Tabletop Simulator Lua Error: "attempt to perform arithmetic on a string value"

Tabletop Simulator Lua Error: "attempt to perform arithmetic on a string value"

首先,了解一些背景信息(除了我对编码相当陌生之外)...我正在开发一款棋盘游戏,对于该游戏的桌面模拟器版本,我已经创建了一系列 UI 菜单操作,只要玩家按下 table 中间的按钮就会弹出(玩家必须首先宣布他们将提交特定工作的出价,并且他们按下按钮会启动该工作的 RFP 投标过程)。玩家按下按钮后,UI 会发出提示,询问所有 other 玩家是否愿意参与竞标相关工作。

Bid intention menu

然后所有参与的投标人输入他们的有效投标——连同他们的市场声誉,这会影响他们在投标过程中获胜后从工作中收取的总费用——然后脚本找到最低的投标确定工作获胜者。

Bid adjustment/submission menu

此出价调整菜单的前两个字段是 editable,而第三个(费用)是只读的。费用数字根据输入到其他两个的任何值实时调整。手续费计算公式为effective bid + (reputation * 5) = fee.

我遇到的问题是,每当玩家从前两个字段之一中删除一个值(例如,通过突出显示它并按退格键)时,游戏的聊天框中会弹出以下错误:

Error in Script (Custom Assetbundle - 64453f) function <adjustReputationBlue>:
chunk_3:(555,4-55): attempt to perform arithmetic on a string value

我假设错误是由删除数值后的 nil 值引起的,所以我尝试添加一些条件逻辑,在任何算术之前将前两个字段中的 nil 值重置为 0被执行。但是,这没有用,所以我有点难过。

这是相关的 Lua 代码(在按钮的 ttslua 文件中):

function adjustBidBlue(Player, value, id)
    effective_bid_blue = value
    feeAdjustBlue()
end
function adjustReputationBlue(Player, value, id)
    reputation_blue = value
    feeAdjustBlue()
end
function feeAdjustBlue()
    if effective_bid_blue == nil then
        effective_bid_blue = 0
    end
    if reputation_blue == nil then
        reputation_blue = 0
    end
    fee_blue = effective_bid_blue + reputation_blue * 5
    UI.setAttribute("fee_blue", "text", fee_blue)
end

这里是相关的 XML 代码(在全局 UI 文件中):

<InputField
    id="effective_bid_blue"
    active="false"
    characterLimit="4"
    characterValidation="Integer"
    fontSize="26"
    height="44"
    offsetXY="-285 -150"
    onValueChanged="64453f/adjustBidBlue"
    shadow="rgba(0,0,0,0.5)"
    shadowDistance="2 -2"
    showAnimation="FadeIn"
    animationDuration="0.25"
    visibility="Blue"
    width="85">
</InputField>

<InputField
    id="reputation_blue"
    active="false"
    characterLimit="2"
    characterValidation="Integer"
    fontSize="26"
    height="44"
    offsetXY="-95 -150"
    onValueChanged="64453f/adjustReputationBlue"
    shadow="rgba(0,0,0,0.5)"
    shadowDistance="2 -2"
    showAnimation="FadeIn"
    animationDuration="0.25"
    visibility="Blue"
    width="85">
</InputField>

<InputField
    id="fee_blue"
    active="false"
    characterValidation="Integer"
    fontSize="26"
    height="44"
    offsetXY="95 -150"
    readOnly="true"
    shadow="rgba(0,0,0,0.5)"
    shadowDistance="2 -2"
    showAnimation="FadeIn"
    animationDuration="0.25"
    width="85"
    visibility="Blue">
</InputField>

如果您想查看完整代码,here it is on GitHub. And here it is in the Steam workshop

非常感谢!

正如 Joseph 指出的那样,effective_bid_blue = valuereputation_blue = value 需要更改为 effective_bid_blue = tonumber(value)reputation_blue = tonumber(value),因为 "value" 参数变量变为字符串只要不是输入的数字或 nil.