March 05, 2021, 07:56:30 AM

Author Topic: [bmx] Config File Save / Load with XML by ninjarat [ 1+ years ago ]  (Read 561 times)

Offline BlitzBot

Title : Config File Save / Load with XML
Author : ninjarat
Posted : 1+ years ago

Description : Uses Brucey's libxml wrapper to save and load a config file.  Easily adaptable code, and simple function interface for non-OOP guys.

Code :
Code: BlitzMax
  1. Import BaH.libxml
  2. Import BRL.Retro
  3.  
  4. 'by Bill Whitacre (ninjarat)
  5.  
  6. Type TSettings
  7.         Field swdth,shght
  8.         Field sndflag
  9.         Field mscflag,mscvol#
  10.         Field sfxflag,sfxvol#
  11.        
  12.         Method setToDefault()
  13.                 swdth=640
  14.                 shght=480
  15.                 sndflag=1
  16.                 mscflag=1
  17.                 sfxflag=1
  18.                 mscvol=1#
  19.                 sfxvol=1#
  20.         End Method
  21.        
  22.         Method createFromXML(doc:TxmlDoc)
  23.                 Local rootnode:TxmlNode
  24.                 Local children:TList=New TList
  25.                 rootnode=doc.getRootElement()
  26.                 If Lower(rootnode.getName())<>"config" Then
  27.                         RuntimeError "Not CONFIG file; failed!"
  28.                         Return
  29.                 End If
  30.                 children=rootnode.getChildren()
  31.                 If children.count()<2 Then
  32.                         RuntimeError "Not enough DATA NODES; failed!"
  33.                         Return
  34.                 Else If children.count()>2 Then
  35.                         RuntimeError "Too many DATA NODES; failed!"
  36.                         Return
  37.                 End If
  38.                 For j:TxmlNode=EachIn children
  39.                         Select j.getName()
  40.                         Case "screenmode"
  41.                                 swdth=j.getAttribute("width").toInt()
  42.                                 shght=j.getAttribute("height").toInt()
  43.                         Case "sound"
  44.                                 op$=j.getAttribute("enableall")
  45.                                 If Lower(op)="yes" Then sndflag=1 Else If Lower(op)="no" Then sndflag=0
  46.                                 Local sndchildren:TList=New TList
  47.                                 sndchildren=j.getChildren()
  48.                                 If sndchildren.count()<2 Then
  49.                                         RuntimeError "Not enough DATA NODES; failed!"
  50.                                         Return
  51.                                 Else If sndchildren.count()>2 Then
  52.                                         RuntimeError "Too many DATA NODES; failed!"
  53.                                         Return
  54.                                 End If
  55.                                 For k:TxmlNode=EachIn sndchildren
  56.                                         currvol#=k.getAttribute("volume").toFloat()
  57.                                         mode$=k.getAttribute("enable")
  58.                                         If Lower(mode)="yes" Then currmode=1 Else If Lower(mode)="no" Then currmode=0
  59.                                         If sndflag And currmode Then currmode=1 Else currmode=0
  60.                                         Select k.getName()
  61.                                         Case "music"
  62.                                                 mscflag=currmode
  63.                                                 mscvol=currvol
  64.                                         Case "soundfx"
  65.                                                 sfxflag=currmode
  66.                                                 sfxvol=currvol
  67.                                         End Select
  68.                                 Next
  69.                         Default
  70.                                 RuntimeError "Unidentifiable DATA NODE; failed!"
  71.                         End Select
  72.                 Next
  73.                 xmlCleanupParser()
  74.         End Method
  75.        
  76.         Method saveToXML()
  77.                 Local cfgdoc:TxmlDoc=TxmlDoc.newDoc("1.0")
  78.                
  79.                 Local rootnode:TxmlNode=TxmlNode.newNode("config")
  80.                 cfgdoc.setRootElement(rootnode)
  81.                
  82.                 Local resnode:TxmlNode=rootnode.addChild("screenmode")
  83.                 resnode.addAttribute("width",swdth)
  84.                 resnode.addAttribute("height",shght)
  85.                
  86.                 Local sndnode:TxmlNode=rootnode.addChild("sound")
  87.                 If sndflag=1 Then
  88.                         sndnode.addAttribute("enableall","yes")
  89.                 Else
  90.                         sndnode.addAttribute("enableall","no")
  91.                 End If
  92.                
  93.                 Local musicnode:TxmlNode=sndnode.addChild("music")
  94.                 musicnode.addAttribute("volume",1#)
  95.                 If mscflag=1 Then
  96.                         musicnode.addAttribute("enable","yes")
  97.                 Else
  98.                         musicnode.addAttribute("enable","no")
  99.                 End If
  100.                
  101.                 Local sfxnode:TxmlNode=sndnode.addChild("soundfx")
  102.                 sfxnode.addAttribute("volume",1#)
  103.                 If sfxflag=1 Then
  104.                         sfxnode.addAttribute("enable","yes")
  105.                 Else
  106.                         sfxnode.addAttribute("enable","no")
  107.                 End If
  108.                
  109.                 cfgdoc.setCompressMode(9)
  110.                 cfgdoc.saveFormatFile("config",True)
  111.                
  112.                 xmlCleanupParser()
  113.         End Method
  114.        
  115.         Method toString$()
  116.                 Return "ScreenResolution: "+swdth+", "+shght+"~nAudioEnabled: "+sndflag+"~nMusic: "+mscflag+"   Volume: "+Int(mscvol*100)+"%~nSound: "+sfxflag+"   Volume: "+Int(sfxvol*100)+"%"
  117.         End Method
  118. End Type
  119.  
  120. Function saveConfig(settings:TSettings)
  121.         settings.saveToXML()
  122. End Function
  123.  
  124. Function loadConfig:TSettings(settings:TSettings Var)
  125.         settings.createFromXML(getdoc("config"))
  126. End Function
  127.  
  128. Function defaultConfig(settings:TSettings Var)
  129.         settings.setToDefault()
  130. End Function
  131.  
  132. Private
  133.         Function getdoc:TxmlDoc(docname:String)
  134. #tryagain
  135.                 Local doc:TxmlDoc = TxmlDoc.parseFile(docname)
  136.                
  137.                 If doc = Null Then
  138.                         If tryingagain=1 Then Return Null
  139.                         Local settings:TSettings=New TSettings
  140.                         settings.setToDefault()
  141.                         saveConfig(settings)
  142.                         tryingagain=1
  143.                         Goto tryagain
  144.                 End If
  145.        
  146.                 Return doc
  147.         End Function


Comments :


Czar Flavius(Posted 1+ years ago)

 Local children:TList=New TListIt is not neccesary to make the new tlist.


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal