示例#1
0
        private void JudgeResult()
        {
            if (IsGameOver())
            {
                PushMsg("很遗憾队伍全灭,请再接再厉!");
                return;
            }

            if (Gamers.Count == 1)
            {
                var winner      = Gamers.First();
                var treasureStr = TreasureTotal.ToString();
                if (string.IsNullOrEmpty(treasureStr))
                {
                    PushMsg($"获胜者为 {CodeApi.Code_At(winner.QQNum)} !但是没有任何物品掉落");
                    return;
                }

                PushMsg($"获胜者为 {CodeApi.Code_At(winner.QQNum)} !获得以下物品:\r\n{treasureStr}");
                TreasureTotal.SaveToPerson(winner.QQNum);
                return;
            }

            var msg       = "恭喜你们获得了胜利!\r\n";
            var treasures = TreasureTotal.Split();

            msg += $"{CodeApi.Code_At(Gamers[0].QQNum)} 获取了\r\n{treasures[0]}\r\n{CodeApi.Code_At(Gamers[1].QQNum)} 获取了\r\n{treasures[1]}";
            PushMsg(msg);

            treasures[0].SaveToPerson(Gamers[0].QQNum);
            treasures[1].SaveToPerson(Gamers[1].QQNum);
        }
示例#2
0
        private void PlayerAct(XunYuanGamingModel player, int choice, XunyuanMonsterModel monster, XunYuanGamingModel partner)
        {
            switch (choice)
            {
            case -1:
            {
                PushMsg("你放弃了思考!");
                break;
            }

            case 0:
            {
                monster.HP = Math.Max(0, monster.HP - player.Attack);
                PushMsg($"{monster.Name} 受到了 {CodeApi.Code_At(player.QQNum)} 的 {player.Attack} 点伤害,剩余 {monster.HP} 点生命值");
                break;
            }

            case 1:
            {
                partner.HP = Math.Max(0, partner.HP - player.Attack);
                PushMsg($"{CodeApi.Code_At(player.QQNum)} 受到了 {CodeApi.Code_At(player.QQNum)} 的 {player.Attack} 点伤害,剩余 {partner.HP} 点生命值");
                if (partner.IsDead)
                {
                    PushMsg($"{CodeApi.Code_At(partner.QQNum)} 被移除了队伍!");
                    Gamers.Remove(partner);
                }
                break;
            }
            }
        }
示例#3
0
        public bool Fight(MsgInformationEx MsgDTO, object[] param)
        {
            var aimNum = (long)param[0];

            if (MsgDTO.FromQQ == aimNum)
            {
                MsgSender.PushMsg(MsgDTO, "你无法跟自己对决!");
                return(false);
            }

            if (BindAiSvc.AllAiNums.Contains(aimNum))
            {
                MsgSender.PushMsg(MsgDTO, "鱼唇的人类,你无法挑战ai的威严!");
                return(false);
            }

            if (ChessSvc.IsGroupInPlaying(MsgDTO.FromGroup))
            {
                MsgSender.PushMsg(MsgDTO, "本群正在进行一场对决,请稍后再试!");
                return(false);
            }

            if (OSPersonBuff.CheckBuff(MsgDTO.FromQQ, "黄砂"))
            {
                MsgSender.PushMsg(MsgDTO, "你当前无法进行挑战!(黄砂)");
                return(false);
            }

            if (!WaiterSvc.WaitForConfirm(MsgDTO.FromGroup, aimNum, $"{CodeApi.Code_At(MsgDTO.FromQQ)} 正在向你发起一场对决,是否接受?", MsgDTO.BindAi, 10))
            {
                MsgSender.PushMsg(MsgDTO, "对决取消!");
                return(false);
            }

            if (ChessSvc.IsQQInPlaying(MsgDTO.FromQQ))
            {
                MsgSender.PushMsg(MsgDTO, "你正在进行一场对决,请稍后再试!");
                return(false);
            }

            if (ChessSvc.IsQQInPlaying(aimNum))
            {
                MsgSender.PushMsg(MsgDTO, "你的对手正在进行一场对决,请稍后再试!");
                return(false);
            }

            ChessSvc.StartAGame(MsgDTO.FromGroup, MsgDTO.FromQQ, aimNum, (GroupNum, QQNum, Msg, judge) =>
            {
                var msg       = MsgDTO.Clone();
                msg.FromQQ    = QQNum;
                msg.FromGroup = GroupNum;

                var info = WaiterSvc.WaitForInformation(msg, Msg,
                                                        information => information.FromGroup == GroupNum && information.FromQQ == QQNum && judge(information.Msg), 10, true);
                return(info == null ? string.Empty : info.Msg);
            }, MsgDTO.BindAi);

            return(true);
        }
示例#4
0
        private bool DealDiet(MsgInformationEx MsgDTO, string name, long aimQQ, int price)
        {
            var aimDietRec = CookingRecord.Get(aimQQ);

            if (!aimDietRec.CheckDiet(name))
            {
                MsgSender.PushMsg(MsgDTO, "对方没有该菜肴!");
                return(false);
            }

            var dietModel = CookingDietSvc[name];

            if (dietModel.EstimatedPrice < price)
            {
                MsgSender.PushMsg(MsgDTO, $"交易价格不能低于该菜肴的成本价格({dietModel.EstimatedPrice.CurencyFormat()})!");
                return(false);
            }

            var sourceOSPerson = OSPerson.GetPerson(MsgDTO.FromQQ);
            var fee            = OSPersonBuff.CheckBuff(MsgDTO.FromQQ, "苍天") ? 0 : price / 20;

            if (sourceOSPerson.Golds < price + fee)
            {
                MsgSender.PushMsg(MsgDTO, "你没有足够的金币来支付!");
                return(false);
            }

            var count = aimDietRec.CookedDietDic[name];
            var msg   = $"收到来自 {CodeApi.Code_At(MsgDTO.FromQQ)} 的交易请求:\r\n" +
                        $"希望得到的菜肴:{name}\r\n" +
                        $"价格:{price.CurencyFormat()}({dietModel.EstimatedPrice.CurencyFormat()})\r\n" +
                        $"你当前持有:{count}个,是否确认交易?";

            if (!WaiterSvc.WaitForConfirm(MsgDTO.FromGroup, aimQQ, msg, MsgDTO.BindAi, 10))
            {
                MsgSender.PushMsg(MsgDTO, "交易取消!");
                return(false);
            }

            var sourceDietRec = CookingRecord.Get(MsgDTO.FromQQ);

            sourceDietRec.AddDiet(name);
            sourceDietRec.Update();

            aimDietRec.DietConsume(name);
            aimDietRec.Update();

            sourceOSPerson.Golds -= price + fee;
            sourceOSPerson.Update();

            var aimOSPerson = OSPerson.GetPerson(aimQQ);

            aimOSPerson.Golds += price;
            aimOSPerson.Update();

            MsgSender.PushMsg(MsgDTO, "交易完毕!");
            return(true);
        }
示例#5
0
        public bool Xunyuan(MsgInformationEx MsgDTO, object[] param)
        {
            var aimQQ = (long)param[0];

            if (aimQQ == MsgDTO.FromQQ)
            {
                MsgSender.PushMsg(MsgDTO, "你无法和自己寻缘!");
                return(false);
            }

            if (!XunYuanMgr.CheckGroup(MsgDTO.FromGroup))
            {
                MsgSender.PushMsg(MsgDTO, "此群正在进行一场寻缘,请稍候再试!");
                return(false);
            }

            if (!XunYuanMgr.CheckQQNum(MsgDTO.FromQQ))
            {
                MsgSender.PushMsg(MsgDTO, "你正在进行一场寻缘,请稍候再试!");
                return(false);
            }

            if (!XunYuanMgr.CheckQQNum(aimQQ))
            {
                MsgSender.PushMsg(MsgDTO, "对方正在进行一场寻缘,请稍候再试!");
                return(false);
            }

            var msg = $"{CodeApi.Code_At(aimQQ)} 你正被邀请参加一次寻缘,是否同意?";

            if (!WaiterSvc.WaitForConfirm(MsgDTO.FromGroup, aimQQ, msg, MsgDTO.BindAi))
            {
                MsgSender.PushMsg(MsgDTO, "操作取消!");
                return(false);
            }

            var Gamers = new[] { MsgDTO.FromQQ, aimQQ }.Select(p =>
            {
                var armerRecord = PersonArmerRecord.Get(p);
                var osPerson    = OSPerson_Doremi.GetPerson(p);
                var levelModel  = LevelSvc.GetByLevel(osPerson.Level);

                var battleArmers = Rander.RandSort(armerRecord.Armers.ToArray()).Take(10).ToDictionary(a => a.Key, a => a.Value);
                return(new XunYuanGamingModel()
                {
                    QQNum = p,
                    Armers = battleArmers,
                    EscapeArmers = armerRecord.EscapeArmers,
                    BasicHP = levelModel.HP,
                    HP = levelModel.HP + ArmerSvc.CountHP(battleArmers),
                    BasicAttack = levelModel.Atk,
                    Attack = levelModel.Atk + ArmerSvc.CountAtk(battleArmers)
                });
            }).ToArray();

            XunYuanMgr.StartGame(Gamers, MsgDTO.FromGroup, MsgDTO.BindAi);
            return(true);
        }
示例#6
0
 public static void PushMsg(MsgInformationEx MsgInfo, string Content, bool isNeedAt = false)
 {
     PushMsg(new MsgCommand
     {
         Command = MsgInfo.Type == MsgType.Group ? CommandType.SendGroup : CommandType.SendPrivate,
         Msg     = MsgInfo.Type == MsgType.Group && isNeedAt ? $"{CodeApi.Code_At(MsgInfo.FromQQ)} {Content}" : Content,
         ToGroup = MsgInfo.FromGroup,
         ToQQ    = MsgInfo.FromQQ,
         BindAi  = MsgInfo.BindAi
     });
 }
示例#7
0
        public bool SayHello(MsgInformationEx MsgDTO, object[] param)
        {
            var query = HelloList.FirstOrDefault(h => h.GroupNum == MsgDTO.FromGroup && h.QQNum == MsgDTO.FromQQ);

            if (query == null)
            {
                MsgSender.PushMsg(MsgDTO, "你还没有设定过招呼内容哦~(请使用【打招呼设定】命令来设定每日打招呼内容!)");
                return(false);
            }

            MsgSender.PushMsg(MsgDTO, $"{CodeApi.Code_At(MsgDTO.FromQQ)} {query.Content}");
            return(true);
        }
示例#8
0
        private static void DoSkill(MsgInformationEx MsgDTO, long aimQQ, string key, DateTime rebornTime, string skillName)
        {
            var cache = new AliveStateCache
            {
                QQNum      = aimQQ,
                GroupNum   = MsgDTO.FromGroup,
                Name       = skillName,
                RebornTime = rebornTime
            };

            SCacheService.Cache(key, cache, rebornTime);

            MsgSender.PushMsg(MsgDTO, $"成功对 {CodeApi.Code_At(aimQQ)} 使用了 {skillName}!他将于 {rebornTime.ToString(CultureInfo.CurrentCulture)} 后复活!");
        }
示例#9
0
        private void MonsterTurn(XunyuanMonsterModel monster)
        {
            var target = Gamers[Rander.RandInt(Gamers.Count)];

            target.HP = Math.Max(0, target.HP - monster.Atk);
            PushMsg($"{CodeApi.Code_At(target.QQNum)} 受到了 {monster.Name} 的 {monster.Atk}点攻击伤害!剩余 {target.HP}点生命");
            if (!target.IsDead)
            {
                return;
            }

            PushMsg($"{CodeApi.Code_At(target.QQNum)} 被移除了队伍!");
            Gamers.Remove(target);
        }
