示例#1
0
        private async Task <(string, Card)> GachaSingle(string id = null, bool tenTimes = false)
        {
            GachaDetail gd = !string.IsNullOrWhiteSpace(id) ? await client.GetGacha(id) : data.RecentGachaDetails.FirstOrDefault(i => i.Value.Type == "permanent" || i.Value.Type == "limited").Value;

            if (gd == null)
            {
                gd = data.RecentGachaDetails.Last().Value;
            }
            var cards = gd.Details[0].ToList();
            var rates = gd.Rates[0].ToList();
            // 1. 选择稀有度
            double        sumRate  = rates.Sum(c => c.Value.Rate);
            double        tempRate = 0;
            List <double> sorted   = new List <double>();

            rates.ForEach(r => { tempRate += r.Value.Rate; sorted.Add(tempRate / sumRate); });
            double next = randomer.NextDouble();

            sorted.Add(next);
            sorted.Sort();
            var rate = int.Parse(rates[sorted.IndexOf(next)].Key);

            // 2. 十连三星保底
            if (tenTimes == true && rate == 2)
            {
                rate = 3;
            }
            // 3. 取出相应卡组
            cards = cards.Where(c => c.Value.RarityIndex == rate).ToList();
            sorted.Clear();
            tempRate = 0;
            sumRate  = 0;
            // 4. 大于三星时选择概率提升卡组
            if (rate > 3)
            {
                var pickups = cards.GroupBy(k => k.Value.Pickup).Select(g => new KeyValuePair <bool, double>(g.Key, g.Sum(k => k.Value.Weight))).ToList();
                sumRate = pickups.Sum(k => k.Value);
                pickups.ForEach(p => { tempRate += p.Value; sorted.Add(tempRate / sumRate); });
                next = randomer.NextDouble();
                sorted.Add(next);
                sorted.Sort();
                var pickup = pickups[sorted.IndexOf(next)].Key;
                cards = cards.Where(k => k.Value.Pickup == pickup).ToList();
                sorted.Clear();
                tempRate = 0;
                sumRate  = 0;
            }
            // 5. 取出卡片
            int nextIndex = randomer.Next(0, cards.Count - 1);

            return(cards[nextIndex].Key, data.Cards[cards[nextIndex].Key]);
        }
示例#2
0
        public async void DoHandleAsync(MiraiHttpSession session, IMessageBase[] chain, IBaseInfo info, bool isGroupMessage = true)
        {
            List <IMessageBase> result = null;
            IMessageBase        img    = null;

            sb.Clear();
            switch (chain.First(m => m.Type == "Plain").ToString())
            {
            case "单抽":
                logger.LogInformation($"{info.Name} 单抽");
                var card = await GachaSingle();

                var message = $"单抽结果: {stars[card.Item2.Rarity]} {data.Characters[card.Item2.CharacterId.ToString()].CharacterName[0]} - {card.Item2.Prefix[0]}";
                img = await session.UploadPictureAsync(UploadTarget.Group, await client.GetCardThumbPath(card.Item2.ResourceSetName, card.Item1));

                result = new List <IMessageBase>
                {
                    new PlainMessage(message),
                    img
                };
                logger.LogInformation(message);
                break;

            case "当期池子":
                GachaDetail gd        = GetRecentGachaDetail();
                DateTime    endTime   = DateTimeOffset.FromUnixTimeMilliseconds(long.Parse(gd.ClosedAt[0])).LocalDateTime;
                DateTime    startTime = DateTimeOffset.FromUnixTimeMilliseconds(long.Parse(gd.PublishedAt[0])).LocalDateTime;
                sb.AppendLine(gd.GachaName[0]);
                sb.AppendLine(gd.Information.NewMemberInfo[0]);
                sb.AppendLine($"{startTime} - {endTime}");
                img = await session.UploadPictureAsync(UploadTarget.Group, await client.GetGachaBannerImagePath(gd.BannerAssetBundleName));

                result = new List <IMessageBase>
                {
                    new PlainMessage(sb.ToString()),
                    img
                };
                logger.LogInformation(sb.ToString());
                break;

            case "十连":
                List <(string, Card)> cards = new List <(string, Card)>(11);
                for (int i = 0; i < 9; i++)
                {
                    cards.Add(await GachaSingle());
                }
                cards.Add(await GachaSingle(tenTimes: true));
                img = await session.UploadPictureAsync(UploadTarget.Group, await render.RenderGachaImageAsync(cards));

                sb.AppendLine("十连结果:");
                foreach (var item in cards)
                {
                    sb.AppendLine($"{stars[item.Item2.Rarity]} {data.Characters[item.Item2.CharacterId.ToString()].CharacterName[0]} - {item.Item2.Prefix[0]}");
                }
                result = new List <IMessageBase>
                {
                    new PlainMessage(sb.ToString()),
                    img
                };
                logger.LogInformation(sb.ToString());
                break;

            default:
                break;
            }
            if (isGroupMessage)
            {
                await session.SendGroupMessageAsync(((IGroupMemberInfo)info).Group.Id, result.ToArray());
            }
            else
            {
                await session.SendFriendMessageAsync(info.Id, result.ToArray());
            }
        }