miduo_server/fightmanager/src/main/java/com/ljsd/fight/CheckFight.java

188 lines
6.8 KiB
Java
Raw Normal View History

2019-11-27 10:33:27 +08:00
package com.ljsd.fight;
2019-11-25 16:13:24 +08:00
import manager.STableManager;
import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.jse.JsePlatform;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
2020-06-13 16:59:39 +08:00
import java.util.concurrent.atomic.AtomicInteger;
2019-11-25 16:13:24 +08:00
public class CheckFight {
private static final Logger LOGGER = LoggerFactory.getLogger(CheckFight.class);
private ThreadLocal<LuaValue> localTransCoderObj = new ThreadLocal<LuaValue>();
2020-06-13 16:59:39 +08:00
private ThreadLocal<Integer> localVersion = new ThreadLocal<>();
2019-11-25 16:13:24 +08:00
// private String luaFileName = null;
private CheckFight(){}
public static class Instance {
public final static CheckFight instance = new CheckFight();
}
public static CheckFight getInstance() {
return CheckFight.Instance.instance;
}
2020-06-13 16:59:39 +08:00
private AtomicInteger hotFixVersion = new AtomicInteger();
2019-11-25 16:13:24 +08:00
static class LuaHotFixBean{
private int version;
public int getVersion() {
return version;
}
}
public void luaHotFix(){
LuaHotFixBean luaHotFixBean = STableManager.getJsonFilePathInJsonConf("lua-hotfix.json", LuaHotFixBean.class);
2020-06-13 16:59:39 +08:00
if(luaHotFixBean!=null && hotFixVersion.get() < luaHotFixBean.getVersion()){
LOGGER.info("the curhotFixVersion={},the new hotFixVersion={} will hotfix ",hotFixVersion.get(),luaHotFixBean.getVersion());
//init();
2019-11-25 16:13:24 +08:00
LOGGER.info("the luahotfix done");
2020-06-13 16:59:39 +08:00
hotFixVersion.set(luaHotFixBean.getVersion());
2019-11-25 16:13:24 +08:00
}
}
2020-06-13 16:59:39 +08:00
// public void init(){
// LuaHotFixBean luaHotFixBean = STableManager.getJsonFilePathInJsonConf("lua-hotfix.json", LuaHotFixBean.class);
// if(luaHotFixBean!=null) {
// hotFixVersion = luaHotFixBean.getVersion();
// }
// }
2019-11-25 16:13:24 +08:00
public static String getPath(String prefixDir, String... filePath) throws IOException {
StringBuilder path = new StringBuilder();
path.append(getRootPath()).append(prefixDir);
for (String p : filePath) {
path.append(File.separator).append(p);
}
return path.toString();
}
public static String getRootPath() throws IOException {
StringBuilder path = new StringBuilder();
if (isWindows()) {// Window 系统
path.append(new File(".").getCanonicalPath()).append(File.separator);
}else {
path.append("../");
}
return path.toString();
}
public static boolean isWindows() {
String osName = System.getProperty("os.name");
return osName.matches("^(?i)Windows.*$");
}
/**
* 线50ms100线
2021-09-14 20:11:27 +08:00
* @return {, /1,2,3,4,5}
2019-11-25 16:13:24 +08:00
*/
2024-05-06 16:15:12 +08:00
/**
*
* @param seed
* @param maxTime
* @param fightData
* @param optionData
* @param fightType
* @return
*/
public long[] checkFight(int seed, int maxTime, LuaValue fightData, LuaValue optionData, FightType fightType) {
2019-11-25 16:13:24 +08:00
LuaValue transCoderObj = this.getTransCoderObj();
2024-05-06 16:15:12 +08:00
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);
2019-11-25 16:13:24 +08:00
}
2024-05-06 16:15:12 +08:00
resultCache[8] = result.get("curRound").tolong();
2019-11-25 16:13:24 +08:00
return resultCache;
}
2024-05-06 16:15:12 +08:00
public long[][] checkHardStageFight(int seed, int maxTime, LuaValue fightData, LuaValue optionData, FightType fightType) {
2021-05-11 21:31:07 +08:00
LuaValue transCoderObj = this.getTransCoderObj();
long[][] resultX = new long[2][];
2024-05-06 16:15:12 +08:00
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();
2021-05-11 21:31:07 +08:00
long[] starRecord = new long[6];
2024-05-06 16:15:12 +08:00
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();
}
}
2021-05-11 21:31:07 +08:00
}
2024-05-06 16:15:12 +08:00
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();
2021-05-11 21:31:07 +08:00
}
2024-05-06 16:15:12 +08:00
LOGGER.info("{} --> 单位剩余血量 : {}", i, resultCache[i]);
2021-05-11 21:31:07 +08:00
}
2024-05-06 16:15:12 +08:00
2021-05-11 21:31:07 +08:00
resultX[0] = resultCache;
resultX[1] = starRecord;
return resultX;
}
2024-05-06 16:15:12 +08:00
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);
}
2019-11-25 16:13:24 +08:00
public LuaValue getTransCoderObj(){
LuaValue transCoderObj = localTransCoderObj.get();
2020-06-13 16:59:39 +08:00
if(transCoderObj == null||localVersion.get()!=hotFixVersion.get()){
2019-11-25 16:13:24 +08:00
String luaFileName = null;
try {
luaFileName = getPath("luafight/BattleMain.lua");
} catch (IOException e) {
e.printStackTrace();
}
2020-06-13 16:59:39 +08:00
localVersion.set( hotFixVersion.get());
2019-11-25 16:13:24 +08:00
Globals globals = JsePlatform.debugGlobals();
transCoderObj = globals.loadfile(luaFileName).call();
localTransCoderObj.set(transCoderObj);
return transCoderObj;
}
return transCoderObj;
}
}