diff --git a/Service/Application.Domain.Entity/logdb/db/game_fight_data.cs b/Service/Application.Domain.Entity/logdb/db/game_fight_data.cs index 5e6fd63..dc49111 100644 --- a/Service/Application.Domain.Entity/logdb/db/game_fight_data.cs +++ b/Service/Application.Domain.Entity/logdb/db/game_fight_data.cs @@ -97,12 +97,6 @@ namespace Application.Domain.Entity [SugarColumn(IsNullable = true)] public string? pars { get; set; } - /// - /// 预计用时 - /// - [SugarColumn(IsNullable = true)] - public long? dueTime { get; set; } - /// /// addTime /// diff --git a/Service/Application.Domain/Services/Interface/Fight/IGameFightService.cs b/Service/Application.Domain/Services/Interface/Fight/IGameFightService.cs index ef8b379..04d0990 100644 --- a/Service/Application.Domain/Services/Interface/Fight/IGameFightService.cs +++ b/Service/Application.Domain/Services/Interface/Fight/IGameFightService.cs @@ -13,7 +13,7 @@ public interface IGameFightService Task RemoveFightHarm(string fightId, string userId); Task AddFight(string fightId, string areaCode, string keyId, string mainId, string code, string scene, string mapId, - string userId,long dueTime, long exp = 0, long copper = 0, long petExp = 0, string award = "", string pars = ""); + string userId, long exp = 0, long copper = 0, long petExp = 0, string award = "", string pars = ""); Task SetFightWin(game_fight_data fightData, string winUser, bool setDefMap=true); Task HandleFightData(); @@ -29,7 +29,10 @@ public interface IGameFightService Task RemoveFightGoods(string mapId, string mgId); Task AutoUseDrug(UserAttrModel user, game_fight_data fight); Task HandelFightEnd(string userId, List data); - Task ValidFight(game_fight_data fight, bool isBlack = true); + Task CheckFightLock(string userId, string lockStr); + Task SetFightLock(string userId); + Task FightIsCool(string userId); + Task SetFightCool(string userId, long CoolTime); #endregion } \ No newline at end of file diff --git a/Service/Application.Domain/Services/Service/Fight/GameFightService.cs b/Service/Application.Domain/Services/Service/Fight/GameFightService.cs index 277cdd5..8eab714 100644 --- a/Service/Application.Domain/Services/Service/Fight/GameFightService.cs +++ b/Service/Application.Domain/Services/Service/Fight/GameFightService.cs @@ -94,7 +94,7 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa public async Task AddFight(string fightId, string areaCode, string keyId, string mainId, string code, string scene, string mapId, - string userId, long dueTime, long exp = 0, long copper = 0, long petExp = 0, string award = "", + string userId,long exp = 0, long copper = 0, long petExp = 0, string award = "", string pars = "") { long addTime = TimeExtend.GetTimeStampMilliseconds; @@ -119,7 +119,6 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa petExp = petExp, award = award, pars = pars, - dueTime = dueTime, addTime = addTime, okTime = 0, endTime = endTime @@ -382,11 +381,6 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa public async Task HandleFight(game_fight_data fightData) { - if (await ValidFight(fightData) == false) - { - return; - } - string winUser = fightData.winUser; string lowUser = fightData.userId == winUser ? fightData.mainId : fightData.userId; @@ -701,26 +695,34 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa await Task.CompletedTask; } - - public async Task ValidFight(game_fight_data fight, bool isBlack = true) + + public async Task CheckFightLock(string userId, string lockStr) { - bool result = true; - if (fight.dueTime > 0) - { - int diffTime = Convert.ToInt32(fight.okTime - fight.addTime); - if (diffTime < 3000) - { - result = diffTime >= fight.dueTime; - if (result == false && isBlack) //异常处理 - { - //封禁账号 - var userService = App.GetService(); - await userService.BlackUser(fight.userId); - } - } - } + string key = string.Format(BaseCache.BaseCacheKey, "FightLock"); + var onData = await redis.GetHashAsync(key, userId); + return onData == lockStr; + } - return result; + public async Task SetFightLock(string userId) + { + string lockStr = StringAssist.NewGuid; + string key = string.Format(BaseCache.BaseCacheKey, "FightLock"); + await redis.AddHashAsync(key, userId, lockStr); + return lockStr; + } + + public async Task FightIsCool(string userId) + { + string key = string.Format(BaseCache.BaseCacheKey, "FightCool"); + var onData = await redis.GetHashAsync(key, userId); + return TimeExtend.GetTimeStampMilliseconds >= onData; + } + + public async Task SetFightCool(string userId, long CoolTime) + { + long lockStr = TimeExtend.GetTimeStampMilliseconds + CoolTime; + string key = string.Format(BaseCache.BaseCacheKey, "FightCool"); + await redis.AddHashAsync(key, userId, lockStr); } #endregion diff --git a/Service/Application.Domain/Tool/Base/FightCompute.cs b/Service/Application.Domain/Tool/Base/FightCompute.cs new file mode 100644 index 0000000..435c93a --- /dev/null +++ b/Service/Application.Domain/Tool/Base/FightCompute.cs @@ -0,0 +1,217 @@ +using Dm.util; + +namespace Application.Domain; + +public class FightCompute +{ + public static FightResultModel ComputeFight(UserAttrModel atkUser, UserAttrModel defUser) + { + int result = 0; + int myHarm = 0; + int otHarm = 0; + List myStateData = new List(); + List myRemData = new List(); + List otStateData = new List(); + List otRemData = new List(); + + var atkHandle = UnitFight(atkUser, defUser); + myHarm += atkHandle.atkHarm; + otHarm += atkHandle.defHarm; + otStateData.AddRange(atkHandle.stateData); + otRemData.AddRange(atkHandle.remData); + if (defUser.IsSystem == 1) { + var defHandle = UnitFight(defUser, atkUser); + myHarm += defHandle.defHarm; + otHarm += defHandle.atkHarm; + myStateData.AddRange(defHandle.stateData); + myRemData.AddRange(defHandle.remData); + } + + return new FightResultModel() { + result = result, + myHarm = myHarm, + otHarm = otHarm, + myStateData = myStateData, + myRemData = myRemData, + otStateData = otStateData, + otRemData = otRemData + }; + } + + private static UnitFightResult UnitFight(UserAttrModel atkUser, UserAttrModel defUser) + { + int atkHarm = 0; + int defHarm = 0; + List stateData = new List(); + List remData = new List(); + //闪避处理 + if (defUser.Dodge > 0) + { + decimal dodgeRide = defUser.Dodge - atkUser.Deadly + defUser.DeadlyLess; + if (dodgeRide > 0) + { + if (randomTrigger(dodgeRide)) + { + return new UnitFightResult() + { + atkHarm = 0, + defHarm = 0, + stateData = stateData, + remData = remData + }; + } + } + } + + //士气处理 + if (atkUser.upMorale > 0) + { + atkUser.minAtk = Convert.ToInt32(atkUser.minAtk * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3)); + } + + if (defUser.upMorale > 0) + { + defUser.defense = Convert.ToInt32(defUser.defense * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3)); + } + + if (atkUser.minAtk > defUser.defense && defUser.defense > 0) + { + double harmRide = (atkUser.minAtk - defUser.defense) / defUser.defense; + harmRide = harmRide > 1.2 ? 1.2 : harmRide; + double fight_Harm = harmRide * atkUser.maxAtk; + defHarm +=Convert.ToInt32( 0 - fight_Harm); + } + else + { + defHarm = -1; + } + + //暴击处理 + if (atkUser.Crit > 0) + { + if (randomTrigger(atkUser.Crit)) + { + defHarm = Convert.ToInt32(defHarm * 1.5) ; + } + } + + //处理反弹 + if (defUser.Rebound > 0) + { + decimal reboundRide = defUser.Rebound = atkUser.ReboundLess; + if (reboundRide > 0) + { + atkHarm += Convert.ToInt32( defHarm * reboundRide); + } + } + + defHarm +=Convert.ToInt32(0 - atkUser.Harm_Add) ; //额外伤害 + //连击处理 + if (atkUser.Atk_Next > 0) + { + if (randomTrigger(atkUser.Atk_Next)) + { + defHarm =Convert.ToInt32( defHarm * 1.3); + atkHarm += Convert.ToInt32(atkHarm * 1.3) ; + } + } + + //免伤处理 + if (defUser.NoHarm > 0 && defHarm < -1) + { + defHarm = Convert.ToInt32( defHarm * (1 - defUser.NoHarm)); + defHarm = defHarm > 0 ? 0 : defHarm; + } + + //吸血处理 + if (defHarm < 0 && atkUser.InBlood > 0) + { + decimal inBloodRide = atkUser.InBlood - defUser.Punish; + if (inBloodRide > 0) + { + atkHarm += Convert.ToInt32((0 - defHarm) * inBloodRide); + } + } + + //#region 状态类处理 + decimal slow = atkUser.Slow - defUser.SlowLess; + if (randomTrigger(slow)) + { + stateData.Add("Slow"); + } + + decimal poison = atkUser.Poison - defUser.PoisonLess; + if (randomTrigger(poison)) + { + stateData.Add("Poison"); + } + + decimal curse = atkUser.Curse - defUser.CurseLess; + if (randomTrigger(curse)) + { + stateData.Add("Curse"); + } + + decimal weaken = atkUser.Weaken - defUser.WeakenLess; + if (randomTrigger(weaken)) + { + stateData.Add("Weaken"); + } + + decimal depressed = atkUser.Depressed - defUser.DepressedLess; + if (randomTrigger(depressed)) + { + stateData.Add("Depressed"); + } + + decimal breach = atkUser.Breach - defUser.BreachLess; + if (randomTrigger(breach)) + { + stateData.Add("Breach"); + } + + decimal palsyatk = atkUser.PalsyAtk - defUser.PalsyAtkLess; + if (randomTrigger(palsyatk)) + { + stateData.Add("PalsyAtk"); + } + + if (randomTrigger(atkUser.Del_Fashion)) + { + if (defUser.code == nameof(UserEnum.AttrCode.Person)) + { + remData.Add(new FightRemoveData() + { + code = "Equ", + par = "Fashion", + count = 1 + }); + } + } + + //#endregion + + return new UnitFightResult() + { + atkHarm = atkHarm, + defHarm = defHarm, + stateData = stateData, + remData = remData + }; + } + + private static bool randomTrigger(decimal rate) + { + Random random = new Random(); + double rand = random.NextDouble(); + return rand < Convert.ToDouble(rate); + } +} + +public class UnitFightResult +{ + public int atkHarm { get; set; } + public int defHarm { get; set; } + public List stateData { get; set; } + public List remData { get; set; } +} \ No newline at end of file diff --git a/Service/Application.Web/Controllers/Pub/FightController.cs b/Service/Application.Web/Controllers/Pub/FightController.cs index 8ed18d9..3243087 100644 --- a/Service/Application.Web/Controllers/Pub/FightController.cs +++ b/Service/Application.Web/Controllers/Pub/FightController.cs @@ -102,10 +102,8 @@ public class FightController : ControllerBase } } - var otAttr = await _monsterService.GetMonsterAttrModel(keyId, mainId); - long dueTime = FightTool.GetFightDueTime(userAttr, otAttr); bool result = await _fightService.AddFight(fightId, areaCode, keyId, mainId, code, scene, mapId, userId, - dueTime, exp, + exp, copper, petExp, award, pars); if (result) { @@ -177,11 +175,8 @@ public class FightController : ControllerBase long petExp = 0; string award = string.Empty; string pars = ""; - var userAttr = await _attrService.GetUserAttrModel(userId); - var otAttr = await _attrService.GetUserAttrModel(otUser.userId); - long dueTime = FightTool.GetFightDueTime(userAttr, otAttr); bool result = await _fightService.AddFight(fightId, areaCode, keyId, otUser.userId, code, onMapInfo.code, - onMapInfo.mapId, userId, dueTime, exp, + onMapInfo.mapId, userId, exp, copper, petExp, award, pars); if (result) { @@ -227,57 +222,68 @@ public class FightController : ControllerBase #region 此处处理战斗 - FightResultModel fightResult = new FightResultModel() - { - result = -1 - }; - if (!string.IsNullOrEmpty(parms.data)) - { - fightResult = JsonConvert.DeserializeObject(parms.data); - } - - #endregion - - //更新攻击 + var myAttr = await _attrService.GetUserAttrModel(userId, fight.scene); UserAttrModel otAttr = new UserAttrModel(); if (fight.code == nameof(GameEnum.FightCode.PVE)) { otAttr = await _monsterService.GetMonsterAttrModel(fight.keyId, fight.mainId); - if (fightResult.result == 0) - { - otAttr.blood = otAttr.blood + fightResult.otHarm; - otAttr.blood = otAttr.blood < 0 ? 0 : otAttr.blood; - otAttr.blood = otAttr.blood > otAttr.upBlood ? otAttr.upBlood : otAttr.blood; - await _monsterService.SetMonsterBlood(fight.keyId, otAttr.blood); - } } else { - if (fightResult.result == 0) - { - await _fightService.SetUserFightHarm(fight.mainId, fightResult.otHarm); - await _attrService.UpdateUserBlood(fight.mainId, 1, fightResult.otHarm); - await _attrService.AddUserLoadState(fight.mainId, fightResult.otStateData); - await _fightService.HandelFightEnd(fight.mainId, fightResult.otRemData); - } - otAttr = await _attrService.GetUserAttrModel(fight.mainId, fight.scene); } - if (fightResult.result == 0) + int cool = FightTool.GetFightCool(myAttr.agility, otAttr.agility); //冷却时间 + + FightResultModel fightResult = new FightResultModel() { - if (otAttr.blood > 0) + result = -1 + }; + + if (await _fightService.CheckFightLock(userId, parms.key)) + { + //此处还需要判断冷却时间 + bool isCool = await _fightService.FightIsCool(userId); + if (isCool) { - myHarm = fightResult.myHarm; - myHarm += await _fightService.GetUserFightHarm(userId); - otHarm = fightResult.otHarm; - await _attrService.UpdateUserBlood(userId, 1, fightResult.myHarm); - await _attrService.AddUserLoadState(userId, fightResult.myStateData); - await _fightService.HandelFightEnd(userId, fightResult.myRemData); + fightResult = FightCompute.ComputeFight(myAttr, otAttr); + if (fightResult.result == 0) + { + //此处记录冷却时间 + await _fightService.SetFightCool(userId, cool); + otAttr.blood = otAttr.blood + fightResult.otHarm; + otAttr.blood = otAttr.blood < 0 ? 0 : otAttr.blood; + otAttr.blood = otAttr.blood > otAttr.upBlood ? otAttr.upBlood : otAttr.blood; + if (fight.code == nameof(GameEnum.FightCode.PVE)) + { + await _monsterService.SetMonsterBlood(fight.keyId, otAttr.blood); + } + else + { + await _fightService.SetUserFightHarm(fight.mainId, fightResult.otHarm); + await _attrService.UpdateUserBlood(fight.mainId, 1, fightResult.otHarm); + await _attrService.AddUserLoadState(fight.mainId, fightResult.otStateData); + await _fightService.HandelFightEnd(fight.mainId, fightResult.otRemData); + } + + if (otAttr.blood > 0) + { + myAttr.blood = myAttr.blood + fightResult.otHarm; + myAttr.blood = myAttr.blood < 0 ? 0 : myAttr.blood; + myAttr.blood = myAttr.blood > myAttr.upBlood ? myAttr.upBlood : myAttr.blood; + + myHarm = fightResult.myHarm; + myHarm += await _fightService.GetUserFightHarm(userId); + otHarm = fightResult.otHarm; + await _attrService.UpdateUserBlood(userId, 1, fightResult.myHarm); + await _attrService.AddUserLoadState(userId, fightResult.myStateData); + await _fightService.HandelFightEnd(userId, fightResult.myRemData); + } + } } } - var myAttr = await _attrService.GetUserAttrModel(userId, fight.scene); + #endregion //结束战斗都此处直接返回 if (otAttr.blood < 1 || myAttr.blood < 1) @@ -312,21 +318,19 @@ public class FightController : ControllerBase //获取个人负面 var myLoad = await _attrService.GetUserLoadState(userId); - //冷却时间 - int cool = FightTool.GetFightCool(myAttr.agility, otAttr.agility); - - int exitCopper = otAttr.lev * 5; //退出战斗需要的铜贝 + string fightKey = await _fightService.SetFightLock(userId); var result = new { myHarm, otHarm, - myAttr = myAttr, - otAttr = otAttr, + myAttr = new { no = myAttr.viceId, name = myAttr.name, blood = myAttr.blood, upBlood = myAttr.upBlood }, + otAttr = new { no = otAttr.viceId, name = otAttr.name, blood = otAttr.blood, upBlood = otAttr.upBlood }, myDrug = myDrug.drug, myLoad = myLoad, exitCopper, cool, + key = fightKey }; return PoAction.Ok(result); } @@ -631,11 +635,6 @@ public class FightController : ControllerBase return PoAction.Message("该战斗不可复刻挂机!"); } - if (await _fightService.ValidFight(fight,false) == false) - { - return PoAction.Message("异常的战斗,无法挂机!"); - } - var myAttr = await _attrService.GetUserAttrModel(userId, fight.scene); int diffTime = Convert.ToInt32(fight.okTime - fight.addTime); diffTime = diffTime < 300 ? 300 : diffTime; diff --git a/Service/Application.Web/Model/RequestParms/Fight/FightParms.cs b/Service/Application.Web/Model/RequestParms/Fight/FightParms.cs index c28e5f2..76d084d 100644 --- a/Service/Application.Web/Model/RequestParms/Fight/FightParms.cs +++ b/Service/Application.Web/Model/RequestParms/Fight/FightParms.cs @@ -3,5 +3,5 @@ public class FightParms { public string fightId { get; set; } - public string data { get; set; } + public string key { get; set; } } \ No newline at end of file diff --git a/Web/src/pages/fight/index.vue b/Web/src/pages/fight/index.vue index c85c79a..e367ec6 100644 --- a/Web/src/pages/fight/index.vue +++ b/Web/src/pages/fight/index.vue @@ -10,10 +10,10 @@ 攻击  .  - 查看 + 查看 - 查看 + 查看  .  撤退({{ exitCopper }}铜贝) @@ -68,6 +68,7 @@ const myDrug = ref>([]); const myLoad = ref>([]); const exitCopper = ref(0); const coolTime = ref(0); +const fightKey = ref(''); let coolLock = false;//冷却锁 const coolTimer = ref(0);//冷却定时器 @@ -89,8 +90,8 @@ onUnmounted(() => { }) /**加载方法 */ -const BindData = async (data: string): Promise => { - let result = await FightService.Fight(fightId, data); +const BindData = async (fig:string): Promise => { + let result = await FightService.Fight(fightId, fig); if (result.code == 0) { myAttr.value = result.data.myAttr as IUserAttr; otAttr.value = result.data.otAttr as IUserAttr; @@ -100,7 +101,8 @@ const BindData = async (data: string): Promise => { coolTime.value = result.data.cool; dataLock = false; myHarm.value = result.data.myHarm; - otHarm.value = result.data.otHarm; + otHarm.value = result.data.otHarm; + fightKey.value = result.data.key; } else if (result.code == 100) { PageExtend.RedirectTo("/fight/result?f=" + fightId); @@ -150,10 +152,8 @@ const UseFightDrug = async (drugId: string) => { /**攻击 */ const FightAtk = async () => { if (coolLock == false && dataLock == false) { - StartCool(); - let result = FightTool.FightHandle(myAttr.value, otAttr.value); - let data = JSON.stringify(result); - await BindData(data); + StartCool(); + await BindData(fightKey.value); } } diff --git a/Web/src/services/Index/FightService.ts b/Web/src/services/Index/FightService.ts index 9f1cabe..d34d72a 100644 --- a/Web/src/services/Index/FightService.ts +++ b/Web/src/services/Index/FightService.ts @@ -22,10 +22,10 @@ export class FightService { * 战斗接口 * POST /Fight/Fight * @param fightId body - * @param data body + * @param key body */ - static async Fight(fightId: string, data: string) { - return await ApiService.Request("post", "/Fight/Fight", { fightId, data }); + static async Fight(fightId: string, key: string) { + return await ApiService.Request("post", "/Fight/Fight", { fightId, key }); } /** diff --git a/任务生成/resource/map.xls b/任务生成/resource/map.xls index f2f1ef2..15bdffb 100644 Binary files a/任务生成/resource/map.xls and b/任务生成/resource/map.xls differ