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