Tabletop Simulator Lua Ошибка: «попытка выполнить арифметику c над строковым значением» - PullRequest
2 голосов
/ 18 июня 2020

Во-первых, немного контекста (в дополнение к тому факту, что я новичок в программировании) ... Я разрабатываю настольную игру, а для версии Tabletop Simulator указанной игры я создал серия действий меню пользовательского интерфейса, которые всплывают всякий раз, когда игрок нажимает кнопку в середине стола (игрок должен сначала объявить, что он будет подавать заявку на конкретную работу, и нажатие их кнопки инициирует процесс запроса предложения для этого работа). После того, как игрок нажимает кнопку, пользовательский интерфейс предлагает всем другим игрокам, хотят ли они участвовать в торгах на рассматриваемую работу.

Меню назначения ставок

Затем все участвующие участники торгов вводят свою эффективную ставку - вместе со своей репутацией на рынке, которая влияет на общую плату, которую они получат за работу, если они выиграют процесс торгов, - а затем сценарий находит самая низкая ставка для определения победителя задания.

Меню корректировки ставок / подачи

Первые два поля этого меню корректировки ставок доступны для редактирования, а третье (плата) только для чтения. Номер комиссии корректируется в режиме реального времени в соответствии с любыми значениями, введенными в два других. Формула для расчета комиссии: 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

Я работал в предположении, что ошибка вызвана нулевым значением, как только числовое значение было удалено, поэтому я попытался добавить несколько условных лог c, который сбрасывает нулевые значения в первых двух полях на 0 перед выполнением любых арифметических операций c. Однако это не сработало, поэтому я немного озадачен.

Вот соответствующий код Lua (который находится в файле tts lua кнопки):

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 (который находится в глобальном файле пользовательского интерфейса):

<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>

Если вы хотите увидеть полный код, вот он на GitHub . И вот он в мастерской Steam .

Спасибо огромное!

1 Ответ

0 голосов
/ 18 июня 2020

Как указал Джозеф, effective_bid_blue = value и reputation_blue = value необходимо было изменить на effective_bid_blue = tonumber(value) и reputation_blue = tonumber(value), поскольку переменная параметра «value» становится строкой, если это не введенное число или nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...