예제 #1
0
    /// <summary>
    /// 设置容器单元格
    /// </summary>
    /// <param name="cellWidth">单元格宽</param>
    /// <param name="cellHeight">单元格高</param>
    /// <param name="arrangement">单元格滑动方向 [水平 or 垂直]</param>
    /// <param name="upperLimitIndex">超过最大上限,进行垃圾回收</param>
    /// <param name="lowerLimitIndex">超过最大下限,进行资源加载</param>
    /// <param name="cellHeightSpace">单元格与单元格之间的高度</param>
    /// <param name="cellWidthSpace">单元格与单元格之间的宽度</param>
    /// <param name="maxPerLine">这个根据 单元格滑动方向来定, 垂直 ,就是每行最多有多少个单元格  水平表示每列最多有多少单元格</param>
    protected void SetData(int cellWidth, int cellHeight, Arrangement arrangement, int upperLimitIndex = 0, int lowerLimitIndex = 0,
                           int cellHeightSpace = 0, int cellWidthSpace = 0, int maxPerLine = 1)
    {
        this.CellWidth       = cellWidth;
        this.CellHeight      = cellHeight;
        this.CellWidthSpace  = cellWidthSpace;
        this.CellHeightSpace = cellHeightSpace;
        this.MaxPerLine      = maxPerLine;
        this._Arranement     = arrangement;
        switch (arrangement)
        {
        case Arrangement.Horizontal:
            scroRect.vertical = false;
            break;

        case Arrangement.Vertical:
            scroRect.horizontal = false;
            break;

        default:
            scroRect.horizontal = true;
            scroRect.vertical   = true;
            break;
        }
    }
예제 #2
0
        public ActionResult Create(Arrangement item)
        {
            ArrangementStatus status;
            IQueryable <int>  qry;

            if (!ModelState.IsValid)
            {
                return(View(item));
            }

            qry = from x in db.Arrangements
                  where x.Year == item.Year
                  orderby x.Serial descending
                  select x.Serial;

            item.Status = (int)StatusEnum.Status01;
            item.Year   = DateTime.Today.Year;
            item.Serial = qry.FirstOrDefault() + 1;

            status = new ArrangementStatus
            {
                ArrangementYear   = item.Year,
                ArrangementSerial = item.Serial,
                CreatorId         = User.Identity.Name,
                Date    = DateTime.Now,
                Status  = item.Status,
                Comment = Mictlanix.Iam.Properties.Resources.NewStatusComment
            };

            db.Arrangements.Add(item);
            db.Statuses.Add(status);
            db.SaveChanges();

            return(RedirectToAction("Index"));
        }
 public LegendItemBlockContainer(Arrangement arrangement, Dataset dataset, IComparable seriesKey)
   : base(arrangement)
 {
   LegendItemBlockContainer itemBlockContainer = this;
   this.dataset = dataset;
   this.seriesKey = seriesKey;
 }
예제 #4
0
        public void player_transcribes_arrangement_correctly_and_in_time()
        {
            var kickPattern  = new Pattern("|X|_|_|_|X|_|_|_|X|_|_|_|X|_|_|_|");
            var snarePattern = new Pattern("|_|_|_|_|X|_|_|_|_|_|_|_|X|_|_|_|");
            var hiHatPattern = new Pattern("|_|_|X|_|_|_|X|_|_|_|X|_|_|_|X|_|");

            var kickTrack  = new Track(kickPattern, new Sound("Kick"));
            var snareTrack = new Track(snarePattern, new Sound("Snare"));
            var hiHatTrack = new Track(hiHatPattern, new Sound("HiHat"));

            var arrangementTracks = new List <Track>
            {
                kickTrack,
                snareTrack,
                hiHatTrack
            };
            var       arrangement = new Arrangement(arrangementTracks);
            var       player      = new Player(arrangement, 120);
            var       writer      = new StringWriter();
            Stopwatch sw          = new Stopwatch();

            sw.Start();
            player.TranscribeArrangement(writer);
            sw.Stop();
            Assert.AreEqual(sw.ElapsedMilliseconds < 2100, true);
            Assert.AreEqual(sw.ElapsedMilliseconds > 1800, true);
            Assert.AreEqual(writer.GetCurrentString(), "|Kick|_|HiHat|_|Kick+Snare|_|HiHat|_|Kick|_|HiHat|_|Kick+Snare|_|HiHat|_|\r\n");
        }
예제 #5
0
        public void ExportFile_WithCrawlResultsModel_ShouldSaveFile()
        {
            // Act
            var filename    = "testFile";
            var arrangement = new Arrangement();

            var links  = new List <string>();
            var models = new List <CrawlModel>();

            links.Add("testpage1.com");

            var model = new CrawlModel()
            {
                Page  = "testpage.com",
                Links = links
            };

            models.Add(model);

            var crawlResults = new CrawlResultModel()
            {
                FileName    = filename,
                CrawlModels = models
            };


            // Arrange
            arrangement.SUT.ExportFile(crawlResults);

            // Assert
            File.Exists(filename + ".json").Should().BeTrue();
        }
예제 #6
0
        private List <PriceZone> GeneratePriceZones(Arrangement arrangement, List <Seat> allSeats)
        {
            var priceZones = new List <PriceZone>();

            foreach (var sector in arrangement.Sectors)
            {
                Price regularPrice    = GetRegularPriceLevels()[sector.DataQuality];
                var   discoundedPrice = GetDiscoundedPriceLevels()[sector.DataQuality];

                var priceZone = new PriceZone
                {
                    ScenePriceZoneId = sector.PriceZoneId,
                    Name             = sector.Name,
                    Seats            = allSeats.Where(x => sector.Seats.Any(s => s.Id == x.SceneSeatId)).ToList(),
                    Options          = new List <PriceOption>
                    {
                        new PriceOption {
                            Name = "Regular", Price = regularPrice
                        },
                        new PriceOption {
                            Name = "Discounted", Price = discoundedPrice
                        },
                    }
                };

                priceZones.Add(priceZone);
            }

            return(priceZones);
        }
예제 #7
0
        private static void CalculateArrangements(List <string[]> permutations)
        {
            var arrangements = new List <Arrangement>();

            foreach (var permutation in permutations)
            {
                var arrangement = new Arrangement();

                foreach (var guest in permutation)
                {
                    arrangement.Guests.Add(guest);
                }

                for (int i = 0; i < _totalGuests; i++)
                {
                    var guest           = permutation[i];
                    var toLeft          = permutation[i - 1 < 0 ? _totalGuests - 1 : i - 1];
                    var toLeftHappiness = _guests.First(x => x.Name == guest && x.NextTo == toLeft).Happiness;
                    arrangement.TotalHappiness += toLeftHappiness;

                    var toRight          = permutation[i + 1 > _totalGuests - 1 ? 0 : i + 1];
                    var toRightHappiness = _guests.First(x => x.Name == guest && x.NextTo == toRight).Happiness;
                    arrangement.TotalHappiness += toRightHappiness;
                }

                arrangements.Add(arrangement);
            }

            CustomConsoleColour.SetAnswerColour();
            Console.WriteLine($"{arrangements.Max(x => x.TotalHappiness)}");
            Console.ResetColor();
        }
 public LegendItemBlockContainer(Arrangement arrangement, int datasetIndex, int series)
   : base(arrangement)
 {
   LegendItemBlockContainer itemBlockContainer = this;
   this.datasetIndex = datasetIndex;
   this.series = series;
 }
예제 #9
0
        public ActionResult ChangeStatus(ArrangementStatus item)
        {
            if (ModelState.IsValid)
            {
                // guardar ArrangementStatus en la db
                // cambiar estado al Arrangement
                Arrangement arrangement = db.Arrangements.Find(item.ArrangementYear, item.ArrangementSerial);
                //DateTime date = DateTime.Parse(Request.Params["SessionDate"]);

                if (item.StatusEnum == StatusEnum.Status09)
                {
                    arrangement.SessionDate = item.SessionDate;
                }

                if (item.StatusEnum == StatusEnum.Status10)
                {
                    arrangement.Session = item.Session;
                }

                arrangement.Status = item.Status;

                item.Arrangement = arrangement;
                item.Date        = DateTime.Now;
                item.CreatorId   = User.Identity.Name;
                db.Statuses.Add(item);

                db.Configuration.ValidateOnSaveEnabled = false;
                db.SaveChanges();
                db.Configuration.ValidateOnSaveEnabled = true;

                return(RedirectToAction("Index"));
            }
            return(View(item));
        }
        public static void UpdateXml(Arrangement arr, DLCPackageData info)
        {
            arr.SongFile = new RocksmithToolkitLib.DLCPackage.AggregateGraph.SongFile {
                File = ""
            };
            arr.Id       = IdGenerator.Guid();
            arr.MasterId = RandomGenerator.NextInt();

            // update xml with user modified DLCPackageData info
            var songXml = Song2014.LoadFromFile(arr.SongXml.File);

            songXml.AlbumName      = info.SongInfo.Album;
            songXml.AlbumYear      = info.SongInfo.SongYear.ToString();
            songXml.ArtistName     = info.SongInfo.Artist;
            songXml.ArtistNameSort = info.SongInfo.ArtistSort;
            songXml.AverageTempo   = info.SongInfo.AverageTempo;
            songXml.Title          = info.SongInfo.SongDisplayName;
            songXml.ToneBase       = arr.ToneBase;
            songXml.ToneA          = arr.ToneA;
            songXml.ToneB          = arr.ToneB;
            songXml.ToneC          = arr.ToneC;
            songXml.ToneD          = arr.ToneD;

            using (var stream = File.Open(arr.SongXml.File, FileMode.Create))
                songXml.Serialize(stream, true);
        }
예제 #11
0
 public void ArrangeSelectedImages(Arrangement arrangement, int spacing, int margin)
 {
     using (new OperationWrapper(this))
     {
         _positionManager.DoPositionSelectedImages(arrangement, spacing, margin);
     }
 }
예제 #12
0
파일: Form1.cs 프로젝트: tomyqg/CSHomework
        private void Form1_Load(object sender, EventArgs e)
        {
            int left = 30; int top = 30;

            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    arrArray[total]          = new Arrangement();
                    arrArray[total].left     = left;
                    arrArray[total].top      = top;
                    arrArray[total].location = -1;
                    if (total != 8)
                    {
                        Button btn = new Button();
                        btn.Left                 = left;
                        btn.Top                  = top;
                        btn.Width                = 50;
                        btn.Height               = 50;
                        btn.Text                 = (total + 1).ToString();
                        buttons[total]           = btn;
                        arrArray[total].location = total;
                        this.Controls.Add(btn);
                    }
                    total += 1;
                    left  += 50;
                }
                left = 30;
                top += 50;
            }
        }
