Read/Write Config.ini (CMS)

From The Official Visionaire Studio: Adventure Game Engine Wiki
Revision as of 21:28, 2 March 2014 by AFRLme (talk)
Name Type By
Read/Write Config.ini Definition AFRLme

This script allows you to read from/write to the config.ini file. This script is required for anyone wanting to create a professional game menu which stores & remembers each players option configuration. By default Visionaire Studio would load the default settings on game launch.

Instructions

It is a little bit hard to create step by step instructions for this script. My suggestion is to: read over the script & comments I have added & then try & edit it to suit your needs. If you have any difficulties, then please feel free to contact me for help.

1. Add the main script to the Visionaire Studio Script Editor & set the script as a definition script.
2. Edit the script to suit.
3. Create conditions & values (in vs editor) - they should reflect the conditions & values listed in the script.
4. Assign default values (integer & string for values, boolean for conditions). 5. create a condition that will be used to determine if settings have been changed. This condition should be set to true each time an option is changed. Name it: cfg_update.
6. To read from the config.ini: add an execute a script action to the game launch action, or the an at begin of scene action for the menu scene, containing...

read_ini()

7. To write new settings to the config.ini: add an execute a script action to an at end of scene action for the menu scene, containing...

if getObject("Conditions[cfg_update]"):getBool(VConditionValue) then
 write_ini()
end

Main Script

--[[
Read from config.ini [v2] (28/02/2014)
Written by AFRLme [Lee Clarke]
-- + --
alternatingfrequencies@hotmail.com | skype @ AFRLme
-- + --
This script is donation optional. In game credit is non-negotiable.
You are free to: ¹ use it in your game(s). ² modify the script.
Do not remove - or edit - this comment block.
--]]

-- * local variables * --
local fn = "config.ini" -- store filename
-- * --
local wm = getObject("Conditions[cfg_wm]") -- window mode [fullscreen/windowed]
local res = getObject("Values[cfg_res]") -- resolution [fullscreen mode only]
local subs = getObject("Conditions[cfg_subs]") -- subtitles [on/off]
local fx = getObject("Values[cfg_fx]") -- fx level [low/medium/high] (controls which animations will be displayed)
local cbm = getObject("Conditions[cfg_cbm]") -- color blind mode [on/off]

-- * fallback * --
local lglvl = "Error" -- default value for log level
local df = "File = Data.vis" -- filename should reflect exported .vis file
game:setValue(VGameSpeechLanguage, game:getLink(VGameStandardLanguage)) -- default speech language to stndard language

-- * tables * --
local t_res = {"Auto","desktop","640x480","800x600","1024x768","1280x720","1280x1024","1680x1050","1920x1080"} -- add available resolutions here
local t_lang = game:getLinks(VGameLanguages) -- store all available languages into a table

-- * function used to read data from the config.ini file * --
function read_ini()
 local fr = io.open(localAppDir .. fn, "r") -- read from config.ini
 -- * --
 if fr then -- if file exists then...
  line = fr:read() -- read currently selected line
  print("-- * --")
  print(fn .. " exists")
  print("retrieving settings from " .. fn)
  for lines in io.lines(fn) do
   line = string.lower(lines) -- convert all line content to lowercase
   if not line:find("#") then -- skip all lines containing "#"
    if lines:find("file =") then df = line end
    -- * window mode * --
    if line == "fullscreen = no" then wm:setValue(VConditionValue, false); print("window mode is currently set to Windowed") end
    if line == "fullscreen = yes" then wm:setValue(VConditionValue, true); print("window mode is currently set to Fullscreen") end
    -- * resolution * --
    for i = 1, table.maxn(t_res) do if line == ("resolution = " .. string.lower( t_res[i] )) then res:setValue(VValueString, t_res[i]); res:setValue(VValueInt, i); print("resolution is currently set to " .. res:getStr(VValueString)) end end
    -- * subtitles * --
    if line == "subtitles = no" then subs:setValue(VConditionValue, false); print("subtitles are currently set to off") end
    if line == "subtitles = yes" then subs:setValue(VConditionValue, true); print("subtitles are currently set to on") end
    -- * text language * --
    for i = 1, table.maxn(t_lang) do if line == ("textlanguage = " .. string.lower( t_lang[i]:getName() )) then game:setValue(VGameStandardLanguage, t_lang[i]); print("text language is currently set to " .. game:getLink(VGameStandardLanguage):getName()) end end
    -- * speech language * --
    for i = 1, table.maxn(t_lang) do if line == ("speechlanguage = " .. string.lower( t_lang[i]:getName() )) then game:setValue(VGameSpeechLanguage, t_lang[i]); print("spoken language is currently set to " .. game:getLink(VGameSpeechLanguage):getName()) end end
    -- * fx quality * --
    if line == "fxquality = low" then fx:setValue(VValueString, "Low"); fx:setValue(VValueInt, 1); print("fx quality is currently set to " .. fx:getStr(VValueString)) end
    if line == "fxquality = medium" then fx:setValue(VValueString, "Medium"); fx:setValue(VValueInt, 2); print("fx quality is currently set to " .. fx:getStr(VValueString)) end
    if line == "fxquality = high" then fx:setValue(VValueString, "High"); fx:setValue(VValueInt, 3); print("fx quality is currently set to " .. fx:getStr(VValueString)) end
    -- * color blind mode * ---
    if line == "colorblindmode = no" then cbm:setValue(VConditionValue, false); print("color blind mode is currently set to Off") end
    if line == "colorblindmode = yes" then cbm:setValue(VConditionValue, true); print("color blind mode is currently set to On") end
    -- * log level * --
    if line == "loglevel = error" then lglvl = "Error"; print("log level is currently set to Error") end
    if line == "loglevel = warning" then lglvl = "Warning"; print("log level is currently set to Warning") end
    if line == "loglevel = info" then lglvl = "Info"; print("log level is currently set to Info") end
    -- * sound levels * --
    if line:find("musicvolume =") then print("music volume = " .. getVolume(eMusicVolume)) end
    if line:find("soundvolume =") then print("sound volume = " .. getVolume(eSoundVolume)) end
    if line:find("speechvolume =") then print("speech volume = " .. getVolume(eSpeechVolume)) end
    if line:find("movievolume =") then print("movie volume = " .. getVolume(eMovieVolume)) end
    if line:find("globalvolume =") then print("global volume = " .. getVolume(eGlobalVolume)) end
   end
  end
  fr:close()
  print('successfully retrieved settings from ' .. fn .. "\n")
