Beispiel #1
0
        public async Task <IHttpActionResult> LotteryAsync([Required] LotteryRequest request)
        {
            //中奖名单
            var wonEmployee = await _prizeService.GetListAsync(a => a.EmployeeId, a => a.Disable == (short)BaseModel.DisableEnum.Normal);

            var notWonEmployee = await _employeeService.GetListAsync(a => a.Id, a => !wonEmployee.Contains(a.Id));

            var prizeType = await _prizeTypeService.FirstOrDefaultAsync(a => a.Id == request.Type);

            //当前类型奖品的中奖人数
            var typeCount = await _prizeService.CountAsync(a => a.PrizeTypeId == request.Type);

            if (typeCount >= prizeType.Count)
            {
                return(Fail("奖品已经抽完"));
            }
            int xunhuanr = 0;

            if ((prizeType.Count - typeCount) <= prizeType.Num)
            {
                xunhuanr = (prizeType.Count - typeCount);
            }
            else
            {
                xunhuanr = prizeType.Num;
            }
            Random     rand  = new Random();
            List <int> plist = new List <int>();

            for (int i = 0; i < xunhuanr; i++)
            {
                var employeeId = Suiji(rand, plist, notWonEmployee);
                plist.Add(employeeId);
            }
            var result = await _prizeService.AddAsync(plist.Select(a => new Prize
            {
                EmployeeId = a,
                PrizeTypeId = prizeType.Id
            }).ToList());

            return(Succeed(new LotteryResponse
            {
                EmployeeIds = plist,
                Rounds = (prizeType.Count % prizeType.Num) == 0 ? (prizeType.Count / prizeType.Num) : (prizeType.Count / prizeType.Num + 1),
                RoundsIndex = (typeCount % prizeType.Num) == 0 ? (typeCount / prizeType.Num) : (typeCount / prizeType.Num + 1)
            }, "抽取成功"));
        }
