menu.t_valuename = { dummycontrol = { {itemname = 'cooperative', displayname = motif.pause_menu.training_pause_menu.menu.valuename.dummycontrol_cooperative}, {itemname = 'ai', displayname = motif.pause_menu.training_pause_menu.menu.valuename.dummycontrol_ai}, {itemname = 'manual', displayname = motif.pause_menu.training_pause_menu.menu.valuename.dummycontrol_manual}, }, ailevel = { {itemname = '1', displayname = motif.pause_menu.training_pause_menu.menu.valuename.ailevel_1}, {itemname = '2', displayname = motif.pause_menu.training_pause_menu.menu.valuename.ailevel_2}, {itemname = '3', displayname = motif.pause_menu.training_pause_menu.menu.valuename.ailevel_3}, {itemname = '4', displayname = motif.pause_menu.training_pause_menu.menu.valuename.ailevel_4}, {itemname = '5', displayname = motif.pause_menu.training_pause_menu.menu.valuename.ailevel_5}, {itemname = '6', displayname = motif.pause_menu.training_pause_menu.menu.valuename.ailevel_6}, {itemname = '7', displayname = motif.pause_menu.training_pause_menu.menu.valuename.ailevel_7}, {itemname = '8', displayname = motif.pause_menu.training_pause_menu.menu.valuename.ailevel_8}, }, dummymode = { {itemname = 'stand', displayname = motif.pause_menu.training_pause_menu.menu.valuename.dummymode_stand}, {itemname = 'crouch', displayname = motif.pause_menu.training_pause_menu.menu.valuename.dummymode_crouch}, {itemname = 'jump', displayname = motif.pause_menu.training_pause_menu.menu.valuename.dummymode_jump}, {itemname = 'wjump', displayname = motif.pause_menu.training_pause_menu.menu.valuename.dummymode_wjump}, }, guardmode = { {itemname = 'none', displayname = motif.pause_menu.training_pause_menu.menu.valuename.guardmode_none}, {itemname = 'auto', displayname = motif.pause_menu.training_pause_menu.menu.valuename.guardmode_auto}, {itemname = 'all', displayname = motif.pause_menu.training_pause_menu.menu.valuename.guardmode_all}, {itemname = 'reverse1', displayname = motif.pause_menu.training_pause_menu.menu.valuename.guardmode_reverse1}, {itemname = 'reverse2', displayname = motif.pause_menu.training_pause_menu.menu.valuename.guardmode_reverse2}, {itemname = 'reverse3', displayname = motif.pause_menu.training_pause_menu.menu.valuename.guardmode_reverse3}, }, fallrecovery = { {itemname = 'none', displayname = motif.pause_menu.training_pause_menu.menu.valuename.fallrecovery_none}, {itemname = 'ground', displayname = motif.pause_menu.training_pause_menu.menu.valuename.fallrecovery_ground}, {itemname = 'air', displayname = motif.pause_menu.training_pause_menu.menu.valuename.fallrecovery_air}, {itemname = 'random', displayname = motif.pause_menu.training_pause_menu.menu.valuename.fallrecovery_random}, }, distance = { {itemname = 'any', displayname = motif.pause_menu.training_pause_menu.menu.valuename.distance_any}, {itemname = 'close', displayname = motif.pause_menu.training_pause_menu.menu.valuename.distance_close}, {itemname = 'medium', displayname = motif.pause_menu.training_pause_menu.menu.valuename.distance_medium}, {itemname = 'far', displayname = motif.pause_menu.training_pause_menu.menu.valuename.distance_far}, }, buttonjam = { {itemname = 'none', displayname = motif.pause_menu.training_pause_menu.menu.valuename.buttonjam_none}, {itemname = 'a', displayname = motif.pause_menu.training_pause_menu.menu.valuename.buttonjam_a}, {itemname = 'b', displayname = motif.pause_menu.training_pause_menu.menu.valuename.buttonjam_b}, {itemname = 'c', displayname = motif.pause_menu.training_pause_menu.menu.valuename.buttonjam_c}, {itemname = 'x', displayname = motif.pause_menu.training_pause_menu.menu.valuename.buttonjam_x}, {itemname = 'y', displayname = motif.pause_menu.training_pause_menu.menu.valuename.buttonjam_y}, {itemname = 'z', displayname = motif.pause_menu.training_pause_menu.menu.valuename.buttonjam_z}, {itemname = 's', displayname = motif.pause_menu.training_pause_menu.menu.valuename.buttonjam_s}, {itemname = 'd', displayname = motif.pause_menu.training_pause_menu.menu.valuename.buttonjam_d}, {itemname = 'w', displayname = motif.pause_menu.training_pause_menu.menu.valuename.buttonjam_w}, }, powerlevel = { {itemname = 'none', displayname = motif.pause_menu.training_pause_menu.menu.valuename.powerlevel_0}, {itemname = 'l', displayname = motif.pause_menu.training_pause_menu.menu.valuename.powerlevel_1}, {itemname = '2', displayname = motif.pause_menu.training_pause_menu.menu.valuename.powerlevel_2}, {itemname = '3', displayname = motif.pause_menu.training_pause_menu.menu.valuename.powerlevel_3}, {itemname = '4', displayname = motif.pause_menu.training_pause_menu.menu.valuename.powerlevel_4}, {itemname = '5', displayname = motif.pause_menu.training_pause_menu.menu.valuename.powerlevel_5}, }, costlevel = { {itemname = 'none', displayname = motif.pause_menu.training_pause_menu.menu.valuename.costlevel_0}, {itemname = '1', displayname = motif.pause_menu.training_pause_menu.menu.valuename.costlevel_1}, {itemname = '2', displayname = motif.pause_menu.training_pause_menu.menu.valuename.costlevel_2}, {itemname = '3', displayname = motif.pause_menu.training_pause_menu.menu.valuename.costlevel_3}, {itemname = '4', displayname = motif.pause_menu.training_pause_menu.menu.valuename.costlevel_4}, {itemname = '5', displayname = motif.pause_menu.training_pause_menu.menu.valuename.costlevel_5}, {itemname = '6', displayname = motif.pause_menu.training_pause_menu.menu.valuename.costlevel_6}, {itemname = '7', displayname = motif.pause_menu.training_pause_menu.menu.valuename.costlevel_7}, {itemname = '8', displayname = motif.pause_menu.training_pause_menu.menu.valuename.costlevel_8}, {itemname = '9', displayname = motif.pause_menu.training_pause_menu.menu.valuename.costlevel_9}, {itemname = 'Max', displayname = motif.pause_menu.training_pause_menu.menu.valuename.costlevel_max}, }, framedata = { {itemname = '0', displayname = motif.pause_menu.training_pause_menu.menu.valuename.framedata_0}, {itemname = '1', displayname = motif.pause_menu.training_pause_menu.menu.valuename.framedata_1}, }, inputdata = { {itemname = '0', displayname = motif.pause_menu.training_pause_menu.menu.valuename.inputdata_0}, {itemname = '1', displayname = motif.pause_menu.training_pause_menu.menu.valuename.inputdata_1}, }, combodata = { {itemname = '0', displayname = motif.pause_menu.training_pause_menu.menu.valuename.combodata_0}, {itemname = '1', displayname = motif.pause_menu.training_pause_menu.menu.valuename.combodata_1}, }, recoverydir = { {itemname = 'none', displayname = motif.pause_menu.training_pause_menu.menu.valuename.recoverydir_none}, {itemname = 'fwd', displayname = motif.pause_menu.training_pause_menu.menu.valuename.recoverydir_fwd}, {itemname = 'back', displayname = motif.pause_menu.training_pause_menu.menu.valuename.recoverydir_back}, {itemname = 'random', displayname = motif.pause_menu.training_pause_menu.menu.valuename.recoverydir_random}, }, } menu.t_itemname = { --Recovery Dir ['recoverydir'] = function(t, item, cursorPosY, moveTxt, sec) if menu.f_valueChanged(t.items[item], sec) then for i = 1,8,1 do player(i) mapSet('_iksys_trainingRecoveryDir', menu.recoverydir - 1) end end return true end, --Frame Data ['framedata'] = function(t, item, cursorPosY, moveTxt, sec) if menu.f_valueChanged(t.items[item], sec) then for i = 1,8,1 do player(i) mapSet('_iksys_trainingFrameData', menu.framedata - 1) end end return true end, --Input Data ['inputdata'] = function(t, item, cursorPosY, moveTxt, sec) if menu.f_valueChanged(t.items[item], sec) then for i = 1,8,1 do player(i) mapSet('_iksys_trainingInputData', menu.inputdata - 1) end end return true end, --Combo Data ['combodata'] = function(t, item, cursorPosY, moveTxt, sec) if menu.f_valueChanged(t.items[item], sec) then for i = 1,8,1 do player(i) mapSet('_iksys_trainingComboData', menu.combodata - 1) end end return true end, --Power Recovery 能量恢复 ['powerlevel'] = function(t, item, cursorPosY, moveTxt, sec) if menu.f_valueChanged(t.items[item], sec) then for i = 1,8,1 do player(i) mapSet('_iksys_PowerLevel', menu.powerlevel - 1) end end return true end, --cost Recovery cost恢复 ['costlevel'] = function(t, item, cursorPosY, moveTxt, sec) if menu.f_valueChanged(t.items[item], sec) then for i = 1,8,1 do player(i) mapSet('_iksys_CostLevel', menu.costlevel - 1) end end return true end, --Back ['back'] = function(t, item, cursorPosY, moveTxt, sec) if getInput(-1, sec.menu.done.key) then -- 优先返回父菜单(上一级) if t.parent ~= nil and t.parent.loop ~= nil then sndPlay(motif.Snd, sec.cancel.snd[1], sec.cancel.snd[2]) menu.currentMenu[1] = t.parent.loop if t.parentId ~= nil then menu.currentMenuId = t.parentId end main.f_menuSnap(sec) return false end -- 已经是最外层菜单 → 才退出暂停 sndPlay(motif.Snd, sec.exit.snd[1], sec.exit.snd[2]) togglePause(false) main.pauseMenu = false return false end return true end, --Dummy Control ['dummycontrol'] = function(t, item, cursorPosY, moveTxt, sec) local ok, name = menu.f_valueChanged(t.items[item], sec) if ok then if name == 'cooperative' or name == 'manual' then player(2) setAILevel(0) elseif name == 'ai' then player(2) setAILevel(menu.ailevel) end player(2) mapSet('_iksys_trainingDummyControl', menu.dummycontrol - 1) end return true end, --AI Level ['ailevel'] = function(t, item, cursorPosY, moveTxt, sec) if menu.f_valueChanged(t.items[item], sec) then if menu.t_valuename.dummycontrol[menu.dummycontrol or 1].itemname == 'ai' then player(2) setAILevel(menu.ailevel) end end return true end, --Dummy Mode ['dummymode'] = function(t, item, cursorPosY, moveTxt, sec) if menu.f_valueChanged(t.items[item], sec) then player(2) mapSet('_iksys_trainingDummyMode', menu.dummymode - 1) end return true end, --Guard Mode ['guardmode'] = function(t, item, cursorPosY, moveTxt, sec) if menu.f_valueChanged(t.items[item], sec) then player(2) mapSet('_iksys_trainingGuardMode', menu.guardmode - 1) end return true end, --Fall Recovery ['fallrecovery'] = function(t, item, cursorPosY, moveTxt, sec) if menu.f_valueChanged(t.items[item], sec) then player(2) mapSet('_iksys_trainingFallRecovery', menu.fallrecovery - 1) end return true end, --Distance ['distance'] = function(t, item, cursorPosY, moveTxt, sec) if menu.f_valueChanged(t.items[item], sec) then player(2) mapSet('_iksys_trainingDistance', menu.distance - 1) end return true end, --Button Jam ['buttonjam'] = function(t, item, cursorPosY, moveTxt, sec) if menu.f_valueChanged(t.items[item], sec) then player(2) mapSet('_iksys_trainingButtonJam', menu.buttonjam - 1) end return true end, --Key Config ['keyboard'] = function(t, item, cursorPosY, moveTxt, sec) if getInput(-1, sec.menu.done.key) --[[or getKey('F1')]] then sndPlay(motif.Snd, sec.cursor.done.snd[1], sec.cursor.done.snd[2]) options.f_keyCfgInit('Keys', t.submenu[t.items[item].itemname].title) menu.itemname = t.items[item].itemname end return true end, --Joystick Config ['gamepad'] = function(t, item, cursorPosY, moveTxt, sec) if getInput(-1, sec.menu.done.key) --[[or getKey('F2')]] then sndPlay(motif.Snd, sec.cursor.done.snd[1], sec.cursor.done.snd[2]) options.f_keyCfgInit('Joystick', t.submenu[t.items[item].itemname].title) menu.itemname = t.items[item].itemname end return true end, --Default ['inputdefault'] = function(t, item, cursorPosY, moveTxt, sec) if getInput(-1, sec.menu.done.key) then sndPlay(motif.Snd, sec.cursor.done.snd[1], sec.cursor.done.snd[2]) options.f_keyDefault() options.f_setKeyConfig('Keys') if getCommandLineValue("-nojoy") == nil then options.f_setKeyConfig('Joystick') end options.f_saveCfg(false) end return true end, --Round Reset ['reset'] = function(t, item, cursorPosY, moveTxt, sec) if getInput(-1, sec.menu.done.key) then sndPlay(motif.Snd, sec.cursor.done.snd[1], sec.cursor.done.snd[2]) --togglePause(false) roundReset() main.pauseMenu = false return false end return true end, --Reload (Rematch) ['reload'] = function(t, item, cursorPosY, moveTxt, sec) if getInput(-1, sec.menu.done.key) then sndPlay(motif.Snd, sec.cursor.done.snd[1], sec.cursor.done.snd[2]) --togglePause(false) reload() main.pauseMenu = false return false end return true end, --Command List ['commandlist'] = function(t, item, cursorPosY, moveTxt, sec) if getInput(-1, sec.menu.done.key) then sndPlay(motif.Snd, sec.cursor.done.snd[1], sec.cursor.done.snd[2]) menu.f_commandlistParse() menu.itemname = t.items[item].itemname end return true end, --Character Change ['characterchange'] = function(t, item, cursorPosY, moveTxt, sec) if getInput(-1, sec.menu.done.key) then Global_hasReset = 0 --退出对局时重置开关 sndPlay(motif.Snd, sec.cursor.done.snd[1], sec.cursor.done.snd[2]) --togglePause(false) endMatch() start.characterchange = true main.pauseMenu = false start.f_selectReset(false) return false end return true end, --Exit ['exit'] = function(t, item, cursorPosY, moveTxt, sec) if getInput(-1, sec.menu.done.key) then Global_hasReset = 0 --退出对局时重置开关 sndPlay(motif.Snd, sec.cursor.done.snd[1], sec.cursor.done.snd[2]) --togglePause(false) endMatch() start.exit = true main.pauseMenu = false return false end return true end, } menu.t_vardisplay = { ['recoverydir'] = function() return menu.t_valuename.recoverydir[menu.recoverydir or 1].displayname end, ['inputdata'] = function() return menu.t_valuename.inputdata[menu.inputdata or 1].displayname end, ['framedata'] = function() return menu.t_valuename.framedata[menu.framedata or 1].displayname end, ['combodata'] = function() return menu.t_valuename.combodata[menu.combodata or 1].displayname end, ['powerlevel'] = function() --gdghf return menu.t_valuename.powerlevel[menu.powerlevel or 1].displayname end, ['costlevel'] = function() --gdghf return menu.t_valuename.costlevel[menu.costlevel or 1].displayname end, ['dummycontrol'] = function() return menu.t_valuename.dummycontrol[menu.dummycontrol or 1].displayname end, ['ailevel'] = function() return menu.t_valuename.ailevel[menu.ailevel or gameOption('Options.Difficulty')].displayname end, ['dummymode'] = function() return menu.t_valuename.dummymode[menu.dummymode or 1].displayname end, ['guardmode'] = function() return menu.t_valuename.guardmode[menu.guardmode or 1].displayname end, ['fallrecovery'] = function() return menu.t_valuename.fallrecovery[menu.fallrecovery or 1].displayname end, ['distance'] = function() return menu.t_valuename.distance[menu.distance or 1].displayname end, ['buttonjam'] = function() return menu.t_valuename.buttonjam[menu.buttonjam or 1].displayname end, } menu.t_menus = { {id = 'menu', sec = motif.pause_menu.pause_menu, bg = motif.pausebgdef.pausebgdef, movelist = true}, {id = 'training', sec = motif.pause_menu.training_pause_menu, bg = motif.pausebgdef.trainingpausebgdef, movelist = true}, } menu.t_menuIndex = {} local function f_pauseMenuKey(gamemodeName) gamemodeName = tostring(gamemodeName or ''):lower() gamemodeName = gamemodeName:gsub('%s+', '_') if gamemodeName == '' then return '' end return gamemodeName .. '_pause_menu' end local function f_pauseMenuIdFromKey(key) key = tostring(key or ''):lower() if key:sub(-11) == '_pause_menu' then key = key:sub(1, -12) end return key end local function f_pauseMenuBgKey(gamemodeName) gamemodeName = tostring(gamemodeName or ''):lower() gamemodeName = gamemodeName:gsub('%s+', '_') if gamemodeName == '' then return '' end return gamemodeName .. 'pausebgdef' end local function f_registerPauseMenu(id, sec, bg, movelist) if id == '' or sec == nil then return end for i = 1, #menu.t_menus do if menu.t_menus[i].id == id then return end end table.insert(menu.t_menus, {id = id, sec = sec, bg = bg, movelist = movelist}) end local function f_indexPauseMenus() menu.t_menuIndex = {} for i = 1, #menu.t_menus do menu.t_menuIndex[menu.t_menus[i].id] = menu.t_menus[i] end end -- Dynamically generates all menus and submenus function menu.f_start() if motif.pause_menu ~= nil then for k, sec in pairs(motif.pause_menu) do local id = f_pauseMenuIdFromKey(k) if id ~= '' and id ~= 'pause_menu' then local bg = motif.pausebgdef.pausebgdef local bgKey = f_pauseMenuBgKey(id) if bgKey ~= '' and motif.pausebgdef ~= nil and motif.pausebgdef[bgKey] ~= nil then bg = motif.pausebgdef[bgKey] end f_registerPauseMenu(id, sec, bg, true) end end end f_indexPauseMenus() for k, v in ipairs(menu.t_menus) do menu[v.id] = { title = main.f_itemnameUpper(v.sec.title.text, v.sec.menu.title.uppercase), cursorPosY = 1, moveTxt = 0, item = 1, submenu = {}, items = {} } menu[v.id].loop = menu.f_createMenu(menu[v.id], v.sec, v.bg, true) local w = main.f_menuWindow(v.sec.menu) local t_pos = {} --for storing current table position local lastNum = 0 for i, suffix in ipairs(v.sec.menu.itemname_order) do for j, c in ipairs(main.f_strsplit('_', suffix)) do --split using "_" delimiter --appending the menu table if j == 1 then --first string after menu.itemname (either reserved one or custom submenu assignment) if menu[v.id].submenu[c] == nil or c:match("^spacer%d*$") then menu[v.id].submenu[c] = {} menu[v.id].submenu[c].title = main.f_itemnameUpper(v.sec.menu.itemname[suffix], v.sec.menu.title.uppercase) -- 新增:父菜单记录 menu[v.id].submenu[c].parent = menu[v.id] menu[v.id].submenu[c].parentId = v.id if menu.t_itemname[c] == nil and not c:match("^spacer%d*$") then menu[v.id].submenu[c].cursorPosY = 1 menu[v.id].submenu[c].moveTxt = 0 menu[v.id].submenu[c].item = 1 menu[v.id].submenu[c].submenu = {} menu[v.id].submenu[c].items = {} menu[v.id].submenu[c].loop = menu.f_createMenu(menu[v.id].submenu[c], v.sec, v.bg, false) end if not suffix:match(c .. '_') then table.insert(menu[v.id].items, { itemname = c, displayname = v.sec.menu.itemname[suffix], paramname = suffix, vardisplay = menu.f_vardisplay(c), selected = false, }) table.insert(menu.t_vardisplayPointers, menu[v.id].items[#menu[v.id].items]) end end t_pos = menu[v.id].submenu[c] t_pos.name = c else --following strings if t_pos.submenu[c] == nil or c:match("^spacer%d*$") then t_pos.submenu[c] = {} t_pos.submenu[c].title = main.f_itemnameUpper(v.sec.menu.itemname[suffix], v.sec.menu.title.uppercase) --新增:父菜单记录 t_pos.submenu[c].parent = t_pos t_pos.submenu[c].parentId = menu.currentMenuId or v.id if menu.t_itemname[c] == nil and not c:match("^spacer%d*$") then t_pos.submenu[c].cursorPosY = 1 t_pos.submenu[c].moveTxt = 0 t_pos.submenu[c].item = 1 t_pos.submenu[c].submenu = {} t_pos.submenu[c].items = {} t_pos.submenu[c].loop = menu.f_createMenu(t_pos.submenu[c], v.sec, v.bg, false) end table.insert(t_pos.items, { itemname = c, displayname = v.sec.menu.itemname[suffix], paramname = suffix, vardisplay = menu.f_vardisplay(c), selected = false, }) table.insert(menu.t_vardisplayPointers, t_pos.items[#t_pos.items]) end if j > lastNum then t_pos = t_pos.submenu[c] t_pos.name = c end end lastNum = j end end textImgSetWindow(v.sec.menu.item.selected.active.TextSpriteData, w[1], w[2], w[3], w[4]) textImgSetWindow(v.sec.menu.item.active.TextSpriteData, w[1], w[2], w[3], w[4]) textImgSetWindow(v.sec.menu.item.value.active.TextSpriteData, w[1], w[2], w[3], w[4]) textImgSetWindow(v.sec.menu.item.selected.TextSpriteData, w[1], w[2], w[3], w[4]) textImgSetWindow(v.sec.menu.item.TextSpriteData, w[1], w[2], w[3], w[4]) textImgSetWindow(v.sec.menu.item.value.TextSpriteData, w[1], w[2], w[3], w[4]) --for _, v2 in pairs(v.sec.menu.item.bg) do -- animSetWindow(v2.AnimData, w[1], w[2], w[3], w[4]) --end --for _, v2 in pairs(v.sec.menu.item.active.bg) do -- animSetWindow(v2.AnimData, w[1], w[2], w[3], w[4]) --end if gameOption('Debug.DumpLuaTables') then main.f_printTable(menu[v.id], 'debug/t_' .. v.id .. 'Menu.txt') end -- Move list if v.movelist then local t = v.sec.movelist if t.window.margins.y[1] ~= 0 or t.window.margins.y[2] ~= 0 then local fontProps = motif.files.font['font' .. v.sec.movelist.text.font[1]] if fontProps ~= nil then menu.movelistW = { 0, math.max(0, t.pos[2] + t.text.offset[2] - t.window.margins.y[1]), t.pos[1] + t.text.offset[1] + t.window.width, t.pos[2] + t.text.offset[2] + (t.window.visibleitems - 1) * main.f_round((fontProps.size[2] + fontProps.spacing[2]) * t.text.scale[2] + t.text.spacing[2]) + t.window.margins.y[2] + math.max(0, t.glyphs.offset[2]) } textImgSetWindow(t.text.TextSpriteData, menu.movelistW[1], menu.movelistW[2], menu.movelistW[3], menu.movelistW[4]) end end end end end -- Shared menu loop logic function menu.f_createMenu(tbl, sec, bg, bool_main) return function() hook.run("menu.menu.loop") if menu._lastMenuTbl ~= tbl then menu._lastMenuTbl = tbl main.f_menuItemBgAnimReset(sec) end local t = tbl.items if tbl.reset then -- tbl.reset = false -- 原本阻止绘制 main.f_menuCommonDraw(t, tbl.item, tbl.cursorPosY, tbl.moveTxt, sec, bg, true) tbl.reset = false else main.f_menuCommonDraw(t, tbl.item, tbl.cursorPosY, tbl.moveTxt, sec, bg, true) end tbl.cursorPosY, tbl.moveTxt, tbl.item = main.f_menuCommonCalc(t, tbl.item, tbl.cursorPosY, tbl.moveTxt, sec, sec.cursor) textImgReset(sec.title.TextSpriteData) textImgSetText(sec.title.TextSpriteData, tbl.title) if esc() or getInput(-1, sec.menu.cancel.key) then if bool_main then sndPlay(motif.Snd, sec.exit.snd[1], sec.exit.snd[2]) togglePause(false) main.pauseMenu = false else sndPlay(motif.Snd, sec.cancel.snd[1], sec.cancel.snd[2]) end if menu.currentMenu[1] ~= menu.currentMenu[2] then main.f_menuSnap(sec) end menu.currentMenu[1] = menu.currentMenu[2] return elseif menu.t_itemname[t[tbl.item].itemname] ~= nil then if not menu.t_itemname[t[tbl.item].itemname](tbl, tbl.item, tbl.cursorPosY, tbl.moveTxt, sec) then return end elseif getInput(-1, sec.menu.done.key) then local f = t[tbl.item].itemname if tbl.submenu[f].loop ~= nil then sndPlay(motif.Snd, sec.cursor.done.snd[1], sec.cursor.done.snd[2]) menu.currentMenu[1] = tbl.submenu[f].loop main.f_menuSnap(sec) elseif not menu.t_itemname[f](tbl, tbl.item, tbl.cursorPosY, tbl.moveTxt, sec) then return end end end end function menu.f_commandlistRender(sec, t) local cmdList = {} if t.commandlist ~= nil then cmdList = t.commandlist else table.insert(cmdList, {{glyph = false, text = sec.movelist.text.text, align = 1, col = {}}}) end if esc() or getInput(-1, sec.menu.cancel.key, sec.menu.done.key) then sndPlay(motif.Snd, sec.cancel.snd[1], sec.cancel.snd[2]) menu.itemname = '' menu.f_commandlistDraw(sec, t, cmdList) return elseif getInput(-1, sec.menu.subtract.key) and #menu.t_movelists > 1 then sndPlay(motif.Snd, sec.cursor.move.snd[1], sec.cursor.move.snd[2]) menu.movelistChar = menu.movelistChar - 1 if menu.movelistChar < 1 then menu.movelistChar = #menu.t_movelists end elseif getInput(-1, sec.menu.add.key) and #menu.t_movelists > 1 then sndPlay(motif.Snd, sec.cursor.move.snd[1], sec.cursor.move.snd[2]) menu.movelistChar = menu.movelistChar + 1 if menu.movelistChar > #menu.t_movelists then menu.movelistChar = 1 end elseif main.f_input(main.t_players, {'~U'}) or anyJoystickKey('LS_Y-') then repeatAdjust('movelist_up', true, function() if t.tbl.movelistLine > 1 then if getInput(-1, sec.menu.previous.key) then sndPlay(motif.Snd, sec.cursor.move.snd[1], sec.cursor.move.snd[2]) end t.tbl.movelistLine = t.tbl.movelistLine - 1 end end) elseif main.f_input(main.t_players, {'~D'}) or anyJoystickKey('LS_Y+') then repeatAdjust('movelist_down', true, function() if t.tbl.movelistLine <= #cmdList - sec.movelist.window.visibleitems then if getInput(-1, sec.menu.next.key) then sndPlay(motif.Snd, sec.cursor.move.snd[1], sec.cursor.move.snd[2]) end t.tbl.movelistLine = t.tbl.movelistLine + 1 end end) else repeatAdjust('movelist_up', false, function() end) repeatAdjust('movelist_down', false, function() end) end menu.f_commandlistDraw(sec, t, cmdList) end function menu.f_commandlistDraw(sec, t, cmdList) -- draw overlay rectDraw(sec.movelist.overlay.RectData) -- draw title textImgReset(sec.movelist.title.TextSpriteData) textImgSetText( sec.movelist.title.TextSpriteData, main.f_itemnameUpper(string.format(sec.movelist.title.text, t.name), sec.movelist.title.uppercase) ) textImgDraw(sec.movelist.title.TextSpriteData) -- draw commands local i = 0 for n = t.tbl.movelistLine, math.min(t.tbl.movelistLine + sec.movelist.window.visibleitems + 1, #cmdList) do i = i + 1 local alignOffset = 0 local lengthOffset = 0 local align = 1 local width = 0 for k, v in ipairs(cmdList[n]) do if v.text ~= '' then alignOffset = 0 if v.align == 0 then alignOffset = sec.movelist.window.width * 0.5 elseif v.align == -1 then alignOffset = sec.movelist.window.width end if v.align ~= align then lengthOffset = 0 align = v.align end local fontProps = motif.files.font['font' .. sec.movelist.text.font[1]] -- glyph if v.glyph and motif.glyphs[v.text] ~= nil then local g = motif.glyphs[v.text] if g.Size and g.AnimData then local scaleX = fontProps.size[2] * sec.movelist.text.scale[2] / g.Size[2] * sec.movelist.glyphs.scale[1] local scaleY = fontProps.size[2] * sec.movelist.text.scale[2] / g.Size[2] * sec.movelist.glyphs.scale[2] if v.align == -1 then alignOffset = alignOffset - g.Size[1] * scaleX end animSetScale(g.AnimData, scaleX, scaleY) animSetPos( g.AnimData, math.floor(sec.movelist.pos[1] + sec.movelist.text.offset[1] + sec.movelist.glyphs.offset[1] + alignOffset + lengthOffset), sec.movelist.pos[2] + sec.movelist.text.offset[2] + sec.movelist.glyphs.offset[2] + main.f_round((fontProps.size[2] + fontProps.spacing[2]) * sec.movelist.text.scale[2] + sec.movelist.text.spacing[2]) * (i - 1) ) animSetWindow( g.AnimData, menu.movelistW[1], menu.movelistW[2], menu.movelistW[3], menu.movelistW[4] ) animDraw(g.AnimData) if k < #cmdList[n] then width = g.Size[1] * scaleX + sec.movelist.glyphs.spacing[1] end end else -- text textImgReset(sec.movelist.text.TextSpriteData) textImgSetAlign(sec.movelist.text.TextSpriteData, v.align) textImgSetColor( sec.movelist.text.TextSpriteData, v.col.r or sec.movelist.text.font[4], v.col.g or sec.movelist.text.font[5], v.col.b or sec.movelist.text.font[6], v.col.a or sec.movelist.text.font[7] ) textImgAddPos( sec.movelist.text.TextSpriteData, alignOffset + lengthOffset, main.f_round((fontProps.size[2] + fontProps.spacing[2]) * sec.movelist.text.scale[2] + sec.movelist.text.spacing[2]) * (i - 1) ) textImgSetText(sec.movelist.text.TextSpriteData, v.text) textImgDraw(sec.movelist.text.TextSpriteData) if k < #cmdList[n] then width = textImgGetTextWidth(sec.movelist.text.TextSpriteData, v.text) * sec.movelist.text.scale[1] + sec.movelist.text.spacing[1] end end if v.align == 0 then lengthOffset = lengthOffset + width / 2 elseif v.align == -1 then lengthOffset = lengthOffset - width else lengthOffset = lengthOffset + width end end end end -- draw scroll arrows if #cmdList > sec.movelist.window.visibleitems then if t.tbl.movelistLine > 1 then animUpdate(sec.movelist.arrow.up.AnimData) animDraw(sec.movelist.arrow.up.AnimData) end animUpdate(sec.movelist.arrow.down.AnimData) animDraw(sec.movelist.arrow.down.AnimData) end end function menu.f_trainingReset_New() if Global_hasReset == 0 then for k, _ in pairs(menu.t_valuename) do menu[k] = 1 end menu.fallrecovery = 4 menu.framedata = 2 menu.inputdata = 2 menu.combodata = 2 menu.ailevel = gameOption('Options.Difficulty') for _, v in ipairs(menu.t_vardisplayPointers) do v.vardisplay = menu.f_vardisplay(v.itemname) end Global_hasReset = 1 --进入对局将已重置过的开关打开 end for i = 1,8,1 do player(i) mapSet('_iksys_PowerLevel', menu.powerlevel - 1) mapSet('_iksys_CostLevel', menu.costlevel - 1) mapSet('_iksys_trainingFrameData', menu.framedata - 1) mapSet('_iksys_trainingInputData', menu.inputdata - 1) mapSet('_iksys_trainingComboData', menu.combodata - 1) mapSet('_iksys_isArkUnScreenPack', 1) mapSet('_iksys_trainingDummyControl', menu.dummycontrol - 1) mapSet('_iksys_trainingDummyMode', menu.dummymode -1) mapSet('_iksys_trainingGuardMode', menu.guardmode - 1) mapSet('_iksys_trainingFallRecovery', menu.fallrecovery - 1) mapSet('_iksys_trainingRecoveryDir', menu.recoverydir - 1) mapSet('_iksys_trainingDistance', menu.distance - 1) mapSet('_iksys_trainingButtonJam', menu.buttonjam - 1) end end