示例#10
0
        public bool AdvantureAgainst(MsgInformationEx MsgDTO, object[] param)
        {
            var aimNum = (long)param[0];

            if (MsgDTO.FromQQ == aimNum)
            {
                MsgSender.PushMsg(MsgDTO, "你无法跟自己对决!");
                return(false);
            }

            if (BindAiSvc.AllAiNums.Contains(aimNum))
            {
                MsgSender.PushMsg(MsgDTO, "鱼唇的人类,你无法挑战ai的威严!");
                return(false);
            }

            if (!AdvGameSvc.CheckGroup(MsgDTO.FromGroup))
            {
                MsgSender.PushMsg(MsgDTO, "本群正在进行一场对决,请稍后再试!");
                return(false);
            }

            if (!WaiterSvc.WaitForConfirm(MsgDTO.FromGroup, aimNum,
                                          $"{CodeApi.Code_At(MsgDTO.FromQQ)} 正在向你发起一场冒险对决,是否接受?", MsgDTO.BindAi, 10))
            {
                MsgSender.PushMsg(MsgDTO, "对决取消!");
                return(false);
            }

            if (!AdvGameSvc.CheckPlayer(aimNum))
            {
                MsgSender.PushMsg(MsgDTO, "你的对手正在进行一场对决,请稍后再试!");
                return(false);
            }

            if (!AdvGameSvc.CheckPlayer(MsgDTO.FromQQ))
            {
                MsgSender.PushMsg(MsgDTO, "你正在进行一场对决,请稍后再试!");
                return(false);
            }

            AdvGameSvc.GameStart(MsgDTO.FromGroup, MsgDTO.FromQQ, aimNum, 1, MsgDTO.BindAi);
            return(true);
        }
示例#11
0
        private void Settlement()
        {
            var msg = $"对决结束!{CodeApi.Code_At(Winner.QQNum)}获取了胜利!";

            if (Bonus > 0)
            {
                msg += $"\r\n获得了全部赏金 {Bonus}金币!";
                var osPerson = OSPerson.GetPerson(Winner.QQNum);
                osPerson.Golds += Bonus;
                osPerson.Update();
            }
            MsgSender.PushMsg(GroupNum, 0, msg, BindAi);

            foreach (var player in players)
            {
                var p = AdvPlayer.GetPlayer(player.QQNum);
                p.BattleRecord(p.QQNum == Winner.QQNum);
                p.Update();
                if (p.QQNum != Winner.QQNum)
                {
                    var osPerson = OSPerson.GetPerson(p.QQNum);
                    osPerson.Golds -= 100;
                    osPerson.Update();
                    MsgSender.PushMsg(GroupNum, p.QQNum, $"你不幸输掉了对决,扣除100金币,你剩余金币为 {osPerson.Golds}", BindAi);
                    continue;
                }

                if (p.WinTotal % 10 != 0)
                {
                    continue;
                }

                var items = HonorSvc.CurMonthLimitItems();
                var item  = items.RandElement();
                MsgSender.PushMsg(GroupNum, p.QQNum, $"你已经累计赢得 {p.WinTotal}场对决,获取额外奖励 {item.Name}*1", BindAi);

                var record   = ItemCollectionRecord.Get(p.QQNum);
                var honorMsg = record.ItemIncome(item.Name);
                if (!string.IsNullOrEmpty(honorMsg))
                {
                    MsgSender.PushMsg(GroupNum, 0, honorMsg, BindAi);
                }
            }
        }
示例#12
0
        public bool ExchangeOwner(MsgInformationEx MsgDTO, object[] param)
        {
            var aimQQ = (long)param[0];

            if (!WaiterSvc.WaitForConfirm(MsgDTO, $"【警告】是否确认将群主移交给 {CodeApi.Code_At(aimQQ)}?(此操作不可逆)"))
            {
                MsgSender.PushMsg(MsgDTO, "操作取消!");
                return(false);
            }

            var setting = GroupSettingSvc[MsgDTO.FromGroup];

            setting.AuthInfo.Owner = aimQQ;

            setting.Update();

            MsgSender.PushMsg(MsgDTO, "已成功移交群主!");

            return(true);
        }