Beispiel #2
0
        public int Call_LotteryDraw(LotteryRequest request)
        {
            LotteryResponse response = new LotteryResponse();
            var             p        = this.CurrentSession.GetBindPlayer();
            Lottery         l        = p.Lottery;
            DateTime        now      = DateTime.Now;

            int method = response.method = request.method;
            int mode   = response.mode = request.mode;

            response.rewardInfo = new RewardInfo()
            {
                items = new List <RewardItem>(),
                units = new List <UnitInfo>(),
                res   = new List <ResInfo>()
            };
            PlayerController playerController = Server.GetController <PlayerController>();
            PkgController    pkgController    = Server.GetController <PkgController>();

            //先判断是否免费
            if (method == 1)
            {
                //单抽
                if (mode == 1)
                {
                    //金币单抽
                    DLottery dl = DLotteries[1];
                    if (now >= l.GoldFreeNextTime)
                    {
                        DLotteryRand rand = null;
                        if (l.GoldBaseNumb <= 1)
                        {
                            rand           = this.Rand(dl.rand_sp, p.Level);
                            l.GoldBaseNumb = GameConfig.lottery_base_cnt;
                        }
                        else
                        {
                            rand            = this.Rand(dl.rand, p.Level);
                            l.GoldBaseNumb -= 1;
                        }
                        response.success = true;
                        response.rewardInfo.items.Add(new RewardItem()
                        {
                            id    = rand.item_id,
                            count = rand.item_cnt,
                        });
                        //todo: 滚屏广播

                        l.GoldUsedNumb += 1;
                        l.GoldFreeNumb -= 1;
                        if (l.GoldFreeNumb > 0)
                        {
                            l.GoldFreeNextTime = now.AddMinutes(dl.free_cd);//下次免费金币抽刷新时间
                        }
                        else
                        {
                            l.GoldFreeNextTime = DateTime.Today.AddDays(1);
                        }
                    }
                    else
                    {
                        bool canChou = false;
                        //扣道具
                        string reason = "金币单抽";
                        if (pkgController.TrySubItem(p, dl.cost_item, 1, reason, out var item))
                        {
                            canChou = true;
                        }
                        else
                        {
                            //扣钱
                            if (playerController.IsCurrencyEnough(p, CurrencyType.GOLD, dl.cost_res_cnt))
                            {
                                canChou = true;
                                playerController.AddCurrency(p, CurrencyType.GOLD, -dl.cost_res_cnt, reason);
                            }
                        }
                        if (canChou)
                        {
                            DLotteryRand rand = null;
                            if (l.GoldBaseNumb <= 1)
                            {
                                rand           = this.Rand(dl.rand_sp, p.Level);
                                l.GoldBaseNumb = GameConfig.lottery_base_cnt;
                            }
                            else
                            {
                                rand            = this.Rand(dl.rand, p.Level);
                                l.GoldBaseNumb -= 1;
                            }
                            response.success = true;
                            response.rewardInfo.items.Add(new RewardItem()
                            {
                                id    = rand.item_id,
                                count = rand.item_cnt
                            });

                            l.GoldUsedNumb += 1;

                            //todo: 滚屏广播
                        }
                    }
                }
                else//钻石单抽奖
                {
                    DLottery dl = DLotteries[2];
                    if (now >= l.DmdFreeNextTime)
                    {
                        DLotteryRand rand = null;
                        if (l.DmdBaseNumb <= 1)
                        {
                            rand          = this.Rand(dl.rand_sp, p.Level);
                            l.DmdBaseNumb = GameConfig.lottery_base_cnt;
                        }
                        else
                        {
                            rand           = this.Rand(dl.rand, p.Level);
                            l.DmdBaseNumb -= 1;
                        }
                        if (l.DmdUsedNumb == 0)
                        {
                            rand          = new DLotteryRand();
                            rand.item_id  = GameConfig.lottery_first_item_id;
                            rand.item_cnt = GameConfig.lottery_first_item_cnt;
                        }
                        response.success = true;

                        response.rewardInfo.items.Add(new RewardItem()
                        {
                            id    = rand.item_id,
                            count = rand.item_cnt
                        });

                        //todo: 滚屏广播
                        l.DmdUsedNumb    += 1;
                        l.DmdFreeNumb    -= 1;
                        l.DmdFreeNextTime = now.AddMinutes(dl.free_cd);//下次免费金币抽刷新时间
                    }
                    else
                    {
                        bool canChou = false;
                        //扣道具
                        string reason = "钻石单抽";
                        if (pkgController.TrySubItem(p, dl.cost_item, 1, reason, out var item))
                        {
                            canChou = true;
                        }
                        else
                        {
                            //扣钱
                            if (playerController.IsCurrencyEnough(p, CurrencyType.DIAMOND, dl.cost_res_cnt))
                            {
                                canChou = true;
                                playerController.AddCurrency(p, CurrencyType.DIAMOND, -dl.cost_res_cnt, reason);
                            }
                        }
                        if (canChou)
                        {
                            DLotteryRand rand = null;
                            if (l.DmdBaseNumb <= 1)
                            {
                                rand          = this.Rand(dl.rand_sp, p.Level);
                                l.DmdBaseNumb = GameConfig.lottery_base_cnt;
                            }
                            else
                            {
                                rand           = this.Rand(dl.rand, p.Level);
                                l.DmdBaseNumb -= 1;
                            }
                            response.success = true;
                            response.rewardInfo.items.Add(new RewardItem()
                            {
                                id    = rand.item_id,
                                count = rand.item_cnt
                            });
                            //todo: 滚屏广播
                            l.DmdUsedNumb += 1;
                        }
                    }
                }
            }
            else
            {
                //十连抽
                if (mode == 1)
                {//金币抽
                    string   reason = "金币十连抽";
                    DLottery dl     = DLotteries[1];
                    int      cost   = (int)(dl.cost_res_cnt * 10d * dl.ten_discount / 100d);
                    if (playerController.IsCurrencyEnough(p, CurrencyType.GOLD, cost))
                    {
                        playerController.AddCurrency(p, CurrencyType.GOLD, -cost, reason);

                        for (int i = 0; i < 10; i++)
                        {
                            DLotteryRand rand = null;
                            if (l.GoldBaseNumb <= 1)
                            {
                                rand           = this.Rand(dl.rand_sp, p.Level);
                                l.GoldBaseNumb = GameConfig.lottery_base_cnt;
                            }
                            else
                            {
                                rand            = this.Rand(dl.rand, p.Level);
                                l.GoldBaseNumb -= 1;
                            }

                            response.rewardInfo.items.Add(new RewardItem()
                            {
                                id    = rand.item_id,
                                count = rand.item_cnt
                            });
                        }
                        //todo: 滚屏广播


                        response.success  = true;
                        l.Gold10UsedNumb += 1;
                    }
                }
                else
                {//钻石抽
                    string   reason = "钻石十连抽";
                    DLottery dl     = DLotteries[2];
                    int      cost   = (int)(dl.cost_res_cnt * 10d * dl.ten_discount / 100d);
                    if (playerController.IsCurrencyEnough(p, CurrencyType.DIAMOND, cost))
                    {
                        playerController.AddCurrency(p, CurrencyType.DIAMOND, -cost, reason);

                        for (int i = 0; i < 10; i++)
                        {
                            DLotteryRand rand = null;
                            if (l.DmdBaseNumb <= 1)
                            {
                                if (l.Dmd10UsedNumb == 0)
                                {
                                    rand = this.Rand(dl.rand_first10, p.Level);
                                }
                                else
                                {
                                    rand = this.Rand(dl.rand_sp, p.Level);
                                }
                                l.DmdBaseNumb = GameConfig.lottery_base_cnt;
                            }
                            else
                            {
                                rand           = this.Rand(dl.rand, p.Level);
                                l.DmdBaseNumb -= 1;
                            }

                            response.rewardInfo.items.Add(new RewardItem()
                            {
                                id    = rand.item_id,
                                count = rand.item_cnt
                            });
                        }
                        //todo: 滚屏广播

                        l.Dmd10UsedNumb += 1;
                        response.success = true;
                    }
                }
            }

            if (response.success)
            {
                String reason;
                if (mode == 1)
                {
                    reason = "金币";
                }
                else
                {
                    reason = "钻石";
                }
                if (method == 1)
                {
                    reason += "单抽";
                }
                else
                {
                    reason += "十连抽";
                }
                foreach (var kv in response.rewardInfo.items.GroupBy(x => x.id))
                {
                    int itemid  = kv.Key;
                    int itemcnt = kv.Sum(m => m.count);
                    pkgController.AddItem(p, itemid, itemcnt, reason);
                }
            }
            response.diamond             = p.Wallet.DIAMOND;
            response.diamondBaseNumb     = l.DmdBaseNumb;
            response.diamondFreeNextTime = l.DmdFreeNextTime.ToUnixTime();
            response.diamondUsedNumb     = l.DmdUsedNumb;
            response.gold             = p.Wallet.GOLD;
            response.goldBaseNumb     = l.GoldBaseNumb;
            response.goldFreeNextTime = l.GoldFreeNextTime.ToUnixTime();
            response.goldUsedNumb     = l.GoldUsedNumb;
            response.goldFreeNumb     = l.GoldFreeNumb;
            response.diamondFreeNumb  = l.DmdFreeNumb;

            CurrentSession.SendAsync(response);
            return(0);
        }