Code archives/File Utilities/Saving/Loading Types

This code has been declared by its author to be Public Domain code.

Download source code

Saving/Loading Types by BlackJumper2005
This was created in response to a request about saving and reloading a game. Someone demonstrated a custom save routine + corresponding loader.

To me this seemed like too much work, when the Str$() function will format all fields in a type for printing, thus saving half the work. The challenge then becomes the writing of a parser for the text values of your type.

The example below shows the reading of a couple of ints and a string. There is a code snippet (add's Parser Function) elsewhere in the Archives that could help with parsing other values such as floats...

http://www.blitzbasic.com/codearcs/codearcs.php?code=161
[code]
;------------------------------------------------------------------
;----   demo of saving and reloading game data using Str$()    ----
;----             Blackjumper  - Jan 2005                      ----
;------------------------------------------------------------------

Type test
	Field x
	Field y
	Field name$
End Type

For count = 1 To 4
	n.test = New test
	n\x = Rand(10)
	n\y = Rand(10)+100
	n\name$ = Chr(Rand(26)+65) +Chr(Rand(26)+65) +Chr(Rand(26)+65)
Next


fileout = WriteFile("C:\storedgame.txt")
For n.test = Each test
	Print Str$(n)
	WriteString (fileout, Str$(n))
Next
CloseFile( fileout ) 

Print "game data written to file... press any key to continue"
Print
WaitKey

Print "deleting all instances of type 'test'..."
For n.test = Each test
	Delete n
Next
Print "printing all type information...
Print "________________________________"
For n = Each test
	Print Str$(n)
Next
Print "--------------------------------"
WaitKey
Print


Print "... now reading from disk..."
filein = ReadFile("C:\storedgame.txt") 
While Not Eof(filein)
Read1$ = ReadString$( filein ) 
RestoreTestInfo(Read1$)
Wend

Print "printing all reloaded type information...
Print "------------------------"
For n.test = Each test
	Print Str$(n)
Next
Print "------------------------"

WaitKey
End

Function RestoreTestInfo( SavedString$ )
	Print "Read from file --> " + SavedString$
	SavedString$ = Mid$( SavedString$, 2, Len(SavedString$)-2) ; remove end square brackets
	
	firstcomma = Instr(SavedString$, ",")
	firstvalue% = Left$(SavedString$, firstcomma-1)   ; convert first value (up to comma) to an int
	
	SavedString$ = Mid$( SavedString$, firstcomma+1, Len(SavedString$)-firstcomma+1)  ; eat up to 1st comma

	firstcomma = Instr(SavedString$, ",")
	secondvalue% = Left$(SavedString$, firstcomma-1)  ; convert up to new first comma to another int
	
	SavedString$ = Mid$( SavedString$, firstcomma+1, Len(SavedString$)-firstcomma+1)  ; eat up to new 1st comma
	ThirdString$ = Mid$( SavedString$, 2, Len(SavedString$)-2)                        ; remove quotes from string

	reloaded.test = New test			; make a new type
	reloaded\x = firstvalue%			; and assign the
	reloaded\y = secondvalue%			; reloaded values
	reloaded\name$ = ThirdString$		; to the fields
	
End Function

[/code]

Comments

Xerra2006
I found this very useful for ripping out the code to get 3 bits of data from one line in the function by reading up to commas and reworking the string.

Thanks for that.


BlackJumper2006
Someone (Sefery) was asking for an example of how to load and save object position by using the F6 and F7 keys.

http://www.blitzbasic.com/Community/posts.php?topic=59739

I modified their code as follows to achieve this...

AppTitle "My little box"

Graphics3D 800,600,32,2

SetBuffer BackBuffer()
Global message$ = "move the boxes... '[' and ']' to change box"
Type test
	Field x
	Field y
	Field z
	Field name$
	Field shape
End Type

For count = 1 To 4
	n.test = New test
	n\x = Rand(10)
	n\y = Rand(10)
	n\z = Rand(10)+10
	n\name$ = Chr(Rand(26)+65) +Chr(Rand(26)+65) +Chr(Rand(26)+65)
	n\shape = CreateCube()
	EntityColor n\shape, count*50, 0,0
Next

camera=CreateCamera()

light=CreateLight()

RotateEntity light,0,0,90

Global reload.test
Global control.test = Last test
maxshape = control\shape
control.test = First test
minshape = control\shape


Repeat

If KeyDown(200)=True Then control\y = control\y + 1
If KeyDown(203)=True Then control\x = control\x - 1
If KeyDown(205)=True Then control\x = control\x + 1
If KeyDown(208)=True Then control\y = control\y - 1

If (KeyHit(26)=True And control\shape <> minshape) Then control = Before control
If (KeyHit(27)=True And control\shape <> maxshape) Then control = After control

For update.test = Each test
    PositionEntity update\shape, update\x, update\y, update\z
Next

If KeyHit(64) Then save
If KeyHit(65) Then load 

UpdateWorld 
RenderWorld 

Text 20, 20, message$
Flip 

Until KeyHit(1)
End 

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function save()

fileout = WriteFile("Shay1.SM")
For n.test = Each test
	Print Str$(n)
	WriteString (fileout, Str$(n))
;	WriteFloat (fileout,cube)
;	WriteFloat (fileout,EntityX)
;	WriteFloat (fileout,EntityY)
;	WriteFloat (fileout,EntityZ)
Next
CloseFile( fileout ) 
Cls 
message$ = "game data written to file..."
FlushKeys 

End Function
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function load()
Cls
For destroy.test = Each test
    FreeEntity destroy\shape
    Delete destroy
Next

filein = ReadFile("Shay1.SM") 
While Not Eof(filein)
      Read1$ = ReadString$( filein ) 
      ;Read1$ = ReadFloat( filein ) 
      If Read1$<>"" Then
        reload.test = RestoreTestInfo(Read1$)
      EndIf
Wend 
DebugLog "finished with loaded file"
FlushKeys
control = First test
End Function 
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function RestoreTestInfo.test( SavedString$ )
	message$ =  "Read from file --> " + SavedString$ + "    ...     "
	DebugLog message$     ; typical type looks like ... [-3,-4,14,"LQT",18898368]
	SavedString$ = Mid$( SavedString$, 2, Len(SavedString$)-2) ; remove end square brackets
	
	firstcomma = Instr(SavedString$, ",")
	xvalue% = Left$(SavedString$, firstcomma-1)   ; convert first value (up to comma) to an int
	
	SavedString$ = Mid$( SavedString$, firstcomma+1, Len(SavedString$)-firstcomma+1)  ; eat up to 1st comma

	firstcomma = Instr(SavedString$, ",")
	yvalue% = Left$(SavedString$, firstcomma-1)  ; convert up to new first comma to another int
	SavedString$ = Mid$( SavedString$, firstcomma+1, Len(SavedString$)-firstcomma+1)  ; eat up to new 1st comma

	
	firstcomma = Instr(SavedString$, ",")
	zvalue% = Left$(SavedString$, firstcomma-1)  ; convert up to new first comma to another int

	
	SavedString$ = Mid$( SavedString$, firstcomma+1, Len(SavedString$)-firstcomma+1)  ; eat up to new 1st comma
	ThirdString$ = Mid$( SavedString$, 2, Len(SavedString$))     ; remove first quote from string

	firstcomma = Instr(SavedString$, ",")
	ThirdString$ = Mid$(SavedString$, 2, firstcomma-3)
	
	message$ = message$ + "x: " + xvalue + "   y: " + yvalue + "   z: " + zvalue + "     name: " + ThirdString$
	DebugLog message$

	reloaded.test = New test			; make a new type
	reloaded\x = xvalue%			    ; and assign the
	reloaded\y = yvalue%		     	; reloaded values
	reloaded\z = zvalue%
	reloaded\name$ = ThirdString$		; to the fields
	reloaded\shape = CreateCube()
	
	Return (reloaded)
	
End Function
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



Code Archives Forum