示例#13
0
        private string ProcessMonsterCave(MonsterCave cave)
        {
            var msg = "";
            var atk = CurPlayer.GetAtk();

            cave.HP = Math.Max(cave.HP - atk, 0);
            msg    += $"你打出了 {atk} 点伤害,{cave.Name}剩余{cave.HP}生命值\r\n";
            if (cave.HP > 0)
            {
                CurPlayer.HP = Math.Max(CurPlayer.HP - cave.Atk, 0);
                msg         += $"{cave.Name}对你造成了{cave.Atk}点伤害,你剩余{CurPlayer.HP}生命值";
            }
            else
            {
                OtherPlayer.HP = Math.Max(OtherPlayer.HP - cave.Atk, 0);
                msg           += $"{CodeApi.Code_At(OtherPlayer.QQNum)} 你受到了{cave.Atk}点伤害,你剩余{OtherPlayer.HP}生命值";
            }

            return(msg);
        }
示例#14
0
        public bool AttachSegment(MsgInformationEx MsgDTO, object[] param)
        {
            var aimQQ = (long)param[0];

            if (aimQQ == MsgDTO.FromQQ)
            {
                MsgSender.PushMsg(MsgDTO, "你无法和自己进行拼接!", true);
                return(false);
            }

            if (BindAiSvc.AllAiNums.Contains(aimQQ))
            {
                MsgSender.PushMsg(MsgDTO, "Stupid Human!", true);
                return(false);
            }

            var selfRecord = SegmentRecord.Get(MsgDTO.FromQQ);

            if (string.IsNullOrEmpty(selfRecord.Segment))
            {
                MsgSender.PushMsg(MsgDTO, "你当前没有任何碎片!", true);
                return(false);
            }

            var aimRecord = SegmentRecord.Get(aimQQ);

            if (string.IsNullOrEmpty(aimRecord.Segment))
            {
                MsgSender.PushMsg(MsgDTO, "对方当前没有任何碎片!", true);
                return(false);
            }

            var treasure = SegmentSvc.FindTreasureBySegment(selfRecord.Segment);

            if (!treasure.IsMatch(selfRecord.Segment, aimRecord.Segment))
            {
                MsgSender.PushMsg(MsgDTO, $"拼接失败,碎片不匹配!({selfRecord.Segment}×{aimRecord.Segment})");
                return(false);
            }

            selfRecord.AddTreasureRecord(treasure.Name);
            aimRecord.AddTreasureRecord(treasure.Name);

            var selfBonusItems = HonorSvc.RandItems(3);
            var aimBonusItems  = HonorSvc.RandItems(3);

            var selfIcRecord = ItemCollectionRecord.Get(MsgDTO.FromQQ);
            var aimIcRecord  = ItemCollectionRecord.Get(aimQQ);

            var selfRate = selfRecord.IsRare ? 2 : 1;

            foreach (var item in selfBonusItems)
            {
                selfIcRecord.ItemIncome(item.Name, selfRate);
            }

            var aimRate = aimRecord.IsRare ? 2 : 1;

            foreach (var item in aimBonusItems)
            {
                aimIcRecord.ItemIncome(item.Name, aimRate);
            }

            MsgSender.PushMsg(MsgDTO, treasure.ToString());

            var msg = "拼接成功!\r\n" +
                      $"{CodeApi.Code_At(MsgDTO.FromQQ)} 获得了{selfBonusItems.Select(p => $"{p.Name}*{selfRate}").JoinToString(",")} !\r\n" +
                      $"{CodeApi.Code_At(aimQQ)} 获得了{aimBonusItems.Select(p => $"{p.Name}*{aimRate}").JoinToString(",")} !";

            MsgSender.PushMsg(MsgDTO, msg);

            selfRecord.ClearSegment();
            aimRecord.ClearSegment();
            selfRecord.Update();
            aimRecord.Update();

            return(true);
        }
