binary accounts the easy way.... - genusis - 19-02-2007
Ok, yes I can do this on a new mirage source even mirage source 2 and it works fine but i have a problem the problem is how would I do it for something like this.
Code: Sub LoadPlayer(ByVal index As Long, _
ByVal Name As String)
Dim FileName As String
Dim i As Long
Dim N As Long
Call ClearPlayer(index)
FileName = App.Path & "\accounts\" & Trim$(Name) & ".ini"
Player(index).Login = GetVar(FileName, "GENERAL", "Login")
Player(index).Password = GetVar(FileName, "GENERAL", "Password")
Player(index).Pet.Alive = NO
For i = 1 To MAX_CHARS
' General
Player(index).Char(i).Name = GetVar(FileName, "CHAR" & i, "Name")
Player(index).Char(i).Sex = Val(GetVar(FileName, "CHAR" & i, "Sex"))
Player(index).Char(i).Class = Val(GetVar(FileName, "CHAR" & i, "Class"))
If Player(index).Char(i).Class = 0 Then Player(index).Char(i).Class = 1
Player(index).Char(i).Sprite = Val(GetVar(FileName, "CHAR" & i, "Sprite"))
Player(index).Char(i).Level = Val(GetVar(FileName, "CHAR" & i, "Level"))
Player(index).Char(i).Exp = Val(GetVar(FileName, "CHAR" & i, "Exp"))
Player(index).Char(i).Access = Val(GetVar(FileName, "CHAR" & i, "Access"))
Player(index).Char(i).PK = Val(GetVar(FileName, "CHAR" & i, "PK"))
Player(index).Char(i).Guild = GetVar(FileName, "CHAR" & i, "Guild")
Player(index).Char(i).Guildaccess = Val(GetVar(FileName, "CHAR" & i, "Guildaccess"))
' Vitals
Player(index).Char(i).HP = Val(GetVar(FileName, "CHAR" & i, "HP"))
Player(index).Char(i).MP = Val(GetVar(FileName, "CHAR" & i, "MP"))
Player(index).Char(i).SP = Val(GetVar(FileName, "CHAR" & i, "SP"))
' Stats
Player(index).Char(i).STR = Val(GetVar(FileName, "CHAR" & i, "str"))
Player(index).Char(i).DEF = Val(GetVar(FileName, "CHAR" & i, "DEF"))
Player(index).Char(i).Speed = Val(GetVar(FileName, "CHAR" & i, "SPEED"))
Player(index).Char(i).Magi = Val(GetVar(FileName, "CHAR" & i, "MAGI"))
Player(index).Char(i).POINTS = Val(GetVar(FileName, "CHAR" & i, "POINTS"))
' Worn equipment
Player(index).Char(i).ArmorSlot = Val(GetVar(FileName, "CHAR" & i, "ArmorSlot"))
Player(index).Char(i).WeaponSlot = Val(GetVar(FileName, "CHAR" & i, "WeaponSlot"))
Player(index).Char(i).HelmetSlot = Val(GetVar(FileName, "CHAR" & i, "HelmetSlot"))
Player(index).Char(i).ShieldSlot = Val(GetVar(FileName, "CHAR" & i, "ShieldSlot"))
' Position
Player(index).Char(i).Map = Val(GetVar(FileName, "CHAR" & i, "Map"))
Player(index).Char(i).x = Val(GetVar(FileName, "CHAR" & i, "X"))
Player(index).Char(i).y = Val(GetVar(FileName, "CHAR" & i, "Y"))
Player(index).Char(i).Dir = Val(GetVar(FileName, "CHAR" & i, "Dir"))
' Check to make sure that they aren't on map 0, if so reset'm
If Player(index).Char(i).Map = 0 Then
Player(index).Char(i).Map = START_MAP
Player(index).Char(i).x = START_X
Player(index).Char(i).y = START_Y
End If
' Inventory
For N = 1 To MAX_INV
Player(index).Char(i).Inv(N).num = Val(GetVar(FileName, "CHAR" & i, "InvItemNum" & N))
Player(index).Char(i).Inv(N).Value = Val(GetVar(FileName, "CHAR" & i, "InvItemVal" & N))
Player(index).Char(i).Inv(N).Dur = Val(GetVar(FileName, "CHAR" & i, "InvItemDur" & N))
Next
' Spells
For N = 1 To MAX_PLAYER_SPELLS
Player(index).Char(i).Spell(N) = Val(GetVar(FileName, "CHAR" & i, "Spell" & N))
Next
If Val(GetVar(FileName, "CHAR" & i, "HasPet")) = 1 Then
Player(index).Pet.Sprite = Val(GetVar(FileName, "CHAR" & i, "Pet"))
Player(index).Pet.Alive = YES
Player(index).Pet.Dir = DIR_UP
Player(index).Pet.Map = Player(index).Char(i).Map
Player(index).Pet.x = Player(index).Char(i).x + Int((Rnd * 3) - 1)
If Player(index).Pet.x < 0 Or Player(index).Pet.x > MAX_MAPX Then Player(index).Pet.x = GetPlayerX(index)
Player(index).Pet.y = Player(index).Char(i).y + Int((Rnd * 3) - 1)
If Player(index).Pet.y < 0 Or Player(index).Pet.y > MAX_MAPY Then Player(index).Pet.y = GetPlayerY(index)
Player(index).Pet.MapToGo = 0
Player(index).Pet.XToGo = -1
Player(index).Pet.YToGo = -1
Player(index).Pet.Level = Val(GetVar(FileName, "CHAR" & i, "PetLevel"))
Player(index).Pet.HP = Player(index).Pet.Level * 5 '???
End If
For N = 1 To MAX_FRIENDS
Player(index).Char(i).Friends(N) = GetVar(FileName, "CHAR" & i, "Friend" & N)
Next
FileName = App.Path & "\banks\" & Trim(Name) & ".ini"
' Bank
For N = 1 To MAX_BANK
Player(index).Char(i).Bank(N).num = Val(GetVar(FileName, "CHAR" & i, "BankItemNum" & N))
Player(index).Char(i).Bank(N).Value = Val(GetVar(FileName, "CHAR" & i, "BankItemVal" & N))
Player(index).Char(i).Bank(N).Dur = Val(GetVar(FileName, "CHAR" & i, "BankItemDur" & N))
Next N
Next
End Sub
and
Code: Sub SavePlayer(ByVal index As Long)
Dim FileName As String
Dim i As Long
Dim N As Long
FileName = App.Path & "\accounts\" & Trim$(Player(index).Login) & ".ini"
Call PutVar(FileName, "GENERAL", "Login", Trim$(Player(index).Login))
Call PutVar(FileName, "GENERAL", "Password", Trim$(Player(index).Password))
For i = 1 To MAX_CHARS
' General
Call PutVar(FileName, "CHAR" & i, "Name", Trim$(Player(index).Char(i).Name))
Call PutVar(FileName, "CHAR" & i, "Class", STR(Player(index).Char(i).Class))
Call PutVar(FileName, "CHAR" & i, "Sex", STR(Player(index).Char(i).Sex))
Call PutVar(FileName, "CHAR" & i, "Sprite", STR(Player(index).Char(i).Sprite))
Call PutVar(FileName, "CHAR" & i, "Level", STR(Player(index).Char(i).Level))
Call PutVar(FileName, "CHAR" & i, "Exp", STR(Player(index).Char(i).Exp))
Call PutVar(FileName, "CHAR" & i, "Access", STR(Player(index).Char(i).Access))
Call PutVar(FileName, "CHAR" & i, "PK", STR(Player(index).Char(i).PK))
Call PutVar(FileName, "CHAR" & i, "Guild", Trim$(Player(index).Char(i).Guild))
Call PutVar(FileName, "CHAR" & i, "Guildaccess", STR(Player(index).Char(i).Guildaccess))
' Vitals
Call PutVar(FileName, "CHAR" & i, "HP", STR(Player(index).Char(i).HP))
Call PutVar(FileName, "CHAR" & i, "MP", STR(Player(index).Char(i).MP))
Call PutVar(FileName, "CHAR" & i, "SP", STR(Player(index).Char(i).SP))
' Stats
Call PutVar(FileName, "CHAR" & i, "str", STR(Player(index).Char(i).STR))
Call PutVar(FileName, "CHAR" & i, "DEF", STR(Player(index).Char(i).DEF))
Call PutVar(FileName, "CHAR" & i, "SPEED", STR(Player(index).Char(i).Speed))
Call PutVar(FileName, "CHAR" & i, "MAGI", STR(Player(index).Char(i).Magi))
Call PutVar(FileName, "CHAR" & i, "POINTS", STR(Player(index).Char(i).POINTS))
' Worn equipment
Call PutVar(FileName, "CHAR" & i, "ArmorSlot", STR(Player(index).Char(i).ArmorSlot))
Call PutVar(FileName, "CHAR" & i, "WeaponSlot", STR(Player(index).Char(i).WeaponSlot))
Call PutVar(FileName, "CHAR" & i, "HelmetSlot", STR(Player(index).Char(i).HelmetSlot))
Call PutVar(FileName, "CHAR" & i, "ShieldSlot", STR(Player(index).Char(i).ShieldSlot))
' Check to make sure that they aren't on map 0, if so reset'm
If Player(index).Char(i).Map = 0 Then
Player(index).Char(i).Map = START_MAP
Player(index).Char(i).x = START_X
Player(index).Char(i).y = START_Y
End If
' Position
Call PutVar(FileName, "CHAR" & i, "Map", STR(Player(index).Char(i).Map))
Call PutVar(FileName, "CHAR" & i, "X", STR(Player(index).Char(i).x))
Call PutVar(FileName, "CHAR" & i, "Y", STR(Player(index).Char(i).y))
Call PutVar(FileName, "CHAR" & i, "Dir", STR(Player(index).Char(i).Dir))
' Inventory
For N = 1 To MAX_INV
Call PutVar(FileName, "CHAR" & i, "InvItemNum" & N, STR(Player(index).Char(i).Inv(N).num))
Call PutVar(FileName, "CHAR" & i, "InvItemVal" & N, STR(Player(index).Char(i).Inv(N).Value))
Call PutVar(FileName, "CHAR" & i, "InvItemDur" & N, STR(Player(index).Char(i).Inv(N).Dur))
Next
' Spells
For N = 1 To MAX_PLAYER_SPELLS
Call PutVar(FileName, "CHAR" & i, "Spell" & N, STR(Player(index).Char(i).Spell(N)))
Next
' Pet
If i = Player(index).CharNum Then
If Player(index).Pet.Alive = YES Then
Call PutVar(FileName, "CHAR" & i, "HasPet", 1)
Call PutVar(FileName, "CHAR" & i, "Pet", STR(Player(index).Pet.Sprite))
Call PutVar(FileName, "CHAR" & i, "PetLevel", STR(Player(index).Pet.Level))
Else
Call PutVar(FileName, "CHAR" & i, "HasPet", 0)
Call DelVar(FileName, "CHAR" & i, "Pet") ' Saving space
Call DelVar(FileName, "CHAR" & i, "PetLevel")
End If
Else
Call PutVar(FileName, "CHAR" & i, "HasPet", 0)
Call DelVar(FileName, "CHAR" & i, "Pet") ' Saving space
Call DelVar(FileName, "CHAR" & i, "PetLevel")
End If
' Friend list
For N = 1 To MAX_FRIENDS
Call PutVar(FileName, "CHAR" & i, "Friend" & N, Player(index).Char(i).Friends(N))
Next
FileName = App.Path & "\banks\" & Trim(Player(index).Login) & ".ini"
' Bank
For N = 1 To MAX_BANK
Call PutVar(FileName, "CHAR" & i, "BankItemNum" & N, STR(Player(index).Char(i).Bank(N).num))
Call PutVar(FileName, "CHAR" & i, "BankItemVal" & N, STR(Player(index).Char(i).Bank(N).Value))
Call PutVar(FileName, "CHAR" & i, "BankItemDur" & N, STR(Player(index).Char(i).Bank(N).Dur))
Next N
Next
End Sub
It confused me since I have banks and pets it makes me wounder if its possible while keeping the banks and pets in ini. unless if you change them to .bin I could still use them..... haven't the clue.
- Obsidian - 19-02-2007
Well first off... you need to move Pet.Alive = NO, into the Sub ClearPlayer... that variable does not need to be saved at all. Secondly... If you use binary accounts the easy way... and you use my tutorial... it will still save that for you, no worries.
- genusis - 19-02-2007
so your say move the whole pet=no to the clear player then just replace the rest with
Code: Sub SavePlayer(ByVal index As Long)
Dim FileName As String
Dim f As Long
FileName = App.Path & "\accounts\" & Trim$(Player(index).Login) & ".bin"
f = FreeFile
Open FileName For Binary As #f
Put #f, , Player(index)
Close #f
End Sub
Code: Sub LoadPlayer(ByVal index As Long, ByVal name As String)
Dim FileName As String
Dim f As Long
Call ClearPlayer(index)
FileName = App.Path & "\accounts\" & Trim(name) & ".bin"
f = FreeFile
Open FileName For Binary As #f
Get #f, , Player(index)
Close #f
End Sub
and it will work, and I don't have to change anything else.
oh oops that's already in sub clearplayers. I guess that it was being used twice and I didn't notice lol.
- Obsidian - 19-02-2007
Actually for the Put/Get stuff it's better to do it like this...
Code: Open FileName For Binary As #f
Put #f, , Player(index).Login
Put #f, , Player(index).Password
for i = 1 to max_chars
put #f, , Player(index).char(i)
next i
Close #f
There are a ton of temporary variables stored in the accountrec... and if you just use Put #f, , Player(index) it will also save every one of the temporary variables (not that it's a huge problem, it's only an extra 15 or 20 bytes i think... but it's better practice to do it the way mentioned above.
- Spodi - 19-02-2007
Well if we are talking about best and worst, it is best to save in a method that allows you to load in one Get. For example, vbGORE loads a map directly into RAM, and takes about 2-3ms per 100x100 map, while before, it took about 300-400ms to load the map tile-by-tile.
- Obsidian - 19-02-2007
Well technically for speed. But if you're looking to save space (like 15 bytes, like i said before), it's better not to save all of the temporary variables... but like you said, it's faster to not have to go through loops first as well. Oh well.
|