Play - 响应裁判指令

在之前的内容中,我们已经介绍了如何书写一个简单的Play。在本节中,我们将介绍如何配置Play来响应裁判指令。

查看当前裁判信息

你可以在开启了Core程序后,在裁判盒界面模拟任意裁判指令,在调试面板上你将看到由Core程序输出的裁判指令。

面板的左上角显示了当前运行的脚本与状态,在中央的上部分显示了当前的裁判指令,其中第一行是lua层的裁判指令字符串,第二行为c++层收到的裁判指令。接收的流程为,c++层接收到的裁判信息存在内存中,lua层在每次被调用时通过判断是否有新的裁判信息来决定脚本的跳转。如果需要依据裁判信息来进行判断,会根据上述的裁判指令字符串选取脚本并执行。

目前的所有指令为

指令

说明

编号

Protobuf

GameHalt

比赛停止

0

HALT

GameStop

比赛暂停

1

STOP

OurTimeout

我方暂停

12或13

TIMEOUT_YELLOWTIMEOUT_BLUE

TheirIndirectKick

对方间接任意球

10或11

INDIRECT_FREE_YELLOWINDIRECT_FREE_BLUE

OurIndirectKick

我方间接任意球

10或11

INDIRECT_FREE_YELLOWINDIRECT_FREE_BLUE

TheirKickOff

对方开球

4或5

PREPARE_KICKOFF_YELLOWPREPARE_KICKOFF_BLUE

OurKickOff

我方开球

4或5

PREPARE_KICKOFF_YELLOWPREPARE_KICKOFF_BLUE

TheirBallPlacement

对方自动放球

16或17

BALL_PLACEMENT_YELLOWBALL_PLACEMENT_BLUE

OurBallPlacement

我方自动放球

16或17

BALL_PLACEMENT_YELLOWBALL_PLACEMENT_BLUE

TheirPenaltyKick

对方点球

6或7

PREPARE_PENALTY_YELLOWPREPARE_PENALTY_BLUE

OurPenaltyKick

我方点球

6或7

PREPARE_PENALTY_YELLOWPREPARE_PENALTY_BLUE

提示

裁判指令到字符串的转换在Core的VisionModule中完成,可以在VisionModule.cppupdateRefereeMsg函数中查看。 裁判指令的编号以及对应的protobuf消息可以在ssl_referee.proto中查看。

响应裁判指令

在之前Play的创建时,我们提到了战术包的概念,为了响应裁判指令,我们依然可以在战术包中进行配置。我们在之前创建的my_tactic_2024文件夹中使用Rocos的模板文件创建一个PlayConfig.lua的文件

# in Rocos root directory
mkdir -p Core/my_tactic_2024
cd Core/my_tactic_2024
cp ../tactic/PlayConfig.lua.template ./PlayConfig.lua

打开PlayConfig.lua文件,将第二段注释中,针对gRefConfig的部分取消注释。

 1--[[
 2- `GameHalt`            : 比赛停止
 3- `GameStop`            : 比赛暂停
 4- `OurTimeout`          : 我方暂停
 5- `TheirIndirectKick`   : 对方间接任意球
 6- `OurIndirectKick`     : 我方间接任意球
 7- `TheirKickOff`        : 对方开球
 8- `OurKickOff`          : 我方开球
 9- `TheirBallPlacement`  : 对方自动放球
10- `OurBallPlacement`    : 我方自动放球
11- `TheirPenaltyKick`    : 对方点球
12- `OurPenaltyKick`      : 我方点球
13- `NormalPlay`          : 正常比赛
14]]
15
16---[[
17gRefConfig = {
18    GameHalt = "",
19    GameStop = "",
20    OurTimeout = "",
21    TheirIndirectKick = "",
22    OurIndirectKick = "",
23    TheirKickOff = "",
24    OurKickOff = "",
25    TheirBallPlacement = "",
26    OurBallPlacement = "",
27    TheirPenaltyKick = "",
28    OurPenaltyKick = "",
29    NormalPlay = "",
30}
31--]]

你可以对上面的table进行配置,当裁判指令到来时,Core会根据gRefConfig的配置来选择对应的Play进行执行。 对于每一项指令的运行脚本,你可以选择以下任意一种类型:

-- 第一种:String类型,直接使用脚本名称
gRefConfig = {
    GameHalt = "Halt_v1",
    ...
}
-- 第二种:Table类型,框架会在每次选择时随机选择一个脚本
gRefConfig = {
    ...
    OurKickOff = {"KickOff_v1", "KickOff_v2"},
    ...
}
-- 第三种:Function类型,返回类型为String或Table,框架会在每次选择时调用该函数,例如模拟旧版Rocos的定位球分区
gRefConfig = {
    ...
    OurIndirectKick = function()
        if ball.posX() > 0 then
            return {"FrontKick_v1","FrontKick_v2"}
        else
            return "BackKick_v1"
        end
    end,
    ...
}

配置的脚本名称可以是Rocos自带或任意战术包的任意Play,至此组成了一个Tactic的完整配置。如果有多个战术包中存在PlayConfig.lua文件,则可以在Client中启动Core之前进行选择,同时记得勾选USE启用战术包。