跳转至

脚本选择

本小节将大致介绍当程序开始运行时,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
第二类dofile开启新文件,同样会根据球在场上的位置决定gCurrentPlay,如ourDirectPlay.lua:
    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
此类脚本dofile之后会运行和第三类脚本相似的函数,此处也会根据opponent中的NormalKick脚本里规定的gOppoConfig选择运行的脚本,即gCurrentPlay = cond.getOpponentScript(str, gOppoConfig.xx, maxRandom),于是在此处把第二类脚本打开的文件和第三类脚本一起介绍,如ourKickOff.lua:
    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
至此gCurrentPlay决定完毕
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",
    }