From 21628473763d177708ac53002eefef2905c6a259 Mon Sep 17 00:00:00 2001 From: grimm <1769111741@qq.com> Date: Mon, 6 May 2024 16:15:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=98=E6=96=97=E6=9C=8D=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/ljsd/fight/CheckFight.java | 106 ++++++++++-------- 1 file changed, 61 insertions(+), 45 deletions(-) diff --git a/fightmanager/src/main/java/com/ljsd/fight/CheckFight.java b/fightmanager/src/main/java/com/ljsd/fight/CheckFight.java index 4d266b605..7e587e82b 100644 --- a/fightmanager/src/main/java/com/ljsd/fight/CheckFight.java +++ b/fightmanager/src/main/java/com/ljsd/fight/CheckFight.java @@ -88,68 +88,84 @@ public class CheckFight { * 单线程执行每次用时50ms,目前支持并发100以内,再大用线程池异步处理 * @return {战斗结果, 战斗伤害/战斗时间,单位1剩余血量,单位2剩余血量,单位3剩余血量,单位4剩余血量,单位5剩余血量} */ - public long[] checkFight(int seed,int maxTime, LuaValue fightData, LuaValue optionData,FightType fightType){ + /** + * 执行战斗检查并返回结果。 + * @param seed 随机数种子 + * @param maxTime 最大时间或轮数 + * @param fightData 战斗数据 + * @param optionData 选项数据 + * @param fightType 战斗类型 + * @return 返回一个长整型数组,包含:战斗结果,战斗时间,以及各单位剩余血量等信息。 + */ + public long[] checkFight(int seed, int maxTime, LuaValue fightData, LuaValue optionData, FightType fightType) { LuaValue transCoderObj = this.getTransCoderObj(); - LuaValue func = transCoderObj.get(LuaValue.valueOf("Execute")); - LuaValue args = new LuaTable(); - args.set("seed",seed); - args.set("type",fightType.getType()); - args.set("maxRound",maxTime); - LuaValue result = func.call(args,fightData,optionData); - long[] resultCache = new long[9];//对方阵容走配置 Todo 后面结构走配置 - resultCache[0]= result.get("result").tolong(); - resultCache[1]= result.get("duration").tolong(); - LOGGER.info(" lua check test fight result : {} {}", resultCache[0] , result.length()); - for (int i = 1; i <= result.length(); i++) { - long talon = result.rawget(i).tolong(); - if (talon > 0) { - resultCache[i + 1] = talon; - } else { - resultCache[i + 1] = talon; - } - resultCache[i + 1] = result.rawget(i).tolong(); - LOGGER.info(i + " --> 单位剩余血量 : " + resultCache[i + 1]); + LuaValue result = callLuaValue(seed, maxTime, fightData, optionData, fightType, transCoderObj); + long[] resultCache = new long[9]; // 假定最多有8个单位的剩余血量信息 + + resultCache[0] = result.get("result").tolong(); + resultCache[1] = result.get("duration").tolong(); + LOGGER.info("Lua check test fight result: {} Length: {}", resultCache[0], result.length()); + + for (int i = 1; i <= result.length() && i < 8; i++) { + long remainingHealth = result.rawget(i).tolong(); + resultCache[i + 1] = remainingHealth; + LOGGER.info("{} --> 单位剩余血量: {}", i, remainingHealth); } - resultCache[8]= result.get("curRound").tolong(); + + resultCache[8] = result.get("curRound").tolong(); return resultCache; } - public long[][] checkHardStageFight(int seed,int maxTime, LuaValue fightData, LuaValue optionData,FightType fightType){ + public long[][] checkHardStageFight(int seed, int maxTime, LuaValue fightData, LuaValue optionData, FightType fightType) { LuaValue transCoderObj = this.getTransCoderObj(); long[][] resultX = new long[2][]; - LuaValue func = transCoderObj.get(LuaValue.valueOf("Execute")); - LuaValue args = new LuaTable(); - args.set("seed",seed); - args.set("type",fightType.getType()); - args.set("maxRound",maxTime); - LuaValue result = func.call( args,fightData,optionData); - int status = result.get("result").toint(); - int duration = result.get("duration").toint(); + LuaValue result = callLuaValue(seed, maxTime, fightData, optionData, fightType, transCoderObj); + + int status = 0; + int duration = 0; + LuaValue resultVal = result.get("result"); + if (!resultVal.isnil()) status = resultVal.toint(); + + resultVal = result.get("duration"); + if (!resultVal.isnil()) duration = resultVal.toint(); + long[] starRecord = new long[6]; - for(int x = 1; x <= result.get("starRecord").length() ; x++){ - long s = result.get("starRecord").rawget(x).tolong(); - starRecord[x-1] = s; + LuaValue starRecordVal = result.get("starRecord"); + if (!starRecordVal.isnil()) { + for (int x = 1; x <= starRecordVal.length() && x <= starRecord.length; x++) { + LuaValue val = starRecordVal.rawget(x); + if (!val.isnil()) { + starRecord[x - 1] = val.tolong(); + } + } } - long[] resultCache = new long[8];//对方阵容走配置 Todo 后面结构走配置 - resultCache[0]= status; - resultCache[1]= duration; - LOGGER.info(" lua check test fight result : {} {}", resultCache[0] , result.length()); - for (int i = 1; i <= result.length(); i++) { - long tolong = result.rawget(i).tolong(); - if(tolong>0){ - resultCache[i+1]= Math.min(Integer.MAX_VALUE,tolong); - }else { - resultCache[i+1]= Math.max(Integer.MIN_VALUE,tolong); + long[] resultCache = new long[8]; + resultCache[0] = status; + resultCache[1] = duration; + + for (int i = 2; i < resultCache.length && i <= result.length(); i++) { + LuaValue val = result.rawget(i); + if (!val.isnil()) { + resultCache[i] = val.toint(); } - resultCache[i+1] = result.rawget(i).toint(); - LOGGER.info(i+" --> 单位剩余血量 : "+ resultCache[i+1]); + LOGGER.info("{} --> 单位剩余血量 : {}", i, resultCache[i]); } + resultX[0] = resultCache; resultX[1] = starRecord; return resultX; } + public LuaValue callLuaValue(int seed, int maxTime, LuaValue fightData, LuaValue optionData, FightType fightType, LuaValue transCoderObj) { + LuaValue func = transCoderObj.get(LuaValue.valueOf("Execute")); + LuaValue args = new LuaTable(); + args.set("seed", seed); + args.set("type", fightType.getType()); + args.set("maxRound", maxTime); + return func.call(args, fightData, optionData); + } + public LuaValue getTransCoderObj(){ LuaValue transCoderObj = localTransCoderObj.get(); if(transCoderObj == null||localVersion.get()!=hotFixVersion.get()){