예제 #13
0
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            ReservationManager rm     = new ReservationManager(new UnitOfWork(new ReservationContextTest()));
            Client             client = new Client(999, "Alice", "Cards", ClientCategory.Vip, new Address());

            rm.AddClient(client);
            Location     start  = Location.Antwerpen;
            Location     stop   = Location.Brussel;
            List <Price> prices = new List <Price>();

            prices.Add(new Price(Arrangement.Airport, 100m));
            prices.Add(new Price(Arrangement.Business, 100m));
            prices.Add(new Price(Arrangement.NightLife, 900m));
            prices.Add(new Price(Arrangement.Wedding, 800m));
            prices.Add(new Price(Arrangement.Wellness, 750m));
            Car             car     = new Car("RabbitHole", "Delux", "Brown", prices);
            DeliveryAddress address = new DeliveryAddress("Teaparty", "1", "Wonderland");

            rm.AddCar(car);
            DateTime    startTime   = new DateTime(2020, 12, 12, 13, 0, 0);
            Arrangement arrangement = Arrangement.Wedding;
            DateTime    endTime     = new DateTime(2020, 12, 13, 0, 0, 0);

            ReservationOverview reservationOverview = rm.CreateOverview(rm.CreateReservation(client, start, stop, car, startTime, arrangement, endTime, address));

            // FileReader.AddClients();
            // FileReader.AddCars();
            Console.ReadKey();
        }
        /// <summary>
        /// Preferred Write method
        /// <para>Detects the Arrangment Tuning correctly</para>
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="outputFile"></param>
        /// <param name="platform"></param>
        public static void Write(Arrangement arr, string outputFile, Platform platform)
        {
            using (var reader = new StreamReader(arr.SongXml.File))
            {
                var bitConverter = platform.GetBitConverter;
                if (arr.ArrangementType == ArrangementType.Vocal)
                {
                    var serializer = new XmlSerializer(typeof(Vocals));
                    var vocals     = (Vocals)serializer.Deserialize(reader);
                    WriteVocalsFile(vocals, outputFile, bitConverter);
                }
                else
                {
                    var serializer = new XmlSerializer(typeof(Song));
                    var song       = (Song)serializer.Deserialize(reader);

                    // apply proper fix for null tuning
                    var tuning = new Int16[] { 0, 0, 0, 0, 0, 0 };
                    if (arr.TuningStrings != null)
                    {
                        tuning = arr.TuningStrings.ToArray();
                    }

                    WriteSngFile(song, InstrumentTuningExtensions.GetTuningByOffsets(tuning), arr.ArrangementType, outputFile, bitConverter);
                }
            }
        }
예제 #15
0
        private void OnZoekBeschikbareLimosClick(object sender, RoutedEventArgs e)
        {
            //DateTime? startDatum = StartDatumDatePicker.SelectedDate;
            //DateTime? eindDatum = EindDatumDatePicker.SelectedDate;

            DateTime startDatum;
            DateTime eindDatum;

            if (StartDatumDatePicker.SelectedDate == null)
            {
                startDatum = DateTime.MinValue;
            }
            else
            {
                startDatum = (DateTime)StartDatumDatePicker.SelectedDate;
            }

            if (EindDatumDatePicker.SelectedDate == null)
            {
                eindDatum = DateTime.MaxValue;
            }
            else
            {
                eindDatum = (DateTime)EindDatumDatePicker.SelectedDate;
            }

            Locatie     startLocatie = (Locatie)StartLocatieComboBox.SelectionBoxItem;
            Arrangement arrangement  = (Arrangement)ArrangementComboBox.SelectionBoxItem;

            BeschikbareLimosListView.ItemsSource = _repo.OphalenLimosMetFilters(startDatum, eindDatum, startLocatie, arrangement);
        }
예제 #16
0
 /// <summary>
 /// Constructs a new instance of the StyleEntry class.
 /// </summary>
 /// <param name="Arrange">The arrangement</param>
 /// <param name="Part">The style part</param>
 /// <param name="Instrument">The instrument</param>
 /// <param name="ChordType">The chord family</param>
 /// <param name="Message">The message</param>
 public StyleEntry(Arrangement Arrange, StylePart Part, Instrument Instrument, ChordType ChordType, MidiMessage Message)
 {
     this.arrangement = Arrange;
     this.part        = Part;
     this.instrument  = Instrument;
     this.chordType   = ChordType;
     this.message     = Message;
 }
예제 #17
0
        public ResultWindow(Arrangement arrangement)
        {
            InitializeComponent();
            var viewModel = new ViewModelResultWindow(arrangement);

            DataContext            = viewModel;
            viewModel.CloseWindow += (sender, e) => { Close(); };
        }
예제 #18
0
        public Task RemoveAsync(Arrangement arrangement)
        {
            var intendedToDelete = _context.TagArrangement.Where(e => e.ArrangementId == arrangement.Id).ToList();

            _context.TagArrangement.RemoveRange(intendedToDelete);

            return(_context.SaveChangesAsync());
        }
예제 #19
0
        //GET: /Arrangement/Assign
        public ViewResult Assign(int year, int serial)
        {
            Arrangement arrangement = db.Arrangements.Find(year, serial);

            return(View("Assign", new Assignment {
                Arrangement = arrangement, ArrangementYear = year, ArrangementSerial = serial
            }));
        }
예제 #20
0
        //
        // GET: /Arrangements/ChangeStatus/2011/1

        public ActionResult ChangeStatus(int year, int serial)
        {
            Arrangement arrangement = db.Arrangements.Find(year, serial);

            return(View(new ArrangementStatus {
                ArrangementYear = year, ArrangementSerial = serial, Status = arrangement.Status
            }));
        }
예제 #21
0
 public PriceCalculation(Arrangement arrangement, Limousine limousine, Client client, DateTime reservationDateStart, DateTime reservationDateEnd)
 {
     Hours             = arrangement.GetHours(reservationDateStart, reservationDateEnd, limousine.FirstHourPrice);
     Subtotal          = (int)arrangement.Price;
     ChargedDiscounts  = CalculateChargedDiscounts(Subtotal, client);
     TotalExclusiveVAT = Subtotal - ChargedDiscounts;
     VATAmount         = TotalExclusiveVAT * (Decimal)vatPercentage;
     Total             = TotalExclusiveVAT + VATAmount;
 }
