Page 1 of 1
Best way to store data as tables
Posted: Mon Jan 30, 2023 11:12 pm
by UnicronLucas
I may be completely overthinking this, but I am curious about the best way to store large data. I am trying to make my first game, and it will be a card game, similar to Magic: the gathering. But I am not sure how to store the data, right now I am writing a big old lua file that will have like a parent class for all cards with card specific Id's and card types, then children classes for each card type aka player cards or magic cards. after I create those I am going to write code that will input cards one by one. Is there a better way to do this? I keep thinking I am doing something wrong or maybe overthinking it?
thanks in advance.
Re: Best way to store data as tables
Posted: Tue Jan 31, 2023 2:21 am
by BrotSagtMist
Funny that we have this topic again today.
I would personally use a format in the form of
Code: Select all
name val1 val2 val3 TEXT
name val1 val2 val3 TEXT
name val1 val2 val3 TEXT
This can be read pretty comfortable with something like:
Code: Select all
for line in love.filesystem.lines("Cards") do
local a,b,c,d,e=string.match(line,"(%g*)%s?(%g*)%s?(%g*)%s?(%g*)%s?(%g*)")
Cards[#Cards+1]={name=a,attack=b,defense=c,description=d,e}
end
--or if subtables are needed just name it.
a,b,c,d,e=string.match(line,"(%g*)%s?(%g*)%s?(%g*)%s?(%g*)%s?(%g*)")
Cards[a][#Cards[a]+1]={b,c,d,e}
As long as all cards have a similar amount of data fields parsing this way stays easy.
Oh yea this also means that the cards ID is automatically its line number in the cards file, be smart, save a step.
Generating stuff as lua file works good on read in, but the generating step can quickly grow out of hand so its probably not optimal for large data amounts.
Re: Best way to store data as tables
Posted: Tue Jan 31, 2023 2:33 am
by RNavega
UnicronLucas wrote: ↑Mon Jan 30, 2023 11:12 pm
after I create those I am going to write code that will input cards one by one. Is there a better way to do this? I keep thinking I am doing something wrong or maybe overthinking it?
What does "input" mean in this context?
Re: Best way to store data as tables
Posted: Tue Jan 31, 2023 3:12 am
by UnicronLucas
I meant like I create a class that has cards, and then I use like
Code: Select all
card1 = Card:new(alot of stuff here that say what the card can do)
this just felt very, not smart to me, and like there should be a better way to do it
Re: Best way to store data as tables
Posted: Tue Jan 31, 2023 3:19 am
by UnicronLucas
BrotSagtMist wrote: ↑Tue Jan 31, 2023 2:21 am
Funny that we have this topic again today.
And sorry I tried to search it, but I wasn't sure what to search for now I think I might go for your second approach, as I am thinking of different card types having different parts so I think I would need subtables, a table for each card type.
your way does make sense to me though, thank you!
Re: Best way to store data as tables
Posted: Tue Jan 31, 2023 9:23 am
by darkfrei
I am using the tab-separated values
Tab-separated values. Not this one, but other way:
The first value is a index or key, the second is a value, but if the third is available then second and all next tab-saparated values are in list (sequence).
Limitations: no correct saving for tab symbol in any string; no tables inside the saved table (except list).
Pro: readability, safe.
So the save file is just
Code: Select all
--savegame.tsv
b yes
d text
c false
a true
e 2 3 4 true text
1 1
2 true
3 false
4 text
5 long text with spaces
6 list with tabs
true yes
false no
-- comment example
also comment while no tabs
this file has priority while not saved to the appdata
Loading and saving of values:
Code: Select all
local ST = require ('save-tsv')
function love.load()
NiceTable = ST.load ("savegame")
end
Code: Select all
function love.keypressed(key, scancode, isrepeat)
if scancode == "s" then
ST.save ("savegame", NiceTable)
elseif scancode == "x" then
ST.remove ("savegame")
NiceTable = ST.load ("savegame")
elseif key == "escape" then
love.event.quit()
end
end
- 2023-01-31T10_19_06-Untitled.png (20.26 KiB) Viewed 3265 times
Re: Best way to store data as tables
Posted: Tue Jan 31, 2023 3:05 pm
by RNavega
UnicronLucas wrote: ↑Tue Jan 31, 2023 3:12 am
I meant like I create a class that has cards, and then I use like
Code: Select all
card1 = Card:new(alot of stuff here that say what the card can do)
Thanks for clarifying.
Because of 'information entropy' (the limit of how concise you can be when describing a complex thing), there will always be some place where you'll need to have that list of properties / alot of stuff about the card.
So in your place I'd just use what I'm more comfortable with, even if it's defining the entire card deck directly in a Lua file.
The goal here is to get to the gameplay part already so you can invest the most of your time in balancing your game and making it fun. Like "pick your battles", I can optimize / convert the cards format later if it's not working for me.
Re: Best way to store data as tables
Posted: Sat Feb 18, 2023 7:19 pm
by deströyer
Depends a bit on the type of data (eg. is it information about GUI layouts, a tilemap, etc.) but for a bunch of different game elements with varying abouts of stats/properties I usually use just a big list of tab separated values in the form
index - stat - value - comment (if any)
eg. my gamedata.txt looks like this
Code: Select all
weapon_cutlass weaponDamage 15
weapon_cutlass weaponVariance 0.33
weapon_cutlass weaponSpeed 10
weapon_cutlass requiredStatType strength
weapon_cutlass requiredStatAmount 9
weapon_cutlass damageType slashing
weapon_cutlass equipSlot equip_weapon
weapon_cutlass image gameObjects
weapon_cutlass quad blade_03
armor_cloth armorValue 5
armor_cloth requiredStatType strength
armor_cloth requiredStatAmount 8
armor_cloth equipSlot equip_armor
armor_cloth image gameObjects
armor_cloth quad armor_01
armor_leather armorValue 15
armor_leather equipSlot equip_armor
armor_leather image gameObjects
armor_leather quad armor_03
armor_leather requiredStatType strength
armor_leather requiredStatAmount 8
then I have a string.gmatch( ) that checks through each line, adds it to a table, and when I reference the key armor_leather I get all the stats and values for armor_leather, for example
It's pretty flexible and hasn't fallen over on me.
Re: Best way to store data as tables
Posted: Sat Feb 18, 2023 7:50 pm
by darkfrei
Oh, here is a nice way to do something like list of all values:
https://forums.factorio.com/viewtopic.php?t=45107