Read/Write Config.ini (CMS)

From The Official Visionaire Studio: Adventure Game Engine Wiki
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.

Please note that, not all of the options included in the config.ini script below, are official parameters. Some of them are custom options, that have just been added as an example. Custom options require you to determine what they do inside of your game, as they do not automatically affect anything. For a list of default parameters, please see here.

Instructions

This script is a little too flexible & complicated for me to create a proper step by step guide. I would instead recommend looking over the script, & checking out the demo I have linked in the resources section below.

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. Don't forget to set the correct condition/value for edited settings; they should reflect the current settings value.
7. To read from the config.ini: add an execute a script action to the game launch action, or inside of a at begin of scene action for the menu scene, containing...

read_ini()

8. To write new settings to the config.ini: add an execute a script action to an at end of scene action - or left click action of a scene object - for the menu scene, containing...

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

Main Script

--[[
Read/Write Config.ini [v2.1] (12/01/2019)
Written by AFRLme [Lee Clarke]
-- + --
afrlme@outlook.com | https://de.tail.studio
-- + --
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 = "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...
  lines = fr:read() -- read currently selected line
  print("-- * --")
  print(fn .. " exists")
  print("retrieving settings from " .. fn)
  for lines in io.lines(localAppDir .. fn) do
   line = string.lower(lines) -- convert all line content to lowercase
   line = string.gsub(line, '\r', '') -- fallback for mac/linux
   if not line:find("#") then -- skip all lines containing "#"
    if line:find("file =") then df = string.sub(lines, 8); print("file is currently linked to " .. df) 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, #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, #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, #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)
 else
  print(fn  .. " does not exist")
 end
end

-- * function used to write data to the config.ini file * --
function write_ini()
 local fw = io.open(localAppDir .. fn, "w") -- write to config.ini
 print("-- * --")
 print("writing new settings to " .. fn)
 -- * data file * --
 fw:write("File = " .. 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

Resources

The project file .ved & resource files will be linked here.