2019年12月14日土曜日

buffactiveのindexを英語でハードコーディングしている問題


GearSwapはbuffactive変数(table)によってプレイヤーのbuff内容をリアルタイムに管理している。たとえば、マーチが1曲かかっているときは、buffactive[214] == 1となり、2曲の時は値が2になる。214はマーチのIDである。このとき、インデックスは214だけでなく、buffactive.march == 2と書くこともできる。

ところが、buffactive.marchに値が設定されるのは、languageがenglishの場合のみである。GearSwapは
                            local buff = res.buffs[id][language]:lower()
上記の命令文によってインデックス名を指定しているため、languageがjapaneseの場合は、buffactive['マーチ'] == 2と書く必要があり、buffactive.marchには値が設定されない。

gearswapのluaファイルの中身を検索すると、buffactive.charmとかbuffactive.Pianissimo とかbuffactive.Entrustとか見つかる。あるいは「if T{'terror', 'sleep', 'stun', 'petrification', 'charm', 'weakness'}:contains(buff_name:lower()) then」のように状態異常名を直書きしているコードもある。インデックス名が英語で書かれていてはjapaneseの場合は正常に動作しない。

したがって正常に動作させるためには該当部分を日本語に修正するか、IDに修正する必要がある。buffactive['魅了']、buffactive['ピアニッシモ']、buffactive['エントラスト']への修正。
buffactive[14]、buffactive[17]、buffactive[409]、buffactive[584]への修正。
あるいは一切修正せず language を english にして magicReplace を使う方法もある。



ところで、上記lower()関数はビルトインのものではなくオーバーロードされた関数であることに注意。GearSwap\helper_functions.luaの35行目で下記の通りに再定義されている。
function string.lower(message)
    if message and type(message) == 'string' and language == 'english' then
        return __raw.lower(message)
    elseif message and type(message) == 'string' then
        return message:gsub('[A-Z]',function (letter) return string.char(letter:byte(1)+32) end)
    else
        return message
    end
end

さらにbuffactiveにはメタテーブルが設定されていて__indexがオーバーロードされている。

◆helper_functions.lua
function user_key_filter(val)
    return type(val) == 'string' and string.lower(val) or val
end
function make_user_table()
    return setmetatable({}, user_data_table)
end

◆statics.lua
user_data_table = {
    __newindex = function(tab, key, val)
        rawset(tab, user_key_filter(key), val)
    end,
    __index = function(tab, key)
        return rawget(tab, user_key_filter(key))
    end
    }
buffactive = make_user_table()

このオーバーロードによって buffactive.Pianissimo とか buffactive.Entrust のように先頭文字が大文字であってもlower()関数によって小文字化されるため問題なく動作するようになっている。






0 件のコメント:

コメントを投稿