-- * end if else * --
 else
  print(fn  .. ' does not exist\n')
 end
end

-- * function used to write data to the config.ini file * --
function write_ini()
 local fw = io.open(localAppDir .. "config.ini", "w") -- write to config.ini
 print("-- * --")
 print("writing new settings to " .. fn)
 -- * data file * --
 fw:write(df .. "\n")
 -- * window mode * --
 fw:write("#\n")
 fw:write("# Fullscreen = {Yes|No}\n")
 fw:write("# Yes: starts the game in fullscreen\n")
 fw:write("# No: starts the game in a window\n")
 fw:write("Fullscreen = ")
 if wm:getBool(VConditionValue) then fw:write("Yes\n") else fw:write("No\n") end
 -- * resolution * --
 fw:write("#\n")
 fw:write("# Resolution = {Auto|Desktop|Custom}\n")
 fw:write("# Auto: wide-screen support is activated if a wide-screen display is detected\n")
 fw:write("# Desktop: current desktop resolution is used when game is started in full screen mode\n")
 fw:write("# Custom: enter a custom value eg: Resolution = 1920x1080\n")
 fw:write("Resolution = " .. res:getStr(VValueString) .. "\n")
 -- * subtitles * --
 fw:write("#\n")
 fw:write("# Subtitles = {Yes|No}\n")
 fw:write("# Yes: show subtitles during the game, cut scenes & videos\n")
 fw:write("# No: do not show subtitles during the game, cut scenes or videos\n")
 fw:write("Subtitles = ")
 if subs:getBool(VConditionValue) then fw:write("Yes\n") else fw:write("No\n") end
 -- * text language * --
 fw:write("#\n")
 fw:write("# TextLanguage = {English|French|German|Spanish}\n")
 fw:write("# this will display subtitles in the specified language\n")
 fw:write("TextLanguage = " .. game:getLink(VGameStandardLanguage):getName() .. "\n")
 -- * speech language * --
 fw:write("#\n")
 fw:write("# SpeechLanguage = {English|French|German|Spanish}\n")
 fw:write("# this will play speech files linked to the specified language\n")
 fw:write("# if no speech language is provided then the speech language will default to the standard language\n")
 fw:write("SpeechLanguage = " .. game:getLink(VGameSpeechLanguage):getName() .. "\n")
 -- * fx quality * --
 fw:write("#\n")
 fw:write("# FxQuality = {Low|Medium|High}\n")
 fw:write("# allows user to change animation/particle fx modes (for players on lower end machines)\n")
 fw:write("# Low: only show the basic required game animations/particle fx\n")
 fw:write("# Medium: only show certain animations/particle fx &/or animations containing less frames\n")
 fw:write("# High: show all animations, in all their glory\n")
 fw:write("FxQuality = " .. fx:getStr(VValueString) .. "\n")
 -- * color blind mode * --
 fw:write("#\n")
 fw:write("# ColorBlindMode = {Yes|No}\n")
 fw:write("# Yes: enable color blind support (graphic replacement, on screen indicators etc)\n")
 fw:write("# No: show the game as it's meant to be played\n")
 fw:write("ColorBlindMode = ")
 if cbm:getBool(VConditionValue) then fw:write("Yes\n") else fw:write("No\n") end
 -- * log level * --
 fw:write("#\n")
 fw:write("# LogLevel = {Info|Warning|Error}\n")
 fw:write("LogLevel = " .. lglvl .. "\n")
 -- * volume settings * --
 fw:write("#\n")
 fw:write("# MusicVolume|SoundVolume|SpeechVolume|MovieVolume|GlobalVolume = int value {0-100}\n")
 fw:write("MusicVolume = " .. getVolume(eMusicVolume) .. "\n")
 fw:write("SoundVolume = " .. getVolume(eSoundVolume) .. "\n")
 fw:write("SpeechVolume = " .. getVolume(eSpeechVolume) .. "\n")
 fw:write("MovieVolume = " .. getVolume(eMovieVolume) .. "\n")
 fw:write("GlobalVolume = " .. getVolume(eGlobalVolume) .. "\n")
 print("new settings successfully written to " .. fn)
 fw:close()
end