namespace Application.Domain; public static class GameBus { #region 物品资源操作 public static async Task UpdateBag(string userId, int operate, string goodsType, string parameter, long count, string remark) { bool isok = false; if (goodsType.Equals(nameof(GameEnum.PropCode.Goods))) { var goodsService = App.GetService(); isok = await goodsService.UpdateUserGoods(userId, operate, Convert.ToInt32(parameter), (int)count, remark); } else if (goodsType.Equals(nameof(GameEnum.PropCode.Equ))) { var equService = App.GetService(); if (operate == 1) { isok = await equService.AddUserEqu(userId, Convert.ToInt32(parameter), (int)count, remark); } else { isok = await equService.DeductUserEqu(userId, Convert.ToInt32(parameter), (int)count, remark); } } else if (goodsType.Equals(nameof(GameEnum.PropCode.copper))) { var accService = App.GetService(); isok = await accService.UpdateUserCopper(userId, operate, count); } else if (goodsType.Equals(nameof(GameEnum.PropCode.gold))) { var accService = App.GetService(); isok = await accService.UpdateUserAcc(userId, operate, nameof(AccEnum.AccType.gold), count, nameof(AccEnum.Name.其他), remark); } else if (goodsType.Equals(nameof(GameEnum.PropCode.cowry))) { var accService = App.GetService(); isok = await accService.UpdateUserAcc(userId, operate, nameof(AccEnum.AccType.cowry), count, nameof(AccEnum.Name.其他), remark); } else if (goodsType.Equals(nameof(GameEnum.PropCode.vigour))) { var attrService = App.GetService(); isok = await attrService.UpdateUserVigour(userId, operate, count); } else if (goodsType.Equals(nameof(GameEnum.PropCode.exp))) { var attrService = App.GetService(); isok = await attrService.UpdateUserExp(userId, count, operate); } else if (goodsType.Equals(nameof(GameEnum.PropCode.renown))) { var accService = App.GetService(); isok = await accService.UpdateUserAccBath(userId, operate, nameof(AccEnum.AccType.renown), count, nameof(AccEnum.Name.其他), remark); } else if (goodsType.Equals(nameof(GameEnum.PropCode.teach))) { var accService = App.GetService(); isok = await accService.UpdateUserAccBath(userId, operate, nameof(AccEnum.AccType.teach), count, nameof(AccEnum.Name.其他), remark); } else if (goodsType.Equals(nameof(GameEnum.PropCode.map))) { var mapService = App.GetService(); isok = await mapService.AddUserCityMap(userId, Convert.ToInt32(parameter)); } return isok; } public static async Task UpdateBag(string userId, int operate, dynamic Reward, string remark = "", long count = 1) { try { foreach (var item in Reward) { long num = Convert.ToInt64(item.count) * count; if (num <= 0) { continue; } await UpdateBag(userId, operate, item.code, item.parameter, num, remark); } return true; } catch { return false; } } #endregion #region 验证 public static async Task CheckNeed(string userId, dynamic data, int count = 1) { List needs = new List(); foreach (var item in data) { needs.Add(new TowerNeed() { code = Convert.ToString(item.code), name = Convert.ToString(item.name), parameter = Convert.ToString(item.parameter), count = Convert.ToInt64(item.count), retCount = Convert.ToInt64(item.retCount) }); } return await CheckNeed(userId, needs, count); } public static async Task CheckNeed(string userId, TowerNeed item, int count = 1) { CheckTowerNeed result = new CheckTowerNeed(); result.Needs = new List(); bool isok = true; int isDeal = 1; int isGive = 1; item.isAsk = 1; if (item.code == nameof(GameEnum.PropCode.Equ)) { var equService = App.GetService(); var myOpEqu = await equService.GetUserEquByEquIdToDeduct(userId, Convert.ToInt32(item.parameter)); int MyCount = myOpEqu.Count; long needCount = item.count * count; item.count = needCount; item.onCount = MyCount; if (MyCount < needCount) { item.isAsk = 0; isok = false; } } else if (item.code == nameof(GameEnum.PropCode.Goods)) { int MyCount = 0; var goodsService = App.GetService(); var goodsInfo = await goodsService.GetUserGoodsInfo(userId, Convert.ToInt32(item.parameter)); if (goodsInfo != null) { MyCount = (int)goodsInfo.count; if (goodsInfo.isDeal == 0) { isDeal = 0; } if (goodsInfo.isGive == 0) { isGive = 0; } } long needCount = item.count * count; item.count = needCount; item.onCount = MyCount; if (MyCount < needCount) { isok = false; item.isAsk = 0; } } else if (item.code == nameof(GameEnum.PropCode.copper)) { var accService = App.GetService(); var MyAcc = await accService.GetUserAccInfo(userId, nameof(AccEnum.AccType.copper)); long needAcc = item.count * count; item.count = needAcc; item.onCount = MyAcc; if (MyAcc < needAcc) { isok = false; item.isAsk = 0; } } else if (item.code == nameof(GameEnum.PropCode.gold)) { var accService = App.GetService(); var MyAcc = await accService.GetUserAccInfo(userId, nameof(AccEnum.AccType.gold)); long needAcc = item.count * count; item.count = needAcc; item.onCount = MyAcc; if (MyAcc < needAcc) { item.isAsk = 0; isok = false; } } else if (item.code == nameof(GameEnum.PropCode.vigour)) //活力 { var attrService = App.GetService(); var MyAcc = await attrService.GetUserVigourInfo(userId); long needAcc = item.count * count; item.count = needAcc; item.onCount = (long)MyAcc.vitality; if (MyAcc.vitality < needAcc) { item.isAsk = 0; isok = false; } } else if (item.code == nameof(GameEnum.PropCode.lev)) { var attrService = App.GetService(); var MyLev = await attrService.GetUserLev(userId); item.count = item.count; item.onCount = MyLev; if (MyLev < item.count) { item.isAsk = 0; isok = false; } } result.result = isok; result.isDeal = isDeal; result.isGive = isGive; result.Needs.Add(item); return result; } public static async Task CheckNeed(string userId, List needs, int count = 1) { CheckTowerNeed result = new CheckTowerNeed(); result.Needs = new List(); bool isok = true; int isDeal = 1; int isGive = 1; foreach (var item in needs) { var checkResult = await CheckNeed(userId, item, count); if (isok) { isok = checkResult.result; } if (checkResult.isDeal == 0) { isDeal = 0; } if (checkResult.isGive == 0) { isGive = 0; } result.Needs.AddRange(checkResult.Needs); } result.result = isok; result.isDeal = isDeal; result.isGive = isGive; return result; } public static async Task CheckNeeds(string userId, List needs, int count = 1) { CheckTowerNeeds result = new CheckTowerNeeds(); bool isok = true; int isDeal = 1; int isGive = 1; result.Needs = new List(); foreach (var item in needs) { item.isAsk = 1; if (item.code == nameof(GameEnum.PropCode.Equ)) { var equService = App.GetService(); int MyCount = await equService.GetUserEquByEquIdCount(userId, Convert.ToInt32(item.parameter)); long needCount = item.count * count; item.count = needCount; item.onCount = MyCount; if (MyCount < needCount) { item.isAsk = 0; isok = false; } } else if (item.code == nameof(GameEnum.PropCode.Goods)) { int MyCount = 0; var goodsService = App.GetService(); var goodsInfo = await goodsService.GetUserGoodsInfo(userId, Convert.ToInt32(item.parameter)); if (goodsInfo != null) { MyCount = (int)goodsInfo.count; if (goodsInfo.isDeal == 0) { isDeal = 0; } if (goodsInfo.isGive == 0) { isGive = 0; } } long needCount = item.count * count; item.count = needCount; item.onCount = MyCount; if (MyCount < needCount) { isok = false; item.isAsk = 0; } } else if (item.code == nameof(GameEnum.PropCode.copper)) { var accService = App.GetService(); var MyAcc = await accService.GetUserAccInfo(userId, nameof(AccEnum.AccType.copper)); long needAcc = item.count * count; item.count = needAcc; item.onCount = MyAcc; if (MyAcc < needAcc) { isok = false; item.isAsk = 0; } } else if (item.code == nameof(GameEnum.PropCode.gold)) { var accService = App.GetService(); var MyAcc = await accService.GetUserAccInfo(userId, nameof(AccEnum.AccType.gold)); long needAcc = item.count * count; item.count = needAcc; item.onCount = MyAcc; if (MyAcc < needAcc) { item.isAsk = 0; isok = false; } } else if (item.code == nameof(GameEnum.PropCode.vigour)) //活力 { var attrService = App.GetService(); var MyAcc = await attrService.GetUserVigourInfo(userId); long needAcc = item.count * count; item.count = needAcc; item.onCount = (long)MyAcc.vitality; if (MyAcc.vitality < needAcc) { item.isAsk = 0; isok = false; } } else if (item.code == nameof(GameEnum.PropCode.lev)) { var attrService = App.GetService(); var MyLev = await attrService.GetUserLev(userId); item.count = item.count; item.onCount = MyLev; if (MyLev < item.count) { isok = false; } } result.Needs.Add(item); } result.result = isok; result.isDeal = isDeal; result.isGive = isGive; return result; } #endregion #region 概率 public static RandomDataBase GetRandomByWeight(List data) { var _randomInstance = new Random(); if (data.Count == 0) { return null; } double totalWeight = data.Sum(it => it.random); int rnd = _randomInstance.Next(Convert.ToInt32(totalWeight) + 1); double current = 0; foreach (var item in data) { current += item.random; if (rnd < current) { return item; } } return null; } public static List GetRandomGoods(RandomModel random, int count = 1, decimal luck = 0) { List result = new List(); for (int i = 0; i < count; i++) { List timeAward = new List(); if (random.code == nameof(RandomModel.RandomCode.Weight)) { timeAward = RandomHandleByWeight(random, luck); } else { timeAward = RandomHandleByChance(random, luck); } foreach (var item in timeAward) { var onAward = result.FindIndex(it => it.code == item.code && it.parameter == item.par); if (onAward > -1) { result[onAward].count += RandomAssist.GetFormatedNumeric(item.minCount, item.maxCount); } else { TowerGet add = new TowerGet() { code = item.code, name = item.name, parameter = item.par, count = RandomAssist.GetFormatedNumeric(item.minCount, item.maxCount) }; result.Add(add); } } } return result; } private static List RandomHandleByWeight(RandomModel random, decimal luck = 0) { var _randomInstance = new Random(); List result = new List(); double empty = random.empty * (1.0 + (double)luck) / 100; if (_randomInstance.NextDouble() > empty) { return result; } if (random.data.Count == 0) { return result; } double totalWeight = random.data.Sum(it => it.chance); int rnd = _randomInstance.Next(Convert.ToInt32(totalWeight) + 1); double current = 0; foreach (var item in random.data) { current += item.chance; if (rnd < current) { result.Add(item); return result; } } return result; } private static List RandomHandleByChance(RandomModel random, decimal luck = 0) { var _randomInstance = new Random(); List result = new List(); double empty = (random.empty / 100); if (_randomInstance.NextDouble() > empty) { return result; } if (random.data.Count == 0) { return result; } foreach (var item in random.data) { double rnd = _randomInstance.NextDouble(); double okChance = (item.chance / 100) * (1.0 + Convert.ToDouble(luck)); if (rnd < okChance) { result.Add(item); } } return result; } #endregion }