miduo_server/conf/BattleMain.lua

212 lines
8.5 KiB
Lua

---- linux
package.path = package.path ..';../luafight/?.lua';
require("Modules.Battle.Logic.Misc.BattleDefine")
require("Modules.Battle.Logic.Misc.BattleUtil")
require("Modules.Battle.Logic.Misc.BattleQueue")
require("Modules.Battle.Logic.Misc.BattleDictionary")
require("Modules.Battle.Logic.Misc.BattleList")
require("Modules.Battle.Logic.Misc.BattleObjectPool")
require("Modules.Battle.Logic.Base.BattleEvent")
require("Modules.Battle.Logic.Base.Random")
require("Modules.Battle.Logic.Base.RoleData")
require("Modules.Battle.Logic.Base.Buff")
require("Modules.Battle.Logic.Base.Skill")
require("Modules.Battle.Logic.Base.Passivity")
require("Modules.Battle.Logic.BattleLogic")
require("Modules.Battle.Logic.RoleLogic")
local BattleMain = {}
local BattleLogic = BattleLogic
local Random = Random
local _BattleErrorCache = {}
local _BattleErrorIndex = 0
local _seed
local _type
local _fightData
local _optionData
local function pairsByKeys(t)
local a = {}
for n in pairs(t) do
if n then
a[#a+1] = n
end
end
table.sort(a, function( op1, op2 )
local type1, type2 = type(op1), type(op2)
local num1, num2 = tonumber(op1), tonumber(op2)
if ( num1 ~= nil) and (num2 ~= nil) then
return num1 < num2
elseif type1 ~= type2 then
return type1 < type2
elseif type1 == "string" then
return op1 < op2
elseif type1 == "boolean" then
return op1
-- 以上处理: number, string, boolean
else -- 处理剩下的: function, table, thread, userdata
return tostring(op1) < tostring(op2) -- tostring后比较字符串
end
end)
local i = 0
return function()
i = i + 1
return a[i], t[a[i]]
end
end
local function PrintTable(tb)
local indent_str = "{"
local count = 0
for k,v in pairs(tb) do
count = count + 1
end
for k=1, #tb do
local v = tb[k]
if type(v) == "table" then
indent_str = indent_str .. PrintTable(v)
else
indent_str = indent_str .. tostring(v)
end
if k < count then
indent_str = indent_str..","
end
end
local index = 0
for k,v in pairsByKeys(tb) do
index = index + 1
if type(k) ~= "number" then
if type(v) == "table" then
indent_str = string.format("%s%s=%s", indent_str, tostring(k), PrintTable(v))
else
indent_str = string.format("%s%s=%s", indent_str, tostring(k), tostring(v))
end
if index < count then
indent_str = indent_str .. ","
end
end
end
indent_str = indent_str .. "}"
return indent_str
end
local function generateRecordFile()
local time = string.format("%d-%d-%d-%d-%d-%d",
os.date("%Y"),
os.date("%m"),
os.date("%d"),
os.date("%H"),
os.date("%M"),
os.date("%S"))
local file = io.open("luafight/BattleRecord/"..time..".txt", "a")
local record = BattleLogic.GetRecord()
for i=1, #record do
file:write(record[i].."\n")
end
io.close(file)
end
local function addBattleData()
local str = ""
str = str.."seed:\n"..tostring(_seed).."\n"
str = str.."type:\n"..tostring(_type).."\n"
str = str.."fightData:\n"..PrintTable(_fightData).."\n"
str = str.."optionData:\n"..PrintTable(_optionData).."\n"
_BattleErrorIndex = _BattleErrorIndex + 1
if _BattleErrorIndex > 5 then
_BattleErrorIndex = 1
end
_BattleErrorCache[_BattleErrorIndex] = str
end
function BattleMain.Execute(args, fightData, optionData)
_seed = args.seed
_type = args.type
_fightData = fightData
_optionData = optionData or {}
--该开关用于输出战斗过程中的日志,用于验证前后端是否出现战斗不同步
BattleLogic.IsOpenBattleRecord = false
local isError = false
local errorCache
if xpcall(function ()
Random.SetSeed(args.seed)
BattleLogic.Init(args.maxTime, fightData, optionData)
BattleLogic.Type = _type
BattleLogic.StartOrder()
while not BattleLogic.IsEnd do
BattleLogic.Update()
end
end, function (err)
isError = true
errorCache = "error:\n"..debug.traceback(err).."\n"
end) then
local resultList = {}
if BattleLogic.Result == 1 then --胜利记录我方剩余血量
local arr = BattleLogic.Query(function (r) return r.camp == 0 end, true)
for i=1, #arr do
resultList[i] = arr[i]:GetRoleData(RoleDataName.Hp)
end
elseif BattleLogic.Result == 0 then --失败记录敌方剩余血量
local arr = BattleLogic.Query(function (r) return r.camp == 1 end, true)
for i=1, #arr do
resultList[i] = arr[i]:GetRoleData(RoleDataName.Hp)
end
end
resultList.result = BattleLogic.Result
if BattleLogic.IsOpenBattleRecord then
generateRecordFile()
end
-- print -----------------------------------------
--for i=1, #resultList do
-- print("hp:"..resultList[i])
--end
--print("最终运行帧数:"..BattleLogic.CurFrame())
--print("result:"..BattleLogic.Result)
addBattleData()
return resultList
end
if isError then --捕获异常,并输出错误日志
local time = string.format("%d-%d-%d-%d-%d-%d",
os.date("%Y"),
os.date("%m"),
os.date("%d"),
os.date("%H"),
os.date("%M"),
os.date("%S"))
local file = io.open("luafight/LogError/"..time..".txt", "a")
file:write(errorCache)
file:write("seed:\n"..tostring(args.seed).."\n")
file:write("type:\n"..tostring(args.type).."\n")
file:write("fightData:\n"..PrintTable(_fightData).."\n")
file:write("optionData:\n"..PrintTable(_optionData).."\n")
file:write("\n\nlast com.ljsd.battle data:\n")
for i=1, #_BattleErrorCache do
file:write(string.format("\nindex:%d\n", i))
file:write(_BattleErrorCache[i])
end
io.close(file)
end
return { result = -1 }
end
--[[
BattleMain.Execute({seed=1565094199,maxTime=300}
,{enemyData={{{ai={0},camp=1,element=1,passivity={{45,1},{45,2}},professionId=0,property={139,117440,117440,18564,2911,2911,5960,0.0,0.0,0.05,0.15,0.2,1.5,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},quality=3,roleId=23,skill={0,{20001,0.7,{1,0.848,1},{13,2,0.1,2,4},{4,4,0.2,12,4}}},superSkill={1.5,{20002,0.7,{10,1.072,1,0.4},{13,3,0.2,1,4}},{30000,0.7,{4,4,0.2,9,2}}},type=4},teamSkill={}}},playerData={{camp=0,element=4,passivity={{5,0.3,1,0.1,5},{39,5,2800},{12,0.15,0.15,2},{44,0.1,4,0.05,6,2}},professionId=5,property={139,76728,76728,4144,3372,2321,3740,0,0,0,0,0.0847,1.5,0,1,1,0,0,0,0,0,0,0,0,0},quality=1,roleId=10005,skill={0,{20001,0.7,{1,0.65,2}},{30101,0.7,{24,1,0.68}},{30001,0.7,{4,1,0.2,9,2}}},superSkill={2,{20004,0.7,{2,0.86,2}},{10100,0.7,{24,1,0.74}}},type=1},{camp=0,element=3,passivity={{5,0.3,1,0.1,5},{39,5,2800},{12,0.15,0.15,2},{44,0.1,4,0.05,6,2}},professionId=5,property={139,76559,76559,4086,2372,3370,3734,0,0,0,0,0.0808,1.5,0,1,1,0,0,0,0,0,0,0,0,0},quality=1,roleId=10007,skill={0,{20001,0.7,{6,3,3,0.88,1},{4,2,0.15,8,4},{4,3,0.15,8,4}}},superSkill={2,{20001,0.7,{1,1.1,1}},{10721,0.7,{8,0,1,1}}},type=1},{camp=0,element=5,passivity={{6,0.25,1,0.25,1,10},{39,5,2800},{12,0.15,0.15,2},{44,0.1,4,0.05,6,2}},professionId=2,property={139,60127,60127,7669,1672,3242,4060,0,0,0,0,0.1287,1.5,0,1,1,0,0,0,0,0,0,0,0,0},quality=1,roleId=10015,skill={0,{20001,0.7,{10,0.95,2,0.3}}},superSkill={3,{20002,0.7,{33,1.4,2,1,10015,0.15,10},{16,0.04,1,10,2}}},type=1},{camp=0,element=1,passivity={{6,0.25,1,0.25,1,10},{39,5,2800},{12,0.15,0.15,2},{44,0.1,4,0.05,6,2}},professionId=1,property={140,72220,72220,3858,4378,2630,4246,0,0,0,0,0.1274,1.5,0,1,1,0,0,0,0,0,0,0,0,0},quality=1,roleId=10020,skill={0,{20001,0.7,{6,3,3,0.35,1}},{10002,0.7,{24,1,0.9}}},superSkill={5,{20000,0.7,{2,0.65,1}},{10000,0.7,{4,6,0.15,6,1}}},type=1},{camp=0,element=2,passivity={{14,0.4,2,0.3,1,10,1},{39,5,2800},{12,0.15,0.15,2},{44,0.1,4,0.05,6,2}},professionId=3,property={139,58750,58750,5175,2145,3634,3581,0,0,0,0,0.0915,1.5,0,1,1,0,0,0,0,0,0,0,0,0},quality=1,roleId=10008,skill={0,{20001,0.7,{29,4,4,0.45,2,2,0.1}}},superSkill={4,{20000,0.7,{2,0.7,2}},{20000,0.7,{3,0.15,1,8}}},type=1},teamSkill={}}}
,{{1,1,0},{1,6,11},{1,6,21},{1,6,31},{1,6,41},{1,6,51},{1,5,0}})
]]--
return BattleMain