saving indexes of strings in lua tables (arrays or dictionary table?)
Question
So I have quite a dilemma. I have a code that reads a certain msg, for example:
m.content:sub(1,8) == 'Loot of ' then
reads:
01:50 Loot of a starving wolf: a dirty fur, a salad, 2 pancakes, 60 gold
Now I'm trying to make it insert into a table. The problem I have so far is that I can't make it count the type of string and compare it in the table to add its index.
For example:
t = {dirty fur="quantity of msgs that show this",insert a new msg="how many times haves appear}
What I have working so far is:
foreach newmessage m do
m.content:sub(1,8) == 'Loot of ' then
and then I'm just lost. I don't know how to create this table; it should be local, I believe, but the main problem I have with this is that I don't want to print it in pairs, I want to call the values from 1 to #table, in the order they were inserted. That's where my pain starts.
I want something like:
table msgs = {spear='100',something='2', ovni='123'}
so when I get this table (which I still can't make), I can call the same table for another function, that well I want to call table."xmsg" = quantity. I hope someone understands what I'm asking.
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
return msgs of this function :
{"3 gold coins"}
{"3 gold coins"}
{"nothing"}
{"6 gold coins", "a hand axe"}
{"12 gold coins", "a hand axe"}
Solution
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
I wanted to write a long answer to accompany this code, but I don't have the time right now, sorry. I'll do it later.