脚本选择¶
本小节将大致介绍当程序开始运行时,lua部分是如何决定运行Play文件夹下的哪个脚本的。当用户在config的操作台中给出IS_TEST_MODE = true/false、gTestPlay = ""或OPPONENT_NAME = ""后,启动代码,大致决策流程如下:
Select Play¶
在程序开始运行时,先运行SelectPlay.lua,判断运行哪个脚本。如果是TestMode则运行config里指定的test脚本(即gTestPlay = ""),如果不是TestMode则运行config里指定的NormalKick脚本(即OPPONENT_NAME = "")
首先,把gNormalPlay赋值为gOppoConfig里的NorPlay,gOppoConfig在opponent文件夹下赋值,详见下文
gNormalPlay = gOppoConfig.NorPlay
接着开始选Play,这一部分主要是确定gCurrentPlay的值
if SelectRefPlay() then --首先确定有没有裁判盒指令
RunRefScript(curRefMsg) --curRefMsg为收到的裁判盒指令。
dofile("../lua_scripts/ssl/play/Ref/"..curRefMag..".lua")
dofile后进入Play/Ref下的一系列脚本,在其中决定gCurrentPlay的值,这些脚本分为三类 第一类:直接给gCurrentPlay赋值,如gameHalt.lua、gameOver.lua、gameStop.lua等等,其中可根据球在场上的位置决定gCurrentPlay,例如gameStop.lua:
if OPPONENT_NAME == "PureDefence8" then --OPPONENT_NAME在config中规定
if ball.refPosX() < -480/1200*param.pitchLength and math.abs(ball.refPosY()) > 300/900*param.pitchWidth then
gCurrentPlay = "Ref_CornerDef_PureDefence8"
elseif ball.refPosX() > 100/1200*param.pitchLength then
gCurrentPlay = "Ref_FrontDef_PureDefence8"
elseif ball.refPosX() >-100/1200*param.pitchLength then
gCurrentPlay = "Ref_MiddleDef_PureDefence8"
else
gCurrentPlay = "Ref_BackDef_PureDefence8"
end
elseif OPPONENT_NAME == "NormalKick" then
gCurrentPlay = "Ref_Stop_normal"
else
gCurrentPlay = "Ref_Stop_show"
end
if OPPONENT_NAME == "NormalKick_show" then
if ball.refPosX() > 480/1200*param.pitchLength and math.abs(ball.refPosY()) > 300/900*param.pitchWidth then
dofile("../lua_scripts/ssl/play/Ref/CornerKick/CornerKick.lua")
elseif ball.refPosX() > 100/1200*param.pitchLength then
dofile("../lua_scripts/ssl/play/Ref/FrontKick/FrontKick.lua")
elseif ball.refPosX()>-100/1200*param.pitchLength then
dofile("../lua_scripts/ssl/play/Ref/MiddleKick/MiddleKick.lua")
else
dofile("../lua_scripts/ssl/play/Ref/BackKick/BackKick.lua")
end
else
if ball.refPosX() > 480/1200*param.pitchLength and math.abs(ball.refPosY()) > 300/900*param.pitchWidth then
dofile("../lua_scripts/ssl/play/Ref/CornerKick/CornerKick.lua")
elseif ball.refPosX()>0 then
dofile("../lua_scripts/ssl/play/Ref/FrontKick/FrontKick.lua")
else
dofile("../lua_scripts/ssl/play/Ref/BackKick/BackKick.lua")
end
end
if type(gOppoConfig.KickOff) == "function" then
gCurrentPlay = cond.getOpponentScript("Ref_KickOffV", gOppoConfig.KickOff(), 1)
else
gCurrentPlay = cond.getOpponentScript("Ref_KickOffV", gOppoConfig.KickOff, 1)
end
--或Play/Ref/BackKick/BackKick.lua:
if type(gOppoConfig.BackKick) == "function" then
gCurrentPlay = cond.getOpponentScript("Ref_BackKickV", gOppoConfig.BackKick(), 3)
else
gCurrentPlay = cond.getOpponentScript("Ref_BackKickV", gOppoConfig.BackKick, 3)
end
else
if IS_TEST_MODE then
gCurrentPlay = gTestPlay --由config里的gTestPlay决定
else
SelectBayesPlay()
--在SelectBayesPlay()中把gCurrentPlay = gNormalPlay
end
end
gLastPlay = gCurrentPlay
--print("gCurrentPlay: ", gCurrentPlay)
RunPlay(gCurrentPlay)
debugEngine:gui_debug_msg(CGeoPoint:new_local(-50, -param.pitchWidth/2),gCurrentState)
Opponent¶
opponent中的NormalKick系列脚本的功用在前文的SelectPlay部分已经提及,此处仅提供一个参考样例
gOppoConfig = {
------------------------------play-----------------------------------
CornerKick = {"Ref_CornerKick_show"},
FrontKick = {"Ref_FrontKick_show"},
MiddleKick = {"Ref_MiddleKick_show"},
BackKick = {"Ref_BackKick_show"},
-------------------------------Def-----------------------------------
CornerDef = "Ref_CornerDef_show",
FrontDef = "Ref_FrontDef_show",
MiddleDef = "Ref_MiddleDef_show",
BackDef = "Ref_BackDef_show",
-------------------------------Special-------------------------------
PenaltyKick = "Ref_PenaltyKick_normal",
PenaltyDef = "Ref_PenaltyDef_normal",
KickOff = "Ref_KickOff_show",
KickOffDef = "Ref_KickOffDef_show",
NorPlay = "Nor_4_show",
}