예제 #22
0
        /// <summary>
        /// Loads all the chords and notes for the arrangement
        /// </summary>
        public ArrangementObject LoadArrangement(Arrangement arrangment)
        {
            XmlDocument document = new XmlDocument();

            using (var inputStream = File.OpenRead(source))
            {
                var psarc = new PlayStationArchive();
                psarc.Read(inputStream, true);

                try
                {
                    foreach (var entry in psarc.TOC)
                    {
                        if (entry.Name.Contains("songs") && entry.Name.Contains("arr") && entry.Name.EndsWith("_" + arrangment.ToString() + ".xml"))
                        {
                            psarc.InflateEntry(entry);
                            using (var reader = new StreamReader(entry.Data, Encoding.UTF8))
                            {
                                document.LoadXml(reader.ReadToEnd());
                            }
                            break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
                finally
                {
                    if (psarc != null)
                    {
                        psarc.Dispose();
                        psarc = null;
                    }
                }
            }

            float averageTempo = float.Parse(document.GetElementsByTagName("averageTempo")[0].InnerText, CultureInfo.InvariantCulture);

            XmlNode node       = document.GetElementsByTagName("transcriptionTrack")[0];
            int     noteCount  = int.Parse(node["notes"].GetAttribute("count"));
            int     chordCount = int.Parse(node["chords"].GetAttribute("count"));

            if (noteCount <= 0 && chordCount <= 0)
            {
                node       = document.GetElementsByTagName("level")[0];
                noteCount  = int.Parse(node["notes"].GetAttribute("count"));
                chordCount = int.Parse(node["chords"].GetAttribute("count"));
            }

            ArrangementObject newArrangement = new ArrangementObject(averageTempo,
                                                                     noteCount, node["notes"].GetElementsByTagName("note"),
                                                                     chordCount, node["chords"].GetElementsByTagName("chord"));

            return(newArrangement);
        }
예제 #23
0
        public static bool ValidateExpiryDate(Arrangement item, int days)
        {
            if (item.ExpiryDate == null)
            {
                return(true);
            }

            return((item.ExpiryDate.Value - DateTime.Now).Days <= days);
        }
예제 #24
0
        private Yaku Toitoi(Arrangement arrangement)
        {
            if (arrangement.IsChiitoitsu || arrangement.IsKokushi || _melds.Any(m => m.MeldType == MeldType.Shuntsu) || arrangement.Shuntsus.Any())
            {
                return(Yaku.None);
            }

            return(Yaku.Toitoi);
        }
예제 #25
0
 public usrc_Item()
 {
     InitializeComponent();
     //Item = new TangentaTableClass.Item();
     m_Arrangement = new Arrangement();
     m_Arrangement.Define(0, btn_Stock, nmUpDn_StockQuantity);
     m_Arrangement.Define(1, btn_NoStock, nmUpDn_FactoryQuantity);
     DefaultColor = BackColor;
 }
예제 #26
0
        private Yaku Kokushi(Arrangement arrangement)
        {
            if (arrangement.IsKokushi)
            {
                return(arrangement.Pair == _winningTile ? Yaku.KokushiMusouJuusanmen : Yaku.KokushiMusou);
            }

            return(Yaku.None);
        }
예제 #27
0
 public PrijsBerekening(Limo limo, Arrangement arr, EventingKorting evtKorting, int aantalReserveringen,
                        DateTime startTijd, DateTime eindTijd)
 {
     Limo                = limo;
     Arrangement         = arr;
     EventingKorting     = evtKorting;
     AantalReserveringen = aantalReserveringen;
     Periode             = new Periode(startTijd, eindTijd);
     BerekenKostPrijs();
 }
예제 #28
0
 public MainWindow()
 {
     InitializeComponent();
     SettingManager.Init();
     arrangement             = new Arrangement(this);
     unarranged              = new ObservableCollection <Item>();
     waitingList.ItemsSource = unarranged;
     PipeManager             = new PipeManager(this);
     PipeManager.Initialize();
 }
예제 #29
0
 public ActionResult Edit(Arrangement datosconvenio)
 {
     if (ModelState.IsValid)
     {
         db.Entry(datosconvenio).State = EntityState.Modified;
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
     return(View(datosconvenio));
 }
예제 #30
0
        public IActionResult Update(Arrangement model)
        {
            if (model == null)
            {
                return(BadRequest($"{nameof(model)} is null."));
            }
            var result = m_ArrangementService.Update(model);

            return(Json(result));
        }
예제 #31
0
        //schrappen?
        public bool BevatOverUren(Arrangement arr)
        {
            bool bevatOveruren = false;

            if (arr == Arrangement.NightLife || arr == Arrangement.Wedding)
            {
                bevatOveruren = this.Duur > TimeSpan.FromHours(7);
            }
            return(bevatOveruren);
        }
예제 #32
0
        internal static Arrangement GetArrangement(ParameterizableConfigurationElement checkerConfiguration, Validator validator)
        {
            if (checkerConfiguration == null)
            {
                checkerConfiguration = new ParameterizableConfigurationElement();
            }

            IQueryable <Arrangement> arrangements = DataContext.Instance.ArrangementSet
                                                    .Where(c => c.Validator.ValidatorId == validator.ValidatorId &&
                                                           c.Parameters.Count == checkerConfiguration.Parameters.Count &&
                                                           c.Parameters.All(p => checkerConfiguration.Parameters.AllKeys.Contains(p.Name)));

            Arrangement arrangement = null;

            foreach (Arrangement dbArrangement in arrangements)
            {
                if (dbArrangement.Parameters.All(p => checkerConfiguration.Parameters[p.Name].Value == p.Value))
                {
                    arrangement = dbArrangement;
                    break;
                }
            }

            bool pendingChanges = false;

            if (arrangement == null)
            {
                arrangement = DataContext.Instance.ArrangementSet.Add(new Arrangement
                {
                    Validator   = validator,
                    Description = checkerConfiguration.Description
                });

                foreach (NameValueConfigurationElement parameter in checkerConfiguration.Parameters)
                {
                    arrangement.Parameters.Add(new Parameter {
                        Name = parameter.Name, Value = parameter.Value
                    });
                }

                pendingChanges = true;
            }
            else if (arrangement.Description != checkerConfiguration.Description)
            {
                arrangement.Description = checkerConfiguration.Description;
                pendingChanges          = true;
            }

            if (pendingChanges)
            {
                DataContext.Instance.SaveChanges();
            }

            return(arrangement);
        }
        private static void UpdateTones(Arrangement arrangement)
        {
            // template may not reflect current XML state, update tone slots
            if (arrangement.ArrangementType != ArrangementType.Vocal)
            {
                var xml = Song2014.LoadFromFile(arrangement.SongXml.File);

                if (xml.ToneBase != null)
                {
                    arrangement.ToneBase = xml.ToneBase;
                }

                // A (ID 0)
                if (xml.ToneA != null)
                {
                    if (xml.ToneA != xml.ToneBase)
                    {
                        // SNG convertor expects ToneA to be ID 0
                        throw new InvalidDataException(String.Format("Invalid tone definition detected in {0}, ToneA (ID 0) is expected to be same as ToneBase.", arrangement.SongXml.File));
                    }
                    arrangement.ToneA = xml.ToneA;
                }
                else
                {
                    arrangement.ToneA = null;
                }
                // B (ID 1)
                if (xml.ToneB != null)
                {
                    arrangement.ToneB = xml.ToneB;
                }
                else
                {
                    arrangement.ToneB = null;
                }
                // C (ID 2)
                if (xml.ToneC != null)
                {
                    arrangement.ToneC = xml.ToneC;
                }
                else
                {
                    arrangement.ToneC = null;
                }
                // D (ID 3)
                if (xml.ToneD != null)
                {
                    arrangement.ToneD = xml.ToneD;
                }
                else
                {
                    arrangement.ToneD = null;
                }
            }
        }
        public AttributesHeader2014(string arrangementFileName, Arrangement arrangement, DLCPackageData info, Platform platform)
        {
            IsVocal = arrangement.ArrangementType == Sng.ArrangementType.Vocal;
            SongContent = (IsVocal) ? null : Song2014.LoadFromFile(arrangement.SongXml.File);
            var dlcName = info.Name.ToLower();

            var albumUrn = String.Format(URN_TEMPLATE, TagValue.Image.GetDescription(), TagValue.DDS.GetDescription(), String.Format("album_{0}", dlcName));
            var jsonUrn = String.Format(URN_TEMPLATE, TagValue.Database.GetDescription(), TagValue.JsonDB.GetDescription(), String.Format("{0}_{1}", dlcName, arrangementFileName));

            //FILL ATTRIBUTES
            this.AlbumArt = albumUrn;
            ArrangementName = arrangement.Name.ToString();
            DLC = true;
            DLCKey = info.Name;
            LeaderboardChallengeRating = 0;
            ManifestUrn = jsonUrn;
            MasterID_RDV = arrangement.MasterId;
            PersistentID = arrangement.Id.ToString().Replace("-", "").ToUpper();
            Shipping = true;
            SKU = "RS2";
            SongKey = info.Name;

            if (!IsVocal)
            {
                AlbumName = AlbumNameSort = info.SongInfo.Album;
                ArtistName = info.SongInfo.Artist;
                CentOffset = arrangement.TuningPitch != 0 ? TuningFrequency.Frequency2Cents(arrangement.TuningPitch) : 0.0;
                ArtistNameSort = info.SongInfo.ArtistSort;
                CapoFret = (arrangement.Sng2014.Metadata.CapoFretId == 0xFF) ? CapoFret = 0 : Convert.ToDecimal(arrangement.Sng2014.Metadata.CapoFretId);
                DNA_Chords = arrangement.Sng2014.DNACount[(int) DNAId.Chord];
                DNA_Riffs = arrangement.Sng2014.DNACount[(int) DNAId.Riff];
                DNA_Solo = arrangement.Sng2014.DNACount[(int) DNAId.Solo];
                NotesEasy = arrangement.Sng2014.NoteCount[0];
                NotesMedium = arrangement.Sng2014.NoteCount[1];
                NotesHard = arrangement.Sng2014.NoteCount[2];
                EasyMastery = NotesEasy / NotesHard;
                MediumMastery = NotesMedium / NotesHard;
                Representative = Convert.ToInt32(!arrangement.BonusArr);
                RouteMask = (int)arrangement.RouteMask;

                // TODO this is not quite it but much closer
                SongDiffEasy = SongContent.SongLength / NotesEasy;
                SongDiffMed = SongContent.SongLength / NotesMedium;
                SongDiffHard = SongContent.SongLength / NotesHard;
                SongDifficulty = SongDiffHard;

                SongLength = (double?)Math.Round(SongContent.SongLength, 3, MidpointRounding.AwayFromZero);
                SongName = info.SongInfo.SongDisplayName;
                SongNameSort = info.SongInfo.SongDisplayNameSort;
                SongYear = info.SongInfo.SongYear;

                var tunDef = TuningDefinitionRepository.Instance().Select(arrangement.Tuning, platform.version);
                Tuning = tunDef.Tuning;
            }
        }
예제 #35
0
 public LegendTitle(LegendItemSource source, Arrangement hLayout, Arrangement vLayout)
 {
   LegendTitle legendTitle = this;
   LegendItemSource[] legendItemSourceArray = new LegendItemSource[1];
   int index = 0;
   LegendItemSource legendItemSource = source;
   legendItemSourceArray[index] = legendItemSource;
   this.sources = legendItemSourceArray;
   this.items = new BlockContainer(hLayout);
   this.hLayout = hLayout;
   this.vLayout = vLayout;
   this.backgroundPaint = (Paint) null;
   this.legendItemGraphicEdge = RectangleEdge.__\u003C\u003ELEFT;
   this.legendItemGraphicAnchor = RectangleAnchor.__\u003C\u003ECENTER;
   this.legendItemGraphicLocation = RectangleAnchor.__\u003C\u003ECENTER;
   this.legendItemGraphicPadding = new RectangleInsets(2.0, 2.0, 2.0, 2.0);
   this.itemFont = LegendTitle.__\u003C\u003EDEFAULT_ITEM_FONT;
   this.itemPaint = LegendTitle.__\u003C\u003EDEFAULT_ITEM_PAINT;
   this.itemLabelPadding = new RectangleInsets(2.0, 2.0, 2.0, 2.0);
 }
        public void TestArrangementAnalyzer()
        {
            // Randomly picked 2 shanten hand. 34467p 44446s 3447m
              var pinzu = new[] // 001201100 (0,3,5)(1,2,4)(2,0,0)(2,1,2)(2,2,3)
              {
            new Arrangement(0, 3, 5),
            new Arrangement(1, 2, 4), // 2 incomplete mentsu
            new Arrangement(2, 0, 0),
            new Arrangement(2, 1, 2),
            new Arrangement(2, 2, 3)
              };
              var souzu = new[] // 000401000 (0,2,5)(1,1,3)(2,0,0)(2,1,2)
              {
            new Arrangement(0, 2, 5), // 1 incomplete and 1 complete mentsu
            new Arrangement(1, 1, 3),
            new Arrangement(2, 0, 0),
            new Arrangement(2, 1, 2)
              };
              var manzu = new[] // 001200100 (0,3,4)(1,1,2)(1,2,3)(2,0,0)(2,1,1)(2,2,2)
              {
            new Arrangement(0, 3, 4),
            new Arrangement(1, 1, 2),
            new Arrangement(1, 2, 3),
            new Arrangement(2, 0, 0), // 1 complete pair
            new Arrangement(2, 1, 1),
            new Arrangement(2, 2, 2)
              };
              var honor = new Arrangement(0, 0, 0).Yield();

              var analyzer = new ArrangementAnalyzer();
              analyzer.AddSetOfArrangements(pinzu);
              analyzer.AddSetOfArrangements(souzu);
              analyzer.AddSetOfArrangements(manzu);
              analyzer.AddSetOfArrangements(honor);
              var shanten = analyzer.CalculateShanten();
              Assert.AreEqual(2, shanten);
        }
 private void AssociateTechniques(Arrangement x, Attributes att, string technique)
 {
     att.AssociatedTechniques.Add(String.Format("{0}{1}", x.ArrangementType == Sng.ArrangementType.Bass ? "Bass" : "", technique));
 }
예제 #38
0
 private static string CreateCompactArrangementString(Arrangement a)
 {
   return $"({a.JantouValue},{a.MentsuCount},{a.MentsuValue})";
 }
 //TODO: investigate on values 0.9 and lower, spotted in DLC
 public void GenerateDynamicVisualDensity(IAttributes attribute, dynamic song, Arrangement arrangement, GameVersion version)
 {
     if (arrangement.ArrangementType == ArrangementType.Vocal)
     {
         if (version == GameVersion.RS2014)
             attribute.DynamicVisualDensity = Enumerable.Repeat(2.0f, 20).ToList();
         else
             attribute.DynamicVisualDensity = new List<float> {
                 4.5f, 4.3000001907348633f, 4.0999999046325684f, 3.9000000953674316f, 3.7000000476837158f,
                 3.5f, 3.2999999523162842f, 3.0999999046325684f, 2.9000000953674316f, 2.7000000476837158f,
                 2.5f, 2.2999999523162842f, 2.0999999046325684f,
                 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f
             };
     }
     else
     {
         const float floorLimit = 5f;
         attribute.DynamicVisualDensity = new List<float>(20);
         float endSpeed = Math.Min(45f, Math.Max(floorLimit, arrangement.ScrollSpeed)) / 10f;
         if (song.Levels.Length == 1)
         {
             attribute.DynamicVisualDensity = Enumerable.Repeat(endSpeed, 20).ToList();
         }
         else
         {
             double beginSpeed = 4.5d;
             double maxLevel = Math.Min(song.Levels.Length, 20d) - 1;
             double factor = maxLevel > 0 ? Math.Pow(endSpeed / beginSpeed, 1d / maxLevel) : 1d;
             for (int i = 0; i < 20; i++)
             {
                 if (i >= maxLevel)
                 {
                     attribute.DynamicVisualDensity.Add(endSpeed);
                 }
                 else
                 {
                     attribute.DynamicVisualDensity.Add((float)(beginSpeed * Math.Pow(factor, i)));
                 }
             }
         }
     }
 }
        public AttributesHeader2014(string arrangementFileName, Arrangement arrangement, DLCPackageData info, Platform platform)
        {
            if (arrangement.ArrangementType == ArrangementType.ShowLight)
                return;

            IsVocal = arrangement.ArrangementType == Sng.ArrangementType.Vocal;
            SongContent = (IsVocal) ? null : Song2014.LoadFromFile(arrangement.SongXml.File);
            var dlcName = info.Name.ToLower();

            var albumUrn = String.Format(URN_TEMPLATE, TagValue.Image.GetDescription(), TagValue.DDS.GetDescription(), String.Format("album_{0}", dlcName));
            var jsonUrn = String.Format(URN_TEMPLATE, TagValue.Database.GetDescription(), TagValue.JsonDB.GetDescription(), String.Format("{0}_{1}", dlcName, arrangementFileName));

            //FILL ATTRIBUTES
            this.AlbumArt = albumUrn;
            JapaneseVocal |= arrangement.Name == Sng.ArrangementName.JVocals;
            ArrangementName = IsVocal ? Sng.ArrangementName.Vocals.ToString() : arrangement.Name.ToString(); //HACK: weird vocals stuff
            DLC = true;
            DLCKey = info.Name;
            LeaderboardChallengeRating = 0;
            ManifestUrn = jsonUrn;
            MasterID_RDV = arrangement.MasterId;
            PersistentID = arrangement.Id.ToString().Replace("-", "").ToUpper();
            Shipping = true;
            SKU = "RS2";
            SongKey = info.Name;

            if (!IsVocal)
            {
                AlbumName = AlbumNameSort = info.SongInfo.Album;
                ArtistName = info.SongInfo.Artist;
                CentOffset = (!arrangement.TuningPitch.Equals(0)) ? TuningFrequency.Frequency2Cents(arrangement.TuningPitch) : 0.0;
                ArtistNameSort = info.SongInfo.ArtistSort;
                CapoFret = (arrangement.Sng2014.Metadata.CapoFretId == 0xFF) ? CapoFret = 0 : Convert.ToDecimal(arrangement.Sng2014.Metadata.CapoFretId);
                DNA_Chords = arrangement.Sng2014.DNACount[(int)DNAId.Chord];
                DNA_Riffs = arrangement.Sng2014.DNACount[(int)DNAId.Riff];
                DNA_Solo = arrangement.Sng2014.DNACount[(int)DNAId.Solo];
                NotesEasy = arrangement.Sng2014.NoteCount[0];
                NotesMedium = arrangement.Sng2014.NoteCount[1];
                NotesHard = arrangement.Sng2014.NoteCount[2];
                EasyMastery = NotesEasy / NotesHard;
                MediumMastery = NotesMedium / NotesHard;
                Metronome = (int?)arrangement.Metronome;
                Representative = Convert.ToInt32(!arrangement.BonusArr);
                RouteMask = (int)arrangement.RouteMask;

                // TODO use ManifestFunctions.GetSongDifficulty() method (fix generation alghorythm)
                SongDiffEasy = SongContent.SongLength / NotesEasy;
                SongDiffMed = SongContent.SongLength / NotesMedium;
                SongDiffHard = SongContent.SongLength / NotesHard;
                SongDifficulty = SongDiffHard;

                SongLength = (double?)Math.Round(SongContent.SongLength, 3, MidpointRounding.AwayFromZero);
                SongName = info.SongInfo.SongDisplayName;
                SongNameSort = info.SongInfo.SongDisplayNameSort;
                SongYear = info.SongInfo.SongYear;

                //Detect tuning
                var tuning = TuningDefinitionRepository.Instance().SelectAny(SongContent.Tuning, platform.version);
                if (tuning == null)
                {
                    tuning = new TuningDefinition();
                    tuning.Tuning = SongContent.Tuning;
                    tuning.Name = tuning.UIName = arrangement.Tuning;
                    if (String.IsNullOrEmpty(tuning.Name))
                    {
                        tuning.Name = tuning.UIName = tuning.NameFromStrings(arrangement.TuningStrings, arrangement.ArrangementType == ArrangementType.Bass);
                    }
                    tuning.Custom = true;
                    tuning.GameVersion = GameVersion.RS2014;
                    TuningDefinitionRepository.Instance().Add(tuning, true);
                }
                Tuning = tuning.Tuning;
            }
        }
예제 #41
0
        public override Arrangement get_Arrangement(long IDNivel, IDbConnection conn) {
            Arrangement result = new Arrangement();
            result.tradicaoDocumental = new List<string>();
            result.ordenacao = new List<string>();
            try {
                // Tradicao documental
                string query = string.Format(@"
                    SELECT ttd.Designacao
                    FROM Nivel n
                    INNER JOIN FRDBase frd ON frd.IDNivel = n.ID AND frd.isDeleted = 0
                    INNER JOIN SFRDTradicaoDocumental td ON td.IDFRDBase = frd.ID AND td.isDeleted = 0
                    INNER JOIN TipoTradicaoDocumental ttd ON ttd.ID = td.IDTipoTradicaoDocumental AND ttd.isDeleted = 0
                    WHERE n.ID = {0}  AND n.isDeleted = 0 ",
                    IDNivel);

                SqlCommand command = new SqlCommand(query, (SqlConnection)conn);
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read()) {
                    if (!reader.IsDBNull(0))
                        result.tradicaoDocumental.Add(reader.GetString(0));
                }
                reader.Close();

                // Ordenacao:
                query = string.Format(@"
                    SELECT  ord.Designacao
                    FROM Nivel n
                    INNER JOIN FRDBase frd ON frd.IDNivel = n.ID AND frd.isDeleted = 0
                    INNER JOIN SFRDOrdenacao o ON o.IDFRDBase = frd.ID AND o.isDeleted = 0
                    INNER JOIN TipoOrdenacao ord ON ord.ID = o.IDTipoOrdenacao AND ord.isDeleted = 0
                    WHERE n.ID = {0}  AND n.isDeleted = 0 ", IDNivel);

                command.CommandText = query;
                reader = command.ExecuteReader();
                while (reader.Read()) {
                    if (!reader.IsDBNull(0))
                        result.ordenacao.Add(reader.GetString(0));
                }
                reader.Close();
            }
            catch (Exception ex) { Trace.WriteLine(ex); throw; }

            return result;
        }
 public void GenerateDynamicVisualDensity(IAttributes attribute, dynamic song, Arrangement arrangement)
 {
     if (arrangement.ArrangementType == ArrangementType.Vocal)
     {
         attribute.DynamicVisualDensity = new List<float>{
                 4.5f, 4.3000001907348633f, 4.0999999046325684f, 3.9000000953674316f, 3.7000000476837158f,
                 3.5f, 3.2999999523162842f, 3.0999999046325684f, 2.9000000953674316f, 2.7000000476837158f,
                 2.5f, 2.2999999523162842f, 2.0999999046325684f,
                 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f};
     }
     else
     {
         attribute.DynamicVisualDensity = new List<float>(20);
         float endSpeed = Math.Min(45f, Math.Max(10f, arrangement.ScrollSpeed)) / 10f;
         if (song.Levels.Length == 1)
         {
             for (int i = 0; i < 20; i++)
             {
                 attribute.DynamicVisualDensity.Add(endSpeed);
             }
         }
         else
         {
             double beginSpeed = 4.5d;
             double maxLevel = Math.Min(song.Levels.Length, 16d) - 1;
             double factor = maxLevel == 0 ? 1d : Math.Pow(endSpeed / beginSpeed, 1d / maxLevel);
             for (int i = 0; i < 20; i++)
             {
                 if (i >= maxLevel)
                 {
                     attribute.DynamicVisualDensity.Add(endSpeed);
                 }
                 else
                 {
                     attribute.DynamicVisualDensity.Add((float)(beginSpeed * Math.Pow(factor, i)));
                 }
             }
         }
     }
 }
        private static void ParseTuning(Arrangement dest, Attributes2014 attr)
        {
            bool isBass = false;
            TuningDefinition tuning = null;
            switch (dest.Name)
            {
                case ArrangementName.Bass:
                    tuning = TuningDefinitionRepository.Instance().SelectForBass(attr.Tuning, GameVersion.RS2014);
                    isBass = true;
                    break;
                case ArrangementName.Vocals:
                    break;
                default:
                    tuning = TuningDefinitionRepository.Instance().Select(attr.Tuning, GameVersion.RS2014);
                    break;

            }

            if (tuning == null)
            {
                tuning = new TuningDefinition();
                tuning.UIName = tuning.Name = TuningDefinition.NameFromStrings(attr.Tuning, isBass);
                tuning.Custom = true;
                tuning.GameVersion = GameVersion.RS2014;
                tuning.Tuning = attr.Tuning;
                TuningDefinitionRepository.Instance().Add(tuning, true);
            }
            dest.Tuning = tuning.UIName;
            dest.TuningStrings = tuning.Tuning;

            if (attr.CentOffset != null)
                dest.TuningPitch = attr.CentOffset.Cents2Frequency();
        }
        /// <summary>
        /// Loads required DLC info from folder.
        /// </summary>
        /// <returns>The DLCPackageData info.</returns>
        /// <param name="unpackedDir">Unpacked dir.</param>
        /// <param name="targetPlatform">Target platform.</param>
        /// <param name = "sourcePlatform"></param>
        public static DLCPackageData LoadFromFolder(string unpackedDir, Platform targetPlatform, Platform sourcePlatform = null)
        {
            var data = new DLCPackageData();
            data.GameVersion = GameVersion.RS2014;
            data.SignatureType = PackageMagic.CON;
            if (sourcePlatform == null)
                sourcePlatform = unpackedDir.GetPlatform();

            //Arrangements / Tones
            data.Arrangements = new List<Arrangement>();
            data.TonesRS2014 = new List<Tone2014>();

            //Load files
            var jsonFiles = Directory.EnumerateFiles(unpackedDir, "*.json", SearchOption.AllDirectories).ToArray();
            foreach (var json in jsonFiles)
            {
                var attr = Manifest2014<Attributes2014>.LoadFromFile(json).Entries.ToArray()[0].Value.ToArray()[0].Value;
                var xmlName = attr.SongXml.Split(':')[3];
                var xmlFile = Directory.EnumerateFiles(unpackedDir, xmlName + ".xml", SearchOption.AllDirectories).FirstOrDefault();

                if (attr.Phrases != null)
                {
                    if (data.SongInfo == null)
                    {
                        // Fill Package Data
                        data.Name = attr.DLCKey;
                        data.Volume = (attr.SongVolume == 0 ? -12 : attr.SongVolume); //FIXME: too low song volume issue, revert to -6 to fix.
                        data.PreviewVolume = (attr.PreviewVolume ?? data.Volume);

                        // Fill SongInfo
                        data.SongInfo = new SongInfo
                        {
                            SongDisplayName = attr.SongName,
                            SongDisplayNameSort = attr.SongNameSort,
                            Album = attr.AlbumName,
                            SongYear = attr.SongYear ?? 0,
                            Artist = attr.ArtistName,
                            ArtistSort = attr.ArtistNameSort,
                            AverageTempo = (int) attr.SongAverageTempo
                        };
                    }

                    // Adding Tones
                    foreach (var jsonTone in attr.Tones)
                    {
                        if (jsonTone == null) continue;
                        var key = jsonTone.Key;
                        if (data.TonesRS2014.All(t => t.Key != key))
                        {
                            // fix tones names that do not have the correct alphacase for cross matching
                            if (attr.Tone_Base.ToLower() == jsonTone.Name.ToLower() && attr.Tone_Base != jsonTone.Name)
                                jsonTone.Name = attr.Tone_Base;
                            if (attr.Tone_A != null && attr.Tone_A.ToLower() == jsonTone.Name.ToLower() && attr.Tone_A != jsonTone.Name)
                                jsonTone.Name = attr.Tone_A;
                            if (attr.Tone_B != null && attr.Tone_B.ToLower() == jsonTone.Name.ToLower() && attr.Tone_B != jsonTone.Name)
                                jsonTone.Name = attr.Tone_B;
                            if (attr.Tone_C != null && attr.Tone_C.ToLower() == jsonTone.Name.ToLower() && attr.Tone_C != jsonTone.Name)
                                jsonTone.Name = attr.Tone_C;
                            if (attr.Tone_D != null && attr.Tone_D.ToLower() == jsonTone.Name.ToLower() && attr.Tone_D != jsonTone.Name)
                                jsonTone.Name = attr.Tone_D;

                            data.TonesRS2014.Add(jsonTone);
                        }
                    }

                    // Adding Arrangement
                    data.Arrangements.Add(new Arrangement(attr, xmlFile));
                }
                else if (xmlFile.ToLower().Contains("_vocals"))
                {
                    var voc = new Arrangement
                    {
                        Name = attr.JapaneseVocal == true ? ArrangementName.JVocals : ArrangementName.Vocals,
                        ArrangementType = ArrangementType.Vocal,
                        ScrollSpeed = 20,
                        SongXml = new SongXML {File = xmlFile},
                        SongFile = new SongFile {File = ""},
                        CustomFont = attr.JapaneseVocal == true
                    };

                    // Get symbols stuff from _vocals.xml
                    var fontSng = Path.Combine(unpackedDir, xmlName + ".sng");
                    var vocSng = Sng2014FileWriter.ReadVocals(xmlFile);

                    if (vocSng.IsCustomFont())
                    {
                        voc.CustomFont = true;
                        voc.FontSng = fontSng;
                        vocSng.WriteChartData(fontSng, new Platform(GamePlatform.Pc, GameVersion.None));
                    }

                    voc.Sng2014 = Sng2014File.ConvertXML(xmlFile, ArrangementType.Vocal, voc.FontSng);

                    // Adding Arrangement
                    data.Arrangements.Add(voc);
                }
            }

            //ShowLights XML
            var xmlShowLights = Directory.EnumerateFiles(unpackedDir, "*_showlights.xml", SearchOption.AllDirectories).FirstOrDefault();
            if (!String.IsNullOrEmpty(xmlShowLights))
            {
                var shl = new Arrangement
                {
                    ArrangementType = ArrangementType.ShowLight,
                    Name = ArrangementName.ShowLights,
                    SongXml = new SongXML { File = xmlShowLights },
                    SongFile = new SongFile { File = "" }
                };

                // Adding ShowLights
                data.Arrangements.Add(shl);
            }

            //Get DDS Files
            var ddsFiles = Directory.EnumerateFiles(unpackedDir, "album_*.dds", SearchOption.AllDirectories).ToArray();
            if (ddsFiles.Any())
            {
                var ddsFilesC = new List<DDSConvertedFile>();
                foreach (var file in ddsFiles)
                    switch (Path.GetFileNameWithoutExtension(file).Split('_')[2])
                    {

                        case "256":
                            data.AlbumArtPath = file;
                            ddsFilesC.Add(new DDSConvertedFile() { sizeX = 256, sizeY = 256, sourceFile = file, destinationFile = file.CopyToTempFile(".dds") });
                            break;
                        case "128":
                            ddsFilesC.Add(new DDSConvertedFile() { sizeX = 128, sizeY = 128, sourceFile = file, destinationFile = file.CopyToTempFile(".dds") });
                            break;
                        case "64":
                            ddsFilesC.Add(new DDSConvertedFile() { sizeX = 64, sizeY = 64, sourceFile = file, destinationFile = file.CopyToTempFile(".dds") });
                            break;
                    } data.ArtFiles = ddsFilesC;
            }

            // Lyric Art
            var lyricArt = Directory.EnumerateFiles(unpackedDir, "lyrics_*.dds", SearchOption.AllDirectories).ToArray();
            if (lyricArt.Any())
                data.LyricArtPath = lyricArt.FirstOrDefault();

            //Get other files
            //Audio files
            var targetAudioFiles = new List<string>();
            var sourceAudioFiles = Directory.EnumerateFiles(unpackedDir, "*.wem", SearchOption.AllDirectories).ToArray();

            foreach (var file in sourceAudioFiles)
            {
                var newFile = Path.Combine(Path.GetDirectoryName(file), String.Format("{0}_fixed{1}", Path.GetFileNameWithoutExtension(file), Path.GetExtension(file)));
                if (targetPlatform.IsConsole != (sourcePlatform = file.GetAudioPlatform()).IsConsole)
                {
                    OggFile.ConvertAudioPlatform(file, newFile);
                    targetAudioFiles.Add(newFile);
                }
                else targetAudioFiles.Add(file);
            }

            if (!targetAudioFiles.Any())
                throw new InvalidDataException("Audio files not found.");

            string audioPath = null, audioPreviewPath = null;
            var a = new FileInfo(targetAudioFiles[0]);

            if (targetAudioFiles.Count == 2)
            {
                var b = new FileInfo(targetAudioFiles[1]);

                if (a.Length > b.Length)
                {
                    audioPath = a.FullName;
                    audioPreviewPath = b.FullName;
                }
                else
                {
                    audioPath = b.FullName;
                    audioPreviewPath = a.FullName;
                }
            }
            else
                audioPath = a.FullName;

            data.OggPath = audioPath;

            //Make Audio preview with expected name when rebuild
            if (!String.IsNullOrEmpty(audioPreviewPath))
            {
                var newPreviewFileName = Path.Combine(Path.GetDirectoryName(audioPath), String.Format("{0}_preview{1}", Path.GetFileNameWithoutExtension(audioPath), Path.GetExtension(audioPath)));
                File.Move(audioPreviewPath, newPreviewFileName);
                data.OggPreviewPath = newPreviewFileName;
            }

            //AppID
            var appidFile = Directory.EnumerateFiles(unpackedDir, "*.appid", SearchOption.AllDirectories).FirstOrDefault();
            if (appidFile != null)
                data.AppId = File.ReadAllText(appidFile);

            //Package version
            var versionFile = Directory.EnumerateFiles(unpackedDir, "toolkit.version", SearchOption.AllDirectories).FirstOrDefault();
            if (versionFile != null)
                data.PackageVersion = GeneralExtensions.ReadPackageVersion(versionFile);
            else data.PackageVersion = "1";

            return data;
        }
예제 #45
0
        private void Analyze(Arrangement arrangement, int currentTileType, int currentProtoGroup)
        {
            if (currentTileType >= _tileTypeCount)
              {
            _arrangements.Add(arrangement);
            return;
              }

              Analyze(arrangement, currentTileType + 1, 0);

              // Inlined a bunch of things for about 25% performance gain.
              var count = _protoGroups.Count;
              for (var i = currentProtoGroup; i < count; ++i)
              {
            var protoGroup = _protoGroups[i];
            var isJantou = i <= 1;
            if (isJantou)
            {
              if (_jantouValue != 0 || !protoGroup.CanInsert(_concealed, _used, currentTileType))
              {
            continue;
              }

              protoGroup.Insert(_concealed, _used, currentTileType);

              var oldJantouValue = _jantouValue;
              _jantouValue = protoGroup.Value;
              var added = arrangement.SetJantouValue(_jantouValue);

              Analyze(added, currentTileType, i);

              protoGroup.Remove(_concealed, _used, currentTileType);
              _jantouValue = oldJantouValue;
            }
            else
            {
              if (_usedMelds == 4 || !protoGroup.CanInsert(_concealed, _used, currentTileType))
              {
            continue;
              }

              protoGroup.Insert(_concealed, _used, currentTileType);

              _usedMelds += 1;
              var added = arrangement.AddMentsu(protoGroup.Value);

              Analyze(added, currentTileType, i);

              protoGroup.Remove(_concealed, _used, currentTileType);
              _usedMelds -= 1;
            }
              }
        }
        public static Arrangement Read(Attributes2014 attr, Platform platform, Guid id, string filename, Stream data = null)
        {
            Arrangement result = null;
            using (var str = data ?? File.OpenRead(filename))
            {
                switch (Path.GetExtension(filename))
                {
                    case ".xml":
                        Sng2014File xml = null;
                        if (((ArrangementName)attr.ArrangementType) == ArrangementName.Vocals)
                            xml = Sng2014FileWriter.ReadVocals(data);
                        else
                            xml = Sng2014File.ConvertXML(str);
                        result = new Arrangement(attr, xml, id);
                        break;
                    case ".sng":
                        result = new Arrangement(attr, Sng2014File.ReadSng(str, platform), id);
                        break;
                    default:
                        throw new Exception("Unknown file type: " + filename);
                }
                result._songFilename = filename;

            }
            return result;
        }
 private static void AssertIsWorse(ArrangementComparer comparer, Arrangement a, Arrangement b)
 {
     Assert.IsTrue(comparer.IsWorseThan(a, b), $"{a} should be worse than {b}");
       Assert.IsFalse(comparer.IsWorseThan(b, a), $"{b} should not be worse than {a}");
 }
        public AttributesHeader2014(string arrangementFileName, Arrangement arrangement, DLCPackageData info, Platform platform)
        {
            if (arrangement.ArrangementType == ArrangementType.ShowLight)
                return;

            IsVocal = arrangement.ArrangementType == ArrangementType.Vocal;
            SongContent = (IsVocal) ? null : Song2014.LoadFromFile(arrangement.SongXml.File);
            var dlcName = info.Name.ToLower();

            var albumUrn = String.Format(URN_TEMPLATE, TagValue.Image.GetDescription(), TagValue.DDS.GetDescription(), String.Format("album_{0}", dlcName));
            var jsonUrn = String.Format(URN_TEMPLATE, TagValue.Database.GetDescription(), TagValue.JsonDB.GetDescription(), String.Format("{0}_{1}", dlcName, arrangementFileName));

            //FILL ATTRIBUTES
            this.AlbumArt = albumUrn;
            JapaneseVocal |= arrangement.Name == Sng.ArrangementName.JVocals;
            ArrangementName = IsVocal ? Sng.ArrangementName.Vocals.ToString() : arrangement.Name.ToString(); //HACK: weird vocals stuff
            DLC = true;
            DLCKey = info.Name;
            LeaderboardChallengeRating = 0;
            ManifestUrn = jsonUrn;
            MasterID_RDV = arrangement.MasterId;
            PersistentID = arrangement.Id.ToString().Replace("-", "").ToUpper();
            Shipping = true;
            SKU = "RS2";
            SongKey = info.Name; // proof same same

            if (IsVocal) return;
            // added better AlbumNameSort feature
            AlbumName = info.SongInfo.Album;
            AlbumNameSort = info.SongInfo.AlbumSort;
            ArtistName = info.SongInfo.Artist;
            CentOffset = (!arrangement.TuningPitch.Equals(0)) ? TuningFrequency.Frequency2Cents(arrangement.TuningPitch) : 0.0;
            ArtistNameSort = info.SongInfo.ArtistSort;
            if (arrangement.ArrangementType == ArrangementType.Bass)
            {
                SerializeBassInfo = true;
                BassPick = (int) arrangement.PluckedType;
            }
            else
                SerializeBassInfo = false;

            CapoFret = (arrangement.Sng2014.Metadata.CapoFretId == 0xFF) ? CapoFret = 0 : Convert.ToDecimal(arrangement.Sng2014.Metadata.CapoFretId);
            DNA_Chords = arrangement.Sng2014.DNACount[(int)DNAId.Chord];
            DNA_Riffs = arrangement.Sng2014.DNACount[(int)DNAId.Riff];
            DNA_Solo = arrangement.Sng2014.DNACount[(int)DNAId.Solo];
            NotesEasy = arrangement.Sng2014.NoteCount[0];
            NotesMedium = arrangement.Sng2014.NoteCount[1];
            NotesHard = arrangement.Sng2014.NoteCount[2];
            EasyMastery = NotesEasy / NotesHard;
            MediumMastery = NotesMedium / NotesHard;
            Metronome = (int?)arrangement.Metronome;
            // TODO: check for bug here
            // if there is an equivalent bonus arrangement then Representative is set to "1" otherwise "0"
            Representative = Convert.ToInt32(!arrangement.BonusArr);
            RouteMask = (int)arrangement.RouteMask;

            // TODO: use ManifestFunctions.GetSongDifficulty() method (fix generation algorithm)
            // TODO: round to 9 decimal places and improve calculation
            // TODO: fix SongDiff calculations
            SongDiffEasy = SongContent.SongLength / NotesEasy;
            SongDiffMed = SongContent.SongLength / NotesMedium;
            SongDiffHard = SongContent.SongLength / NotesHard;
            SongDifficulty = SongDiffHard;

            SongLength = Math.Round(SongContent.SongLength, 3, MidpointRounding.AwayFromZero);
            SongName = info.SongInfo.SongDisplayName;
            SongNameSort = info.SongInfo.SongDisplayNameSort;
            SongYear = info.SongInfo.SongYear;

            //Detect tuning
            var tuning = TuningDefinitionRepository.Instance.Detect(SongContent.Tuning, platform.version, arrangement.ArrangementType == ArrangementType.Bass);
            Tuning = tuning.Tuning; //can we just use SongContent.Tuning
        }
예제 #49
0
 private static IEnumerable<Arrangement> CreateAllArrangements(int totalTiles)
 {
   for (var jantouValue = 0; jantouValue <= 2; ++jantouValue)
   {
     for (var mentsuCount = 0; mentsuCount <= 4; ++mentsuCount)
     {
       for (var mentsuValue = mentsuCount; mentsuValue <= mentsuCount * 3; ++mentsuValue)
       {
         var arrangement = new Arrangement(jantouValue, mentsuCount, mentsuValue);
         if (arrangement.TotalValue <= totalTiles)
         {
           yield return arrangement;
         }
       }
     }
   }
 }
예제 #50
0
 private static bool IsPerfect(Arrangement arrangement)
 {
     return arrangement.MentsuValue == arrangement.MentsuCount * 3 && arrangement.JantouValue != 1;
 }
예제 #51
0
        /// <summary>
        /// Determines whether an arrangement is worse than another.
        /// </summary>
        public bool IsWorseThan(Arrangement lhs, Arrangement rhs)
        {
            Validate.NotNull(lhs, nameof(lhs));
              Validate.NotNull(rhs, nameof(rhs));

              if (lhs == rhs)
              {
            return false;
              }
              // Same mentsu but better pairs.
              if (lhs.JantouValue < rhs.JantouValue && lhs.MentsuCount == rhs.MentsuCount && lhs.MentsuValue == rhs.MentsuValue)
              {
            return true;
              }
              // Same TotalValue and MentsuCount, but higher PairValue is worse.
              if (lhs.JantouValue > rhs.JantouValue && lhs.MentsuCount == rhs.MentsuCount && lhs.TotalValue == rhs.TotalValue)
              {
            return true;
              }
              // Not enough tiles in other suits to reach the same value.
              var tilesInOtherSuits = 14 - _tileCount;
              if (lhs.TotalValue + tilesInOtherSuits < rhs.TotalValue)
              {
            return true;
              }
              // If there are no tiles in other suits and the total value is equal, take the higher mentsu value (arbitrary choice).
              if (tilesInOtherSuits == 0 && lhs.TotalValue == rhs.TotalValue && lhs.MentsuValue < rhs.MentsuValue)
              {
            return true;
              }
              // If there is exactly one tile in other suits:
              if (tilesInOtherSuits == 1)
              {
            if (lhs.TotalValue < rhs.TotalValue)
            {
              return true;
            }
            if (lhs.HasJantou && rhs.HasJantou && lhs.TotalValue == rhs.TotalValue && lhs.MentsuValue < rhs.MentsuValue)
            {
              return true;
            }
              }
              // Not enough unused groups to reach the same value in other suits.
              var maxWithUnusedGroups = (4 - lhs.MentsuCount) * 3 + (lhs.HasJantou ? 0 : 2);
              if (lhs.TotalValue + maxWithUnusedGroups < rhs.TotalValue)
              {
            return true;
              }
              // Both with or without jantou.
              if (lhs.JantouValue == rhs.JantouValue)
              {
            // Perfect with more mentsu is better than perfect with less mentsu.
            if (lhs.MentsuCount < rhs.MentsuCount)
            {
              return IsPerfect(lhs) && IsPerfect(rhs);
            }
            // Lower value with same MentsuCount is worse.
            if (lhs.MentsuCount == rhs.MentsuCount)
            {
              return lhs.MentsuValue < rhs.MentsuValue;
            }
            // Same value with more mentsu is worse.
            if (lhs.MentsuCount > rhs.MentsuCount)
            {
              return lhs.TotalValue <= rhs.TotalValue;
            }
              }
              return false;
        }
 private static void ParseTones(Arrangement dest, Attributes2014 attr)
 {
     dest.ScrollSpeed = Convert.ToInt32(attr.DynamicVisualDensity.Last() * 10);
     dest.PluckedType = (PluckedType)attr.ArrangementProperties.BassPick;
     dest.RouteMask = (RouteMask)attr.ArrangementProperties.RouteMask;
     dest.BonusArr = attr.ArrangementProperties.BonusArr == 1;
     dest.ToneBase = attr.Tone_Base;
     dest.ToneMultiplayer = attr.Tone_Multiplayer;
     dest.ToneA = attr.Tone_A;
     dest.ToneB = attr.Tone_B;
     dest.ToneC = attr.Tone_C;
     dest.ToneD = attr.Tone_D;
     dest.Tones = attr.Tones.ToList();
 }
        public static void GenerateSNG(Arrangement arrangement, Platform platform)
        {
            string sngFile = Path.ChangeExtension(arrangement.SongXml.File, ".sng");
            switch (platform.version)
            {
                case GameVersion.RS2012:
                    SngFileWriter.Write(arrangement.SongXml.File, sngFile, arrangement.ArrangementType, platform);
                    break;
                case GameVersion.RS2014:
                    using (FileStream fs = new FileStream(arrangement.SongFile.File, FileMode.Create))
                        arrangement.Sng2014.WriteSng(fs, platform);
                    break;
                default:
                    throw new InvalidOperationException("Unexpected game version value");
            }
            arrangement.SongFile.File = Path.GetFullPath(sngFile);

            TMPFILES_SNG.Add(sngFile);
        }
        public static void GenerateSNG(Arrangement arrangement, Platform platform)
        {
            string sngFile = Path.ChangeExtension(arrangement.SongXml.File, ".sng");
            switch (platform.version)
            {
                case GameVersion.RS2012:
                    SngFileWriter.Write(arrangement.SongXml.File, sngFile, arrangement.ArrangementType, platform);
                    break;
                case GameVersion.RS2014:
                    if (arrangement.Sng2014 == null) {
                        // Sng2014File can be reused when generating for multiple platforms
                        // cache results
                        arrangement.Sng2014 = Sng2014File.ConvertXML(arrangement.SongXml.File, arrangement.ArrangementType);
                    }
                    using (FileStream fs = new FileStream(sngFile, FileMode.Create))
                        arrangement.Sng2014.WriteSng(fs, platform);
                    break;
                default:
                    throw new InvalidOperationException("Unexpected game version value");
            }

            if (arrangement.SongFile == null)
                arrangement.SongFile = new SongFile { File = "" };
            arrangement.SongFile.File = Path.GetFullPath(sngFile);

            TMPFILES_SNG.Add(sngFile);
        }
        public Attributes2014(string arrangementFileName, Arrangement arrangement, DLCPackageData info, Platform platform)
            : base(arrangementFileName, arrangement, info, platform)
        {
            #region VARIABLES

            var dlcName = info.Name.ToLower();

            var xblockUrn = String.Format(URN_TEMPLATE_SHORT, TagValue.EmergentWorld.GetDescription(), dlcName);
            var showlightUrn = String.Format(URN_TEMPLATE, TagValue.Application.GetDescription(), TagValue.XML.GetDescription(), String.Format("{0}_showlights", dlcName));
            var songXmlUrn = String.Format(URN_TEMPLATE, TagValue.Application.GetDescription(), TagValue.XML.GetDescription(), String.Format(AggregateGraph2014.NAME_ARRANGEMENT, dlcName, arrangementFileName));
            var songSngUrn = String.Format(URN_TEMPLATE, TagValue.Application.GetDescription(), TagValue.MusicgameSong.GetDescription(), String.Format(AggregateGraph2014.NAME_ARRANGEMENT, dlcName, arrangementFileName));

            var manifestFunctions = new ManifestFunctions(platform.version);

            #endregion

            #region FILL ATTRIBUTES

            ArrangementSort = arrangement.ArrangementSort;
            BlockAsset = xblockUrn;
            manifestFunctions.GenerateDynamicVisualDensity(this, SongContent, arrangement);
            FullName = String.Format(AggregateGraph2014.NAME_ARRANGEMENT, info.Name, arrangement.Name);
            MasterID_PS3 = (IsVocal) ? -1 : arrangement.MasterId;
            MasterID_Xbox360 = (IsVocal) ? -1 : arrangement.MasterId;
            PreviewBankPath = String.Format("song_{0}_preview.bnk", info.Name.ToLower());
            RelativeDifficulty = 0; //Always 0 in RS2014
            ShowlightsXML = showlightUrn;
            SongAsset = songSngUrn;
            SongBank = String.Format("song_{0}.bnk", info.Name.ToLower());
            SongEvent = String.Format("Play_{0}", info.Name);
            SongXml = songXmlUrn;
            SongVolume = info.Volume;
            PreviewVolume = (info.PreviewVolume != null) ? info.PreviewVolume : SongVolume;

            // Only for Vocal
            if (IsVocal)
                InputEvent = "Play_Tone_Standard_Mic";

            // Only for instruments
            if (!IsVocal)
            {
                ArrangementProperties = SongContent.ArrangementProperties;
                ArrangementProperties.BassPick = (int)arrangement.PluckedType;
                ArrangementProperties.PathLead = Convert.ToInt32(arrangement.RouteMask == DLCPackage.RouteMask.Lead);
                ArrangementProperties.PathRhythm = Convert.ToInt32(arrangement.RouteMask == DLCPackage.RouteMask.Rhythm);
                ArrangementProperties.PathBass = Convert.ToInt32(arrangement.RouteMask == DLCPackage.RouteMask.Bass);
                ArrangementProperties.RouteMask = (int)arrangement.RouteMask;

                // BONUS ARRANGEMENT
                ArrangementProperties.BonusArr = Convert.ToInt32(arrangement.BonusArr);

                if (arrangement.Name == Sng.ArrangementName.Combo)
                { //Exclusive condition
                    if (arrangement.RouteMask == DLCPackage.RouteMask.Lead)
                        ArrangementType = (int)Sng.ArrangementName.Lead;
                    else if (arrangement.RouteMask == DLCPackage.RouteMask.Rhythm)
                        ArrangementType = (int)Sng.ArrangementName.Rhythm;
                    else
                        ArrangementType = (int)arrangement.Name;
                }
                else
                    ArrangementType = (int)arrangement.Name;

                //Chords        -- //TODO: MISSING GENERATE

                ChordTemplates = new List<ChordTemplate>();
                manifestFunctions.GenerateChordTemplateData(this, SongContent);

                LastConversionDateTime = SongContent.LastConversionDateTime;
                MaxPhraseDifficulty = manifestFunctions.GetMaxDifficulty(SongContent);

                TargetScore = 100000;
                PhraseIterations = new List<PhraseIteration>();
                manifestFunctions.GeneratePhraseIterationsData(this, SongContent, platform.version);
                //Score_MaxNotes -- Generated on function above
                //Score_PNV      -- Generated on function above

                Phrases = new List<Phrase>();
                manifestFunctions.GeneratePhraseData(this, SongContent);

                Sections = new List<Section>();
                manifestFunctions.GenerateSectionData(this, SongContent);

                SongAverageTempo = SongContent.AverageTempo;
                SongOffset = arrangement.Sng2014.Metadata.StartTime * -1;

                //SongPartition  -- Generated in DLCPackageCreator after this constructor

                //Techniques     -- //TODO: MISSING GENERATE

                //Fix for Dead tones
                var it = info.TonesRS2014;
                Tones = new List<Tone2014>();

                Tone_A = GetToneName(arrangement.ToneA, it);
                Tone_B = GetToneName(arrangement.ToneB, it);
                Tone_Base = GetToneName(arrangement.ToneBase, it);
                Tone_C = GetToneName(arrangement.ToneC, it);
                Tone_D = GetToneName(arrangement.ToneD, it);
                Tone_Multiplayer = GetToneName(arrangement.ToneMultiplayer, it);
            }

            #endregion
        }
        // Load RS1 CDLC into PackageCreator
        public static DLCPackageData RS1LoadFromFolder(string unpackedDir, Platform targetPlatform, bool convert)
        {
            var data = new DLCPackageData();
            data.Arrangements = new List<Arrangement>();
            data.TonesRS2014 = new List<Tone2014>();
            data.Tones = new List<Tone>();

            data.GameVersion = (convert ? GameVersion.RS2014 : GameVersion.RS2012);
            data.SignatureType = PackageMagic.CON;
            // set default volumes
            data.Volume = -6.5F; // default maybe too quite
            data.PreviewVolume = data.Volume;

            //Load song manifest
            var songsManifestJson = Directory.GetFiles(unpackedDir, "songs.manifest.json", SearchOption.AllDirectories);
            if (songsManifestJson.Length < 1)
                throw new DataException("No songs.manifest.json file found.");
            if (songsManifestJson.Length > 1)
                throw new DataException("More than one songs.manifest.json file found.");

            List<Attributes> attr = new List<Attributes>();
            var songsManifest = Manifest.Manifest.LoadFromFile(songsManifestJson[0]).Entries.ToArray();

            for (int smIndex = 0; smIndex < songsManifest.Count(); smIndex++)
            {
                var smData = songsManifest[smIndex].Value.ToArray()[0].Value;
                attr.Add(smData);
            }

            if (attr.FirstOrDefault() == null)
                throw new DataException("songs.manifest.json file did not parse correctly.");

            // Fill SongInfo
            data.SongInfo = new SongInfo();
            data.SongInfo.SongDisplayName = attr.FirstOrDefault().SongName;
            data.SongInfo.SongDisplayNameSort = attr.FirstOrDefault().SongNameSort;
            data.SongInfo.Album = attr.FirstOrDefault().AlbumName;
            data.SongInfo.SongYear = (attr.FirstOrDefault().SongYear == 0 ? 2012 : attr.FirstOrDefault().SongYear);
            data.SongInfo.Artist = attr.FirstOrDefault().ArtistName;
            data.SongInfo.ArtistSort = attr.FirstOrDefault().ArtistNameSort;
            data.Name = attr.FirstOrDefault().SongKey;

            //Load tone manifest, even poorly formed tone_bass.manifest.json
            var toneManifestJson = Directory.GetFiles(unpackedDir, "*tone*.manifest.json", SearchOption.AllDirectories);
            if (toneManifestJson.Length < 1)
                throw new DataException("No tone.manifest.json file found.");

            // toolkit produces multiple tone.manifest.json files when packing RS1 CDLC files
            // rather than change toolkit behavior just merge manifest files for now
            if (toneManifestJson.Length > 1)
            {
                var mergeSettings = new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union };
                JObject toneObject1 = new JObject();

                foreach (var tone in toneManifestJson)
                {
                    JObject toneObject2 = JObject.Parse(File.ReadAllText(tone));
                    //(toneObject1.SelectToken("Entries") as JArray).Merge(toneObject2.SelectToken("Entries"));
                    toneObject1.Merge(toneObject2, mergeSettings);
                }

                toneManifestJson = new string[1];
                toneManifestJson[0] = Path.Combine(unpackedDir, "merged.tone.manifest");
                string json = JsonConvert.SerializeObject(toneObject1, Formatting.Indented);
                File.WriteAllText(toneManifestJson[0], json);
            }

            List<Tone> tones = new List<Tone>();
            Manifest.Tone.Manifest toneManifest = Manifest.Tone.Manifest.LoadFromFile(toneManifestJson[0]);

            for (int tmIndex = 0; tmIndex < toneManifest.Entries.Count(); tmIndex++)
            {
                var tmData = toneManifest.Entries[tmIndex];
                tones.Add(tmData);
            }

            data.Tones = tones;

            // Load AggregateGraph.nt
            var songDir = Path.Combine(unpackedDir, data.Name);
            var aggFile = Directory.GetFiles(songDir, "*.nt", SearchOption.TopDirectoryOnly)[0];
            List<AgGraphNt> aggGraphData = AggregateGraph.AggregateGraph.ReadFromFile(aggFile);

            // Load Exports\Songs\*.xblock
            var xblockDir = Path.Combine(unpackedDir, data.Name, "Exports\\Songs");
            var xblockFile = Directory.GetFiles(xblockDir, "*.xblock", SearchOption.TopDirectoryOnly)[0];
            // xblockFile = "D:\\Temp\\Mapping\\songs.xblock";
            XblockX songsXblock = XblockX.LoadFromFile(xblockFile);

            // create project map for cross referencing arrangements with tones
            var projectMap = AggregateGraph.AggregateGraph.ProjectMap(aggGraphData, songsXblock, toneManifest);

            // Load xml arrangements
            var xmlFiles = Directory.GetFiles(unpackedDir, "*.xml", SearchOption.AllDirectories);
            if (xmlFiles.Length <= 0)
                throw new DataException("Can not find any XML arrangement files");

            List<Tone2014> tones2014 = new List<Tone2014>();

            foreach (var xmlFile in xmlFiles)
            {
                if (xmlFile.ToLower().Contains("metadata")) // skip DeadFox file
                    continue;

                // some poorly formed RS1 CDLC use just "vocal"
                if (xmlFile.ToLower().Contains("vocal"))
                {
                    var voc = new Arrangement();
                    voc.Name = ArrangementName.Vocals;
                    voc.ArrangementType = ArrangementType.Vocal;
                    voc.ScrollSpeed = 20;
                    voc.SongXml = new SongXML { File = xmlFile };
                    voc.SongFile = new SongFile { File = "" };
                    voc.CustomFont = false;

                    // Add Vocal Arrangement
                    data.Arrangements.Add(voc);
                }
                else
                {
                    Attributes2014 attr2014 = new Attributes2014();
                    Song rsSong = new Song();
                    Song2014 rsSong2014 = new Song2014();

                    // optimized tone matching effort using project mapping algo
                    var result = projectMap.First(m => Path.GetFileName(m.SongXmlPath).ToLower() == Path.GetFileName(xmlFile).ToLower());
                    if (result.Tones.Count != 1)
                        throw new DataException("Invalid RS1 CDLC Tones Data");

                    var arrangement = attr.First(s => s.SongXml.ToLower().Contains(result.LLID));
                    var tone = tones.First(t => t.Key == result.Tones[0]);

                    using (var obj1 = new Rs1Converter())
                    {
                        rsSong = obj1.XmlToSong(xmlFile);
                        data.SongInfo.AverageTempo = (int)obj1.AverageBPM(rsSong);
                    }

                    if (arrangement.Tuning == "E Standard")
                        rsSong.Tuning = new TuningStrings { String0 = 0, String1 = 0, String2 = 0, String3 = 0, String4 = 0, String5 = 0 };
                    else if (arrangement.Tuning == "DropD")
                        rsSong.Tuning = new TuningStrings { String0 = -2, String1 = 0, String2 = 0, String3 = 0, String4 = 0, String5 = 0 };
                    else if (arrangement.Tuning == "OpenG")
                        rsSong.Tuning = new TuningStrings { String0 = -2, String1 = -2, String2 = 0, String3 = 0, String4 = 0, String5 = -2 };
                    else if (arrangement.Tuning == "EFlat")
                        rsSong.Tuning = new TuningStrings { String0 = -1, String1 = -1, String2 = -1, String3 = -1, String4 = -1, String5 = -1 };
                    else // default to standard tuning
                    {
                        arrangement.Tuning = "E Standard";
                        rsSong.Tuning = new TuningStrings { String0 = 0, String1 = 0, String2 = 0, String3 = 0, String4 = 0, String5 = 0 };
                    }

                    // save/write the changes to xml file
                    using (var obj1 = new Rs1Converter())
                        obj1.SongToXml(rsSong, xmlFile, true);

                    if (convert)
                        using (var obj1 = new Rs1Converter())
                            tones2014.Add(obj1.ToneToTone2014(tone, rsSong));

                    var test = tones2014.ToArray();

                    // load attr2014 with RS1 mapped values for use by Arrangement()
                    attr2014.Tone_Base = tone.Name;
                    attr2014.ArrangementName = arrangement.ArrangementName;
                    attr2014.CentOffset = 0;
                    attr2014.DynamicVisualDensity = new List<float>() { 2 };
                    attr2014.SongPartition = arrangement.SongPartition;
                    attr2014.PersistentID = IdGenerator.Guid().ToString();
                    attr2014.MasterID_RDV = RandomGenerator.NextInt();
                    attr2014.ArrangementProperties = new SongArrangementProperties2014();

                    // processing order is important - CAREFUL
                    // RouteMask  None = 0, Lead = 1, Rhythm = 2, Any = 3, Bass = 4
                    // XML file names are usually meaningless to arrangement determination

                    if (arrangement.ArrangementName.ToLower().Contains("lead") ||
                        rsSong.Arrangement.ToLower().Contains("lead"))
                    {
                        attr2014.ArrangementName = "Lead";
                        attr2014.ArrangementType = (int)ArrangementType.Guitar;
                        attr2014.ArrangementProperties.RouteMask = (int)RouteMask.Lead;
                        attr2014.ArrangementProperties.PathLead = 1;
                        attr2014.ArrangementProperties.PathRhythm = 0;
                        attr2014.ArrangementProperties.PathBass = 0;
                    }
                    else if (arrangement.ArrangementName.ToLower().Contains("rhythm") ||
                        rsSong.Arrangement.ToLower().Contains("rhythm"))
                    // || rsSong.Arrangement.ToLower().Contains("guitar"))
                    {
                        attr2014.ArrangementName = "Rhythm";
                        attr2014.ArrangementType = (int)ArrangementType.Guitar;
                        attr2014.ArrangementProperties.RouteMask = (int)RouteMask.Rhythm;
                        attr2014.ArrangementProperties.PathLead = 0;
                        attr2014.ArrangementProperties.PathRhythm = 1;
                        attr2014.ArrangementProperties.PathBass = 0;
                    }
                    else if (arrangement.ArrangementName.ToLower().Contains("combo") ||
                        rsSong.Arrangement.ToLower().Contains("combo"))
                    {
                        attr2014.ArrangementName = "Combo";
                        attr2014.ArrangementType = (int)ArrangementType.Guitar;
                        attr2014.ArrangementProperties.RouteMask = arrangement.EffectChainName.ToLower().Contains("lead") ? (int)RouteMask.Lead : (int)RouteMask.Rhythm;
                        attr2014.ArrangementProperties.PathLead = arrangement.EffectChainName.ToLower().Contains("lead") ? 1 : 0;
                        attr2014.ArrangementProperties.PathRhythm = arrangement.EffectChainName.ToLower().Contains("lead") ? 0 : 1;
                        attr2014.ArrangementProperties.PathBass = 0;
                    }
                    else if (arrangement.ArrangementName.ToLower().Contains("bass") ||
                        rsSong.Arrangement.ToLower().Contains("bass"))
                    {
                        attr2014.ArrangementName = "Bass";
                        attr2014.ArrangementType = (int)ArrangementType.Bass;
                        attr2014.ArrangementProperties.RouteMask = (int)RouteMask.Bass;
                        attr2014.ArrangementProperties.PathLead = 0;
                        attr2014.ArrangementProperties.PathRhythm = 0;
                        attr2014.ArrangementProperties.PathBass = 1;
                    }
                    else
                    {
                        // default to Lead arrangment
                        attr2014.ArrangementName = "Lead";
                        attr2014.ArrangementType = (int)ArrangementType.Guitar;
                        attr2014.ArrangementProperties.RouteMask = (int)RouteMask.Lead;
                        attr2014.ArrangementProperties.PathLead = 1;
                        attr2014.ArrangementProperties.PathRhythm = 0;
                        attr2014.ArrangementProperties.PathBass = 0;

                        Console.WriteLine("RS1->RS2 CDLC Conversion defaulted to 'Lead' arrangment");
                    }

                    if (convert) // RS1 -> RS2 magic
                    {
                        using (var obj1 = new Rs1Converter())
                            rsSong2014 = obj1.SongToSong2014(rsSong);

                        // update ArrangementProperties
                        rsSong2014.ArrangementProperties.RouteMask = attr2014.ArrangementProperties.RouteMask;
                        rsSong2014.ArrangementProperties.PathLead = attr2014.ArrangementProperties.PathLead;
                        rsSong2014.ArrangementProperties.PathRhythm = attr2014.ArrangementProperties.PathRhythm;
                        rsSong2014.ArrangementProperties.PathBass = attr2014.ArrangementProperties.PathBass;
                        rsSong2014.ArrangementProperties.StandardTuning = (arrangement.Tuning == "E Standard" ? 1 : 0);

                        // <note time="58.366" linkNext="0" accent="0" bend="0" fret="7" hammerOn="0" harmonic="0" hopo="0" ignore="0" leftHand="-1" mute="0" palmMute="0" pluck="-1" pullOff="0" slap="-1" slideTo="-1" string="3" sustain="0.108" tremolo="0" harmonicPinch="0" pickDirection="0" rightHand="-1" slideUnpitchTo="-1" tap="0" vibrato="0" />
                        if (rsSong2014.Levels.Any(sl => sl.Notes.Any(sln => sln.Bend != 0)))
                            rsSong2014.ArrangementProperties.Bends = 1;
                        if (rsSong2014.Levels.Any(sl => sl.Notes.Any(sln => sln.Hopo != 0)))
                            rsSong2014.ArrangementProperties.Hopo = 1;
                        if (rsSong2014.Levels.Any(sl => sl.Notes.Any(sln => sln.SlideTo != -1)))
                            rsSong2014.ArrangementProperties.Slides = 1;
                        if (rsSong2014.Levels.Any(sl => sl.Notes.Any(sln => sln.Sustain > 0)))
                            rsSong2014.ArrangementProperties.Sustain = 1;

                        // fixing times that are off
                        var lastEbeatsTime = rsSong2014.Ebeats[rsSong2014.Ebeats.Length - 1].Time;
                        var lastPhraseIterationsTime = rsSong2014.PhraseIterations[rsSong2014.PhraseIterations.Length - 1].Time;

                        // tested ... not source of in game hangs
                        // confirm last PhraseIterations time is less than last Ebeats time
                        if (lastPhraseIterationsTime > lastEbeatsTime)
                        {
                            rsSong2014.PhraseIterations[rsSong2014.PhraseIterations.Length - 1].Time = lastEbeatsTime;
                            rsSong2014.Sections[rsSong2014.Sections.Length - 1].StartTime = lastEbeatsTime;
                        }

                        // tested ... not source of in game hangs
                        // confirm SongLength at least equals last Ebeats time
                        if (rsSong2014.SongLength < lastEbeatsTime)
                            rsSong2014.SongLength = lastEbeatsTime;

                        using (var obj2 = new Rs2014Converter())
                            obj2.Song2014ToXml(rsSong2014, xmlFile, true);
                    }

                    // Adding Song Arrangement
                    try
                    {
                        data.Arrangements.Add(new Arrangement(attr2014, xmlFile));
                    }
                    catch (Exception ex)
                    {
                        // mainly for the benifit of convert2012 CLI users
                        Console.WriteLine(@"This CDLC could not be auto converted." + Environment.NewLine + "You can still try manually adding the arrangements and assests." + Environment.NewLine + ex.Message);
                    }
                }
            }

            // get rid of duplicate tone names
            tones2014 = tones2014.Where(p => p.Name != null)
                .GroupBy(p => p.Name).Select(g => g.First()).ToList();
            data.TonesRS2014 = tones2014;

            //Get Album Artwork DDS Files
            var artFiles = Directory.GetFiles(unpackedDir, "*.dds", SearchOption.AllDirectories);
            if (artFiles.Length < 1)
                throw new DataException("No Album Artwork file found.");
            if (artFiles.Length > 1)
                throw new DataException("More than one Album Artwork file found.");

            var targetArtFiles = new List<DDSConvertedFile>();
            data.AlbumArtPath = artFiles[0];
            targetArtFiles.Add(new DDSConvertedFile() { sizeX = 256, sizeY = 256, sourceFile = artFiles[0], destinationFile = artFiles[0].CopyToTempFile(".dds") });
            data.ArtFiles = targetArtFiles;

            //Audio files
            var targetAudioFiles = new List<string>();
            var audioFiles = Directory.GetFiles(unpackedDir, "*.ogg", SearchOption.AllDirectories);
            if (audioFiles.Length < 1)
                throw new DataException("No Audio file found.");
            if (audioFiles.Length > 2)
                throw new DataException("Too many Audio files found.");

            int i;
            for (i = 0; i < audioFiles.Length; i++)
            {
                if (convert && audioFiles[i].Contains("_fixed.ogg")) // use it
                    break;
                if (!convert && !audioFiles[i].Contains("_fixed.ogg"))
                    break;
            }

            var sourcePlatform = unpackedDir.GetPlatform();
            if (targetPlatform.IsConsole != (sourcePlatform = audioFiles[i].GetAudioPlatform()).IsConsole)
            {
                var newFile = Path.Combine(Path.GetDirectoryName(audioFiles[i]), String.Format("{0}_cap.ogg", Path.GetFileNameWithoutExtension(audioFiles[i])));
                OggFile.ConvertAudioPlatform(audioFiles[i], newFile);
                audioFiles[i] = newFile;
            }

            targetAudioFiles.Add(audioFiles[i]);

            if (!targetAudioFiles.Any())
                throw new DataException("Audio file not found.");

            FileInfo a = new FileInfo(audioFiles[i]);
            data.OggPath = a.FullName;

            //AppID
            if (!convert)
            {
                var appidFile = Directory.GetFiles(unpackedDir, "*APP_ID*", SearchOption.AllDirectories);
                if (appidFile.Length > 0)
                    data.AppId = File.ReadAllText(appidFile[0]);
            }
            else
                data.AppId = "248750";

            //Package version
            var versionFile = Directory.GetFiles(unpackedDir, "toolkit.version", SearchOption.AllDirectories);
            if (versionFile.Length > 0)
                data.PackageVersion = GeneralExtensions.ReadPackageVersion(versionFile[0]);
            else data.PackageVersion = "1";

            if (convert)
                data.Tones = null;

            return data;
        }
예제 #57
0
 /// <summary>
 /// Returns all possible arrangements for the given hand.
 /// </summary>
 public IEnumerable<Arrangement> Analyze()
 {
     var comparer = new ArrangementComparer(_concealed, _meldCount);
       var arrangement = new Arrangement(0, _meldCount, _meldCount * 3);
       _usedMelds = _meldCount;
       _jantouValue = 0;
       Analyze(arrangement, 0, 0);
       var arrangements = _arrangements.Where(a => !_arrangements.Any(other => comparer.IsWorseThan(a, other))).OrderBy(a => a.Id);
       var compacter = new ArrangementGroupCompacter();
       return compacter.GetCompacted(arrangements);
 }