示例#15
0
        public override bool OnMsgReceived(MsgInformationEx MsgDTO)
        {
            if (base.OnMsgReceived(MsgDTO))
            {
                return(true);
            }

            if (MsgDTO.Type == MsgType.Group)
            {
                var bindAi = BindAiSvc.AiDic.Values.FirstOrDefault(p => MsgDTO.FullMsg.Contains(CodeApi.Code_At(p.SelfNum)));
                if (bindAi == null)
                {
                    return(false);
                }

                MsgDTO.BindAi = bindAi.Name;
            }

            var stateCache = AliveStateSvc.GetState(MsgDTO.FromGroup, MsgDTO.FromQQ);

            if (stateCache != null)
            {
                MsgSender.PushMsg(MsgDTO, $"你已经死了({stateCache.Name})!复活时间:{stateCache.RebornTime:yyyy-MM-dd HH:mm:ss}", true);
                return(false);
            }

            var limitRecord = DailyLimitRecord.Get(MsgDTO.FromQQ, "Tuling");

            if (!limitRecord.Check(TulingDailyLimit))
            {
                MsgSender.PushMsg(MsgDTO, "今天太累了,明天再找我说话吧~", MsgDTO.Type == MsgType.Group);
                return(false);
            }
            limitRecord.Cache();
            limitRecord.Update();

            foreach (var aiNum in BindAiSvc.AllAiNums)
            {
                MsgDTO.FullMsg = MsgDTO.FullMsg.Replace(CodeApi.Code_At(aiNum), string.Empty);
            }

            string response = null;

            foreach (var tuling in ApiKeys.Select(_ => ApiKeys[CurTulingIndex]))
            {
                response = RequestMsg(MsgDTO, tuling.ApiKey);
                if (!string.IsNullOrEmpty(response))
                {
                    break;
                }

                CurTulingIndex = (CurTulingIndex + 1) % ApiKeys.Count;
            }

            if (string.IsNullOrEmpty(response))
            {
                MsgSender.PushMsg(MsgDTO, "今天太累了,明天再找我说话吧~", MsgDTO.Type == MsgType.Group);
                return(false);
            }

            AIAnalyzer.AddCommandCount(new CmdRec()
            {
                FunctionalAi = AIName,
                Command      = "TulingOverride",
                GroupNum     = MsgDTO.FromGroup,
                BindAi       = MsgDTO.BindAi
            });
            MsgSender.PushMsg(MsgDTO, response, MsgDTO.Type == MsgType.Group);
            return(true);
        }
示例#16
0
        private bool DealItem(MsgInformationEx MsgDTO, string name, long aimQQ, int price)
        {
            var aimRecord = ItemCollectionRecord.Get(aimQQ);

            if (!aimRecord.CheckItem(name))
            {
                MsgSender.PushMsg(MsgDTO, "对方没有该物品!");
                return(false);
            }

            var originPrice = HonorSvc.GetItemPrice(HonorSvc.FindItem(name), aimQQ);

            if (originPrice > price)
            {
                MsgSender.PushMsg(MsgDTO, $"收购价格无法低于系统价格({originPrice.CurencyFormat()})!");
                return(false);
            }

            var sourceOSPerson = OSPerson.GetPerson(MsgDTO.FromQQ);
            var fee            = OSPersonBuff.CheckBuff(MsgDTO.FromQQ, "苍天") ? 0 : price / 20;

            if (sourceOSPerson.Golds < price + fee)
            {
                MsgSender.PushMsg(MsgDTO, "你没有足够的金币来支付!");
                return(false);
            }

            var count = aimRecord.GetCount(name);
            var msg   = $"收到来自 {CodeApi.Code_At(MsgDTO.FromQQ)} 的交易请求:\r\n" +
                        $"希望得到的物品:{name}\r\n" +
                        $"价格:{price.CurencyFormat()}({originPrice.CurencyFormat()})\r\n" +
                        $"你当前持有:{count}个,是否确认交易?";

            if (!WaiterSvc.WaitForConfirm(MsgDTO.FromGroup, aimQQ, msg, MsgDTO.BindAi, 10))
            {
                MsgSender.PushMsg(MsgDTO, "交易取消!");
                return(false);
            }

            aimRecord.ItemConsume(name);
            aimRecord.Update();

            var sourceRecord = ItemCollectionRecord.Get(MsgDTO.FromQQ);
            var content      = sourceRecord.ItemIncome(name);

            if (!string.IsNullOrEmpty(content))
            {
                MsgSender.PushMsg(MsgDTO, content, true);
            }

            var aimOSPerson = OSPerson.GetPerson(aimQQ);

            sourceOSPerson.Golds -= price + fee;
            aimOSPerson.Golds    += price;

            sourceOSPerson.Update();
            aimOSPerson.Update();

            MsgSender.PushMsg(MsgDTO, "交易完毕!");
            return(true);
        }