сохранение индексов строк в таблицах lua (массивах или таблицах словарей?) - PullRequest
0 голосов
/ 06 декабря 2011

Так что у меня возникла настоящая дилемма. У меня есть код, который читает определенное сообщение, например:

m.content:sub(1,8) == 'Loot of ' then

читает:

01:50 Loot of a starving wolf: a dirty fur, a salad, 2 pancakes, 60 gold

Теперь я пытаюсь вставить его в таблицу. Проблема, с которой я столкнулся, состоит в том, что я не могу заставить ее считать тип строки и сравнивать ее в таблице, чтобы добавить ее индекс.

Например:

t = {dirty fur="quantity of msgs that show this",insert a new msg="how many times haves appear}

Я до сих пор работаю:

foreach newmessage m do
m.content:sub(1,8) == 'Loot of ' then

и тогда я просто потерялся. Я не знаю, как создать эту таблицу; Я думаю, он должен быть локальным, но главная проблема, с которой я столкнулся, заключается в том, что я не хочу печатать его попарно, я хочу вызывать значения от 1 до #table в том порядке, в котором они были вставлены. Вот тут и начинается моя боль.

Я хочу что-то вроде:

table msgs = {spear='100',something='2', ovni='123'}

поэтому, когда я получаю эту таблицу (которую я до сих пор не могу создать), я могу вызвать ту же таблицу для другой функции, которую я хочу вызвать таблицей. "Xmsg" = количество. Надеюсь, кто-то понимает, о чем я спрашиваю.

function loot()
foreach newmessage m do
        if m.type == MSG_INFO and m.content:sub(1,8) == 'Loot of ' then
        local content = (m.content:match('Loot of .-: (.+)')):token(nil,', ')
        for i,j in ipairs(content) do
       return content
         end
      end
   end
end

возвращает сообщения об этой функции:

{"3 gold coins"}
{"3 gold coins"}
{"nothing"}
{"6 gold coins", "a hand axe"}
{"12 gold coins", "a hand axe"}

1 Ответ

1 голос
/ 06 декабря 2011
TEST_LOG = [[
01:50 Loot of a starving wolf: a dirty fur, a large melon, a cactus
02:20 Loot of a giant: a large melon, an axe
03:30 You are on fire! Not really, this is just a test message
04:00 Loot of a starving wolf: a dirty fur, a tooth, a bundle of hair
04:00 Loot of a starving wolf: a dirty fur, a tooth, an axe
]]

ENEMY_LOOT_COUNTS = {}
LOOT_COUNTS = {}

for line in string.gmatch(TEST_LOG, "([^\n]+)\n") do
    local time, msg = string.match(line, "(%d%d:%d%d) (.+)$")
    if msg and msg:sub(1, 8) == "Loot of " then
        local enemy_name, contents = string.match(msg, "^Loot of a ([^:]+): (.+)$")
        local enemy_t = ENEMY_LOOT_COUNTS[enemy_name]
        if not enemy_t then
            enemy_t = {}
            ENEMY_LOOT_COUNTS[enemy_name] = enemy_t
        end
        local items = {}
        for item_name in string.gmatch(contents, "an? ([^,]+)") do
            items[#items+1] = item_name
            enemy_t[item_name] = (enemy_t[item_name] or 0)+1
            LOOT_COUNTS[item_name] = (LOOT_COUNTS[item_name] or 0)+1
        end
    else
        -- you can handle other messages here if you want
    end
end

for enemy_name, loot_counts in pairs(ENEMY_LOOT_COUNTS) do
    local s = "Enemy "..enemy_name.." dropped: "
    for item_name, item_count in pairs(loot_counts) do
        s = s..item_count.."x "..item_name..", "
    end
    print(s)
end

do
    local s = "Overall: "
    for item_name, item_count in pairs(LOOT_COUNTS) do
        s = s..item_count.."x "..item_name..", "
    end
    print(s)
end

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

...