Name Typ Von
Config.ini lesen/schreiben Definition AFRLme

Mit diesem Skript liest und schreibst du die Datei config.ini. Du brauchst es, wenn dein Spielmenü die Einstellungen jedes Spielers speichern und beim nächsten Start wieder laden soll. Standardmäßig lädt Visionaire Studio beim Spielstart sonst die Grundeinstellungen.

Beachte: Nicht alle Optionen im config.ini-Skript unten sind offizielle Parameter. Einige sind eigene Optionen, die nur als Beispiel dienen. Was eigene Optionen bewirken, musst du in deinem Spiel selbst festlegen, denn sie wirken sich nicht automatisch aus. Eine Liste der Standardparameter findest du hier.

Anweisungen

Dieses Skript ist etwas zu flexibel und kompliziert, als dass ich ein richtiges erstellen könnte Schritt für Schritt Führer. Ich würde stattdessen empfehlen, sich das Skript anzusehen und die Demo anzuschauen, die ich im verlinkt habe Ressourcen Abschnitt unten.

1. Füge das Hauptskript im Skripteditor von Visionaire Studio hinzu und lege es als Definitionsskript fest.
2. Passe das Skript an.
3. Lege im Editor die Bedingungen und Werte an, die im Skript aufgeführt sind.
4. Weise Standardwerte zu (Ganzzahl und String bei Werten, boolesche Werte bei Bedingungen).
5. Lege eine Bedingung an, die anzeigt, ob Einstellungen geändert wurden, und nenne sie cfg_update. Sie wird bei jeder Änderung einer Option auf true gesetzt.
6. Vergiss nicht, bei geänderten Einstellungen die passende Bedingung bzw. den passenden Wert zu setzen; sie müssen den aktuellen Einstellungen entsprechen.
7. Zum Lesen der config.ini fügst du einen Aktionsteil Skript ausführen in die Aktion beim Spielstart oder in eine Aktion zu Szenenbeginn der Menüszene ein, mit ...

read_ini()

8. Zum Schreiben neuer Einstellungen in die config.ini fügst du einen Aktionsteil Skript ausführen in eine Aktion am Szenenende (oder in die Linksklick-Aktion eines Szenenobjekts) der Menüszene ein, mit ...

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

Hauptskript

--[[
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

Ressourcen

Die Projektdatei .ved und die Ressourcendateien werden hier verlinkt.