global = global or {}-- 在文件顶部定义全局表 function saveArkUnSettings() local path = "save/ArkUn/setting.txt" -- 确保目录存在(IKEMEN一般已存在save,但子目录建议提前建好) local file = io.open(path, "w") if not file then return end file:write("replayFrameData=", replayFrameData and "1" or "0", "\n") file:write("replayInputData=", replayInputData and "1" or "0", "\n") file:write("replayComboData=", replayComboData and "1" or "0", "\n") file:close() end function loadArkUnSettings() local path = "save/ArkUn/setting.txt" local file = io.open(path, "r") if not file then return end for line in file:lines() do local key, value = line:match("([^=]+)=([^=]+)") if key and value then local v = value == "1" if key == "replayFrameData" then replayFrameData = v elseif key == "replayInputData" then replayInputData = v elseif key == "replayComboData" then replayComboData = v end end end file:close() end loadArkUnSettings() -- Associative elements table storing functions controlling behaviour of each -- option screen item. Can be appended via external module. options.t_itemname = { --replayframedata ['replayframedata'] = function(t, item, cursorPosY, moveTxt) if (getInput(-1, motif.option_info.menu.add.key) or getInput(-1, motif.option_info.menu.subtract.key)) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if replayFrameData == true then replayFrameData = false else replayFrameData = true end t.items[item].vardisplay = options.f_boolDisplay(replayFrameData) options.modified = true end return true end, --replayinputdata ['replayinputdata'] = function(t, item, cursorPosY, moveTxt) if (getInput(-1, motif.option_info.menu.add.key) or getInput(-1, motif.option_info.menu.subtract.key)) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if replayInputData == true then replayInputData = false else replayInputData = true end t.items[item].vardisplay = options.f_boolDisplay(replayInputData) options.modified = true end return true end, --replaycombodata ['replaycombodata'] = function(t, item, cursorPosY, moveTxt) if (getInput(-1, motif.option_info.menu.add.key) or getInput(-1, motif.option_info.menu.subtract.key)) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if replayComboData == true then replayComboData = false else replayComboData = true end t.items[item].vardisplay = options.f_boolDisplay(replayComboData) options.modified = true end return true end, --Back ['back'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cancel.snd[1], motif.option_info.cancel.snd[2]) return false end return true end, --Port Change ['portchange'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) local port = main.f_drawInput( motif.option_info.textinput.TextSpriteData, motif.option_info.textinput.text.port, motif.option_info, motif.optionbgdef, motif.option_info.textinput.overlay.RectData ) if tonumber(port) ~= nil then sndPlay(motif.Snd, motif.option_info.cursor.done.snd[1], motif.option_info.cursor.done.snd[2]) modifyGameOption('Netplay.ListenPort', tostring(port)) t.items[item].vardisplay = gameOption('Netplay.ListenPort') options.modified = true else sndPlay(motif.Snd, motif.option_info.cancel.snd[1], motif.option_info.cancel.snd[2]) end end return true end, --Default Values ['defaultfuck'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.done.snd[1], motif.option_info.cursor.done.snd[2]) --modifyGameOption('Common.Air', {"data/common.air"}) --modifyGameOption('Common.Cmd', {"data/common.cmd"}) --modifyGameOption('Common.Const', {"data/common.const"}) --modifyGameOption('Common.States', {"data/action.zss", "data/dizzy.zss", "data/guardbreak.zss", "data/score.zss", "data/system.zss", "data/tag.zss", "data/training.zss"}) --modifyGameOption('Common.Fx', {}) --modifyGameOption('Common.Modules', {}) --modifyGameOption('Common.Lua', {"loop()"}) modifyGameOption('Options.Difficulty', 5) modifyGameOption('Options.Life', 120) modifyGameOption('Options.Time', 99) modifyGameOption('Options.GameSpeed', 0) --modifyGameOption('Options.GameSpeedStep', 5) modifyGameOption('Options.Match.Wins', 2) modifyGameOption('Options.Match.MaxDrawGames', -2) -- -2: match.maxdrawgames modifyGameOption('Options.Credits', 10) modifyGameOption('Options.QuickContinue', false) modifyGameOption('Options.AutoGuard', false) modifyGameOption('Options.GuardBreak', true) modifyGameOption('Options.Dizzy', false) modifyGameOption('Options.RedLife', true) modifyGameOption('Options.Team.Duplicates', true) modifyGameOption('Options.Team.LifeShare', false) modifyGameOption('Options.Team.PowerShare', true) modifyGameOption('Options.Team.SingleVsTeamLife', 100) modifyGameOption('Options.Simul.Min', 2) modifyGameOption('Options.Simul.Max', 4) modifyGameOption('Options.Simul.Match.Wins', 2) modifyGameOption('Options.Simul.LoseOnKO', true) modifyGameOption('Options.Tag.Min', 2) modifyGameOption('Options.Tag.Max', 4) modifyGameOption('Options.Tag.Match.Wins', 2) modifyGameOption('Options.Tag.LoseOnKO', false) modifyGameOption('Options.Tag.TimeScaling', 1) modifyGameOption('Options.Turns.Min', 2) modifyGameOption('Options.Turns.Max', 4) modifyGameOption('Options.Turns.Recovery.Base', 12.5) modifyGameOption('Options.Turns.Recovery.Bonus', 27.5) modifyGameOption('Options.Ratio.Recovery.Base', 0) modifyGameOption('Options.Ratio.Recovery.Bonus', 20) modifyGameOption('Options.Ratio.Level1.Attack', 0.82) modifyGameOption('Options.Ratio.Level2.Attack', 1.0) modifyGameOption('Options.Ratio.Level3.Attack', 1.17) modifyGameOption('Options.Ratio.Level4.Attack', 1.30) modifyGameOption('Options.Ratio.Level1.Life', 0.80) modifyGameOption('Options.Ratio.Level2.Life', 1.0) modifyGameOption('Options.Ratio.Level3.Life', 1.17) modifyGameOption('Options.Ratio.Level4.Life', 1.40) --modifyGameOption('Config.Motif', "data/system.def") modifyGameOption('Config.Players', 4) modifyGameOption('Config.Language', "en") modifyGameOption('Config.AfterImageMax', 128) modifyGameOption('Config.ExplodMax', 512) modifyGameOption('Config.HelperMax', 56) modifyGameOption('Config.ProjectileMax', 256) modifyGameOption('Config.PaletteMax', 100) modifyGameOption('Config.TextMax', 128) --modifyGameOption('Config.TickInterpolation', true) --modifyGameOption('Config.ZoomActive', true) --modifyGameOption('Config.EscOpensMenu', true) --modifyGameOption('Config.BackgroundLoading', false) --TODO: not implemented --modifyGameOption('Config.FirstRun', false) --modifyGameOption('Config.WindowTitle', "Ikemen GO") --modifyGameOption('Config.WindowIcon', {"external/icons/IkemenCylia_256.png", "external/icons/IkemenCylia_96.png", "external/icons/IkemenCylia_48.png"}) --modifyGameOption('Config.System', "external/script/main.lua") --modifyGameOption('Config.ScreenshotFolder', "") --modifyGameOption('Config.TrainingChar', "") --modifyGameOption('Config.TrainingStage', "") modifyGameOption('Config.GamepadMappings', "external/gamecontrollerdb.txt") modifyGameOption('Debug.AllowDebugMode', true) modifyGameOption('Debug.AllowDebugKeys', true) --modifyGameOption('Debug.ClipboardRows', 2) --modifyGameOption('Debug.ConsoleRows', 15) --modifyGameOption('Debug.ClsnDarken', true) --modifyGameOption('Debug.DumpLuaTables', false) --modifyGameOption('Debug.Font', "font/debug.def") --modifyGameOption('Debug.FontScale', 1.0) --modifyGameOption('Debug.StartStage', "stages/stage0-720.def") --modifyGameOption('Debug.ForceStageZoomout', 0) --modifyGameOption('Debug.ForceStageZoomin', 0) --modifyGameOption('Debug.KeepSpritesOnReload', 0) --modifyGameOption('Debug.MacOSUseCommandKey', 0) --modifyGameOption('Debug.SpeedTest', 100) -- This is platform dependent now local runtimeOS = getRuntimeOS() if runtimeOS == 'android' then modifyGameOption('Video.RenderMode', 'OpenGL ES 3.2') else modifyGameOption('Video.RenderMode', "OpenGL 3.2") end modifyGameOption('Video.GameWidth', 1280) modifyGameOption('Video.GameHeight', 720) --modifyGameOption('Video.WindowWidth', 0) --modifyGameOption('Video.WindowHeight', 0) modifyGameOption('Video.Fullscreen', false) --modifyGameOption('Video.Borderless', false) --modifyGameOption('Video.RGBSpriteBilinearFilter', true) --modifyGameOption('Video.Framerate', 60) modifyGameOption('Video.VSync', 1) modifyGameOption('Video.MSAA', 0) --modifyGameOption('Video.WindowCentered', true) modifyGameOption('Video.ExternalShaders', {}) modifyGameOption('Video.WindowScaleMode', true) modifyGameOption('Video.FightAspectWidth', -1) modifyGameOption('Video.FightAspectHeight', -1) modifyGameOption('Video.KeepAspect', true) modifyGameOption('Video.EnableModel', true) modifyGameOption('Video.EnableModelShadow', true) --modifyGameOption('Sound.SampleRate', 44100) --modifyGameOption('Sound.SoundFont', "sound/soundfont.sf2") modifyGameOption('Sound.StereoEffects', true) modifyGameOption('Sound.PanningRange', 30) --modifyGameOption('Sound.WavChannels', 32) modifyGameOption('Sound.MasterVolume', 80) --modifyGameOption('Sound.PauseMasterVolume', 100) modifyGameOption('Sound.WavVolume', 80) modifyGameOption('Sound.BGMVolume', 80) --modifyGameOption('Sound.MaxBGMVolume', 100) modifyGameOption('Sound.AudioDucking', false) modifyGameOption('Arcade.AI.RandomColor', false) modifyGameOption('Arcade.AI.SurvivalColor', true) modifyGameOption('Arcade.AI.Ramping', true) modifyGameOption('Netplay.ListenPort', "7500") --modifyGameOption('Netplay.IP.<>', "") --modifyGameOption('Input.ButtonAssist', true) --modifyGameOption('Input.SOCDResolution', 4) --modifyGameOption('Input.ControllerStickSensitivity', 0.4) --modifyGameOption('Input.XinputTriggerSensitivity', 0.5) loadLifebar(motif.files.fight) main.timeFramesPerCount = fightscreenvar("time.framespercount") main.f_updateRoundsNum() main.f_setPlayers() for _, v in ipairs(options.t_vardisplayPointers) do v.vardisplay = options.f_vardisplay(v.itemname) end toggleFullscreen(gameOption('Video.Fullscreen')) toggleVSync(gameOption('Video.VSync')) updateVolume() options.modified = true options.needReload = true end return true end, --Difficulty Level ['difficulty'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Difficulty') < 8 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Difficulty', gameOption('Options.Difficulty') + 1) t.items[item].vardisplay = gameOption('Options.Difficulty') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Difficulty') > 1 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Difficulty', gameOption('Options.Difficulty') - 1) t.items[item].vardisplay = gameOption('Options.Difficulty') options.modified = true end return true end, --Time Limit ['roundtime'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Time') < 1000 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Time', gameOption('Options.Time') + 1) t.items[item].vardisplay = gameOption('Options.Time') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Time') > -1 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Time', gameOption('Options.Time') - 1) t.items[item].vardisplay = options.f_definedDisplay(gameOption('Options.Time'), {[-1] = motif.option_info.menu.valuename.none}, gameOption('Options.Time')) options.modified = true end return true end, --Language Setting ['language'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and (main.f_tableLength(motif.languages) > 1 or motif.languages[gameOption('Config.Language')] == nil) then f_switchLanguage(1) t.items[item].vardisplay = motif.languages[gameOption('Config.Language')] or gameOption('Config.Language') elseif getInput(-1, motif.option_info.menu.subtract.key) and (main.f_tableLength(motif.languages) > 1 or motif.languages[gameOption('Config.Language')] == nil) then f_switchLanguage(-1) t.items[item].vardisplay = motif.languages[gameOption('Config.Language')] or gameOption('Config.Language') end return true end, --Life ['lifemul'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Life') < 300 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Life', gameOption('Options.Life') + 10) t.items[item].vardisplay = gameOption('Options.Life') .. '%' options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Life') > 10 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Life', gameOption('Options.Life') - 10) t.items[item].vardisplay = gameOption('Options.Life') .. '%' options.modified = true end return true end, --Single VS Team Life ['singlevsteamlife'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Team.SingleVsTeamLife') < 300 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Team.SingleVsTeamLife', gameOption('Options.Team.SingleVsTeamLife') + 10) t.items[item].vardisplay = gameOption('Options.Team.SingleVsTeamLife') .. '%' options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Team.SingleVsTeamLife') > 10 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Team.SingleVsTeamLife', gameOption('Options.Team.SingleVsTeamLife') - 10) t.items[item].vardisplay = gameOption('Options.Team.SingleVsTeamLife') .. '%' options.modified = true end return true end, -- Game Speed ['gamespeed'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.GameSpeed') < 9 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.GameSpeed', gameOption('Options.GameSpeed') + 1) t.items[item].vardisplay = options.f_boolDisplay(gameOption('Options.GameSpeed') == 0, motif.option_info.menu.valuename.normal, options.f_boolDisplay(gameOption('Options.GameSpeed') < 0, string.format(motif.option_info.menu.valuename.slow, 0 - gameOption('Options.GameSpeed')), string.format(motif.option_info.menu.valuename.fast, gameOption('Options.GameSpeed')))) options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.GameSpeed') > -9 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.GameSpeed', gameOption('Options.GameSpeed') - 1) t.items[item].vardisplay = options.f_boolDisplay(gameOption('Options.GameSpeed') == 0, motif.option_info.menu.valuename.normal, options.f_boolDisplay(gameOption('Options.GameSpeed') < 0, string.format(motif.option_info.menu.valuename.slow, 0 - gameOption('Options.GameSpeed')), string.format(motif.option_info.menu.valuename.fast, gameOption('Options.GameSpeed')))) options.modified = true end return true end, --Rounds to Win (Single) ['roundsnumsingle'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and main.roundsNumSingle[1] < 10 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Match.Wins', main.roundsNumSingle[1] + 1) main.roundsNumSingle = {gameOption('Options.Match.Wins'), gameOption('Options.Match.Wins')} t.items[item].vardisplay = gameOption('Options.Match.Wins') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and main.roundsNumSingle[1] > 1 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Match.Wins', main.roundsNumSingle[1] - 1) main.roundsNumSingle = {gameOption('Options.Match.Wins'), gameOption('Options.Match.Wins')} t.items[item].vardisplay = gameOption('Options.Match.Wins') options.modified = true end return true end, --Max Draw Games ['maxdrawgames'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and main.maxDrawGames[1] < 10 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Match.MaxDrawGames', main.maxDrawGames[1] + 1) main.maxDrawGames = {gameOption('Options.Match.MaxDrawGames'), gameOption('Options.Match.MaxDrawGames')} t.items[item].vardisplay = gameOption('Options.Match.MaxDrawGames') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and main.maxDrawGames[1] > 0 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Match.MaxDrawGames', main.maxDrawGames[1] - 1) main.maxDrawGames = {gameOption('Options.Match.MaxDrawGames'), gameOption('Options.Match.MaxDrawGames')} t.items[item].vardisplay = gameOption('Options.Match.MaxDrawGames') options.modified = true end return true end, --Credits ['credits'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Credits') < 99 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Credits', gameOption('Options.Credits') + 1) t.items[item].vardisplay = gameOption('Options.Credits') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Credits') > 0 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Credits', gameOption('Options.Credits') - 1) t.items[item].vardisplay = options.f_definedDisplay(gameOption('Options.Credits'), {[0] = motif.option_info.menu.valuename.disabled}, gameOption('Options.Credits')) options.modified = true end return true end, --Arcade Palette ['aipalette'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Arcade.AI.RandomColor') then modifyGameOption('Arcade.AI.RandomColor', false) else modifyGameOption('Arcade.AI.RandomColor', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Arcade.AI.RandomColor'), motif.option_info.menu.valuename.random, motif.option_info.menu.valuename.default) options.modified = true end return true end, --Survival Palette ['aisurvivalpalette'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Arcade.AI.SurvivalColor') then modifyGameOption('Arcade.AI.SurvivalColor', false) else modifyGameOption('Arcade.AI.SurvivalColor', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Arcade.AI.SurvivalColor'), motif.option_info.menu.valuename.random, motif.option_info.menu.valuename.default) options.modified = true end return true end, --AI Ramping ['airamping'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Arcade.AI.Ramping') then modifyGameOption('Arcade.AI.Ramping', false) else modifyGameOption('Arcade.AI.Ramping', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Arcade.AI.Ramping')) options.modified = true end return true end, --Quick Continue ['quickcontinue'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Options.QuickContinue') then modifyGameOption('Options.QuickContinue', false) else modifyGameOption('Options.QuickContinue', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Options.QuickContinue')) options.modified = true end return true end, --Auto-Guard ['autoguard'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Options.AutoGuard') then modifyGameOption('Options.AutoGuard', false) else modifyGameOption('Options.AutoGuard', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Options.AutoGuard')) options.modified = true end return true end, --Dizzy ['dizzy'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Options.Dizzy') then modifyGameOption('Options.Dizzy', false) else modifyGameOption('Options.Dizzy', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Options.Dizzy')) options.modified = true end return true end, --Guard Break ['guardbreak'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Options.GuardBreak') then modifyGameOption('Options.GuardBreak', false) else modifyGameOption('Options.GuardBreak', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Options.GuardBreak')) options.modified = true end return true end, --Red Life ['redlife'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Options.RedLife') then modifyGameOption('Options.RedLife', false) else modifyGameOption('Options.RedLife', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Options.RedLife')) options.modified = true end return true end, --Team Duplicates ['teamduplicates'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Options.Team.Duplicates') then modifyGameOption('Options.Team.Duplicates', false) else modifyGameOption('Options.Team.Duplicates', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Options.Team.Duplicates')) options.modified = true end return true end, --Team Life Share ['teamlifeshare'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Options.Team.LifeShare') then modifyGameOption('Options.Team.LifeShare', false) else modifyGameOption('Options.Team.LifeShare', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Options.Team.LifeShare')) options.modified = true end return true end, --Team Power Share ['teampowershare'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Options.Team.PowerShare') then modifyGameOption('Options.Team.PowerShare', false) else modifyGameOption('Options.Team.PowerShare', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Options.Team.PowerShare')) options.modified = true end return true end, --Rounds to Win (Tag) ['roundsnumtag'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and main.roundsNumTag[1] < 10 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Tag.Match.Wins', main.roundsNumTag[1] + 1) main.roundsNumTag = {gameOption('Options.Tag.Match.Wins'), gameOption('Options.Tag.Match.Wins')} t.items[item].vardisplay = gameOption('Options.Tag.Match.Wins') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and main.roundsNumTag[1] > 1 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Tag.Match.Wins', main.roundsNumTag[1] - 1) main.roundsNumTag = {gameOption('Options.Tag.Match.Wins'), gameOption('Options.Tag.Match.Wins')} t.items[item].vardisplay = gameOption('Options.Tag.Match.Wins') options.modified = true end return true end, --Partner KOed Lose ['losekotag'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Options.Tag.LoseOnKO') then modifyGameOption('Options.Tag.LoseOnKO', false) else modifyGameOption('Options.Tag.LoseOnKO', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Options.Tag.LoseOnKO')) options.modified = true end return true end, --Min Tag Chars ['mintag'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Tag.Min') < gameOption('Options.Tag.Max') then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Tag.Min', gameOption('Options.Tag.Min') + 1) t.items[item].vardisplay = gameOption('Options.Tag.Min') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Tag.Min') > 2 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Tag.Min', gameOption('Options.Tag.Min') - 1) t.items[item].vardisplay = gameOption('Options.Tag.Min') options.modified = true end return true end, --Max Tag Chars ['maxtag'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Tag.Max') < 4 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Tag.Max', gameOption('Options.Tag.Max') + 1) t.items[item].vardisplay = gameOption('Options.Tag.Max') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Tag.Max') > gameOption('Options.Tag.Min') then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Tag.Max', gameOption('Options.Tag.Max') - 1) t.items[item].vardisplay = gameOption('Options.Tag.Max') options.modified = true end return true end, --Rounds to Win (Simul) ['roundsnumsimul'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and main.roundsNumSimul[1] < 10 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Simul.Match.Wins', main.roundsNumSimul[1] + 1) main.roundsNumSimul = {gameOption('Options.Simul.Match.Wins'), gameOption('Options.Simul.Match.Wins')} t.items[item].vardisplay = gameOption('Options.Simul.Match.Wins') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and main.roundsNumSimul[1] > 1 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Simul.Match.Wins', main.roundsNumSimul[1] - 1) main.roundsNumSimul = {gameOption('Options.Simul.Match.Wins'), gameOption('Options.Simul.Match.Wins')} t.items[item].vardisplay = gameOption('Options.Simul.Match.Wins') options.modified = true end return true end, --Simul Player KOed Lose ['losekosimul'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Options.Simul.LoseOnKO') then modifyGameOption('Options.Simul.LoseOnKO', false) else modifyGameOption('Options.Simul.LoseOnKO', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Options.Simul.LoseOnKO')) options.modified = true end return true end, --Min Simul Chars ['minsimul'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Simul.Min') < gameOption('Options.Simul.Max') then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Simul.Min', gameOption('Options.Simul.Min') + 1) t.items[item].vardisplay = gameOption('Options.Simul.Min') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Simul.Min') > 2 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Simul.Min', gameOption('Options.Simul.Min') - 1) t.items[item].vardisplay = gameOption('Options.Simul.Min') options.modified = true end return true end, --Max Simul Chars ['maxsimul'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Simul.Max') < 4 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Simul.Max', gameOption('Options.Simul.Max') + 1) t.items[item].vardisplay = gameOption('Options.Simul.Max') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Simul.Max') > gameOption('Options.Simul.Min') then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Simul.Max', gameOption('Options.Simul.Max') - 1) t.items[item].vardisplay = gameOption('Options.Simul.Max') options.modified = true end return true end, --Turns Recovery Base ['turnsrecoverybase'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Turns.Recovery.Base') < 100 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Turns.Recovery.Base', gameOption('Options.Turns.Recovery.Base') + 0.5) t.items[item].vardisplay = gameOption('Options.Turns.Recovery.Base') .. '%' options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Turns.Recovery.Base') > 0 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Turns.Recovery.Base', gameOption('Options.Turns.Recovery.Base') - 0.5) t.items[item].vardisplay = gameOption('Options.Turns.Recovery.Base') .. '%' options.modified = true end return true end, --Turns Recovery Bonus ['turnsrecoverybonus'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Turns.Recovery.Bonus') < 100 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Turns.Recovery.Bonus', gameOption('Options.Turns.Recovery.Bonus') + 0.5) t.items[item].vardisplay = gameOption('Options.Turns.Recovery.Bonus') .. '%' options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Turns.Recovery.Bonus') > 0 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Turns.Recovery.Bonus', gameOption('Options.Turns.Recovery.Bonus') - 0.5) t.items[item].vardisplay = gameOption('Options.Turns.Recovery.Bonus') .. '%' options.modified = true end return true end, --Min Turns Chars ['minturns'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Turns.Min') < gameOption('Options.Turns.Max') then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Turns.Min', gameOption('Options.Turns.Min') + 1) t.items[item].vardisplay = gameOption('Options.Turns.Min') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Turns.Min') > 1 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Turns.Min', gameOption('Options.Turns.Min') - 1) t.items[item].vardisplay = gameOption('Options.Turns.Min') options.modified = true end return true end, --Max Turns Chars ['maxturns'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Turns.Max') < 8 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Turns.Max', gameOption('Options.Turns.Max') + 1) t.items[item].vardisplay = gameOption('Options.Turns.Max') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Turns.Max') > gameOption('Options.Turns.Min') then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Turns.Max', gameOption('Options.Turns.Max') - 1) t.items[item].vardisplay = gameOption('Options.Turns.Max') options.modified = true end return true end, --Ratio Recovery Base ['ratiorecoverybase'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Ratio.Recovery.Base') < 100 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Ratio.Recovery.Base', gameOption('Options.Ratio.Recovery.Base') + 0.5) t.items[item].vardisplay = gameOption('Options.Ratio.Recovery.Base') .. '%' options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Ratio.Recovery.Base') > 0 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Ratio.Recovery.Base', gameOption('Options.Ratio.Recovery.Base') - 0.5) t.items[item].vardisplay = gameOption('Options.Ratio.Recovery.Base') .. '%' options.modified = true end return true end, --Ratio Recovery Bonus ['ratiorecoverybonus'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Options.Ratio.Recovery.Bonus') < 100 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Ratio.Recovery.Bonus', gameOption('Options.Ratio.Recovery.Bonus') + 0.5) t.items[item].vardisplay = gameOption('Options.Ratio.Recovery.Bonus') .. '%' options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Options.Ratio.Recovery.Bonus') > 0 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Options.Ratio.Recovery.Bonus', gameOption('Options.Ratio.Recovery.Bonus') - 0.5) t.items[item].vardisplay = gameOption('Options.Ratio.Recovery.Bonus') .. '%' options.modified = true end return true end, --Renderer (submenu) ['renderer'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) for k, v in ipairs(t.submenu[t.items[item].itemname].items) do if gameOption('Video.RenderMode') == v.itemname then v.selected = true else v.selected = false end end t.submenu[t.items[item].itemname].loop() t.items[item].vardisplay = gameOption('Video.RenderMode') options.modified = true options.needReload = true end return true end, --gles32 ['gles32'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Video.RenderMode', "OpenGL ES 3.2") options.modified = true options.needReload = true return false end return true end, --gl32 ['gl32'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Video.RenderMode', "OpenGL 3.2") options.modified = true options.needReload = true return false end return true end, --gl21 ['gl21'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Video.RenderMode', "OpenGL 2.1") options.modified = true options.needReload = true return false end return true end, --vk13 ['vk13'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Video.RenderMode', "Vulkan 1.3") options.modified = true options.needReload = true return false end return true end, --Resolution (submenu) ['resolution'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) local t_pos = {} local ok = false for k, v in ipairs(t.submenu[t.items[item].itemname].items) do local width, height = v.itemname:match('^([0-9]+)x([0-9]+)$') if tonumber(width) == gameOption('Video.GameWidth') and tonumber(height) == gameOption('Video.GameHeight') then v.selected = true ok = true else v.selected = false end if v.itemname == 'customres' then t_pos = v end end if not ok and t_pos.selected ~= nil then t_pos.selected = true end t.submenu[t.items[item].itemname].loop() t.items[item].vardisplay = gameOption('Video.GameWidth') .. 'x' .. gameOption('Video.GameHeight') end return true end, --Custom resolution ['customres'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) local reswidth = tonumber(main.f_drawInput( motif.option_info.textinput.TextSpriteData, motif.option_info.textinput.text.reswidth, motif.option_info, motif.optionbgdef, motif.option_info.textinput.overlay.RectData )) if reswidth ~= nil then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) local resheight = tonumber(main.f_drawInput( motif.option_info.textinput.TextSpriteData, motif.option_info.textinput.text.resheight, motif.option_info, motif.optionbgdef, motif.option_info.textinput.overlay.RectData )) if resheight ~= nil then modifyGameOption('Video.GameWidth', reswidth) modifyGameOption('Video.GameHeight', resheight) sndPlay(motif.Snd, motif.option_info.cursor.done.snd[1], motif.option_info.cursor.done.snd[2]) options.modified = true options.needReload = true else sndPlay(motif.Snd, motif.option_info.cancel.snd[1], motif.option_info.cancel.snd[2]) end else sndPlay(motif.Snd, motif.option_info.cancel.snd[1], motif.option_info.cancel.snd[2]) end return false end return true end, --Fullscreen ['fullscreen'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Video.Fullscreen') then modifyGameOption('Video.Fullscreen', false) else modifyGameOption('Video.Fullscreen', true) end toggleFullscreen(gameOption('Video.Fullscreen')) t.items[item].vardisplay = options.f_boolDisplay(gameOption('Video.Fullscreen')) options.modified = true end return true end, --VSync ['vsync'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Video.VSync') == 1 then modifyGameOption('Video.VSync', 0) else modifyGameOption('Video.VSync', 1) end toggleVSync(gameOption('Video.VSync')) t.items[item].vardisplay = options.f_definedDisplay(gameOption('Video.VSync'), {[1] = motif.option_info.menu.valuename.enabled}, motif.option_info.menu.valuename.disabled) options.modified = true end return true end, --MSAA ['msaa'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Video.MSAA') < 32 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Video.MSAA') == 0 then modifyGameOption('Video.MSAA', 2) else modifyGameOption('Video.MSAA', gameOption('Video.MSAA') * 2) end t.items[item].vardisplay = gameOption('Video.MSAA') .. 'x' options.modified = true options.needReload = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Video.MSAA') > 1 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Video.MSAA') == 2 then modifyGameOption('Video.MSAA', 0) else modifyGameOption('Video.MSAA', gameOption('Video.MSAA') / 2) end t.items[item].vardisplay = options.f_definedDisplay(gameOption('Video.MSAA'), {[0] = motif.option_info.menu.valuename.disabled}, gameOption('Video.MSAA') .. 'x') options.modified = true options.needReload = true end return true end, --Window scaling mode ['windowscalemode'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Video.WindowScaleMode') then modifyGameOption('Video.WindowScaleMode', false) else modifyGameOption('Video.WindowScaleMode', true) end t.items[item].vardisplay = options.t_vardisplay['windowscalemode']() options.modified = true end return true end, -- Match Aspect Ratio (submenu) ['aspectratio'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) local t_pos = {} local ok = false local currentWidth = gameOption('Video.FightAspectWidth') local currentHeight = gameOption('Video.FightAspectHeight') for k, v in ipairs(t.submenu[t.items[item].itemname].items) do if v.itemname == 'defaultaspect' and currentWidth == 0 and currentHeight == 0 then v.selected = true ok = true elseif v.itemname == 'stageaspect' and currentWidth == -1 and currentHeight == -1 then v.selected = true ok = true else local width, height = v.itemname:match('^([0-9]+)x([0-9]+)$') if width and height and tonumber(width) == currentWidth and tonumber(height) == currentHeight then v.selected = true ok = true else v.selected = false end end if v.itemname == 'customaspect' then t_pos = v end end if not ok and t_pos.selected ~= nil then t_pos.selected = true end t.submenu[t.items[item].itemname].loop() t.items[item].vardisplay = options.t_vardisplay['aspectratio']() end return true end, --Custom aspect ratio ['customaspect'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) local aspectwidth = tonumber(main.f_drawInput( motif.option_info.textinput.TextSpriteData, motif.option_info.textinput.text.aspectwidth, motif.option_info, motif.optionbgdef, motif.option_info.textinput.overlay.RectData )) if aspectwidth ~= nil and aspectwidth > 0 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) local aspectheight = tonumber(main.f_drawInput( motif.option_info.textinput.TextSpriteData, motif.option_info.textinput.text.aspectheight, motif.option_info, motif.optionbgdef, motif.option_info.textinput.overlay.RectData )) if aspectheight ~= nil and aspectheight > 0 then modifyGameOption('Video.FightAspectWidth', aspectwidth) modifyGameOption('Video.FightAspectHeight', aspectheight) sndPlay(motif.Snd, motif.option_info.cursor.done.snd[1], motif.option_info.cursor.done.snd[2]) options.modified = true options.needReload = true else sndPlay(motif.Snd, motif.option_info.cancel.snd[1], motif.option_info.cancel.snd[2]) end else sndPlay(motif.Snd, motif.option_info.cancel.snd[1], motif.option_info.cancel.snd[2]) end return false end return true end, --Keep Aspect Ratio ['keepaspect'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Video.KeepAspect') then modifyGameOption('Video.KeepAspect', false) else modifyGameOption('Video.KeepAspect', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Video.KeepAspect'), motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) options.modified = true end return true end, --Shaders (submenu) ['shaders'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if #options.t_shaders == 0 then main.f_warning(motif.warning_info.text.text.shaders, motif.option_info, motif.optionbgdef) return true end t.submenu[t.items[item].itemname].loop() t.items[item].vardisplay = options.f_boolDisplay(#gameOption('Video.ExternalShaders') > 0, motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) options.modified = true options.needReload = true end return true end, --Disable (shader) ['noshader'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cancel.snd[1], motif.option_info.cancel.snd[2]) modifyGameOption('Video.ExternalShaders', {}) options.modified = true options.needReload = true return false end return true end, --Enable Model ['enablemodel'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Video.EnableModel') then modifyGameOption('Video.EnableModel', false) else modifyGameOption('Video.EnableModel', true) end t.items[item].vardisplay = options.f_definedDisplay(gameOption('Video.EnableModel'), {[true] = motif.option_info.menu.valuename.enabled}, motif.option_info.menu.valuename.disabled) options.modified = true options.needReload = true end return true end, --Enable Model Shadow ['enablemodelshadow'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Video.EnableModelShadow') then modifyGameOption('Video.EnableModelShadow', false) else modifyGameOption('Video.EnableModelShadow', true) end t.items[item].vardisplay = options.f_definedDisplay(gameOption('Video.EnableModelShadow'), {[true] = motif.option_info.menu.valuename.enabled}, motif.option_info.menu.valuename.disabled) options.modified = true options.needReload = true end return true end, ['mastervolume'] = function(t, item, cursorPosY, moveTxt) local inc = main.f_input(main.t_players, {'~F'}) or anyJoystickKey('LS_X+') local dec = main.f_input(main.t_players, {'~B'}) or anyJoystickKey('LS_X-') acceleratedAdjust('master_inc', inc, function() if gameOption('Sound.MasterVolume') < 200 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Sound.MasterVolume', gameOption('Sound.MasterVolume') + 1) t.items[item].vardisplay = gameOption('Sound.MasterVolume') .. '%' options.modified = true updateVolume() end end) acceleratedAdjust('master_dec', dec, function() if gameOption('Sound.MasterVolume') > 0 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Sound.MasterVolume', gameOption('Sound.MasterVolume') - 1) t.items[item].vardisplay = gameOption('Sound.MasterVolume') .. '%' options.modified = true updateVolume() end end) return true end, ['bgmvolume'] = function(t, item, cursorPosY, moveTxt) local inc = main.f_input(main.t_players, {'~F'}) or anyJoystickKey('LS_X+') local dec = main.f_input(main.t_players, {'~B'}) or anyJoystickKey('LS_X-') acceleratedAdjust('bgm_inc', inc, function() if gameOption('Sound.BGMVolume') < 100 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Sound.BGMVolume', gameOption('Sound.BGMVolume') + 1) t.items[item].vardisplay = gameOption('Sound.BGMVolume') .. '%' options.modified = true updateVolume() end end) acceleratedAdjust('bgm_dec', dec, function() if gameOption('Sound.BGMVolume') > 0 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Sound.BGMVolume', gameOption('Sound.BGMVolume') - 1) t.items[item].vardisplay = gameOption('Sound.BGMVolume') .. '%' options.modified = true updateVolume() end end) return true end, ['sfxvolume'] = function(t, item, cursorPosY, moveTxt) local inc = main.f_input(main.t_players, {'~F'}) or anyJoystickKey('LS_X+') local dec = main.f_input(main.t_players, {'~B'}) or anyJoystickKey('LS_X-') acceleratedAdjust('sfx_inc', inc, function() if gameOption('Sound.WavVolume') < 100 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Sound.WavVolume', gameOption('Sound.WavVolume') + 1) t.items[item].vardisplay = gameOption('Sound.WavVolume') .. '%' options.modified = true end end) acceleratedAdjust('sfx_dec', dec, function() if gameOption('Sound.WavVolume') > 0 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Sound.WavVolume', gameOption('Sound.WavVolume') - 1) t.items[item].vardisplay = gameOption('Sound.WavVolume') .. '%' options.modified = true end end) return true end, --Audio Ducking ['audioducking'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Sound.AudioDucking') then modifyGameOption('Sound.AudioDucking', false) else modifyGameOption('Sound.AudioDucking', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Sound.AudioDucking'), motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) options.modified = true end return true end, --Stereo Effects ['stereoeffects'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Sound.StereoEffects') then modifyGameOption('Sound.StereoEffects', false) else modifyGameOption('Sound.StereoEffects', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Sound.StereoEffects'), motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) options.modified = true end return true end, --Panning Range ['panningrange'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Sound.PanningRange') < 100 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Sound.PanningRange', gameOption('Sound.PanningRange') + 1) t.items[item].vardisplay = gameOption('Sound.PanningRange') .. '%' options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Sound.PanningRange') > 0 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Sound.PanningRange', gameOption('Sound.PanningRange') - 1) t.items[item].vardisplay = gameOption('Sound.PanningRange') .. '%' options.modified = true end return true end, --Key Config ['keyboard'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.done.key) --[[or getKey():match('^F[0-9]+$')]] then sndPlay(motif.Snd, motif.option_info.cursor.done.snd[1], motif.option_info.cursor.done.snd[2]) options.f_keyCfgInit('Keys', t.submenu[t.items[item].itemname].title) while true do if not options.f_keyCfg('Keys', t.items[item].itemname, motif.optionbgdef, false) then break end end end return true end, --Joystick Config ['gamepad'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.done.key) --[[or getKey():match('^F[0-9]+$')]] then sndPlay(motif.Snd, motif.option_info.cursor.done.snd[1], motif.option_info.cursor.done.snd[2]) if getCommandLineValue("-nojoy") == nil then options.f_keyCfgInit('Joystick', t.submenu[t.items[item].itemname].title) while true do if not options.f_keyCfg('Joystick', t.items[item].itemname, motif.optionbgdef, false) then break end end end end return true end, --Default ['inputdefault'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.done.snd[1], motif.option_info.cursor.done.snd[2]) options.f_keyDefault() options.f_setKeyConfig('Keys') if getCommandLineValue("-nojoy") == nil then options.f_setKeyConfig('Joystick') end options.modified = true end return true end, --Players ['players'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) and gameOption('Config.Players') < 8 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.Players', math.min(8, gameOption('Config.Players') + 2)) t.items[item].vardisplay = gameOption('Config.Players') main.f_setPlayers() options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Config.Players') > 2 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.Players', math.max(2, gameOption('Config.Players') - 2)) t.items[item].vardisplay = gameOption('Config.Players') main.f_setPlayers() options.modified = true end return true end, --Debug Keys ['debugkeys'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Debug.AllowDebugKeys') then modifyGameOption('Debug.AllowDebugKeys', false) else modifyGameOption('Debug.AllowDebugKeys', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Debug.AllowDebugKeys'), motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) options.modified = true end return true end, --Debug Mode ['debugmode'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Debug.AllowDebugMode') then modifyGameOption('Debug.AllowDebugMode', false) else modifyGameOption('Debug.AllowDebugMode', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Debug.AllowDebugMode'), motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) options.modified = true end return true end, --Background Loading --[[['backgroundloading'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) if gameOption('Config.BackgroundLoading') then modifyGameOption('Config.BackgroundLoading', false) else modifyGameOption('Config.BackgroundLoading', true) end t.items[item].vardisplay = options.f_boolDisplay(gameOption('Config.BackgroundLoading'), motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) options.modified = true end return true end,]] --HelperMax ['helpermax'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.HelperMax', gameOption('Config.HelperMax') + 1) t.items[item].vardisplay = gameOption('Config.HelperMax') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Config.HelperMax') > 1 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.HelperMax', gameOption('Config.HelperMax') - 1) t.items[item].vardisplay = gameOption('Config.HelperMax') options.modified = true end return true end, --ProjectileMax ['projectilemax'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.ProjectileMax', gameOption('Config.ProjectileMax') + 1) t.items[item].vardisplay = gameOption('Config.ProjectileMax') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Config.ProjectileMax') > 1 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.ProjectileMax', gameOption('Config.ProjectileMax') - 1) t.items[item].vardisplay = gameOption('Config.ProjectileMax') options.modified = true end return true end, --ExplodMax ['explodmax'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.ExplodMax', gameOption('Config.ExplodMax') + 1) t.items[item].vardisplay = gameOption('Config.ExplodMax') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Config.ExplodMax') > 1 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.ExplodMax', gameOption('Config.ExplodMax') - 1) t.items[item].vardisplay = gameOption('Config.ExplodMax') options.modified = true end return true end, --AfterImageMax ['afterimagemax'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.AfterImageMax', gameOption('Config.AfterImageMax') + 1) t.items[item].vardisplay = gameOption('Config.AfterImageMax') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Config.AfterImageMax') > 1 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.AfterImageMax', gameOption('Config.AfterImageMax') - 1) t.items[item].vardisplay = gameOption('Config.AfterImageMax') options.modified = true end return true end, --PaletteMax ['palettemax'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.PaletteMax', gameOption('Config.PaletteMax') + 1) t.items[item].vardisplay = gameOption('Config.PaletteMax') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Config.PaletteMax') > 1 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.PaletteMax', gameOption('Config.PaletteMax') - 1) t.items[item].vardisplay = gameOption('Config.PaletteMax') options.modified = true end options.needReload = true return true end, --TextMax ['textmax'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key) then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.TextMax', gameOption('Config.TextMax') + 1) t.items[item].vardisplay = gameOption('Config.TextMax') options.modified = true elseif getInput(-1, motif.option_info.menu.subtract.key) and gameOption('Config.TextMax') > 1 then sndPlay(motif.Snd, motif.option_info.cursor.move.snd[1], motif.option_info.cursor.move.snd[2]) modifyGameOption('Config.TextMax', gameOption('Config.TextMax') - 1) t.items[item].vardisplay = gameOption('Config.TextMax') options.modified = true end return true end, --Save and Return ['savereturn'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cancel.snd[1], motif.option_info.cancel.snd[2]) if options.modified then options.f_saveCfg(options.needReload) saveArkUnSettings() end main.f_fadeReset('fadeout', motif.option_info) main.close = true --return false end return true end, --Return Without Saving ['return'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cancel.snd[1], motif.option_info.cancel.snd[2]) if options.needReload then main.f_warning(motif.warning_info.text.text.noreload, motif.option_info, motif.optionbgdef) end main.f_fadeReset('fadeout', motif.option_info) main.close = true --return false end return true end, --Save Settings ['savesettings'] = function(t, item, cursorPosY, moveTxt) if getInput(-1, motif.option_info.menu.add.key, motif.option_info.menu.subtract.key, motif.option_info.menu.done.key) then sndPlay(motif.Snd, motif.option_info.cursor.done.snd[1], motif.option_info.cursor.done.snd[2]) if options.modified then options.f_saveCfg(options.needReload) end end return true end, } options.t_vardisplay = { ['replayframedata'] = function() return options.f_boolDisplay(replayFrameData) end, ['replayinputdata'] = function() return options.f_boolDisplay(replayInputData) end, ['replaycombodata'] = function() return options.f_boolDisplay(replayComboData) end, ['afterimagemax'] = function() return gameOption('Config.AfterImageMax') end, ['aipalette'] = function() return options.f_boolDisplay(gameOption('Arcade.AI.RandomColor'), motif.option_info.menu.valuename.random, motif.option_info.menu.valuename.default) end, ['aisurvivalpalette'] = function() return options.f_boolDisplay(gameOption('Arcade.AI.SurvivalColor'), motif.option_info.menu.valuename.random, motif.option_info.menu.valuename.default) end, ['airamping'] = function() return options.f_boolDisplay(gameOption('Arcade.AI.Ramping')) end, ['aspectratio'] = function() local width = gameOption('Video.FightAspectWidth') local height = gameOption('Video.FightAspectHeight') if width > 0 and height > 0 then return width .. ':' .. height elseif width < 0 and height < 0 then return findItemnameBySuffix('stageaspect$') else return findItemnameBySuffix('defaultaspect$') end end, ['audioducking'] = function() return options.f_boolDisplay(gameOption('Sound.AudioDucking'), motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) end, ['autoguard'] = function() return options.f_boolDisplay(gameOption('Options.AutoGuard')) end, --['backgroundloading'] = function() -- return options.f_boolDisplay(gameOption('Config.BackgroundLoading'), motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) --end, ['bgmvolume'] = function() return gameOption('Sound.BGMVolume') .. '%' end, ['credits'] = function() return options.f_definedDisplay(gameOption('Options.Credits'), {[0] = motif.option_info.menu.valuename.disabled}, gameOption('Options.Credits')) end, ['debugkeys'] = function() return options.f_boolDisplay(gameOption('Debug.AllowDebugKeys'), motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) end, ['debugmode'] = function() return options.f_boolDisplay(gameOption('Debug.AllowDebugMode'), motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) end, ['difficulty'] = function() return gameOption('Options.Difficulty') end, ['enablemodel'] = function() return options.f_definedDisplay(gameOption('Video.EnableModel'), {[true] = motif.option_info.menu.valuename.enabled}, motif.option_info.menu.valuename.disabled) end, ['enablemodelshadow'] = function() return options.f_definedDisplay(gameOption('Video.EnableModelShadow'), {[true] = motif.option_info.menu.valuename.enabled}, motif.option_info.menu.valuename.disabled) end, ['explodmax'] = function() return gameOption('Config.ExplodMax') end, ['fullscreen'] = function() return options.f_boolDisplay(gameOption('Video.Fullscreen')) end, ['gamespeed'] = function() return options.f_boolDisplay(gameOption('Options.GameSpeed') == 0, motif.option_info.menu.valuename.normal, options.f_boolDisplay(gameOption('Options.GameSpeed') < 0, string.format(motif.option_info.menu.valuename.slow, 0 - gameOption('Options.GameSpeed')), string.format(motif.option_info.menu.valuename.fast, gameOption('Options.GameSpeed')))) end, ['guardbreak'] = function() return options.f_boolDisplay(gameOption('Options.GuardBreak')) end, ['helpermax'] = function() return gameOption('Config.HelperMax') end, ['keepaspect'] = function() return options.f_boolDisplay(gameOption('Video.KeepAspect'), motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) end, ['language'] = function() sfs = motif.languages[gameOption('Config.Language')] return sfs or gameOption('Config.Language') end, ['lifemul'] = function() return gameOption('Options.Life') .. '%' end, ['losekosimul'] = function() return options.f_boolDisplay(gameOption('Options.Simul.LoseOnKO')) end, ['losekotag'] = function() return options.f_boolDisplay(gameOption('Options.Tag.LoseOnKO')) end, ['mastervolume'] = function() return gameOption('Sound.MasterVolume') .. '%' end, ['maxdrawgames'] = function() return main.maxDrawGames[1] end, ['maxsimul'] = function() return gameOption('Options.Simul.Max') end, ['maxtag'] = function() return gameOption('Options.Tag.Max') end, ['maxturns'] = function() return gameOption('Options.Turns.Max') end, ['minsimul'] = function() return gameOption('Options.Simul.Min') end, ['mintag'] = function() return gameOption('Options.Tag.Min') end, ['minturns'] = function() return gameOption('Options.Turns.Min') end, ['msaa'] = function() return options.f_definedDisplay(gameOption('Video.MSAA'), {[0] = motif.option_info.menu.valuename.disabled}, gameOption('Video.MSAA') .. 'x') end, ['palettemax'] = function() return gameOption('Config.PaletteMax') end, ['panningrange'] = function() return gameOption('Sound.PanningRange') .. '%' end, ['players'] = function() return gameOption('Config.Players') end, ['portchange'] = function() return gameOption('Netplay.ListenPort') end, ['projectilemax'] = function() return gameOption('Config.ProjectileMax') end, ['quickcontinue'] = function() return options.f_boolDisplay(gameOption('Options.QuickContinue')) end, ['ratio1attack'] = function() return options.f_displayRatio(gameOption('Options.Ratio.Level1.Attack')) end, ['ratio1life'] = function() return options.f_displayRatio(gameOption('Options.Ratio.Level1.Life')) end, ['ratio2attack'] = function() return options.f_displayRatio(gameOption('Options.Ratio.Level2.Attack')) end, ['ratio2life'] = function() return options.f_displayRatio(gameOption('Options.Ratio.Level2.Life')) end, ['ratio3attack'] = function() return options.f_displayRatio(gameOption('Options.Ratio.Level3.Attack')) end, ['ratio3life'] = function() return options.f_displayRatio(gameOption('Options.Ratio.Level3.Life')) end, ['ratio4attack'] = function() return options.f_displayRatio(gameOption('Options.Ratio.Level4.Attack')) end, ['ratio4life'] = function() return options.f_displayRatio(gameOption('Options.Ratio.Level4.Life')) end, ['ratiorecoverybase'] = function() return gameOption('Options.Ratio.Recovery.Base') .. '%' end, ['ratiorecoverybonus'] = function() return gameOption('Options.Ratio.Recovery.Bonus') .. '%' end, ['redlife'] = function() return options.f_boolDisplay(gameOption('Options.RedLife')) end, ['renderer'] = function() return gameOption('Video.RenderMode') end, ['resolution'] = function() return gameOption('Video.GameWidth') .. 'x' .. gameOption('Video.GameHeight') end, ['roundsnumsimul'] = function() return main.roundsNumSimul[1] end, ['roundsnumsingle'] = function() return main.roundsNumSingle[1] end, ['roundsnumtag'] = function() return main.roundsNumTag[1] end, ['roundtime'] = function() return options.f_definedDisplay(gameOption('Options.Time'), {[-1] = motif.option_info.menu.valuename.none}, gameOption('Options.Time')) end, ['rumble'] = function(player) return options.f_boolDisplay(gameOption('Joystick_P' .. player .. '.RumbleOn')) end, ['sfxvolume'] = function() return gameOption('Sound.WavVolume') .. '%' end, ['shaders'] = function() return options.f_boolDisplay(#gameOption('Video.ExternalShaders') > 0, motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) end, ['singlevsteamlife'] = function() return gameOption('Options.Team.SingleVsTeamLife') .. '%' end, ['stereoeffects'] = function() return options.f_boolDisplay(gameOption('Sound.StereoEffects'), motif.option_info.menu.valuename.enabled, motif.option_info.menu.valuename.disabled) end, ['dizzy'] = function() return options.f_boolDisplay(gameOption('Options.Dizzy')) end, ['teamduplicates'] = function() return options.f_boolDisplay(gameOption('Options.Team.Duplicates')) end, ['teamlifeshare'] = function() return options.f_boolDisplay(gameOption('Options.Team.LifeShare')) end, ['teampowershare'] = function() return options.f_boolDisplay(gameOption('Options.Team.PowerShare')) end, ['textmax'] = function() return gameOption('Config.TextMax') end, ['turnsrecoverybase'] = function() return gameOption('Options.Turns.Recovery.Base') .. '%' end, ['turnsrecoverybonus'] = function() return gameOption('Options.Turns.Recovery.Bonus') .. '%' end, ['vsync'] = function() return options.f_definedDisplay(gameOption('Video.VSync'), {[1] = motif.option_info.menu.valuename.enabled}, motif.option_info.menu.valuename.disabled) end, ['windowscalemode'] = function() return options.f_boolDisplay(gameOption('Video.WindowScaleMode'), "Bilinear", "Nearest") end, } -- 1. 备份原始函数和底层按键检测函数; local old_f_keyCfg = options.f_keyCfg; local old_getKey = getKey; local old_modify = modifyGameOption; -- 2. 重写函数; options.f_keyCfg = function(cfgType, controller, bg, skipClear) -- --- [ 核心:身份置换拦截 ] --- -- 在这一帧,我们“欺骗”整个引擎的按键识别; _G.getKey = function(k) -- 如果传入了参数(比如检测特定键状态),我们进行映射; if k == 'SPACE' then return old_getKey('TAB') end; if k == 'TAB' then return old_getKey('SPACE') end; -- 如果没传参数(常规检测),获取当前按下的键位; local pressed = old_getKey(); if pressed == 'TAB' then return 'SPACE' end; -- 按下 TAB,引擎认为是 SPACE (触发清除); if pressed == 'SPACE' then return 'Space' end; -- 按下 SPACE,引擎认为是 F13 (一个普通的、没被占用的键); return pressed; end; -- --- [ 核心:保存数据重定向 ] --- -- 因为上面把 SPACE 变成了 F13,我们要拦截保存动作,把 F13 变回 SPACE 存入配置; _G.modifyGameOption = function(opt, val) if val == 'Space' then val = 'SPACE' end; return old_modify(opt, val); end; -- --- [ 执行原始函数 ] --- -- 现在在原始函数眼里:按下 TAB = 触发清除逻辑,按下 SPACE = 录入了一个叫 F13 的普通键; local status, result = pcall(old_f_keyCfg, cfgType, controller, bg, skipClear); -- --- [ 还原环境 ] --- _G.getKey = old_getKey; _G.modifyGameOption = old_modify; -- --- [ 修复显示文字 ] --- -- 原始函数会把 F13 显示在屏幕上,我们需要把它修正为 SPACE; local t = t_keyCfg or options.t_keyCfg; if t then for i = 1, #t do if t[i]['vardisplay' .. player] == 'Space' then t[i]['vardisplay' .. player] = 'SPACE'; end; end; end; if not status then print("Mod Error: " .. tostring(result)) end; return result; end;