{"version":3,"sources":["jsdelivr-header.js","/npm/danoniplus@43.4.0/js/danoni_main.js"],"names":[],"mappings":"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","file":"/npm/danoniplus@43.4.0/js/danoni_main.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/danoniplus@43.4.0/js/danoni_main.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","﻿'use strict';\r\n/**\r\n * Dancing☆Onigiri (CW Edition)\r\n * \r\n * Source by tickle\r\n * Created : 2018/10/08\r\n * Revised : 2026/01/04\r\n *\r\n * https://github.com/cwtickle/danoniplus\r\n */\r\nconst g_version = `Ver 43.4.0`;\r\nconst g_revisedDate = `2026/01/04`;\r\n\r\n// カスタム用バージョン (danoni_custom.js 等で指定可)\r\nlet g_localVersion = ``;\r\nlet g_localVersion2 = ``;\r\n\r\n// ショートカット用文字列(↓の文字列を検索することで対象箇所へジャンプできます)\r\n//  共通:water 初期化:peach タイトル:melon データ管理:pear 前提条件表示:mango 設定:lime ディスプレイ:lemon 拡張設定:apple キーコンフィグ:orange 譜面読込:strawberry メイン:banana 結果:grape\r\n//  シーンジャンプ:Scene\r\n\r\n/**\r\n * ▽ 画面の構成\r\n *  [タイトル]-[設定]-[ディスプレイ]-[キーコンフィグ]-[譜面読込]-[メイン]-[リザルト]\r\n *  ⇒ 各画面に Init がついたものが画面の基本構成(ルート)を表す。\r\n * \r\n * ▽ スプライトの親子関係\r\n *  基本的にdiv要素で管理。最下層を[divRoot]とし、createEmptySprite()でdiv子要素を作成。\r\n *  clearWindow()で[divRoot]以外の全てのスプライトを削除。\r\n *  特定のスプライトに限り削除する場合は deleteChildspriteAll() 。\r\n */\r\nconst current = () => {\r\n\tif (document.currentScript) {\r\n\t\treturn document.currentScript.src;\r\n\t}\r\n\tconst scripts = Array.from(document.getElementsByTagName(`script`));\r\n\tconst targetScript = scripts.find(file => file.src.endsWith(`danoni_main.js`));\r\n\treturn targetScript.src;\r\n};\r\n\r\n/**\r\n * 現在URLのクエリパラメータから指定した値を取得\r\n * @param {string} _name\r\n * @returns {string}\r\n */\r\nconst getQueryParamVal = _name => {\r\n\tconst param = new URL(location.href).searchParams.get(_name);\r\n\treturn param !== null ? decodeURIComponent(param.replace(/\\+/g, ` `)) : null;\r\n};\r\n\r\n// 常時デバッグを許可するドメイン\r\nconst g_reservedDomains = [\r\n\t`danonicw.skr.jp`,\r\n\t`tickle.cloudfree.jp`,\r\n];\r\nObject.freeze(g_reservedDomains);\r\n\r\n// 外部参照を許可するドメイン\r\nconst g_referenceDomains = [\r\n\t`cwtickle.github.io/danoniplus`,\r\n\t`cdn.jsdelivr.net`,\r\n\t`unpkg.com`,\r\n\t`www.unpkg.com`,\r\n\t`support-v\\\\d+--danoniplus.netlify.app`,\r\n];\r\nObject.freeze(g_referenceDomains);\r\n\r\nconst g_rootPath = current().match(/(^.*\\/)/)[0];\r\nlet g_workPath;\r\nconst hasRemoteDomain = _path => g_referenceDomains.some(domain => _path.match(`^https://${domain}/`) !== null);\r\nconst g_remoteFlg = hasRemoteDomain(g_rootPath);\r\n\r\nconst g_randTime = Date.now();\r\nconst g_versionForUrl = g_version.slice(4);    // URL用に先頭の\"Ver \"を削除\r\n\r\nconst g_isFile = location.href.match(/^file/);\r\nconst g_isLocal = location.href.match(/^file/) || location.href.indexOf(`localhost`) !== -1;\r\nconst g_isDebug = g_isLocal ||\r\n\tg_reservedDomains.some(domain => location.href.match(`^https://${domain}/`) !== null) ||\r\n\tgetQueryParamVal(`debug`) === `true`;\r\nconst isLocalMusicFile = _scoreId => g_isFile && !listMatching(getMusicUrl(_scoreId), [`.js`, `.txt`], { suffix: `$` });\r\n\r\n// 50msごとにdocument.readyStateをチェックしてcompleteになったらresolve\r\nconst waitUntilLoaded = () => {\r\n\treturn new Promise(resolve => {\r\n\t\tconst checkReadyState = setInterval(() => {\r\n\t\t\tif (document.readyState === 'complete') {\r\n\t\t\t\tclearInterval(checkReadyState);\r\n\t\t\t\tresolve();\r\n\t\t\t}\r\n\t\t}, 50);\r\n\t});\r\n};\r\n(async () => {\r\n\tawait waitUntilLoaded();\r\n\tg_loadObj.main = true;\r\n\tg_currentPage = `initial`;\r\n\tconst links = document.querySelectorAll(`link`);\r\n\tif (Array.from(links).filter(elem => elem.getAttribute(`href`).indexOf(`danoni_main.css`) !== -1).length === 0) {\r\n\t\tawait importCssFile2(`${g_rootPath}../css/danoni_main.css?${g_versionForUrl}`);\r\n\t}\r\n\r\n\t// ロード直後に定数・初期化ファイル、旧バージョン定義関数を読込\r\n\t// 旧バージョン定義関数はメジャーバージョンが変わった場合にのみ再ロードが掛かるようにする\r\n\tawait loadScript2(`${g_rootPath}../js/lib/danoni_localbinary.js`, false);\r\n\tawait loadScript2(`${g_rootPath}../js/lib/danoni_constants.js?${g_versionForUrl}`);\r\n\tawait loadScript2(`${g_rootPath}../js/lib/legacy_functions.js?${g_versionForUrl.split(`.`)[0]}`, false);\r\n\tinitialControl();\r\n})();\r\n\r\n/*-----------------------------------------------------------*/\r\n/* Scene : COMMON [water] */\r\n/*-----------------------------------------------------------*/\r\n\r\n// fps(デフォルトは60)\r\nlet g_fps = 60;\r\n\r\n// プレイ画面再生時の内部スケジューリング用のマージン時間(100ms)\r\nlet g_scheduleLead = 0.1;\r\n\r\n// 譜面データの&区切りを有効にするか\r\nlet g_enableAmpersandSplit = true;\r\n\r\n// 譜面データをdecodeURIするか\r\nlet g_enableDecodeURI = false;\r\n\r\n// プリロード済ファイル\r\nconst g_preloadFiles = {\r\n\tall: [],\r\n\timage: [],\r\n\tfont: [],\r\n};\r\n\r\n// 矢印サイズ\r\nconst C_ARW_WIDTH = 50;\r\n\r\n// ON/OFFスイッチ\r\nconst C_FLG_ON = `ON`;\r\nconst C_FLG_OFF = `OFF`;\r\nconst C_FLG_ALL = `ALL`;\r\nconst C_DIS_NONE = `none`;\r\nconst C_DIS_AUTO = `auto`;\r\nconst C_DIS_INHERIT = `inherit`;\r\n\r\n// 初期化フラグ（ボタンアニメーション制御）\r\nlet g_initialFlg = false;\r\n\r\nlet g_currentPage = ``;\r\n\r\n// キーコンフィグ初期設定\r\nlet g_kcType = `Main`;\r\nlet g_colorType = `Default`;\r\nlet g_imgType = `Original`;\r\n\r\n// ライフ・ゲームオーバー・曲終了管理\r\nlet g_maxScore = 1000000;\r\nlet g_gameOverFlg = false;\r\nlet g_finishFlg = true;\r\n\r\n/** 共通オブジェクト */\r\nconst g_loadObj = {};\r\nconst g_rootObj = {};\r\nconst g_presetObj = {\r\n\tkeysDataLib: [],\r\n\tkeysDataLocal: [],\r\n};\r\nlet g_headerObj = {};\r\nlet g_scoreObj = {};\r\nlet g_attrObj = {};\r\n\r\nconst g_btnFunc = {\r\n\tbase: {}, reset: {}, cxt: {},\r\n};\r\nlet g_btnAddFunc = {};\r\nlet g_btnDeleteFlg = {};\r\nlet g_cxtAddFunc = {};\r\nlet g_cxtDeleteFlg = {};\r\n\r\nconst g_detailObj = {\r\n\tarrowCnt: [],\r\n\tfrzCnt: [],\r\n\tmaxDensity: [],\r\n\tmaxDensity2Push: [],\r\n\tmaxDensity3Push: [],\r\n\tdensityData: [],\r\n\tdensity2PushData: [],\r\n\tdensity3PushData: [],\r\n\tdensityDiff: [],\r\n\tdensity2PushDiff: [],\r\n\tdensity3PushDiff: [],\r\n\tstartFrame: [],\r\n\tplayingFrame: [],\r\n\tplayingFrameWithBlank: [],\r\n\tspeedData: [],\r\n\tboostData: [],\r\n\ttoolDif: [],\r\n};\r\n\r\nconst g_workObj = {\r\n\tstepX: [],\r\n\tstepRtn: [],\r\n\tstepHitRtn: [],\r\n\tarrowRtn: [],\r\n\tkeyCtrl: [],\r\n\tkeyCtrlN: [],\r\n\tkeyHitFlg: [],\r\n\tscrollDir: [],\r\n\tdividePos: [],\r\n\tnonDefaultSc: false,\r\n};\r\n\r\n// 歌詞制御\r\nlet g_wordSprite;\r\n\r\nconst g_wordObj = {\r\n\twordDir: 0,\r\n\twordDat: ``,\r\n\tfadeInFlg0: false,\r\n\tfadeInFlg1: false,\r\n\tfadeOutFlg0: false,\r\n\tfadeOutFlg1: false,\r\n};\r\n\r\n// オーディオ設定・タイマー管理\r\nlet g_audio = new Audio();\r\nlet g_timeoutEvtId = 0;\r\nlet g_timeoutEvtTitleId = 0;\r\nlet g_timeoutEvtResultId = 0;\r\nlet g_inputKeyBuffer = {};\r\n\r\n// 音楽ファイル エンコードフラグ\r\nlet g_musicEncodedFlg = false;\r\n\r\n// 外部dosデータ\r\nlet g_externalDos = ``;\r\nlet g_musicdata = ``;\r\n\r\nlet g_langStorage = {};\r\n\r\n// ローカルストレージ設定 (作品別)\r\nlet g_localStorage;\r\nlet g_localStorageUrl;\r\nlet g_localStorageUrlOrg;\r\nlet g_localStorageMgt;\r\n\r\n// ローカルストレージ設定 (ドメイン・キー別)\r\nlet g_localKeyStorage;\r\nlet g_canLoadDifInfoFlg = false;\r\n\r\n/*-----------------------------------------------------------*/\r\n/* 要素・属性                                                 */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * div要素のstyleを取得\r\n * @param {string} _id \r\n * @returns {CSSStyleDeclaration}\r\n */\r\nconst $id = _id => document.getElementById(_id).style;\r\n\r\n/**\r\n * 複数のdiv子要素を親要素へ接続\r\n * @param {Element} _baseObj \r\n * @param {...any} [rest] \r\n */\r\nconst multiAppend = (_baseObj, ...rest) => _baseObj.append(...rest);\r\n\r\n/**\r\n * 複数の属性をまとめて設定\r\n * @param {Element} _baseObj \r\n * @param {...any} [rest] \r\n */\r\nconst setAttrs = (_baseObj, { ...rest } = {}) =>\r\n\tObject.keys(rest).forEach(property => _baseObj.setAttribute(property, rest[property]));\r\n\r\n/**\r\n * 属性値を数値に変換して取得\r\n * @param {Element} _baseObj \r\n * @param {string} _attrkey \r\n * @returns {number}\r\n */\r\nconst getNumAttr = (_baseObj, _attrkey) => parseFloat(_baseObj.getAttribute(_attrkey));\r\n\r\n/**\r\n * 文字列に埋め込まれた変数を展開\r\n * @param {string} _str \r\n * @returns {string} 埋め込み後の変数\r\n */\r\nconst convertStrToVal = _str => {\r\n\tif (!hasVal(_str)) return _str;\r\n\tconst strs = _str.split(`}`).join(`{`).split(`{`);\r\n\tlet convStrs = ``;\r\n\tfor (let j = 0; j < strs.length; j += 2) {\r\n\t\tconvStrs += escapeHtmlForEnabledTag(strs[j]);\r\n\t\tconvStrs += setVal(strs[j + 1], ``, C_TYP_CALC);\r\n\t}\r\n\treturn convStrs;\r\n};\r\n\r\n/**\r\n * 半角スペース、タブを文字列から除去\r\n * @param {string} _str \r\n * @returns {string} 半角スペース、タブ除去後の文字列\r\n */\r\nconst trimStr = _str => _str?.split(`\\t`).join(``).replace(/^ +| +$/g, ``);\r\n\r\n/*-----------------------------------------------------------*/\r\n/* 値や配列のチェック・変換                                    */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * 変数が存在するかどうかをチェック\r\n * @param {string} _data\r\n * @param {...any} [strs] 空とundefined以外で除外したい文字列\r\n * @returns {boolean}\r\n */\r\nconst hasVal = (_data, ...strs) => _data !== undefined && _data !== `` && (!strs || strs.every(str => _data !== str));\r\n\r\n/**\r\n * 変数が存在するかどうかをチェック(null無しを含む)\r\n * @param {string} _data\r\n * @param {...any} [strs]\r\n * @returns {boolean}\r\n */\r\nconst hasValN = (_data, ...strs) => hasVal(_data, ...strs) && _data !== null;\r\n\r\n/**\r\n * 文字列から他の型へ変換する処理群\r\n * @param {string} _checkStr\r\n * @param {string} _default\r\n * @returns {number|boolean|string}\r\n */\r\nconst g_convFunc = {\r\n\tfloat: (_checkStr, _default) => isNaN(parseFloat(_checkStr)) ? _default : parseFloat(_checkStr),\r\n\tnumber: (_checkStr, _default) => isNaN(parseInt(_checkStr)) ? _default : parseInt(_checkStr),\r\n\tboolean: (_checkStr, _default) => _checkStr.toString().toLowerCase() === `true` ? true :\r\n\t\t(_checkStr.toString().toLowerCase() === `false` ? false : _default),\r\n\tswitch: (_checkStr, _default) => [C_FLG_OFF, C_FLG_ON].includes(_checkStr.toString().toUpperCase()) ? _checkStr.toString().toUpperCase() : _default,\r\n\tcalc: (_checkStr, _default) => {\r\n\t\ttry {\r\n\t\t\treturn new Function(`return ${_checkStr}`)();\r\n\t\t} catch (err) {\r\n\t\t\treturn _default;\r\n\t\t}\r\n\t},\r\n\tstring: (_checkStr) => _checkStr,\r\n};\r\n\r\n/**\r\n * 文字列を想定された型に変換\r\n * - _type は `float`(小数)、`number`(整数)、`boolean`(真偽値)、\r\n *   `switch`(ON/OFF), `calc`(数式), `string`(文字列)から選択\r\n * - 型に合わない場合は _default を返却するが、_default自体の型チェック・変換は行わない\r\n * @param {string} _checkStr \r\n * @param {string} _default \r\n * @param {string} [_type='string'] \r\n * @returns \r\n */\r\nconst setVal = (_checkStr, _default, _type = C_TYP_STRING) =>\r\n\thasValN(_checkStr) ? g_convFunc[_type](_checkStr, _default) : _default;\r\n\r\n/**\r\n * ブール値からON/OFFへ変換\r\n * @param {boolean} _condition \r\n * @returns {string}\r\n */\r\nconst boolToSwitch = _condition => _condition ? C_FLG_ON : C_FLG_OFF;\r\n\r\n/**\r\n * 単位付きの値を返却\r\n * @param {number} _val \r\n * @param {string} [_unitName='px'] \r\n * @returns {string}\r\n */\r\nconst wUnit = (_val, _unitName = `px`) => `${_val}${_unitName}`;\r\n\r\n/**\r\n * ブール値への変換\r\n * @param {string} _val \r\n * @param {boolean} [_defaultVal=false]\r\n * @returns {boolean}\r\n */\r\nconst setBoolVal = (_val, _defaultVal = false) => hasValN(_val) ? g_convFunc.boolean(_val, _defaultVal) : _defaultVal;\r\n\r\n/**\r\n * 整数値への変換\r\n * @param {string} _val \r\n * @param {number} [_defaultVal=0]\r\n * @returns {number}\r\n */\r\nconst setIntVal = (_val, _defaultVal = 0) => hasValN(_val) ? g_convFunc.number(_val, _defaultVal) : _defaultVal;\r\n\r\n/**\r\n * 先頭のみ大文字に変換（それ以降はそのまま）\r\n * @param {string} _str \r\n * @returns {string}\r\n */\r\nconst toCapitalize = _str => {\r\n\tif (!_str || typeof _str !== `string`) return _str;\r\n\treturn `${_str.charAt(0).toUpperCase()}${_str.slice(1)}`;\r\n};\r\n\r\n/**\r\n * 0以上の数字に変換\r\n * @param {number} _num \r\n * @param {number} [_init=0] 0未満の場合に設定する値\r\n * @returns {number}\r\n */\r\nconst roundZero = (_num, _init = 0) => _num < 0 ? _init : _num;\r\n\r\n/**\r\n * 配列から_targetに合致する配列位置を返す\r\n * 存在しない場合は0を返却\r\n * @param {string[]} _list \r\n * @param {string} _target\r\n * @returns {number}\r\n */\r\nconst getCurrentNo = (_list, _target) => roundZero(_list.indexOf(_target));\r\n\r\n/**\r\n * 配列内に存在するかどうかをチェック\r\n * @param {string} _val \r\n * @param {string[]} _array \r\n * @param {number} [_pos=0]\r\n * @returns {boolean}\r\n */\r\nconst hasValInArray = (_val, _array, _pos = 0) =>\r\n\t_array.findIndex(data => data[_pos] === _val) !== -1;\r\n\r\n/**\r\n * 配列が既定長以上かどうかをチェック\r\n * @param {any[]} _data \r\n * @param {number} [_length=1]\r\n * @returns {boolean}\r\n */\r\nconst hasArrayList = (_data, _length = 1) => _data?.length >= _length;\r\n\r\n/**\r\n * 改行コード区切りの配列展開\r\n * @param {string} _str\r\n * @returns {string[]}\r\n */\r\nconst splitLF = _str => _str?.split(`\\r`).join(`\\n`).split(`\\n`);\r\n\r\n/**\r\n * 改行コード区切りを本来の区切り文字に変換して配列展開\r\n * （改行区切りで間が空行だった場合は無効化）\r\n * @param {string} _str \r\n * @param {string} [_delim='$']\r\n * @returns {string[]}\r\n */\r\nconst splitLF2 = (_str, _delim = `$`) => splitLF(_str)?.filter(val => val !== ``).join(_delim).split(_delim);\r\n\r\n/**\r\n * カンマ区切り処理\r\n * （ただし、カンマ+半角スペースの組の場合は区切り文字と見做さない）\r\n * @param {string} _str \r\n * @returns {string[]}\r\n */\r\nconst splitComma = _str => _str?.split(`, `).join(`*comma* `).split(`,`);\r\n\r\n/**\r\n * ストレージ処理のパース\r\n * @param {string} _keyName \r\n * @param {Object} _default \r\n * @returns {Object}\r\n */\r\nconst parseStorageData = (_keyName, _default = {}) => {\r\n\tconst storageText = localStorage.getItem(_keyName);\r\n\tif (storageText === null) {\r\n\t\treturn _default;\r\n\t}\r\n\ttry {\r\n\t\treturn JSON.parse(storageText);\r\n\t} catch (err) {\r\n\t\treturn _default;\r\n\t}\r\n}\r\n\r\n/**\r\n * オブジェクトをキー名でソート\r\n * @param {Object} _obj \r\n * @returns {Object}\r\n */\r\nconst sortObjectByKeys = _obj => Object.keys(_obj).sort().reduce((acc, key) => {\r\n\tacc[key] = _obj[key];\r\n\treturn acc;\r\n}, {});\r\n\r\n/**\r\n * 画面表示用インデント処理\r\n * @param {number} _level \r\n * @returns {string}\r\n */\r\nconst getIndent = (_level) => '&nbsp;'.repeat(_level * 4);\r\n\r\n/**\r\n * ストレージ情報の取得\r\n * @param {string} _name g_storageFuncの実行キー名\r\n * @param {string} _key g_storageFuncの実行キーの引数\r\n * @param {boolean} [_colorFmt=true]\r\n * @returns {string}\r\n */\r\nconst viewKeyStorage = (_name, _key = ``, _colorFmt = true) => {\r\n\r\n\t// キャッシュ設定\r\n\tif (!viewKeyStorage.cache) {\r\n\t\tviewKeyStorage.cache = new Map();\r\n\t}\r\n\tconst cacheKey = _key + _name + String(_colorFmt);\r\n\tif (viewKeyStorage.cache.has(cacheKey)) {\r\n\t\treturn viewKeyStorage.cache.get(cacheKey);\r\n\t}\r\n\tconst result = formatObject(g_storageFunc.get(_name)?.(_key) || setVal(_name, ``, C_TYP_CALC), 0, { colorFmt: _colorFmt });\r\n\tviewKeyStorage.cache.set(cacheKey, result);\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * オブジェクトのネスト表示処理\r\n * @param {Object} _obj \r\n * @param {Number} _indent \r\n * @param {boolean} [colorFmt=true] フォーマット加工フラグ\r\n * @param {string} [rootKey=''] オブジェクトの最上位プロパティ名\r\n * @returns {string}\r\n */\r\nconst formatObject = (_obj, _indent = 0, { colorFmt = true, rootKey = `` } = {}) => {\r\n\tconst isObj = _obj => typeof _obj === C_TYP_OBJECT && _obj !== null;\r\n\tif (!isObj(_obj)) {\r\n\t\treturn JSON.stringify(_obj);\r\n\t}\r\n\tconst baseIndent = getIndent(_indent);\r\n\tconst nestedIndent = getIndent(_indent + 1);\r\n\r\n\t/**\r\n\t * データの装飾処理\r\n\t * @param {string|boolean|number|Object} _value \r\n\t * @param {string} _rootKey\r\n\t * @returns {string}\r\n\t */\r\n\tconst formatValue = (_value, _rootKey) => {\r\n\t\tif (colorFmt) {\r\n\t\t\tif (typeof _value === C_TYP_STRING) {\r\n\r\n\t\t\t\t// カラーコードの色付け処理\r\n\t\t\t\t_value = escapeHtml(_value).replaceAll(`\\n`, `<br>`);\r\n\t\t\t\tconst colorCodePattern = /(#|0x)(?:[A-Fa-f0-9]{6}(?:[A-Fa-f0-9]{2})?|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{3})/g;\r\n\t\t\t\tif (_value === C_FLG_ON) {\r\n\t\t\t\t\treturn `<span style=\"color:#66ff66\">${g_emojiObj.checkMark} ON</span>`;\r\n\t\t\t\t} else if (colorCodePattern.test(_value)) {\r\n\t\t\t\t\treturn _value.replace(colorCodePattern, (match) =>\r\n\t\t\t\t\t\t`<span style=\"color:${match.replace(`0x`, `#`)}\">◆</span>${match.replace(`0x`, `#`)}`);\r\n\t\t\t\t}\r\n\t\t\t} else if (typeof _value === C_TYP_BOOLEAN) {\r\n\r\n\t\t\t\t// boolean値の色付け処理\r\n\t\t\t\treturn (_value ? `<span style=\"color:#66ff66\">${g_emojiObj.checkMark} true</span>` :\r\n\t\t\t\t\t`<span style=\"color:#ff9999\">${g_emojiObj.crossMark} false</span>`);\r\n\r\n\t\t\t} else if (typeof _value === C_TYP_NUMBER) {\r\n\r\n\t\t\t\tif (_rootKey.startsWith(`scrollDir`)) {\r\n\t\t\t\t\t// scrollDirXのスクロール方向表示処理\r\n\t\t\t\t\treturn _value === 1 ? `1|<span style=\"color:#ff9999\">↑</span>` : `-1|<span style=\"color:#66ff66\">↓</span>`;\r\n\r\n\t\t\t\t} else if (listMatching(_rootKey, [`keyCtrl`, `keyRetry`, `keyTitleBack`], { prefix: `^` })\r\n\t\t\t\t\t&& !_rootKey.startsWith(`keyCtrlPtn`)) {\r\n\t\t\t\t\t// keyCtrlX, keyRetryX, keyTitleBackX の対応キー表示処理\r\n\t\t\t\t\treturn (g_kCd[_value] && _value !== 0) ? `${_value}|<span style=\"color:#ffff66\">${g_kCd[_value]}</span>` : `----`;\r\n\t\t\t\t}\r\n\t\t\t} else if (isObj(_value)) {\r\n\t\t\t\treturn formatObject(_value, _indent + 1, { colorFmt, rootKey: _rootKey });\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn JSON.stringify(_value);\r\n\t};\r\n\r\n\t/**\r\n\t * 配列の装飾処理\r\n\t * @param {number[]|string[]} _obj \r\n\t * @returns {string}\r\n\t */\r\n\tconst formatArrayValue = (_obj) => {\r\n\r\n\t\tconst formatSetArray = (_list, _numOfSet = 2) => {\r\n\t\t\tif (_list.findIndex(val => val === rootKey) >= 0) {\r\n\t\t\t\tlet result = `[`;\r\n\t\t\t\tfor (let j = 0; j < _obj.length; j += _numOfSet) {\r\n\t\t\t\t\tresult += `<br>${nestedIndent}${_obj[j]}: ${_obj[j + 1]}`;\r\n\t\t\t\t\tfor (let k = 0; k < _numOfSet - 2; k++) {\r\n\t\t\t\t\t\tconst idx = j + k + 2;\r\n\t\t\t\t\t\tif (idx < _obj.length) {\r\n\t\t\t\t\t\t\tresult += `, ${formatValue(_obj[idx], rootKey)}`;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tresult += (_obj.length === 0 ? `` : `<br>${baseIndent}`) + `]`;\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\t\t\treturn ``;\r\n\t\t};\r\n\t\tif (colorFmt) {\r\n\t\t\tif (typeof _obj[0] === C_TYP_NUMBER) {\r\n\t\t\t\tlet result;\r\n\t\t\t\tObject.keys(g_dataSetObj).forEach(key =>\r\n\t\t\t\t\tresult ||= formatSetArray(g_dataSetObj[key], Number(key)));\r\n\t\t\t\tif (result !== ``) {\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (_obj.length > 100) {\r\n\t\t\t\tconst filteredArray = _obj.reduce((result, value, index) => {\r\n\t\t\t\t\tif (hasVal(value)) {\r\n\t\t\t\t\t\tresult.push(`${index}: ${formatValue(value, rootKey)}`);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t}, []);\r\n\t\t\t\treturn `[<br>${nestedIndent}${filteredArray.join(`,<br>${nestedIndent}`)}<br>${baseIndent}]`;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn ``;\r\n\t};\r\n\r\n\t/**\r\n\t * 配列・オブジェクトのネスト整形処理\r\n\t * @returns {string}\r\n\t */\r\n\tconst formatCollection = () => {\r\n\t\tconst isArray = Array.isArray(_obj);\r\n\t\tconst isArrayOfArrays = isArray && _obj.every(item => Array.isArray(item));\r\n\t\tconst getNextObject = (_item, _rootKey) => isObj(_item)\r\n\t\t\t? formatObject(_item, _indent + 1, { colorFmt, rootKey: _rootKey })\r\n\t\t\t: formatValue(_item, _rootKey);\r\n\r\n\t\tif (isArray) {\r\n\t\t\tlet result = formatArrayValue(_obj);\r\n\t\t\tif (result !== ``) {\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 配列またはオブジェクトの各要素をフォーマット\r\n\t\tconst formattedEntries = (isArray\r\n\t\t\t? _obj.map(item => {\r\n\t\t\t\tconst formattedValue = isArrayOfArrays\r\n\t\t\t\t\t? `<br>${nestedIndent}${formatValue(item, rootKey)}`\r\n\t\t\t\t\t: getNextObject(item, rootKey);\r\n\t\t\t\treturn formattedValue;\r\n\t\t\t})\r\n\t\t\t: Object.entries(_obj).map(([key, value]) => {\r\n\t\t\t\tconst formattedValue = getNextObject(value, rootKey === `` ? key : rootKey);\r\n\t\t\t\treturn `<br>${nestedIndent}\"${key}\": ${formattedValue}`;\r\n\t\t\t})).filter(val => !hasVal(val) || val !== `----`);\r\n\r\n\t\t// 配列なら[]で囲む、オブジェクトなら{}で囲む\r\n\t\tif (isArray) {\r\n\t\t\treturn _obj.length === 0\r\n\t\t\t\t? '[]'\r\n\t\t\t\t: `[${formattedEntries.join(', ')}${isArrayOfArrays ? `<br>${baseIndent}` : ''}]`;\r\n\t\t} else {\r\n\t\t\treturn `{${formattedEntries.join(',')}<br>${baseIndent}}`;\r\n\t\t}\r\n\t};\r\n\r\n\tlet result = formatCollection();\r\n\tif (!colorFmt) {\r\n\t\tresult = result.replaceAll(`<br>`, `\\r\\n`).replaceAll(`&nbsp;`, ` `);\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * 重複を排除した配列の生成\r\n * @param {any[]} _array1 \r\n * @param {...any} [_arrays]\r\n * @returns {any[]}\r\n */\r\nconst makeDedupliArray = (_array1, ..._arrays) =>\r\n\tArray.from((new Set([..._array1, ..._arrays.flat()])).values()).filter(val => val !== undefined);\r\n\r\n/**\r\n * 二次元配列のコピー\r\n * @param {any[][]} _array2d\r\n * @returns {any[][]}\r\n */\r\nconst copyArray2d = _array2d => structuredClone(_array2d);\r\n\r\n/**\r\n * 配列データを合計\r\n * @param {number[]} _array\r\n * @returns {number}\r\n */\r\nconst sumData = _array => _array.reduce((p, x) => p + x);\r\n\r\n/**\r\n * 特定の値で埋めた配列を作成\r\n * @param {number} _length \r\n * @param {string|number} [_val=0] \r\n * @returns {string[]|number[]}\r\n */\r\nconst fillArray = (_length, _val = 0) => [...Array(_length)].fill(_val);\r\n\r\n/**\r\n * 最小配列長の配列を作成\r\n * @param {any[]} _array \r\n * @param {number} _minLength \r\n * @param {number} _defaultVal\r\n * @returns {string[]|number[]}\r\n */\r\nconst makeBaseArray = (_array = [], _minLength, _defaultVal) => padArray(_array, fillArray(_minLength, _defaultVal));\r\n\r\n/**\r\n * ベースとする配列に対して別の配列で上書き\r\n * @param {string[]|number[]} _array \r\n * @param {string[]|number[]} _baseArray ベースとする配列\r\n * @returns {string[]|number[]}\r\n */\r\nconst padArray = (_array, _baseArray) => {\r\n\t_array?.filter(val => hasVal(val)).forEach((val, j) => _baseArray[j] = val);\r\n\treturn _baseArray;\r\n};\r\n\r\n/**\r\n * ベース配列(_baseArray)の空要素のみ、別配列(_array)の対応要素で補完する（既存値は上書きしない）\r\n * @param {string[]|number[]} _array     補完元（ソース）\r\n * @param {string[]|number[]} _baseArray ベース（既存値を優先）\r\n * @returns {string[]|number[]}\r\n */\r\nconst fillMissingArrayElem = (_array = [], _baseArray = []) => {\r\n\tconst maxLen = Math.max(_baseArray.length, _array.length);\r\n\tconst res = _baseArray.slice();\r\n\tfor (let j = 0; j < maxLen; j++) {\r\n\t\tif (!hasVal(res[j]) && hasVal(_array[j])) res[j] = _array[j];\r\n\t}\r\n\treturn res;\r\n}\r\n\r\n/**\r\n * 配列から上位N番目までに一致する位置を取得\r\n * \r\n * ex. 上位3番目 (_num = 3) の場合\r\n *     [1, 3, 2, 4, 6, 4, 5] -> [[4], [6], [3, 5]]\r\n *     [9, 6, 9, 9, 8, 7, 5] -> [[0, 2, 3]]\r\n * @param {number[]} _array \r\n * @param {number} [_num=1]\r\n * @returns {number[][]}\r\n */\r\nconst getMaxValIdxs = (_array, _num = 1) => {\r\n\tlet baseArray = _array.concat();\r\n\tconst maxIdxs = [];\r\n\r\n\tfor (let j = 0; j < _num; j++) {\r\n\t\tmaxIdxs[j] = [];\r\n\t\tconst maxVal = baseArray.reduce((a, b) => Math.max(a, b));\r\n\t\t_array.map((val, idx) => {\r\n\t\t\tif (val === maxVal) {\r\n\t\t\t\tmaxIdxs[j].push(idx);\r\n\t\t\t}\r\n\t\t});\r\n\t\tbaseArray = baseArray.filter(val => val < maxVal);\r\n\r\n\t\t// 同率で上位N番目まで取得した場合は途中で終了\r\n\t\tif (baseArray.length === 0 || maxIdxs.flat().length >= _num) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\treturn maxIdxs;\r\n};\r\n\r\n/**\r\n * 部分一致検索（リストのいずれかに合致、大小文字問わず）\r\n * @param {string} _str 検索文字\r\n * @param {string[]} _list 検索リスト (英字は小文字にする必要あり)\r\n * @param {string} [object.prefix=''] 前方一致条件 (前方一致時は ^)\r\n * @param {string} [object.suffix=''] 後方一致条件 (後方一致時は $)\r\n * @returns {boolean}\r\n */\r\nconst listMatching = (_str, _list, { prefix = ``, suffix = `` } = {}) =>\r\n\t_list.findIndex(value => _str.toLowerCase().match(new RegExp(String.raw`${prefix}${value}${suffix}`, 'i'))) !== -1;\r\n\r\n/**\r\n * 前方・後方一致検索の組み合わせ（あいまい検索）\r\n * @param {string} _str 検索文字\r\n * @param {string[]} _headerList 前方一致させるリスト\r\n * @param {string[]} _footerList 後方一致させるリスト\r\n * @returns {boolean}\r\n */\r\nconst fuzzyListMatching = (_str, _headerList, _footerList) =>\r\n\tlistMatching(_str, _headerList, { prefix: `^` }) || listMatching(_str, _footerList, { suffix: `$` });\r\n\r\n/**\r\n * 文字列の置換\r\n * @param {string} _str \r\n * @param {string[][]} _pairs 置換ペア配列。[[置換前A,置換後A],[置換前B,置換後B]]の形式で指定\r\n * @returns {string} 置換後文字列\r\n */\r\nconst replaceStr = (_str, _pairs) => {\r\n\tif (_str === undefined) {\r\n\t\treturn _str;\r\n\t}\r\n\tlet tmpStr = _str;\r\n\t_pairs.forEach(pair => tmpStr = String(tmpStr)?.split(pair[0]).join(pair[1]));\r\n\treturn tmpStr;\r\n};\r\n\r\n/**\r\n * 文字列のエスケープ処理\r\n * @param {string} _str \r\n * @param {string[][]} [_escapeList=g_escapeStr.escape]\r\n * @returns {string}\r\n */\r\nconst escapeHtml = (_str, _escapeList = g_escapeStr.escape) => escapeHtmlForEnabledTag(replaceStr(_str, _escapeList));\r\n\r\n/**\r\n * 文字列のエスケープ処理(htmlタグ許容版)\r\n * @param {string} _str \r\n * @returns {string}\r\n */\r\nconst escapeHtmlForEnabledTag = _str => replaceStr(_str, g_escapeStr.escapeTag);\r\n\r\n/**\r\n * HTML Entityから元の文字に戻す\r\n * @param {string} _str \r\n * @returns {string}\r\n */\r\nconst unEscapeEmoji = _str => _str?.replace(/&#(.*?);/g, (_, p1) => String.fromCodePoint(`0${p1}`));\r\n\r\n/**\r\n * エスケープ文字を元の文字に戻す\r\n * @param {string} _str \r\n * @returns {string}\r\n */\r\nconst unEscapeHtml = _str => unEscapeEmoji(replaceStr(_str, g_escapeStr.unEscapeTag));\r\n\r\n/**\r\n * 配列の中身を全てエスケープ処理\r\n * @param {string[]} _array \r\n * @returns {string[]}\r\n */\r\nconst escapeHtmlForArray = _array => _array.map(str => escapeHtml(str));\r\n\r\n/**\r\n * URLのパスを検証し、絶対URLまたは相対パスであればその値を返す\r\n * @param {string} _input \r\n * @param {string} _defaultUrl \r\n * @returns {string}\r\n */\r\nconst validatePath = (_input, _defaultUrl = ``) => {\r\n\t// 絶対 URL（http, https, ftp, fileなど）\r\n\tconst absoluteUrlPattern = /^(https?:\\/\\/|ftp:\\/\\/|file:\\/\\/)/;\r\n\r\n\t// 相対パス（ルート相対 `/path/to/file` もしくは `./file`, `../file` ）\r\n\tconst relativePathPattern = /^\\/|^\\.{1,2}\\//;\r\n\r\n\tconst raw = _input && (absoluteUrlPattern.test(_input) || relativePathPattern.test(_input))\r\n\t\t? encodeURI(_input) : _defaultUrl;\r\n\r\n\t// URL または相対パスが合致すればその値を返し、そうでなければデフォルト URL を返す\r\n\treturn raw.endsWith(`/`) ? raw : raw + `/`;\r\n};\r\n\r\n/**\r\n * 次のカーソルへ移動\r\n * @param {number} _basePos \r\n * @param {number} _num \r\n * @param {number} _length\r\n * @returns {number}\r\n */\r\nconst nextPos = (_basePos, _num, _length) => (_basePos + _num + _length) % _length;\r\n\r\n/*-----------------------------------------------------------*/\r\n/* キーコード関連                                             */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * 特定キーコードを置換する処理\r\n * @param {KeyboardEvent} _evt \r\n * @returns {string}\r\n */\r\nconst transCode = _evt => {\r\n\tconst evtCode = _evt.code;\r\n\tif (evtCode === `` && _evt.key === `Shift`) {\r\n\t\treturn `ShiftRight`;\r\n\t}\r\n\treturn evtCode;\r\n};\r\n\r\n/**\r\n * 特定キーをブロックする処理\r\n * @param {string} _setCode \r\n * @returns {boolean}\r\n */\r\nconst blockCode = _setCode => !C_BLOCK_KEYS.includes(_setCode);\r\n\r\n/*-----------------------------------------------------------*/\r\n/* ショートカット制御                                          */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * キーを押したときの動作（汎用）\r\n * @param {KeyboardEvent} _evt \r\n * @param {string} _displayName \r\n * @param {function} _func\r\n * @param {boolean} _dfEvtFlg\r\n * @returns {boolean}\r\n */\r\nconst commonKeyDown = (_evt, _displayName, _func = _code => { }, _dfEvtFlg) => {\r\n\tif (!_dfEvtFlg) {\r\n\t\t_evt.preventDefault();\r\n\t}\r\n\tconst setCode = transCode(_evt);\r\n\tif (_evt.repeat && (g_unrepeatObj.page.includes(_displayName) || g_unrepeatObj.key.includes(setCode))) {\r\n\t\treturn blockCode(setCode);\r\n\t}\r\n\tg_inputKeyBuffer[setCode] = true;\r\n\r\n\t// 対象ボタンを検索\r\n\tconst scLists = Object.keys(g_shortcutObj[_displayName])\r\n\t\t.filter(keys => keys.split(`_`).every(key => keyIsDown(key)));\r\n\tif (scLists.length > 0) {\r\n\t\t// リンク先にジャンプする場合はonkeyUpイベントが動かないため、事前にキー状態をリセット\r\n\t\tif (g_shortcutObj[_displayName][scLists[0]].reset) {\r\n\t\t\tg_inputKeyBuffer[setCode] = false;\r\n\t\t}\r\n\t\t// 対象ボタン処理を実行\r\n\t\tconst targetId = document.getElementById(g_shortcutObj[_displayName][scLists[0]].id);\r\n\t\tif (targetId !== null && targetId.style.display !== C_DIS_NONE && targetId.style.pointerEvents !== C_DIS_NONE) {\r\n\t\t\ttargetId.click();\r\n\t\t}\r\n\t\treturn blockCode(setCode);\r\n\t}\r\n\t_func(setCode);\r\n\treturn blockCode(setCode);\r\n};\r\n\r\n/**\r\n * キーを離したときの動作（汎用）\r\n * @param {KeyboardEvent} _evt \r\n */\r\nconst commonKeyUp = _evt => {\r\n\tg_inputKeyBuffer[g_kCdNameObj.metaLKey] = false;\r\n\tg_inputKeyBuffer[g_kCdNameObj.metaRKey] = false;\r\n\tg_inputKeyBuffer[transCode(_evt)] = false;\r\n};\r\n\r\n/**\r\n * ショートカットキー表示\r\n * @param {object} _obj\r\n * @param {string} _settingLabel \r\n * @param {string} [object.displayName='option'] \r\n * @param {string} [object.dfLabel=''] ショートカットキーの表示名\r\n * @param {string} [object.targetLabel='lnk${_settingLabel}R'] ショートカットキーを押したときのボタン名\r\n * @param {number} [object.x=g_scViewObj.x]\r\n * @param {number} [object.y=g_scViewObj.y]\r\n * @param {number} [object.w=g_scViewObj.w]\r\n * @param {number} [object.siz=g_scViewObj.siz]\r\n */\r\nconst createScText = (_obj, _settingLabel, { displayName = `option`, dfLabel = ``, targetLabel = `lnk${_settingLabel}R`,\r\n\tx = g_scViewObj.x, y = g_scViewObj.y, w = g_scViewObj.w, siz = g_scViewObj.siz } = {}) => {\r\n\tconst scKey = Object.keys(g_shortcutObj[displayName]).filter(key => g_shortcutObj[displayName][key].id === targetLabel);\r\n\tif (scKey.length > 0) {\r\n\t\tmultiAppend(_obj,\r\n\t\t\tcreateDivCss2Label(`sc${_settingLabel}`,\r\n\t\t\t\tg_scViewObj.format.split(`{0}`).join(dfLabel || (`${g_kCd[g_kCdN.findIndex(kCd => kCd === scKey[0])] ?? ''}`)), {\r\n\t\t\t\tx, y, w, siz, fontWeight: `bold`, opacity: 0.75,\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n};\r\n\r\n/**\r\n * 各画面の汎用ショートカットキー表示\r\n * @param {string} _displayName \r\n */\r\nconst createScTextCommon = _displayName => {\r\n\tif (g_btnPatterns[_displayName]) {\r\n\t\tObject.keys(g_btnPatterns[_displayName]).filter(target => document.getElementById(`btn${target}`) !== null)\r\n\t\t\t.forEach(target =>\r\n\t\t\t\tcreateScText(document.getElementById(`btn${target}`), target, {\r\n\t\t\t\t\tdisplayName: _displayName, targetLabel: `btn${target}`,\r\n\t\t\t\t\tdfLabel: g_lblNameObj[`sc_${_displayName}${target}`] ?? ``,\r\n\t\t\t\t\tx: g_btnPatterns[_displayName][target],\r\n\t\t\t\t}));\r\n\t}\r\n};\r\n\r\n/**\r\n * ショートカットキー有効化\r\n * @param {string} _displayName\r\n * @param {function} _func \r\n * @param {boolean} [object.displayFlg=true]\r\n * @param {boolean} [object.dfEvtFlg=false] \r\n */\r\nconst setShortcutEvent = (_displayName, _func = () => true, { displayFlg = true, dfEvtFlg = false } = {}) => {\r\n\tif (displayFlg) {\r\n\t\tcreateScTextCommon(_displayName);\r\n\t}\r\n\tconst evList = () => {\r\n\t\tdocument.onkeydown = evt => commonKeyDown(evt, _displayName, _func, dfEvtFlg);\r\n\t\tdocument.onkeyup = evt => commonKeyUp(evt);\r\n\t};\r\n\tif (!g_btnWaitFrame[_displayName] ||\r\n\t\tg_btnWaitFrame[_displayName].s_frame === 0 ||\r\n\t\t(g_initialFlg && g_btnWaitFrame[_displayName].initial)) {\r\n\t\tevList();\r\n\t} else {\r\n\t\tsetTimeout(() => {\r\n\t\t\tif (g_currentPage === _displayName) {\r\n\t\t\t\tevList();\r\n\t\t\t}\r\n\t\t}, g_btnWaitFrame[_displayName].s_frame * 1000 / g_fps);\r\n\t}\r\n};\r\n\r\n\r\n/*-----------------------------------------------------------*/\r\n/* ファイル・リンク制御                                        */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * 外部リンクを新規タブで開く\r\n * @param {string} _url \r\n */\r\nconst openLink = _url => {\r\n\tif (_url.match(`^(http|https):/`)) {\r\n\t\twindow.open(_url, `_blank`, `noopener`);\r\n\t}\r\n};\r\n\r\n/**\r\n * URLのフルパスを取得\r\n * @param {string} _url\r\n * @returns {string}\r\n */\r\nconst getFullPath = _url => {\r\n\tconst link = document.createElement(`a`);\r\n\tlink.href = _url;\r\n\treturn link.href;\r\n};\r\n\r\n/**\r\n * プリロードするファイルの設定\r\n * @param {string} _as \r\n * @param {string} _href \r\n * @param {string} [_type=''] \r\n * @param {string} [_crossOrigin='anonymous'] \r\n */\r\nconst preloadFile = (_as, _href, _type = ``, _crossOrigin = `anonymous`) => {\r\n\r\n\tconst preloadFlg = g_preloadFiles.all.find(v => v === _href);\r\n\r\n\tif (preloadFlg === undefined) {\r\n\t\tg_preloadFiles.all.push(_href);\r\n\t\tg_preloadFiles[_as]?.push(_href) || (g_preloadFiles[_as] = [_href]);\r\n\r\n\t\tconst link = document.createElement(`link`);\r\n\t\tlink.rel = `preload`;\r\n\t\tlink.as = _as;\r\n\t\tlink.href = _href;\r\n\t\tif (_type !== ``) {\r\n\t\t\tlink.type = _type;\r\n\t\t}\r\n\t\tif (!g_isFile) {\r\n\t\t\tlink.crossOrigin = _crossOrigin;\r\n\t\t}\r\n\t\tdocument.head.appendChild(link);\r\n\t}\r\n};\r\n\r\n/**\r\n * 外部jsファイルの読込 (Promise)\r\n * 読込可否を g_loadObj[ファイル名] で管理 (true: 読込成功, false: 読込失敗)\r\n * @param {string} _url \r\n * @param {boolean} [_requiredFlg=true] 読込必須フラグ\r\n * @param {string} [_charset='UTF-8']\r\n * @returns {Promise<any>}\r\n */\r\nconst loadScript2 = (_url, _requiredFlg = true, _charset = `UTF-8`) => {\r\n\tconst baseUrl = _url.split(`?`)[0];\r\n\tg_loadObj[baseUrl] = false;\r\n\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tconst script = document.createElement(`script`);\r\n\t\tscript.type = `text/javascript`;\r\n\t\tscript.src = _url;\r\n\t\tscript.charset = _charset;\r\n\t\tscript.onload = () => {\r\n\t\t\tg_loadObj[baseUrl] = true;\r\n\t\t\tresolve(script);\r\n\t\t};\r\n\t\tscript.onerror = _err => {\r\n\t\t\tif (_requiredFlg) {\r\n\t\t\t\tmakeWarningWindow(g_msgInfoObj.E_0041.split(`{0}`).join(getFullPath(baseUrl)));\r\n\t\t\t\treject(_err);\r\n\t\t\t} else {\r\n\t\t\t\tresolve(script);\r\n\t\t\t}\r\n\t\t};\r\n\t\tdocument.querySelector(`head`).appendChild(script);\r\n\t});\r\n};\r\n\r\n/**\r\n * CSSファイルの読み込み (Promise)\r\n * デフォルトは danoni_skin_default.css を読み込む\r\n * @param {url} _href \r\n * @param {string} [object.crossOrigin='anonymous'] \r\n * @returns {Promise<any>}\r\n */\r\nconst importCssFile2 = (_href, { crossOrigin = `anonymous` } = {}) => {\r\n\tconst baseUrl = _href.split(`?`)[0];\r\n\tg_loadObj[baseUrl] = false;\r\n\r\n\treturn new Promise(resolve => {\r\n\t\tconst link = document.createElement(`link`);\r\n\t\tlink.rel = `stylesheet`;\r\n\t\tlink.href = _href;\r\n\t\tif (!g_isFile) {\r\n\t\t\tlink.crossOrigin = crossOrigin;\r\n\t\t}\r\n\t\tlink.onload = () => {\r\n\t\t\tg_loadObj[baseUrl] = true;\r\n\t\t\tresolve(link);\r\n\t\t};\r\n\t\tlink.onerror = () => {\r\n\t\t\tmakeWarningWindow(g_msgInfoObj.E_0041.split(`{0}`).join(getFullPath(baseUrl)), { resetFlg: `title` });\r\n\t\t\tresolve(link);\r\n\t\t};\r\n\t\tdocument.head.appendChild(link);\r\n\t});\r\n};\r\n\r\n/**\r\n * js, cssファイルの連続読込 (async function)\r\n * @param {string[]} _fileData \r\n * @param {string} _loadType\r\n * @returns {Promise<void>}\r\n */\r\nconst loadMultipleFiles2 = async (_fileData, _loadType) => {\r\n\tawait Promise.all(_fileData.map(async filePart => {\r\n\r\n\t\t// ファイルが属するドメインがリモートの場合は、キャッシュが使えるようにする\r\n\t\tconst urlCacheName = listMatching(filePart[1], g_referenceDomains)\r\n\t\t\t? g_versionForUrl : g_randTime;\r\n\t\tconst filePath = `${filePart[1]}${filePart[0]}?${urlCacheName}`;\r\n\t\tif (filePart[0].endsWith(`.css`)) {\r\n\t\t\t_loadType = `css`;\r\n\t\t}\r\n\r\n\t\t// jsファイル、cssファイルにより呼び出す関数を切替\r\n\t\tif (_loadType === `js`) {\r\n\t\t\tawait loadScript2(filePath, false);\r\n\t\t} else if (_loadType === `css`) {\r\n\t\t\tconst cssPath = filePath.split(`.js?`).join(`.css?`);\r\n\t\t\tawait importCssFile2(cssPath);\r\n\t\t}\r\n\t}));\r\n};\r\n\r\n/**\r\n * 与えられたパスより、キーワードとディレクトリに分割\r\n * @param {string} _fileName \r\n * @param {string} [_directory='']\r\n * @returns {string[]} [ファイルキーワード, ルートディレクトリ]\r\n */\r\nconst getFilePath = (_fileName, _directory = ``) => {\r\n\tif (_fileName.startsWith(`https://`)) {\r\n\t\treturn [_fileName, ``];\r\n\t}\r\n\tlet fullPath;\r\n\tif (_fileName.startsWith(C_MRK_CURRENT_DIRECTORY)) {\r\n\t\tfullPath = `${g_workPath}${_fileName.slice(C_MRK_CURRENT_DIRECTORY.length)}`;\r\n\t} else {\r\n\t\tfullPath = `${g_rootPath}${_directory}${_fileName}`;\r\n\t}\r\n\tconst dirPos = fullPath.lastIndexOf(`/`);\r\n\treturn [fullPath.slice(dirPos + 1), fullPath.slice(0, dirPos + 1)];\r\n}\r\n\r\n/**\r\n * 画像ファイルの存在チェック後、プリロードする処理\r\n * @param {string} _imgPath\r\n * @param {string} [object.directory='']\r\n * @param {boolean} [object.syncBackPath=true] \r\n * @returns {string}\r\n */\r\nconst preloadImgFile = (_imgPath, { directory = ``, syncBackPath = true } = {}) => {\r\n\r\n\tlet imgPath = _imgPath;\r\n\tif (g_headerObj.autoPreload && checkImage(_imgPath)) {\r\n\t\tif (syncBackPath) {\r\n\t\t\tconst [file, dir] = getFilePath(_imgPath, directory);\r\n\t\t\timgPath = `${dir}${file}`;\r\n\t\t}\r\n\t\tpreloadFile(`image`, imgPath);\r\n\t}\r\n\treturn imgPath;\r\n};\r\n\r\n/**\r\n * 画像パス部分の取得\r\n * @param {string} _str \r\n * @returns {string}\r\n */\r\nconst getImageUrlPath = _str => {\r\n\tconst matches = _str?.match(/url\\(\"([^\"]*)\"\\)/);\r\n\treturn matches && matches.length >= 2 ? matches[1] : ``;\r\n};\r\n\r\n/**\r\n * カレントディレクトリを含む文字列を置換し、変更後の文字列を作成\r\n * @param {string} _str \r\n * @returns {string}\r\n */\r\nconst reviseCssText = _str => {\r\n\tif (getImageUrlPath(_str) !== ``) {\r\n\t\tconst imgOriginal = getImageUrlPath(_str);\r\n\t\tconst imgPath = preloadImgFile(imgOriginal);\r\n\t\treturn replaceStr(_str, [[imgOriginal, imgPath]]);\r\n\t}\r\n\treturn _str;\r\n};\r\n\r\n/*-----------------------------------------------------------*/\r\n/* 色・グラデーション設定                                      */\r\n/*-----------------------------------------------------------*/\r\nconst g_ctx = document.createElement(`canvas`).getContext(`2d`);\r\n\r\n/**\r\n * 対象のカラーコードが明暗どちらかを判定 (true: 明色, false: 暗色)\r\n * @param {string} _colorStr\r\n * @returns {boolean}\r\n */\r\nconst checkLightOrDark = _colorStr => {\r\n\tconst r = parseInt(_colorStr.substring(1, 3), 16);\r\n\tconst g = parseInt(_colorStr.substring(3, 5), 16);\r\n\tconst b = parseInt(_colorStr.substring(5, 7), 16);\r\n\treturn ((((r * 299) + (g * 587) + (b * 114)) / 1000) < 128);\r\n};\r\n\r\n/**\r\n * 色名をカラーコードに変換\r\n * @param {string} _color \r\n * @returns {string}\r\n */\r\nconst colorNameToCode = _color => {\r\n\tg_ctx.fillStyle = _color;\r\n\treturn g_ctx.fillStyle;\r\n};\r\n\r\n/**\r\n * 10進 -> 16進数変換 (カラーコード形式になるよう0埋め)\r\n * @param {number} _num \r\n * @returns {string}\r\n */\r\nconst byteToHex = _num => _num.toString(16).padStart(2, '0');\r\n\r\n/**\r\n * カラーコードかどうかを判定 (簡易版)\r\n * @param {string} _str\r\n * @returns {boolean}\r\n */\r\nconst isColorCd = _str => _str.substring(0, 1) === `#`;\r\n\r\n/**\r\n * CSSの位置表記系かどうかをチェック\r\n * @param {string} _str\r\n * @returns {boolean}\r\n */\r\nconst hasAnglePointInfo = _str => fuzzyListMatching(_str, g_checkStr.cssHeader, g_checkStr.cssFooter);\r\n\r\n/**\r\n * 色名をカラーコードへ変換 (元々カラーコードの場合は除外)\r\n * @param {string} _color 色名\r\n * @returns {string}\r\n */\r\nconst colorToHex = (_color) => {\r\n\r\n\t// すでにカラーコードのものやパーセント表記、位置表記系を除外\r\n\tif (!isNaN(parseFloat(_color)) || isColorCd(_color) || hasAnglePointInfo(_color)) {\r\n\t\treturn _color;\r\n\t}\r\n\r\n\t// 色_位置;透明度 (Ex: red 20%;255) の形式で取り込み\r\n\t// 透明度はカラーコード形式に変換してRGBの後ろに設定\r\n\tconst tmpColor = _color.split(`;`);\r\n\tconst colorSet = tmpColor[0].split(` `);\r\n\treturn colorNameToCode(colorSet[0]) +\r\n\t\t(tmpColor.length > 1 ? byteToHex(setIntVal(tmpColor[1], 255)) : '') +\r\n\t\t(colorSet[1] !== undefined ? ` ${colorSet.slice(1).join(' ')}` : '');\r\n};\r\n\r\n/**\r\n * カラーコードの前パディング (旧Option Editor対応)\r\n * @param {boolean} _useFlg\r\n * @param {string} _colorStr \r\n * @returns {string}\r\n */\r\nconst colorCdPadding = (_useFlg, _colorStr) => _useFlg ? `#${_colorStr.slice(1).padStart(6, `0`)}` : _colorStr;\r\n\r\n/**\r\n * グラデーション用のカラーフォーマットを作成\r\n * @param {string} _colorStr \r\n * @param {string[]} [object._defaultColorgrd=g_headerObj.defaultColorgrd]\r\n * @param {boolean} [object._colorCdPaddingUse=false]\r\n * @param {string} [object._objType='normal'] (normal: 汎用, titleMusic: タイトル曲名, titleArrow: タイトル矢印)\r\n * @param {boolean} [object._shadowFlg=false]\r\n * @returns {string}\r\n */\r\nconst makeColorGradation = (_colorStr, { _defaultColorgrd = g_headerObj.defaultColorgrd,\r\n\t_colorCdPaddingUse = false, _objType = `normal`, _shadowFlg = false } = {}) => {\r\n\r\n\t// |color_data=300,20,45deg:#ffff99:#ffffff:#9999ff@linear-gradient|\r\n\t// |color_data=300,20,#ffff99:#ffffff:#9999ff@radial-gradient|\r\n\t// |color_data=300,20,#ffff99:#ffffff:#9999ff@conic-gradient|\r\n\r\n\tif (_colorStr === `Default` || _colorStr === ``) {\r\n\t\treturn _colorStr;\r\n\t}\r\n\r\n\t// 矢印の塗りつぶしの場合：透明度を50%にする\r\n\t// 背景矢印の場合       ：透明度を25%にする\r\n\tconst alphaVal = (_shadowFlg && _objType !== `frz`) ? `80` : (_objType === `titleArrow` ? `40` : ``);\r\n\r\n\tlet convertColorStr = ``;\r\n\tconst tmpBackgroundStr = _colorStr.split(`;;`);\r\n\r\n\t// 色情報以外の部分を退避\r\n\tconst addData = tmpBackgroundStr[1] !== undefined ? tmpBackgroundStr.slice(1).join(` `) : ``;\r\n\tif ([``, `-`, `none`].includes(tmpBackgroundStr[0]) ||\r\n\t\ttmpBackgroundStr[0].startsWith(`url(`) || tmpBackgroundStr[0].startsWith(`var(`)) {\r\n\t\treturn addData;\r\n\t}\r\n\r\n\t// 色情報からグラデーションを作成\r\n\tconst tmpColorStr = tmpBackgroundStr[0].split(`@`);\r\n\tconst colorArray = tmpColorStr[0].split(`:`);\r\n\tcolorArray.forEach((colorCd, j) => {\r\n\t\tcolorArray[j] = colorCdPadding(_colorCdPaddingUse, colorToHex(colorCd.replaceAll(`0x`, `#`)));\r\n\t\tif (isColorCd(colorArray[j]) && colorArray[j].length === 7) {\r\n\t\t\tcolorArray[j] += alphaVal;\r\n\t\t}\r\n\t});\r\n\r\n\tconst gradationType = (tmpColorStr.length > 1 ? tmpColorStr[1] : `linear-gradient`);\r\n\tconst defaultDir = `to ${(_objType === 'titleArrow' ? 'left' : 'right')}, `;\r\n\tif (colorArray.length === 1) {\r\n\t\tif (_objType === `titleMusic`) {\r\n\t\t\tconvertColorStr = `${defaultDir}${colorArray[0]} 100%, #eeeeee${alphaVal} 0%`;\r\n\t\t} else if (_defaultColorgrd[0]) {\r\n\t\t\tconvertColorStr = `${defaultDir}${colorArray[0]}, ${_defaultColorgrd[1]}${alphaVal}, ${colorArray[0]}`;\r\n\t\t} else {\r\n\t\t\treturn colorArray[0];\r\n\t\t}\r\n\t} else {\r\n\t\tif (gradationType === `linear-gradient` && (isColorCd(colorArray[0]) || !hasAnglePointInfo(colorArray[0]))) {\r\n\t\t\t// \"to XXXX\" もしくは \"XXXdeg(rad, grad, turn)\"のパターン以外は方向を補完する\r\n\t\t\tconvertColorStr = `${defaultDir}`;\r\n\t\t}\r\n\t\tconvertColorStr += `${colorArray.join(', ')}`;\r\n\t}\r\n\r\n\treturn `${hasVal(addData) ? `${addData} ` : ''}${gradationType}(${convertColorStr})`;\r\n};\r\n\r\n/*-----------------------------------------------------------*/\r\n/* フォント設定                                          */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * 画面共通のフォント設定 (font-family設定を作成)\r\n * @param {string} [_priorityFont=''] 優先させるフォント名 \r\n * @returns {string}\r\n */\r\nconst getBasicFont = (_priorityFont = ``) =>\r\n\t[_priorityFont, g_headerObj.customFont, C_LBL_BASICFONT].filter(value => value !== ``).join(`,`);\r\n\r\n/**\r\n * フォントサイズに応じた横幅を取得\r\n * @param {string} _str \r\n * @param {number} _fontsize \r\n * @param {string} _font \r\n * @returns {number}\r\n */\r\nconst getStrWidth = (_str, _fontsize, _font) => {\r\n\tg_ctx.font = `${wUnit(_fontsize)} ${_font}`;\r\n\treturn g_ctx.measureText(unEscapeHtml(_str)).width;\r\n};\r\n\r\n/**\r\n * Canvas上で使用する絵文字を取得\r\n * - HTMLのdiv要素に絵文字を設定することで、Canvas上で使用できるようにする\r\n * @param {string} _str \r\n * @returns {string}\r\n */\r\nconst getEmojiForCanvas = _str => {\r\n\tconst div = document.createElement(`div`);\r\n\tdiv.innerHTML = _str;\r\n\tconst result = div.innerHTML;\r\n\tdiv.remove();\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * 指定した横幅に合ったフォントサイズを取得\r\n * @param {string} _str \r\n * @param {number} _maxWidth \r\n * @param {string} [object.font=getBasicFont()]\r\n * @param {number} [object.maxSiz=14]\r\n * @param {number} [object.minSiz=5]\r\n * @returns {number}\r\n */\r\nconst getFontSize2 = (_str, _maxWidth, { font = getBasicFont(), maxSiz = 14, minSiz = 5 } = {}) => {\r\n\tfor (let siz = maxSiz; siz >= minSiz; siz--) {\r\n\t\tif (_maxWidth >= getStrWidth(getLongestStr(_str?.split(`<br>`)), siz, font)) {\r\n\t\t\treturn siz;\r\n\t\t}\r\n\t}\r\n\treturn minSiz;\r\n};\r\n\r\n/**\r\n * 配列中から最も長い文字列を抽出\r\n * @param {string[]} _array \r\n * @returns {string}\r\n */\r\nconst getLongestStr = _array => {\r\n\tif (_array === undefined) {\r\n\t\treturn ``;\r\n\t}\r\n\treturn _array.reduce((longest, current) => {\r\n\t\treturn current.length > longest.length ? current : longest;\r\n\t}, ``);\r\n}\r\n\r\n/**\r\n * 補足説明部分のラベル作成\r\n * @param {string} _id \r\n * @param {string} _str \r\n * @param {string} [object.altId=_id]\r\n * @param {number} [object.siz=g_limitObj.mainSiz] \r\n * @returns {HTMLDivElement}\r\n */\r\nconst createDescDiv = (_id, _str, { altId = _id, siz = g_limitObj.mainSiz } = {}) =>\r\n\tcreateDivCss2Label(_id, _str, Object.assign(g_lblPosObj[altId], {\r\n\t\tsiz: getFontSize2(_str, g_lblPosObj[altId]?.w || g_sWidth, { maxSiz: siz }),\r\n\t}));\r\n\r\n/*-----------------------------------------------------------*/\r\n/* ラベル・ボタン・オブジェクトの作成                           */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * 図形の描画 (div要素)\r\n * - 親divに対してこの関数の返却値に対してappendすることで描画される\r\n * @param {string} _id\r\n * @param {number} _x \r\n * @param {number} _y \r\n * @param {number} _width \r\n * @param {number} _height \r\n * @param {string[]} _classes\r\n * @returns {HTMLDivElement}\r\n */\r\nconst createDiv = (_id, _x, _y, _width, _height, _classes = []) => {\r\n\tconst div = document.createElement(`div`);\r\n\r\n\tdiv.id = _id;\r\n\tconst style = div.style;\r\n\tstyle.left = wUnit(_x);\r\n\tstyle.top = wUnit(_y);\r\n\tstyle.width = wUnit(_width);\r\n\tstyle.height = wUnit(_height);\r\n\tstyle.position = `absolute`;\r\n\tdiv.classList.add(..._classes);\r\n\tsetUserSelect(style);\r\n\r\n\treturn div;\r\n};\r\n\r\n/**\r\n * user-select属性の値変更\r\n * @param {object} _style \r\n * @param {string} _value \r\n */\r\nconst setUserSelect = (_style, _value = C_DIS_NONE) => {\r\n\t_style.userSelect = _value;\r\n\t_style.webkitUserSelect = _value;\r\n\t_style.webkitTouchCallout = _value;\r\n};\r\n\r\n/**\r\n * 子div要素のラベル文字作成 (CSS版・拡張属性対応)\r\n * @param {string} _id \r\n * @param {string} _text \r\n * @param {number} [object.x=0]\r\n * @param {number} [object.y=0]\r\n * @param {number} [object.w=g_limitObj.setLblWidth]\r\n * @param {number} [object.h=g_limitObj.setLblHeight]\r\n * @param {number} [object.siz=g_limitObj.setLblSiz]\r\n * @param {number} [object.align='center']\r\n * @param {...any} [object.rest]\r\n * @param {...any} _classes \r\n * @returns {HTMLDivElement}\r\n */\r\nconst createDivCss2Label = (_id, _text, { x = 0, y = 0, w = g_limitObj.setLblWidth, h = g_limitObj.setLblHeight,\r\n\tsiz = g_limitObj.setLblSiz, align = C_ALIGN_CENTER, type = `text`, ...rest } = {}, ..._classes) => {\r\n\tconst div = createDiv(_id, x, y, w, h, [g_cssObj.title_base, ..._classes]);\r\n\r\n\tconst style = div.style;\r\n\tstyle.fontSize = wUnit(siz);\r\n\tstyle.fontFamily = getBasicFont();\r\n\tstyle.textAlign = `${align}`;\r\n\tstyle.pointerEvents = C_DIS_NONE;\r\n\tif (rest?.overflow === C_DIS_AUTO || type !== `text`) {\r\n\t\tstyle.pointerEvents = C_DIS_AUTO;\r\n\t}\r\n\tdiv.innerHTML = _text;\r\n\tObject.keys(rest).forEach(property => style[property] = rest[property]);\r\n\r\n\treturn div;\r\n};\r\n\r\n/**\r\n * 画像表示\r\n * @param {string} _id \r\n * @param {string} _imgPath \r\n * @param {number} _x \r\n * @param {number} _y \r\n * @param {number} _width \r\n * @param {number} _height \r\n * @returns {HTMLDivElement}\r\n */\r\nconst createImg = (_id, _imgPath, _x, _y, _width, _height) => {\r\n\tconst div = createDiv(_id, _x, _y, _width, _height);\r\n\tdiv.innerHTML = `<img id=\"${_id}img\" src=\"${_imgPath}\" style=\"width:${wUnit(_width)};height:${wUnit(_height)}\"${g_isFile ? `` : ` crossOrigin=\"anonimous\"`}>`;\r\n\r\n\treturn div;\r\n};\r\n\r\n/**\r\n * ColorPickerの作成\r\n * @param {string} _parentObj\r\n * @param {string} _id\r\n * @param {function} _func \r\n * @param {number} [object.x=0]\r\n * @param {number} [object.y=0]\r\n * @returns {HTMLInputElement}\r\n */\r\nconst createColorPicker = (_parentObj, _id, _func, { x = 0, y = 0 } = {}) => {\r\n\tconst picker = document.createElement(`input`);\r\n\tpicker.setAttribute(`type`, `color`);\r\n\tpicker.id = _id;\r\n\tpicker.style.left = wUnit(x);\r\n\tpicker.style.top = wUnit(y);\r\n\tpicker.style.position = `absolute`;\r\n\tpicker.style.pointerEvents = C_DIS_AUTO;\r\n\tpicker.addEventListener(`change`, _func);\r\n\t_parentObj.appendChild(picker);\r\n\treturn picker;\r\n};\r\n\r\n/**\r\n * 色付きオブジェクトの作成 (拡張属性対応)\r\n * @param {string} _id \r\n * @param {number} [object.x=0]\r\n * @param {number} [object.y=0]\r\n * @param {number} [object.w=C_ARW_WIDTH]\r\n * @param {number} [object.h=C_ARW_WIDTH]\r\n * @param {string} [object.rotate='']\r\n * @param {string} [object.styleName='']\r\n * @param {...any} [object.rest]\r\n * @param {...any} _classes \r\n * @returns {HTMLDivElement}\r\n */\r\nconst createColorObject2 = (_id,\r\n\t{ x = 0, y = 0, w = C_ARW_WIDTH, h = C_ARW_WIDTH, rotate = ``, styleName = ``,\r\n\t\trotateEnabled = g_stateObj.rotateEnabled, ...rest } = {}, ..._classes) => {\r\n\r\n\tconst div = createDiv(_id, x, y, w, h, _classes);\r\n\tconst style = div.style;\r\n\r\n\t// 矢印・オブジェクト判定\r\n\tlet charaStyle = `arrow${styleName}`;\r\n\tif (isNaN(parseFloat(rotate))) {\r\n\t\tconst objData = rotate.split(`:`);\r\n\t\trotate = setVal(objData[1], 0, C_TYP_FLOAT);\r\n\t\tcharaStyle = `${objData[0]}${styleName}`;\r\n\t}\r\n\tif (rotateEnabled) {\r\n\t\tstyle.transform = `rotate(${rotate}deg)`;\r\n\t}\r\n\r\n\tstyle.maskImage = `url(\"${g_imgObj[charaStyle]}\")`;\r\n\tstyle.maskSize = `contain`;\r\n\tstyle.webkitMaskImage = `url(\"${g_imgObj[charaStyle]}\")`;\r\n\tstyle.webkitMaskSize = `contain`;\r\n\tstyle.pointerEvents = C_DIS_NONE;\r\n\tif (rest?.overflow === C_DIS_AUTO) {\r\n\t\tstyle.pointerEvents = C_DIS_AUTO;\r\n\t}\r\n\tObject.keys(rest).forEach(property => style[property] = rest[property]);\r\n\tsetAttrs(div, { color: rest.background ?? ``, type: charaStyle, cnt: 0, });\r\n\r\n\treturn div;\r\n};\r\n\r\n/**\r\n * 空スプライト(ムービークリップ相当)の作成\r\n * - 作成済みの場合はすでに作成済のスプライトを返却する\r\n * @param {HTMLDivElement} _parentObj 親スプライト\r\n * @param {string} _newObjId 作成する子スプライト名\r\n * @param {number} [object.x=0]\r\n * @param {number} [object.y=0]\r\n * @param {number} [object.w=g_sWidth]\r\n * @param {number} [object.h=g_sHeight]\r\n * @param {string} [object.title]\r\n * @param {...any} [object.rest]\r\n * @param  {...any} _classes\r\n * @returns {HTMLDivElement}\r\n */\r\nconst createEmptySprite = (_parentObj, _newObjId, { x = 0, y = 0, w = g_sWidth, h = g_sHeight, title = ``, ...rest } = {}, ..._classes) => {\r\n\tif (document.getElementById(_newObjId) !== null) {\r\n\t\tchangeStyle(_newObjId, { x, y, w, h, title, ...rest });\r\n\t\treturn document.getElementById(_newObjId);\r\n\t}\r\n\tconst div = createDiv(_newObjId, x, y, w, h, _classes);\r\n\tdiv.title = title;\r\n\r\n\tconst style = div.style;\r\n\tstyle.pointerEvents = (title !== `` || rest?.overflow === C_DIS_AUTO)\r\n\t\t? C_DIS_AUTO : C_DIS_NONE;\r\n\tObject.keys(rest).forEach(property => style[property] = rest[property]);\r\n\t_parentObj.appendChild(div);\r\n\r\n\treturn div;\r\n};\r\n\r\n/**\r\n * 階層スプライト（全体）の作成\r\n * @param {string} _baseName \r\n * @param {number} _num 階層数\r\n * @param {number} [object.x=0]\r\n * @returns {HTMLDivElement}\r\n */\r\nconst createMultipleSprite = (_baseName, _num, { x = 0 } = {}) => {\r\n\tconst sprite = createEmptySprite(divRoot, _baseName);\r\n\tfor (let j = 0; j <= _num; j++) {\r\n\t\tcreateEmptySprite(sprite, `${_baseName}${j}`);\r\n\t}\r\n\taddX(_baseName, `root`, x);\r\n\treturn sprite;\r\n};\r\n\r\n/**\r\n * イベントハンドラ用オブジェクト\r\n * 参考: http://webkatu.com/remove-eventlistener/\r\n * \r\n * - イベントリスナー作成時にリスナーキー(key)を発行する\r\n * - 削除時は発行したリスナーキーを指定して削除する\r\n */\r\nconst g_handler = (() => {\r\n\tconst events = {};\r\n\tlet key = 0;\r\n\r\n\treturn {\r\n\t\t/**\r\n\t\t * イベントリスナーへの追加\r\n\t\t * @param {EventTarget} _target \r\n\t\t * @param {string} _type \r\n\t\t * @param {EventListenerOrEventListenerObject} _listener \r\n\t\t * @param {boolean} [_capture=false] \r\n\t\t * @returns {number}\r\n\t\t */\r\n\t\taddListener: (_target, _type, _listener, _capture = false) => {\r\n\t\t\t_target.addEventListener(_type, _listener, _capture);\r\n\t\t\tevents[key] = {\r\n\t\t\t\ttarget: _target,\r\n\t\t\t\ttype: _type,\r\n\t\t\t\tlistener: _listener,\r\n\t\t\t\tcapture: _capture\r\n\t\t\t};\r\n\t\t\treturn key++;\r\n\t\t},\r\n\t\t/**\r\n\t\t * イベントリスナーの削除\r\n\t\t * @param {number} key \r\n\t\t */\r\n\t\tremoveListener: key => {\r\n\t\t\tif (key in events) {\r\n\t\t\t\tconst e = events[key];\r\n\t\t\t\te.target.removeEventListener(e.type, e.listener, e.capture);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n})();\r\n\r\n/**\r\n * 親スプライト配下の子スプライトを全削除\r\n * @param {object} _parentObjName 親スプライト名\r\n */\r\nconst deleteChildspriteAll = _parentObjName => {\r\n\r\n\tconst parentsprite = document.getElementById(_parentObjName);\r\n\twhile (parentsprite.hasChildNodes()) {\r\n\t\tg_handler.removeListener(parentsprite.firstChild.getAttribute(`lsnrkey`));\r\n\t\tg_handler.removeListener(parentsprite.firstChild.getAttribute(`lsnrkeyTS`));\r\n\t\tg_handler.removeListener(parentsprite.firstChild.getAttribute(`lsnrkeyTE`));\r\n\t\tparentsprite.removeChild(parentsprite.firstChild);\r\n\t}\r\n};\r\n\r\n/**\r\n * div要素の削除\r\n * @param {object} _parentId \r\n * @param {string} _idName \r\n */\r\nconst deleteDiv = (_parentId, _idName) => {\r\n\tif (document.getElementById(_idName) !== null) {\r\n\t\t_parentId.removeChild(document.getElementById(_idName));\r\n\t}\r\n};\r\n\r\n/**\r\n * ボタンの作成 (CSS版・拡張属性対応)\r\n * @param {string} _id \r\n * @param {string} _text\r\n * @param {function} _func\r\n * @param {number} [object.x]\r\n * @param {number} [object.y]\r\n * @param {number} [object.w=g_btnWidth() / 3]\r\n * @param {number} [object.h=g_limitObj.btnHeight]\r\n * @param {number} [object.siz=g_limitObj.btnSiz]\r\n * @param {string} [object.align='center']\r\n * @param {string} [object.title] ボタンオンマウス時のコメント\r\n * @param {string} [object.groupName] 画面名 (g_btnWaitFrameで定義しているプロパティ名を指定)\r\n * @param {boolean} [object.initDisabledFlg=true] ボタン有効化までの時間を設けるかどうか\r\n * @param {function} [object.resetFunc] カスタム処理後に実行する処理\r\n * @param {function} [object.cxtFunc] 右クリック時に実行する処理\r\n * @param {...any} [object.rest]\r\n * @param {...any} _classes \r\n */\r\nconst createCss2Button = (_id, _text, _func = () => true, {\r\n\tx = 0, y = g_sHeight - 100, w = g_btnWidth() / 3, h = g_limitObj.btnHeight,\r\n\tsiz = g_limitObj.btnSiz, align = C_ALIGN_CENTER, title = ``, groupName = g_currentPage, initDisabledFlg = true,\r\n\tresetFunc = () => true, cxtFunc = () => true, ...rest } = {}, ..._classes) => {\r\n\r\n\tconst div = createDiv(_id, x, y, w, h, [`button_common`, ..._classes]);\r\n\tdiv.innerHTML = _text;\r\n\tdiv.title = title;\r\n\r\n\tconst style = div.style;\r\n\tstyle.textAlign = align;\r\n\tstyle.fontSize = wUnit(siz);\r\n\tstyle.fontFamily = getBasicFont();\r\n\tstyle.pointerEvents = C_DIS_AUTO;\r\n\tif (rest.animationName !== undefined) {\r\n\t\tstyle.animationDuration = `1s`;\r\n\t}\r\n\tObject.keys(rest).forEach(property => style[property] = rest[property]);\r\n\r\n\t// ボタン有効化操作\r\n\tif (initDisabledFlg) {\r\n\t\tif (!g_btnWaitFrame[groupName] ||\r\n\t\t\tg_btnWaitFrame[groupName].b_frame === 0 ||\r\n\t\t\t(g_initialFlg && g_btnWaitFrame[groupName].initial)) {\r\n\t\t} else {\r\n\t\t\tstyle.pointerEvents = C_DIS_NONE;\r\n\t\t\tsetTimeout(() => style.pointerEvents = rest.pointerEvents ?? C_DIS_AUTO,\r\n\t\t\t\tg_btnWaitFrame[groupName].b_frame * 1000 / g_fps);\r\n\t\t}\r\n\t}\r\n\r\n\t// ボタンを押したときの動作\r\n\tconst lsnrkey = g_handler.addListener(div, `click`, evt => {\r\n\t\tif (!setBoolVal(g_btnDeleteFlg[_id])) {\r\n\t\t\t_func(evt);\r\n\t\t}\r\n\t\tif (typeof g_btnAddFunc[_id] === C_TYP_FUNCTION) {\r\n\t\t\tg_btnAddFunc[_id](evt, _func, resetFunc);\r\n\t\t}\r\n\t\tif (!setBoolVal(g_btnDeleteFlg[_id])) {\r\n\t\t\tresetFunc(evt);\r\n\t\t}\r\n\t});\r\n\tg_btnFunc.base[_id] = _func;\r\n\tg_btnFunc.reset[_id] = resetFunc;\r\n\r\n\t// 右クリック時の処理\r\n\tdiv.oncontextmenu = evt => {\r\n\t\tif (typeof cxtFunc === C_TYP_FUNCTION) {\r\n\t\t\tif (!setBoolVal(g_cxtDeleteFlg[_id])) {\r\n\t\t\t\tcxtFunc(evt);\r\n\t\t\t}\r\n\t\t\tif (typeof g_cxtAddFunc[_id] === C_TYP_FUNCTION) {\r\n\t\t\t\tg_cxtAddFunc[_id](evt, cxtFunc);\r\n\t\t\t}\r\n\t\t\tg_btnFunc.cxt[_id] = cxtFunc;\r\n\r\n\t\t} else if (typeof g_cxtAddFunc[_id] === C_TYP_FUNCTION) {\r\n\t\t\tg_cxtAddFunc[_id](evt);\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\r\n\t// イベントリスナー用のキーをセット\r\n\tdiv.setAttribute(`lsnrkey`, lsnrkey);\r\n\r\n\treturn div;\r\n};\r\n\r\n/**\r\n * オブジェクトのスタイル一括変更\r\n * @param {string} _id \r\n * @param {number} [object.x]\r\n * @param {number} [object.y]\r\n * @param {number} [object.w]\r\n * @param {number} [object.h]\r\n * @param {string} [object.align]\r\n * @param {string} [object.title]\r\n * @param {...any} [object.rest]\r\n */\r\nconst changeStyle = (_id, { x, y, w, h, siz, align, title, ...rest } = {}) => {\r\n\tconst div = document.getElementById(_id);\r\n\tconst style = div.style;\r\n\r\n\tconst obj = {\r\n\t\tleft: x,\r\n\t\ttop: y,\r\n\t\twidth: w,\r\n\t\theight: h,\r\n\t\tfontSize: siz,\r\n\t};\r\n\tObject.keys(obj).filter(property => setVal(obj[property], ``, C_TYP_FLOAT) !== ``)\r\n\t\t.forEach(property => style[property] = wUnit(obj[property]));\r\n\r\n\tif (align !== undefined) {\r\n\t\tstyle.textAlign = `${align}`;\r\n\t}\r\n\tif (title !== undefined) {\r\n\t\tdiv.title = title;\r\n\t}\r\n\tObject.keys(rest).forEach(property => style[property] = rest[property]);\r\n};\r\n\r\n/**\r\n * タイトル文字描画\r\n * @param {string} _id \r\n * @param {string} _titlename \r\n * @param {number} _x \r\n * @param {number} _y \r\n * @param {...any} [_classes]\r\n */\r\nconst getTitleDivLabel = (_id, _titlename, _x, _y, ..._classes) =>\r\n\tcreateDivCss2Label(_id, _titlename, { x: _x, y: _y, w: g_sWidth, h: 50, siz: g_limitObj.btnSiz }, ..._classes);\r\n\r\n/**\r\n * キーコントロールの初期化\r\n */\r\nconst resetKeyControl = () => {\r\n\tdocument.onkeyup = () => { };\r\n\tdocument.onkeydown = evt => {\r\n\t\tevt.preventDefault();\r\n\t\treturn blockCode(transCode(evt));\r\n\t};\r\n\tg_inputKeyBuffer = {};\r\n};\r\n\r\n/**\r\n * Canvasのベース背景を作成\r\n * @param {CanvasRenderingContext2D} _ctx\r\n * @param {number} [object.w=g_sWidth]\r\n * @param {number} [object.h=g_sHeight] \r\n */\r\nconst makeBgCanvas = (_ctx, { w = g_sWidth, h = g_sHeight } = {}) => {\r\n\tconst grd = _ctx.createLinearGradient(0, 0, 0, h);\r\n\tgrd.addColorStop(0, `#000000`);\r\n\tgrd.addColorStop(1, `#222222`);\r\n\t_ctx.fillStyle = grd;\r\n\t_ctx.fillRect(0, 0, w, h);\r\n};\r\n\r\n/**\r\n * 画面上の描画・オブジェクトを全てクリアし、背景を再描画\r\n * - divオブジェクト(ボタンなど)はdivRoot配下で管理しているため、子要素のみを全削除している。\r\n * - dicRoot自体を削除しないよう注意すること。\r\n * - 再描画時に共通で表示する箇所はここで指定している。\r\n * @param {boolean} [_redrawFlg=false] 画面横幅を再定義し、Canvas背景を再描画するかどうか\r\n * @param {string} [_customDisplayName=''] 画面名(メイン画面: 'Main', それ以外: 空)\r\n */\r\nconst clearWindow = (_redrawFlg = false, _customDisplayName = ``) => {\r\n\tresetKeyControl();\r\n\tresetTransform();\r\n\tresetXY();\r\n\r\n\t// ボタン、オブジェクトをクリア (divRoot配下のもの)\r\n\tdeleteChildspriteAll(`divRoot`);\r\n\r\n\t// 拡張範囲を取得\r\n\tconst diffX = (_customDisplayName === `Main` && g_workObj.nonDefaultSc ?\r\n\t\tg_headerObj.scAreaWidth * (g_headerObj.playingLayout ? 2 : 1) : 0);\r\n\r\n\tconst getLayerWithClear = (_name) => {\r\n\t\tconst layer = document.getElementById(_name);\r\n\t\tconst ctx = layer.getContext(`2d`);\r\n\t\tctx.clearRect(0, 0, layer.width, g_sHeight);\r\n\t\treturn ctx;\r\n\t};\r\n\r\n\tif (document.getElementById(`layer0`) !== null) {\r\n\r\n\t\t// レイヤー情報取得\r\n\t\tconst l0ctx = getLayerWithClear(`layer0`);\r\n\r\n\t\tif (document.getElementById(`layer1`) !== null) {\r\n\t\t\tconst l1ctx = getLayerWithClear(`layer1`);\r\n\r\n\t\t\t// 線画 (title-line)\r\n\t\t\tl1ctx.beginPath();\r\n\t\t\tl1ctx.strokeStyle = `#cccccc`;\r\n\t\t\tl1ctx.moveTo(0, 0);\r\n\t\t\tl1ctx.lineTo(layer1.width, 0);\r\n\t\t\tl1ctx.stroke();\r\n\r\n\t\t\tl1ctx.beginPath();\r\n\t\t\tl1ctx.strokeStyle = `#cccccc`;\r\n\t\t\tl1ctx.moveTo(0, g_sHeight);\r\n\t\t\tl1ctx.lineTo(layer1.width, g_sHeight);\r\n\t\t\tl1ctx.stroke();\r\n\t\t}\r\n\t\tif (document.getElementById(`layer2`) !== null) {\r\n\t\t\tgetLayerWithClear(`layer2`);\r\n\t\t}\r\n\r\n\t\tif (_redrawFlg) {\r\n\t\t\t// 画面背景を指定 (background-color)\r\n\t\t\t$id(`canvas-frame`).width = wUnit(g_sWidth + diffX);\r\n\t\t\tlayer0.width = g_sWidth + diffX;\r\n\t\t\tif (!g_headerObj[`customBack${_customDisplayName}Use`]) {\r\n\t\t\t\tmakeBgCanvas(l0ctx, { w: g_sWidth + diffX });\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// 背景を再描画\r\n\tif (_redrawFlg) {\r\n\t\tg_btnAddFunc = {};\r\n\t\tg_btnDeleteFlg = {};\r\n\t\tg_cxtAddFunc = {};\r\n\t\tg_cxtDeleteFlg = {};\r\n\r\n\t\tif (document.getElementById(`layer0`) === null ||\r\n\t\t\t(!g_headerObj[`customBack${_customDisplayName}Use`] && !g_headerObj.defaultSkinFlg)) {\r\n\r\n\t\t\t$id(`canvas-frame`).width = wUnit(g_sWidth + diffX);\r\n\t\t\tcreateEmptySprite(divRoot, `divBack`, { w: g_sWidth + diffX });\r\n\t\t}\r\n\r\n\t\t// CSSスタイルの初期化\r\n\t\tObject.keys(g_cssBkProperties).forEach(prop =>\r\n\t\t\tdocument.documentElement.style.setProperty(prop, g_cssBkProperties[prop]));\r\n\r\n\t\tObject.keys(g_headerObj).filter(val => val.startsWith(`--`) && hasVal(g_headerObj[val])).forEach(prop =>\r\n\t\t\tdocument.documentElement.style.setProperty(prop, getCssCustomProperty(prop, g_headerObj[prop])));\r\n\t}\r\n};\r\n\r\n/**\r\n * CSSカスタムプロパティの値を作成\r\n * @param {string} _prop \r\n * @param {string} _propData \r\n * @returns {string}\r\n */\r\nconst getCssCustomProperty = (_prop, _propData) =>\r\n\tdocument.documentElement.style.getPropertyValue(_propData) || (g_cssBkProperties[_propData] ?? (\r\n\t\t_prop.endsWith(`-x`) ? _propData : reviseCssText(makeColorGradation(_propData, { _defaultColorgrd: false }))\r\n\t));\r\n\r\n/**\r\n * CSSカスタムプロパティの値をオブジェクトへ退避\r\n */\r\nconst getCssCustomProperties = () => {\r\n\ttry {\r\n\t\tconst htmlStyle = document.documentElement.computedStyleMap();\r\n\t\tfor (const [propertyName, value] of htmlStyle.entries()) {\r\n\t\t\tif (/^--/.test(propertyName)) {\r\n\t\t\t\tg_cssBkProperties[propertyName] = value.toString();\r\n\t\t\t}\r\n\t\t}\r\n\t} catch (error) {\r\n\r\n\t\ttry {\r\n\t\t\t// FirefoxではcomputedStyleMapが使えないため、\r\n\t\t\t// CSSの全スタイルシート定義から :root がセレクタのルールを抽出し、カスタムプロパティを抽出\r\n\t\t\tconst sheets = document.styleSheets;\r\n\t\t\tArray.from(sheets).filter(sheet => !g_isFile && sheet.href !== null &&\r\n\t\t\t\tsheet.href.includes(`danoni_skin_`) && sheet.cssRules).forEach(sheet => {\r\n\t\t\t\t\tfor (const rule of sheet.cssRules) {\r\n\t\t\t\t\t\tif (rule.selectorText === ':root') {\r\n\t\t\t\t\t\t\tfor (let i = 0; i < rule.style.length; i++) {\r\n\t\t\t\t\t\t\t\tconst propertyName = rule.style.item(i);\r\n\t\t\t\t\t\t\t\tif (/^--/.test(propertyName)) {\r\n\t\t\t\t\t\t\t\t\tg_cssBkProperties[propertyName] = rule.style.getPropertyValue(propertyName);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t} catch (error) {\r\n\t\t\t// 上記でもNGの場合は何もしない\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * 背景・マスク用画像の描画\r\n * @param {object} _obj \r\n * @param {string} _obj.path 画像のパス\r\n * @param {string} _obj.class 画像を装飾するCSSクラス名\r\n * @param {string} _obj.left 画像の位置(x座標)\r\n * @param {string} _obj.top 画像の位置(y座標)\r\n * @param {number} _obj.width 画像の幅\r\n * @param {string} _obj.height 画像の高さ (他との共用項目のため、stringで受ける)\r\n * @param {string} _obj.animationName アニメーション名\r\n * @param {string} _obj.animationDuration アニメーションを動かす間隔(秒)\r\n * @param {number} _obj.opacity 画像の不透明度\r\n * @returns {string}\r\n */\r\nconst makeSpriteImage = _obj => {\r\n\tlet tmpInnerHTML = `<img src=${_obj.path} class=\"${_obj.class}\"\tstyle=\"position:absolute;left:${wUnit(_obj.left)};top:${wUnit(_obj.top)}`;\r\n\tif (_obj.width > 0) {\r\n\t\ttmpInnerHTML += `;width:${wUnit(_obj.width)}`;\r\n\t}\r\n\tif (setIntVal(_obj.height) > 0) {\r\n\t\ttmpInnerHTML += `;height:${wUnit(_obj.height)}`;\r\n\t}\r\n\ttmpInnerHTML += `;animation-name:${_obj.animationName};animation-duration:${_obj.animationDuration}s;opacity:${_obj.opacity}\">`;\r\n\treturn tmpInnerHTML;\r\n};\r\n\r\n/**\r\n * 背景・マスク用テキストの描画\r\n * @param {object} _obj \r\n * @param {string} _obj.path テキスト本体\r\n * @param {string} _obj.class テキストを装飾するCSSクラス名\r\n * @param {string} _obj.left テキストの位置(x座標)\r\n * @param {string} _obj.top テキストの位置(y座標)\r\n * @param {number} _obj.width テキストのフォントサイズ (font-size)\r\n * @param {string} _obj.height テキストの色 (color)\r\n * @param {string} _obj.animationName アニメーション名\r\n * @param {string} _obj.animationDuration アニメーションを動かす間隔(秒)\r\n * @param {number} _obj.opacity テキストの不透明度\r\n * @returns {string}\r\n */\r\nconst makeSpriteText = _obj => {\r\n\tlet tmpInnerHTML = `<span class=\"${_obj.class}\"\tstyle=\"display:inline-block;position:absolute;left:${wUnit(_obj.left)};top:${wUnit(_obj.top)}`;\r\n\r\n\t// この場合のwidthは font-size と解釈する\r\n\tif (_obj.width > 0) {\r\n\t\ttmpInnerHTML += `;font-size:${wUnit(_obj.width)}`;\r\n\t}\r\n\r\n\t// この場合のheightは color と解釈する\r\n\tif (_obj.height !== ``) {\r\n\t\ttmpInnerHTML += `;color:${_obj.height}`;\r\n\t}\r\n\ttmpInnerHTML += `;animation-name:${_obj.animationName};animation-duration:${_obj.animationDuration}s;opacity:${_obj.opacity}\">${_obj.path}</span>`;\r\n\treturn tmpInnerHTML;\r\n};\r\n\r\n/**\r\n * 多重配列の存在をチェックし、\r\n * 存在しない場合は作成、存在する場合は重複を避けて配列を新規作成\r\n * @param {any[][]} _obj \r\n * @returns [多重配列(初期化済),配列初期化済数]\r\n */\r\nconst checkDuplicatedObjects = _obj => {\r\n\tlet dataCnts = 0;\r\n\tif (_obj === undefined) {\r\n\t\t_obj = [];\r\n\t\t_obj[0] = [];\r\n\t} else {\r\n\t\tfor (let m = 1; ; m++) {\r\n\t\t\tif (_obj[m] === undefined) {\r\n\t\t\t\t_obj[m] = [];\r\n\t\t\t\tdataCnts = m;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn [_obj, dataCnts];\r\n};\r\n\r\n/**\r\n * 多層スプライトデータの作成処理\r\n * @param {string} _data \r\n * @param {function} _calcFrame \r\n * @returns [多層スプライトデータ, 最大深度]\r\n */\r\nconst makeSpriteData = (_data, _calcFrame = _frame => _frame) => {\r\n\r\n\tconst spriteData = [];\r\n\tlet maxDepth = -1;\r\n\r\n\tsplitLF(_data).filter(data => hasVal(data)).forEach(tmpData => {\r\n\t\tconst tmpSpriteData = tmpData.split(`,`).map(val => trimStr(val));\r\n\r\n\t\t// 深度が\"-\"の場合はスキップ\r\n\t\tif (tmpSpriteData[1] === undefined || tmpSpriteData[1] === `-` ||\r\n\t\t\t(tmpSpriteData[1] === `` && ![`[loop]`, `[jump]`].includes(tmpSpriteData[2]))) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// 値チェックとエスケープ処理\r\n\t\tconst tmpFrame = setIntVal(tmpSpriteData[0], -1) === 0 ? 0 :\r\n\t\t\troundZero(_calcFrame(setVal(tmpSpriteData[0], 200, C_TYP_CALC)));\r\n\t\tconst tmpDepth = (tmpSpriteData[1] === C_FLG_ALL ? C_FLG_ALL : setVal(tmpSpriteData[1], 0, C_TYP_CALC));\r\n\t\tif (tmpDepth !== C_FLG_ALL && tmpDepth > maxDepth) {\r\n\t\t\tmaxDepth = tmpDepth;\r\n\t\t}\r\n\r\n\t\tconst tmpObj = {\r\n\t\t\tpath: escapeHtml(tmpSpriteData[2] ?? ``, g_escapeStr.escapeCode),   // 画像パス or テキスト\r\n\t\t\tclass: escapeHtml(tmpSpriteData[3] ?? ``),                          // CSSクラス\r\n\t\t\tleft: setVal(tmpSpriteData[4], `0`).includes(`{`) ?\r\n\t\t\t\t`${setVal(tmpSpriteData[4], 0)}` : `{${setVal(tmpSpriteData[4], 0)}}`, // X座標\r\n\t\t\ttop: setVal(tmpSpriteData[5], `0`).includes(`{`) ?\r\n\t\t\t\t`${setVal(tmpSpriteData[5], 0)}` : `{${setVal(tmpSpriteData[5], 0)}}`, // Y座標\r\n\t\t\twidth: `${setIntVal(tmpSpriteData[6])}`,                            // spanタグの場合は font-size\r\n\t\t\theight: `${escapeHtml(tmpSpriteData[7] ?? ``)}`,                    // spanタグの場合は color(文字列可)\r\n\t\t\topacity: setVal(tmpSpriteData[8], 1, C_TYP_FLOAT),\r\n\t\t\tanimationName: escapeHtml(setVal(tmpSpriteData[9], C_DIS_NONE)),\r\n\t\t\tanimationDuration: setIntVal(tmpSpriteData[10]) / g_fps,\r\n\t\t};\r\n\t\tif (setVal(tmpSpriteData[11], g_presetObj.animationFillMode) !== undefined) {\r\n\t\t\ttmpObj.animationFillMode = setVal(tmpSpriteData[11], g_presetObj.animationFillMode);\r\n\t\t}\r\n\t\ttmpObj.path = preloadImgFile(tmpObj.path, { syncBackPath: g_headerObj.syncBackPath });\r\n\r\n\t\tlet dataCnts = 0;\r\n\t\t[spriteData[tmpFrame], dataCnts] =\r\n\t\t\tcheckDuplicatedObjects(spriteData[tmpFrame]);\r\n\r\n\t\tconst emptyPatterns = [`[loop]`, `[jump]`];\r\n\t\tconst colorObjFlg = tmpSpriteData[2]?.startsWith(`[c]`) || false;\r\n\t\tconst spriteFrameData = spriteData[tmpFrame][dataCnts] = {\r\n\t\t\tdepth: tmpDepth,\r\n\t\t};\r\n\r\n\t\tif (colorObjFlg) {\r\n\t\t\t// [c]始まりの場合、カラーオブジェクト用の作成準備を行う\r\n\t\t\tconst data = tmpObj.path.slice(`[c]`.length).split(`/`);\r\n\t\t\tspriteFrameData.colorObjInfo = {\r\n\t\t\t\tx: tmpObj.left, y: tmpObj.top, w: tmpObj.width, h: tmpObj.height,\r\n\t\t\t\trotate: setVal(data[0], `0`), opacity: tmpObj.opacity,\r\n\t\t\t\tbackground: makeColorGradation(setVal(data[1], `#ffffff`), { _defaultColorgrd: false }),\r\n\t\t\t\tanimationName: tmpObj.animationName,\r\n\t\t\t\tanimationDuration: `${tmpObj.animationDuration}s`,\r\n\t\t\t};\r\n\t\t\tspriteFrameData.colorObjId = `${tmpFrame}_${dataCnts}`;\r\n\t\t\tspriteFrameData.colorObjClass = setVal(tmpObj.class, undefined);\r\n\t\t\tif (tmpObj.animationFillMode !== undefined) {\r\n\t\t\t\tspriteFrameData.colorObjInfo.animationFillMode = tmpObj.animationFillMode;\r\n\t\t\t}\r\n\r\n\t\t} else if (tmpObj.path === ``) {\r\n\t\t\tspriteFrameData.command = ``;\r\n\t\t} else if (emptyPatterns.includes(tmpObj.path)) {\r\n\t\t\t// ループ、フレームジャンプの場合の処理\r\n\t\t\tspriteFrameData.command = tmpObj.path;\r\n\t\t\tspriteFrameData.jumpFrame = tmpObj.class;\r\n\t\t\tspriteFrameData.maxLoop = tmpObj.left;\r\n\t\t\tspriteFrameData.htmlText = ``;\r\n\t\t} else {\r\n\t\t\t// それ以外の画像、テキストの場合\r\n\t\t\tspriteFrameData.animationName = tmpObj.animationName;\r\n\t\t\tspriteFrameData.htmlText = (checkImage(tmpObj.path) ? makeSpriteImage(tmpObj) : makeSpriteText(tmpObj));\r\n\t\t}\r\n\t});\r\n\r\n\treturn [spriteData, maxDepth];\r\n};\r\n\r\n/**\r\n * スタイル変更データの作成処理\r\n * @param {string} _data \r\n * @param {function} _calcFrame \r\n * @returns [多層スプライトデータ, 1(固定)]\r\n */\r\nconst makeStyleData = (_data, _calcFrame = _frame => _frame) => {\r\n\tconst spriteData = [];\r\n\tsplitLF(_data).filter(data => hasVal(data)).forEach(tmpData => {\r\n\t\tconst tmpSpriteData = tmpData.split(`,`).map(val => trimStr(val));\r\n\r\n\t\t// カスタムプロパティの名称(--始まり)で無い場合はコメントと見做してスキップ\r\n\t\tif (tmpSpriteData.length <= 1 || !tmpSpriteData[1].startsWith(`--`)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst tmpFrame = setIntVal(tmpSpriteData[0], -1) === 0 ? 0 :\r\n\t\t\troundZero(_calcFrame(setVal(tmpSpriteData[0], 200, C_TYP_CALC)));\r\n\r\n\t\tlet dataCnts = 0;\r\n\t\t[spriteData[tmpFrame], dataCnts] = checkDuplicatedObjects(spriteData[tmpFrame]);\r\n\t\tspriteData[tmpFrame][dataCnts] = {\r\n\t\t\tdepth: tmpSpriteData[1],\r\n\t\t\tstyleData: getCssCustomProperty(tmpSpriteData[1], tmpSpriteData[2]),\r\n\t\t};\r\n\t});\r\n\treturn [spriteData, 1];\r\n};\r\n\r\n/**\r\n * 画像ファイルかどうかをチェック\r\n * @param {string} _str \r\n * @returns {boolean}\r\n */\r\nconst checkImage = _str => listMatching(_str, g_imgExtensions, { prefix: `[.]`, suffix: `$` });\r\n\r\n/**\r\n * back/masktitle(result)において、ジャンプ先のフレーム数を取得\r\n * @param {string} _frames ジャンプ先のフレーム数情報。コロン指定でジャンプ先を確率で分岐 (ex. 300:1500:1500)\r\n * @returns {number}\r\n */\r\nconst getSpriteJumpFrame = _frames => {\r\n\tconst jumpFrames = _frames.split(`:`);\r\n\tconst jumpCnt = Math.floor(Math.random() * jumpFrames.length);\r\n\treturn setIntVal(Number(jumpFrames[jumpCnt]) - 1);\r\n};\r\n\r\n/**\r\n * 背景・マスクモーションの表示（共通処理）\r\n * @param {object} _spriteData \r\n * @param {string} _name \r\n * @param {boolean} [_condition=true] \r\n */\r\nconst drawBaseSpriteData = (_spriteData, _name, _condition = true) => {\r\n\tconst baseSprite = document.getElementById(`${_name}Sprite${_spriteData.depth}`);\r\n\tif (_spriteData.command === ``) {\r\n\t\tif (_spriteData.depth === C_FLG_ALL) {\r\n\t\t\tfor (let j = 0; j <= g_scoreObj[`${_name}MaxDepth`]; j++) {\r\n\t\t\t\tdocument.getElementById(`${_name}Sprite${j}`).textContent = ``;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tbaseSprite.textContent = ``;\r\n\t\t}\r\n\t} else {\r\n\t\tif (_condition) {\r\n\t\t\tif (_spriteData.colorObjInfo !== undefined) {\r\n\t\t\t\tconst colorObjClass = _spriteData.colorObjClass?.split(`/`) ?? [];\r\n\t\t\t\tconst id = `${_name}${_spriteData.depth}${_spriteData.colorObjId}`;\r\n\t\t\t\t[`x`, `y`, `w`, `h`].forEach(val => _spriteData.colorObjInfo[val] = convertStrToVal(_spriteData.colorObjInfo[val]));\r\n\t\t\t\tbaseSprite.appendChild(\r\n\t\t\t\t\tcreateColorObject2(id, _spriteData.colorObjInfo, ...colorObjClass)\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\tbaseSprite.innerHTML = convertStrToVal(_spriteData.htmlText);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * 背景・マスクモーションの表示（タイトル・リザルト用）\r\n * @param {number} _frame \r\n * @param {string} _displayName title / result\r\n * @param {string} _depthName back / mask\r\n * @returns {number}\r\n */\r\nconst drawSpriteData = (_frame, _displayName, _depthName) => {\r\n\r\n\tconst spriteName = `${_depthName}${toCapitalize(_displayName)}`;\r\n\tconst tmpObjs = g_headerObj[`${spriteName}Data`][_frame];\r\n\r\n\tfor (let j = 0; j < tmpObjs.length; j++) {\r\n\t\tconst tmpObj = tmpObjs[j];\r\n\t\tdrawBaseSpriteData(tmpObj, spriteName, ![`[loop]`, `[jump]`].includes(tmpObj.command));\r\n\t\tif (tmpObj.command === `[loop]`) {\r\n\t\t\t// キーワード指定：ループ\r\n\t\t\t// 指定フレーム(class)へ移動する\r\n\t\t\tg_scoreObj[`${spriteName}LoopCount`]++;\r\n\t\t\treturn getSpriteJumpFrame(tmpObj.jumpFrame);\r\n\r\n\t\t} else if (tmpObj.command === `[jump]`) {\r\n\t\t\t// キーワード指定：フレームジャンプ\r\n\t\t\t// 指定回数以上のループ(maxLoop)があれば指定フレーム(jumpFrame)へ移動する\r\n\t\t\tif (g_scoreObj[`${spriteName}LoopCount`] >= Number(tmpObj.maxLoop)) {\r\n\t\t\t\tg_scoreObj[`${spriteName}LoopCount`] = 0;\r\n\t\t\t\treturn getSpriteJumpFrame(tmpObj.jumpFrame);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn _frame;\r\n};\r\n\r\n/**\r\n * 背景・マスクモーションの表示\r\n * @param {number} _frame \r\n * @param {string} _depthName \r\n */\r\nconst drawMainSpriteData = (_frame, _depthName) =>\r\n\tg_scoreObj[`${_depthName}Data`][_frame].forEach(tmpObj => drawBaseSpriteData(tmpObj, _depthName));\r\n\r\n/**\r\n * スタイル切替\r\n * @param {number} _frame \r\n * @param {string} _displayName\r\n * @returns {number}\r\n */\r\nconst drawStyleData = (_frame, _displayName) => {\r\n\tg_headerObj[`style${toCapitalize(_displayName)}Data`][_frame].forEach(tmpObj =>\r\n\t\tdocument.documentElement.style.setProperty(tmpObj.depth, tmpObj.styleData));\r\n\r\n\treturn _frame;\r\n};\r\n\r\nconst drawMainStyleData = (_frame) =>\r\n\tg_scoreObj.styleData[_frame].forEach(tmpObj =>\r\n\t\tdocument.documentElement.style.setProperty(tmpObj.depth, tmpObj.styleData));\r\n\r\n/**\r\n * タイトル・リザルトモーションの描画\r\n * @param {string} _displayName\r\n */\r\nconst drawTitleResultMotion = _displayName =>\r\n\tg_animationData.forEach(sprite => {\r\n\t\tconst spriteName = `${sprite}${toCapitalize(_displayName)}`;\r\n\t\tif (g_headerObj[`${spriteName}Data`][g_scoreObj[`${spriteName}FrameNum`]] !== undefined) {\r\n\t\t\tg_scoreObj[`${spriteName}FrameNum`] = g_animationFunc.draw[sprite](g_scoreObj[`${spriteName}FrameNum`], _displayName, sprite);\r\n\t\t}\r\n\t});\r\n\r\n/*-----------------------------------------------------------*/\r\n/* その他の共通設定                                           */\r\n/*-----------------------------------------------------------*/\r\n\r\n// WebAudioAPIでAudio要素風に再生するクラス\r\nclass AudioPlayer {\r\n\tconstructor() {\r\n\t\tthis._context = new AudioContext();\r\n\t\tthis._gain = this._context.createGain();\r\n\t\tthis._gain.connect(this._context.destination);\r\n\t\tthis._startTime = 0;\r\n\t\tthis._fadeinPosition = 0;\r\n\t\tthis._eventListeners = {};\r\n\t\tthis.playbackRate = 1;\r\n\t}\r\n\r\n\tasync init(_arrayBuffer) {\r\n\t\tthis._arrayBuffer = _arrayBuffer;\r\n\t\tawait this._context.decodeAudioData(this._arrayBuffer, _buffer => {\r\n\t\t\tthis._duration = _buffer.duration;\r\n\t\t\tthis._buffer = _buffer;\r\n\t\t});\r\n\t\tthis._eventListeners[`canplaythrough`]?.forEach(_listener => _listener());\r\n\t}\r\n\r\n\t/**\r\n\t * 再生処理\r\n\t * @param {number} _adjustmentTime\r\n\t * - 実際の再生開始時間は、scheduleLead + _adjustmentTime から開始される\r\n\t * - ただしゲーム内での経過時間計算は _adjustmentTime を基準に行う\r\n\t * - scheduleLead は安定した再生タイミングを確保するための内部マージン\r\n\t */\r\n\tplay(_adjustmentTime = 0) {\r\n\t\tthis._source = this._context.createBufferSource();\r\n\t\tthis._source.buffer = this._buffer;\r\n\t\tthis._source.playbackRate.value = this.playbackRate;\r\n\t\tthis._source.connect(this._gain);\r\n\r\n\t\t// 実際の予約時刻（内部スケジューリング用のマージンを含む）\r\n\t\tconst startAt = this._context.currentTime + g_scheduleLead + _adjustmentTime;\r\n\t\tthis._source.start(startAt, this._fadeinPosition);\r\n\r\n\t\t// ゲーム側の論理的開始時刻（g_scheduleLead を含めない）\r\n\t\tthis._startTime = this._context.currentTime + _adjustmentTime;\r\n\t}\r\n\r\n\tpause() {\r\n\t\tif (this._source) {\r\n\t\t\tthis._source.stop(0);\r\n\t\t}\r\n\t}\r\n\r\n\tclose() {\r\n\t\tif (this._context) {\r\n\t\t\tthis._context.close()?.catch(() => {/* ignore double-close */ });\r\n\t\t\tthis._buffer = null;\r\n\t\t}\r\n\t\tif (this._source) {\r\n\t\t\tthis._source.disconnect(this._gain);\r\n\t\t\tthis._source = null;\r\n\t\t}\r\n\t\tif (this._gain) {\r\n\t\t\tthis._gain.disconnect();\r\n\t\t\tthis._gain = null;\r\n\t\t}\r\n\t}\r\n\r\n\tget elapsedTime() {\r\n\t\treturn this._context.currentTime - this._startTime + this._fadeinPosition;\r\n\t}\r\n\r\n\tset currentTime(_currentTime) {\r\n\t\tthis._fadeinPosition = _currentTime;\r\n\t}\r\n\r\n\tget volume() {\r\n\t\treturn this._gain.gain.value;\r\n\t}\r\n\r\n\tset volume(_volume) {\r\n\t\tthis._gain.gain.value = _volume;\r\n\t}\r\n\r\n\tget duration() {\r\n\t\treturn this._duration;\r\n\t}\r\n\r\n\tget readyState() {\r\n\t\tif (this._duration) {\r\n\t\t\treturn 4;\r\n\t\t} else {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\r\n\taddEventListener(_type, _listener) {\r\n\t\tthis._eventListeners[_type]?.push(_listener) || (this._eventListeners[_type] = [_listener]);\r\n\t}\r\n\r\n\tremoveEventListener(_type, _listener) {\r\n\t\tif (this._eventListeners[_type] === undefined) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._eventListeners[_type] = this._eventListeners[_type].filter(_element => _element !== _listener);\r\n\t}\r\n\r\n\tload() { }\r\n\tdispatchEvent() { }\r\n}\r\n\r\n/**\r\n * クリップボードコピー関数\r\n * 入力値をクリップボードへコピーし、メッセージを表示\r\n * @param {string} _textVal 入力値\r\n * @param {string} _msg\r\n */\r\nconst copyTextToClipboard = async (_textVal, _msg) => {\r\n\ttry {\r\n\t\tawait navigator.clipboard.writeText(_textVal);\r\n\r\n\t} catch (error) {\r\n\t\t// http環境では navigator.clipboard が使えないため、従来の方法を実行\r\n\t\t// テキストエリアを用意し、値をセット\r\n\t\tconst copyFrom = document.createElement(`textarea`);\r\n\t\tcopyFrom.textContent = _textVal;\r\n\r\n\t\t// bodyタグの要素を取得\r\n\t\tconst bodyElm = document.getElementsByTagName(`body`)[0];\r\n\t\t// 子要素にテキストエリアを配置\r\n\t\tbodyElm.appendChild(copyFrom);\r\n\r\n\t\t// テキストエリアの値を選択し、コピーコマンド発行\r\n\t\tcopyFrom.select();\r\n\t\tdocument.execCommand(`copy`);\r\n\t\t// 追加テキストエリアを削除\r\n\t\tbodyElm.removeChild(copyFrom);\r\n\r\n\t} finally {\r\n\t\tmakeInfoWindow(_msg, `leftToRightFade`);\r\n\t}\r\n};\r\n\r\n/**\r\n * ローディング文字用ラベルの作成\r\n * @returns {HTMLDivElement}\r\n */\r\nconst getLoadingLabel = () => createDivCss2Label(`lblLoading`, g_lblNameObj.nowLoading, {\r\n\tx: 0, y: g_sHeight - 40, w: g_sWidth, h: g_limitObj.setLblHeight,\r\n\tsiz: g_limitObj.setLblSiz, align: C_ALIGN_RIGHT,\r\n});\r\n\r\n/**\r\n * フレーム数を時間表示へ変換\r\n * @param {number} _frame \r\n * @returns {string}\r\n */\r\nconst transFrameToTimer = _frame => {\r\n\tconst minutes = Math.floor(_frame / g_fps / 60);\r\n\tconst seconds = `${Math.floor((_frame / g_fps) % 60)}`.padStart(2, `0`);\r\n\treturn `${minutes}:${seconds}`;\r\n};\r\n\r\n/**\r\n * 疑似タイマー表記をフレーム数へ変換\r\n * |endFrame=1:35.20|\r\n * @param {string} _str \r\n * @returns {number|string}\r\n */\r\nconst transTimerToFrame = _str => {\r\n\tif (_str.indexOf(`:`) !== -1) {\r\n\t\tconst tmpTimes = _str.split(`:`);\r\n\t\tif (tmpTimes[1].indexOf(`.`) !== -1) {\r\n\t\t\tconst tmpSeconds = tmpTimes[1].split(`.`);\r\n\t\t\treturn g_fps * (Number(tmpTimes[0]) * 60 + Number(tmpSeconds[0])) + Number(tmpSeconds[1]);\r\n\t\t} else {\r\n\t\t\treturn g_fps * (Number(tmpTimes[0]) * 60 + Number(tmpTimes[1]));\r\n\t\t}\r\n\t}\r\n\treturn _str;\r\n};\r\n\r\n/*-----------------------------------------------------------*/\r\n/* Scene : INITIALIZE [peach] */\r\n/*-----------------------------------------------------------*/\r\n\r\nconst initialControl = async () => {\r\n\r\n\tconst stage = document.getElementById(`canvas-frame`);\r\n\tconst divRoot = createEmptySprite(stage, `divRoot`, g_windowObj.divRoot);\r\n\tg_workPath = validatePath(document.getElementById(`jsRootUrl`)?.value,\r\n\t\tnew URL(location.href).href.match(/(^.*\\/)/)[0]);\r\n\r\n\t// 背景の表示\r\n\tif (document.getElementById(`layer0`) !== null) {\r\n\t\tconst layer0 = document.getElementById(`layer0`);\r\n\t\tmakeBgCanvas(layer0.getContext(`2d`));\r\n\t} else {\r\n\t\tcreateEmptySprite(divRoot, `divBack`, g_windowObj.divBack);\r\n\t}\r\n\r\n\t// Now Loadingを表示\r\n\tdivRoot.appendChild(getLoadingLabel());\r\n\r\n\t// 譜面初期情報ロード許可フラグ\r\n\tg_canLoadDifInfoFlg = true;\r\n\r\n\t// 譜面データの読み込みオプション\r\n\tg_enableAmpersandSplit = setBoolVal(document.getElementById(`enableAmpersandSplit`)?.value, true);\r\n\tg_enableDecodeURI = setBoolVal(document.getElementById(`enableDecodeURI`)?.value);\r\n\r\n\t// 作品別ローカルストレージの読み込み\r\n\tloadLocalStorage();\r\n\r\n\t// 譜面データの読み込み(1ファイル目)\r\n\tawait loadChartFile(0);\r\n\r\n\t// 共通設定ファイルの指定\r\n\tlet tmpSettingType = g_rootObj.settingType ?? ``;\r\n\tif (g_remoteFlg && !tmpSettingType.includes(C_MRK_CURRENT_DIRECTORY)) {\r\n\t\ttmpSettingType = `${C_MRK_CURRENT_DIRECTORY}../js/${tmpSettingType}`;\r\n\t};\r\n\tlet [settingType, settingRoot] = getFilePath(tmpSettingType);\r\n\tif (settingType !== ``) {\r\n\t\tsettingType = `_${settingType}`;\r\n\t}\r\n\r\n\t// 共通設定ファイルの読込\r\n\tawait loadScript2(`${settingRoot}danoni_setting${settingType}.js?${g_randTime}`, false);\r\n\tloadLegacySettingFunc();\r\n\tdeleteDiv(divRoot, `lblLoading`);\r\n\r\n\t// クエリで譜面番号が指定されていればセット\r\n\tg_stateObj.scoreId = setIntVal(getQueryParamVal(`scoreId`));\r\n\r\n\t// 譜面ヘッダーの読込\r\n\tObject.assign(g_headerObj, preheaderConvert(g_rootObj));\r\n\r\n\t// CSSファイル内のbackgroundを取得するために再描画\r\n\tif (document.getElementById(`layer0`) === null) {\r\n\t\tdeleteDiv(divRoot, `divBack`);\r\n\t\tcreateEmptySprite(divRoot, `divBack`);\r\n\t} else if (!g_headerObj.defaultSkinFlg && !g_headerObj.customBackUse) {\r\n\t\tcreateEmptySprite(divRoot, `divBack`);\r\n\t}\r\n\r\n\t// CSSファイルの読み込み\r\n\tconst skinList = g_headerObj.jsData.filter(file => file[0].indexOf(`danoni_skin`) !== -1);\r\n\tawait loadMultipleFiles2(skinList, `css`);\r\n\r\n\t// JSファイルの読み込み\r\n\tawait loadMultipleFiles2(g_headerObj.jsData, `js`);\r\n\tloadLegacyCustomFunc();\r\n\r\n\t// 譜面ヘッダー、特殊キー情報の読込\r\n\tObject.assign(g_headerObj, headerConvert(g_rootObj));\r\n\tconst importKeysData = _data => {\r\n\t\tkeysConvert(dosConvert(_data));\r\n\t\tg_headerObj.undefinedKeyLists = g_headerObj.undefinedKeyLists.filter(key => g_keyObj[`${g_keyObj.defaultProp}${key}_0`] === undefined);\r\n\t};\r\n\tg_presetObj.keysDataLib.forEach(list => importKeysData(list));\r\n\tif (g_presetObj.keysData !== undefined) {\r\n\t\tg_presetObj.keysDataLocal.unshift(g_presetObj.keysData);\r\n\t}\r\n\tg_presetObj.keysDataLocal.forEach(list => importKeysData(list));\r\n\tg_headerObj.keyExtraList = keysConvert(g_rootObj, {\r\n\t\tkeyExtraList: makeDedupliArray(g_headerObj.undefinedKeyLists, g_rootObj.keyExtraList?.split(`,`)),\r\n\t});\r\n\r\n\t// デフォルトのカラー・シャッフルグループ設定を退避\r\n\tg_keycons.groups.forEach(type =>\r\n\t\tObject.keys(g_keyObj).filter(val => val.startsWith(type))\r\n\t\t\t.forEach(property => g_keyObj[`${property}d`] = structuredClone(g_keyObj[property])));\r\n\r\n\t// 自動横幅拡張設定\r\n\tif (g_headerObj.autoSpread) {\r\n\t\tg_sWidth = Math.max(g_sWidth, g_presetObj.autoMinWidth ?? g_keyObj.minWidth);\r\n\t\tg_headerObj.keyLists.forEach(key => {\r\n\t\t\tg_sWidth = Math.max(g_sWidth, g_keyObj[`minWidth${key}`] ?? g_keyObj.minWidthDefault);\r\n\r\n\t\t\t// 別キーモード有効時は、別キーモード毎の横幅を拡張対象へ追加\r\n\t\t\tif (g_headerObj.transKeyUse) {\r\n\t\t\t\tfor (let k = 1; hasVal(g_keyObj[`keyCtrl${key}_${k}`]); k++) {\r\n\t\t\t\t\tconst anotherKey = g_keyObj[`transKey${key}_${k}`] ?? ``;\r\n\t\t\t\t\tif (anotherKey !== ``) {\r\n\t\t\t\t\t\tg_sWidth = Math.max(g_sWidth, g_keyObj[`minWidth${anotherKey}`] ?? g_keyObj.minWidthDefault);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$id(`canvas-frame`).width = wUnit(g_sWidth);\r\n\t\t$id(`divRoot`).width = wUnit(g_sWidth);\r\n\t}\r\n\tif (g_headerObj.playingWidth === `default`) {\r\n\t\tg_headerObj.playingWidth = g_sWidth;\r\n\t}\r\n\r\n\t// 可変ウィンドウサイズを更新\r\n\tupdateWindowSiz();\r\n\r\n\t// キー数情報を初期化\r\n\tg_keyObj.currentKey = g_headerObj.keyLabels[g_stateObj.scoreId];\r\n\tg_keyObj.currentPtn = 0;\r\n\r\n\t// 画像ファイルの読み込み\r\n\tg_imgInitList.forEach(img => preloadFile(`image`, g_imgObj[img]));\r\n\r\n\t// その他の画像ファイルの読み込み\r\n\tg_headerObj.preloadImages.filter(image => hasVal(image)).forEach(preloadImage => {\r\n\r\n\t\t// Pattern A: |preloadImages=file.png|\r\n\t\t// Pattern B: |preloadImages=file*.png@10|  -> file01.png ~ file10.png\r\n\t\t// Pattern C: |preloadImages=file*.png@2-9| -> file2.png  ~ file9.png\r\n\t\t// Pattern D: |preloadImages=file*.png@003-018| -> file003.png  ~ file018.png\r\n\r\n\t\tconst tmpPreloadImages = preloadImage.split(`@`);\r\n\t\tif (tmpPreloadImages.length === 1) {\r\n\t\t\t// Pattern Aの場合\r\n\t\t\tpreloadFile(`image`, preloadImage);\r\n\t\t} else {\r\n\t\t\tconst termRoopCnts = tmpPreloadImages[1].split(`-`);\r\n\t\t\tlet startCnt = 1;\r\n\t\t\tlet lastCnt;\r\n\t\t\tlet paddingLen;\r\n\r\n\t\t\tif (termRoopCnts.length === 1) {\r\n\t\t\t\t// Pattern Bの場合\r\n\t\t\t\tlastCnt = setIntVal(tmpPreloadImages[1], 1);\r\n\t\t\t\tpaddingLen = String(setVal(tmpPreloadImages[1], 1)).length;\r\n\t\t\t} else {\r\n\t\t\t\t// Pattern C, Dの場合\r\n\t\t\t\tstartCnt = setIntVal(termRoopCnts[0], 1);\r\n\t\t\t\tlastCnt = setIntVal(termRoopCnts[1], 1);\r\n\t\t\t\tpaddingLen = String(setVal(termRoopCnts[1], 1)).length;\r\n\t\t\t}\r\n\t\t\tfor (let k = startCnt; k <= lastCnt; k++) {\r\n\t\t\t\tpreloadFile(`image`, tmpPreloadImages[0].replaceAll(`*`, String(k).padStart(paddingLen, `0`)));\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\t// ローカルファイル起動時に各種警告文を表示\r\n\tif (g_isFile) {\r\n\t\tmakeWarningWindow(g_msgInfoObj.W_0011);\r\n\t\tif (!listMatching(getMusicUrl(g_stateObj.scoreId), [`.js`, `.txt`], { suffix: `$` })) {\r\n\t\t\tif (g_userAgent.indexOf(`firefox`) !== -1) {\r\n\t\t\t\tmakeWarningWindow(g_msgInfoObj.W_0001);\r\n\t\t\t}\r\n\t\t\tmakeWarningWindow(g_msgInfoObj.W_0012);\r\n\t\t}\r\n\t}\r\n\r\n\tif (g_loadObj.main) {\r\n\r\n\t\t// 譜面分割、譜面番号固定かどうかをチェック\r\n\t\tg_stateObj.dosDivideFlg = setBoolVal(document.getElementById(`externalDosDivide`)?.value ?? getQueryParamVal(`dosDivide`));\r\n\t\tg_stateObj.scoreLockFlg = setBoolVal(document.getElementById(`externalDosLock`)?.value ?? getQueryParamVal(`dosLock`));\r\n\r\n\t\t// 非分割時は resetGaugeSetting が全難易度を一括構築するため、初回のみで十分\r\n\t\tconst loopCount = g_stateObj.dosDivideFlg ? g_headerObj.keyLabels.length : 1;\r\n\r\n\t\tfor (let j = 0; j < g_headerObj.keyLabels.length; j++) {\r\n\r\n\t\t\t// 譜面ファイルが分割されている場合、譜面詳細情報取得のために譜面をロード\r\n\t\t\tif (g_stateObj.dosDivideFlg) {\r\n\t\t\t\tawait loadChartFile(j);\r\n\t\t\t\tresetColorSetting(j);\r\n\t\t\t}\r\n\t\t\tgetScoreDetailData(j);\r\n\t\t\tif (j < loopCount) {\r\n\t\t\t\t// 分割時は各譜面ごとに上書き・補完、非分割時は初回のみ実行\r\n\t\t\t\tresetGaugeSetting(j);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tg_customJsObj.preTitle.forEach(func => func());\r\n\tconst queryMusicId = getQueryParamVal(`musicId`);\r\n\tg_settings.musicIdxNum = queryMusicId !== null ? Number(queryMusicId) :\r\n\t\tg_headerObj.musicGroups?.[g_headerObj.musicNos[g_stateObj.scoreId]] ??\r\n\t\tg_headerObj.musicNos[g_stateObj.scoreId] ?? g_headerObj.musicNos[0];\r\n\ttitleInit(true);\r\n\r\n\t// 未使用のg_keyObjプロパティを削除\r\n\tconst keyProp = g_keyCopyLists.simple.concat(g_keyCopyLists.multiple, `keyCtrl`, `keyName`, `minWidth`, `ptchara`);\r\n\tconst delKeyPropList = [`ptchara7`, `dfPtnNum`, `minKeyCtrlNum`, `minPatterns`];\r\n\tObject.keys(g_keyObj).forEach(key => {\r\n\t\tconst type = keyProp.find(prop => key.startsWith(prop)) || ``;\r\n\t\tif (type !== ``) {\r\n\t\t\tconst keyName = String(key.split(`_`)[0].slice(type.length));\r\n\t\t\tif (!g_headerObj.keyLists.includes(keyName) && keyName !== `` && keyName !== `Default`) {\r\n\t\t\t\tdelete g_keyObj[key];\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (key.match(/^chara7_[a-z]/) || delKeyPropList.includes(key) || g_keyObj[key] === undefined) {\r\n\t\t\tdelete g_keyObj[key];\r\n\t\t}\r\n\t});\r\n\r\n\tg_stateObj.keyInitial = true;\r\n\r\n\t// エディター用のフォーマッター作成\r\n\tconst customKeyList = g_headerObj.keyLists.filter(val =>\r\n\t\tg_keyObj.defaultKeyList.findIndex(key => key === val) < 0);\r\n\r\n\tif (customKeyList.length === 0) {\r\n\t\tg_settings.preconditions = g_settings.preconditions.filter(val => !val.includes(`g_editorTmp`));\r\n\t}\r\n\r\n\tconst addNewOrderGroup = (_orgList, _sortRule) => {\r\n\t\t// インデックスを保持した配列を作成、ルールに従ってソート\r\n\t\tconst indexedList = _orgList.map((value, idx) => ({ value, idx }));\r\n\t\tconst sortedList = [...indexedList].sort(_sortRule);\r\n\t\t// ソート後の配列のインデックスに基づいて、元のインデックスを取得\r\n\t\tconst newIdxs = sortedList.map(({ idx }) => indexedList.findIndex(({ idx: originalIdx }) => originalIdx === idx));\r\n\t\treturn !newIdxs.every((val, j) => val === j) ? newIdxs : undefined;\r\n\t};\r\n\r\n\tcustomKeyList.forEach(key => {\r\n\t\tconst keyBase = `${key}_0`;\r\n\t\tconst keyCtrlPtn = `${g_keyObj.defaultProp}${keyBase}`;\r\n\t\tconst keyGroup = g_keyObj[`keyGroup${keyBase}`];\r\n\t\tconst keyGroupList = makeDedupliArray(keyGroup.flat());\r\n\t\tconst orgKeyNum = g_keyObj[keyCtrlPtn].length;\r\n\t\tconst baseX = Math.floor(Math.random() * (100 - keyGroupList.length));\r\n\r\n\t\tconst divPos = g_keyObj[`div${keyBase}`];\r\n\t\tconst divMaxPos = g_keyObj[`divMax${keyBase}`] ?? Math.max(...g_keyObj[`pos${keyBase}`]) + 1;\r\n\t\tconst stdPos = Math.max(divPos, divMaxPos - divPos);\r\n\t\tconst [deltaXAbove, deltaXBelow] = [(divPos - stdPos) / 2, (divMaxPos - divPos - stdPos) / 2];\r\n\r\n\t\tkeyGroupList.forEach((keyGroupNo, j) => {\r\n\t\t\tconst keyN = keyGroupNo === `0` ? key : `${key}_${j + 1}`;\r\n\t\t\tconst filterCond = (r) => keyGroup[r].findIndex(val => val === keyGroupNo) >= 0;\r\n\t\t\tconst keyCtrlList = g_keyObj[keyCtrlPtn].filter((val, r) => filterCond(r));\r\n\t\t\tconst charaList = g_keyObj[`chara${keyBase}`].filter((val, r) => filterCond(r));\r\n\t\t\tconst colorList = g_keyObj[`color${keyBase}_0`].filter((val, r) => filterCond(r));\r\n\t\t\tconst stepRtnList = g_keyObj[`stepRtn${keyBase}_0`].filter((val, r) => filterCond(r));\r\n\t\t\tconst keyNum = g_keyObj[keyCtrlPtn].filter((val, r) => filterCond(r)).length;\r\n\r\n\t\t\t// ---- Dancing☆Onigiri (CW Edition対応)のフォーマット\r\n\t\t\tg_editorTmp[keyN] = {};\r\n\t\t\tg_editorTmp[keyN].id = orgKeyNum * 100 + baseX + j;\r\n\t\t\tg_editorTmp[keyN].num = keyNum;\r\n\t\t\tg_editorTmp[keyN].chars = keyCtrlList.map(val => g_kCd[val[0]]);\r\n\t\t\tg_editorTmp[keyN].keys = keyCtrlList.map(val => g_kCdN[val[0]]).map(val => replaceStr(val, g_escapeStr.editorKey));\r\n\t\t\tg_editorTmp[keyN].alternativeKeys = keyCtrlList.map(val => val[1] === 0 ? `` : g_kCdN[val[1]]).map(val => replaceStr(val, g_escapeStr.editorKey));\r\n\t\t\tg_editorTmp[keyN].noteNames = charaList.map(val => `${val}_data`);\r\n\t\t\tg_editorTmp[keyN].freezeNames = charaList.map(val => {\r\n\t\t\t\tlet frzName = replaceStr(val, g_escapeStr.frzName);\r\n\t\t\t\tif (frzName.indexOf(`frz`) === -1 && frzName.indexOf(`foni`) === -1) {\r\n\t\t\t\t\tfrzName = frzName.replaceAll(frzName, `frz${toCapitalize(frzName)}`);\r\n\t\t\t\t}\r\n\t\t\t\treturn `${frzName}_data`;\r\n\t\t\t});\r\n\t\t\tg_editorTmp[keyN].colorGroup = colorList.map(val => val % 3);\r\n\r\n\t\t\t// orderGroupsのカスタマイズ\r\n\t\t\tif (divMaxPos > divPos) {\r\n\r\n\t\t\t\t// posXの実際の相対位置を計算\r\n\t\t\t\tconst orgPosList = g_keyObj[`pos${keyBase}`].filter((val, r) => filterCond(r));\r\n\t\t\t\tconst posList = orgPosList.map(val => val < divPos ? val - deltaXAbove : val - divPos - deltaXBelow);\r\n\r\n\t\t\t\tg_editorTmp[keyN].orderGroups = [];\r\n\r\n\t\t\t\t// パターン1: 上下グループ分けして各グループ内で位置順にソート（上下反転）\r\n\t\t\t\tconst upDownIdxs = addNewOrderGroup(orgPosList, (a, b) => {\r\n\t\t\t\t\tconst aAbove = a.value < divPos;\r\n\t\t\t\t\tconst bAbove = b.value < divPos;\r\n\t\t\t\t\tif (aAbove !== bAbove) return Number(aAbove) - Number(bAbove);\r\n\t\t\t\t\treturn a.value - b.value;\r\n\t\t\t\t});\r\n\t\t\t\tif (upDownIdxs !== undefined) {\r\n\t\t\t\t\tg_editorTmp[keyN].orderGroups.push(upDownIdxs);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// パターン2: 単純にステップゾーンのX座標が小さい順にソート\r\n\t\t\t\tconst sortedIdxs = addNewOrderGroup(posList, (a, b) => a.value - b.value);\r\n\t\t\t\tif (sortedIdxs !== undefined) {\r\n\t\t\t\t\tg_editorTmp[keyN].orderGroups.push(sortedIdxs);\r\n\t\t\t\t}\r\n\t\t\t\tif (g_editorTmp[keyN].orderGroups.length === 0) {\r\n\t\t\t\t\tdelete g_editorTmp[keyN].orderGroups;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// ---- ダンおに譜面作成エディタ ver3フォーマット\r\n\r\n\t\t\t// 既存のシャッフルグループからミラー配列を自動生成\r\n\t\t\tlet k = 0, n = 0, convTxt = ``;\r\n\t\t\tlet prevMirrorList = [];\r\n\t\t\twhile (g_keyObj[`shuffle${keyBase}_${k}`] !== undefined) {\r\n\r\n\t\t\t\tconst orgTmpList = []\r\n\t\t\t\tconst mirrorTmpList = [];\r\n\t\t\t\tconst mirrorList = [];\r\n\t\t\t\tg_keyObj[`shuffle${keyBase}_${k}`].filter((val, m) => filterCond(m))\r\n\t\t\t\t\t.forEach((_val, _i) => orgTmpList[_val]?.push(_i) || (orgTmpList[_val] = [_i]));\r\n\t\t\t\torgTmpList.forEach((list, idx) => mirrorTmpList[idx] = list.toReversed());\r\n\t\t\t\torgTmpList?.forEach((list, a) => list?.forEach((val, b) => mirrorList[orgTmpList[a][b]] = mirrorTmpList[a][b]));\r\n\t\t\t\tif (!mirrorList.every((val, p) => val === prevMirrorList[p])) {\r\n\t\t\t\t\tconvTxt += `\\$conv${n + 1}=Mirror${n + 1},${mirrorList.join(',')}<br>`;\r\n\t\t\t\t\tprevMirrorList = mirrorList.concat();\r\n\t\t\t\t\tn++;\r\n\t\t\t\t}\r\n\t\t\t\tk++;\r\n\t\t\t}\r\n\r\n\t\t\t// 矢印・フリーズアローのヘッダー情報を定義\r\n\t\t\tconst noteTxt = g_editorTmp[keyN].noteNames.map((val, r) =>\r\n\t\t\t\t`|${val.slice(0, -(`_data`.length))}[i]_data=[a${String(r).padStart(2, `0`)}]|[E]<br>`).join(``);\r\n\r\n\t\t\tconst freezeTxt = g_editorTmp[keyN].freezeNames.map((val, r) =>\r\n\t\t\t\t`|${val.slice(0, -(`_data`.length))}[i]_data=[f${String(r).padStart(2, `0`)}]|[E]<br>`).join(``);\r\n\r\n\t\t\tg_editorTmp2 += g_editorTmp2Template\r\n\t\t\t\t.replace(`[__KEY__]`, keyN)\r\n\t\t\t\t.replace(`[__MAP__]`, colorList.map(val => val < 3 ? (val + 1) % 3 : val % 7).join(','))\r\n\t\t\t\t.replace(`[__POS__]`, fillArray(keyNum).map((val, r) =>\r\n\t\t\t\t\tisNaN(parseFloat(stepRtnList[r])) ? 28 : 24).join(`,`))\r\n\t\t\t\t.replace(`[__TXT__]`, g_editorTmp[keyN].chars.map(val => val.replace(`, `, ``)).join(`,`))\r\n\t\t\t\t.replace(`[__CONV__]`, convTxt)\r\n\t\t\t\t.replace(`[__NOTE__]`, noteTxt)\r\n\t\t\t\t.replace(`[__FREEZE__]`, freezeTxt)\r\n\t\t\t\t.replaceAll(`\\n`, ``);\r\n\t\t});\r\n\t});\r\n};\r\n\r\n/**\r\n * 作品別ローカルストレージの読み込み・初期設定\r\n * @param {string} _musicId 楽曲ID\r\n */\r\nconst loadLocalStorage = (_musicId = ``) => {\r\n\r\n\t// 作品別ローカルストレージのキー(URL)取得のため、\r\n\t// scoreId, h, debug, musicIdを削除\r\n\t// 選択中の楽曲ID(_musicId)がある場合は、キーとして区別するため追加\r\n\tconst url = new URL(location.href);\r\n\turl.searchParams.delete(`scoreId`);\r\n\turl.searchParams.delete(`h`);\r\n\turl.searchParams.delete(`debug`);\r\n\turl.searchParams.delete(`musicId`);\r\n\tg_localStorageUrl = url.toString();\r\n\r\n\t// リザルト表示用のURL組み立てのため、_musicIdのないURLを保存\r\n\tg_localStorageUrlOrg = g_localStorageUrl;\r\n\r\n\tif (_musicId !== ``) {\r\n\t\turl.searchParams.append(`musicId`, _musicId);\r\n\t\tg_localStorageUrl = url.toString();\r\n\t\tif (g_langStorage.safeMode === C_FLG_ON) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * ローカルストレージの初期値設定\r\n\t * @param {string} _name \r\n\t * @param {string} _type \r\n\t * @param {number} _defaultPos \r\n\t */\r\n\tconst checkLocalParam = (_name, _type = C_TYP_STRING, _defaultPos = 0) => {\r\n\t\tconst defaultVal = g_settings[`${_name}s`][_defaultPos];\r\n\t\tif (g_localStorage[_name] !== undefined) {\r\n\t\t\tg_stateObj[_name] = setVal(g_localStorage[_name], defaultVal, _type);\r\n\t\t\tg_settings[`${_name}Num`] = roundZero(g_settings[`${_name}s`].findIndex(val => val === g_stateObj[_name]), defaultVal);\r\n\t\t} else {\r\n\t\t\tg_localStorage[_name] = defaultVal;\r\n\t\t}\r\n\t};\r\n\r\n\t// ロケールの読込、警告メッセージの入替\r\n\tg_langStorage = parseStorageData(`danoni-locale`);\r\n\tif (g_langStorage.locale !== undefined) {\r\n\t\tg_localeObj.val = g_langStorage.locale;\r\n\t\tg_localeObj.num = g_localeObj.list.findIndex(val => val === g_localeObj.val);\r\n\t}\r\n\tif (g_langStorage.safeMode === undefined) {\r\n\t\tg_langStorage.safeMode = C_FLG_OFF;\r\n\t}\r\n\tif (g_langStorage.bgmVolume === undefined) {\r\n\t\tg_langStorage.bgmVolume = 50;\r\n\t}\r\n\tg_stateObj.bgmVolume = g_langStorage.bgmVolume;\r\n\tg_settings.bgmVolumeNum = g_settings.volumes.findIndex(val => val === g_stateObj.bgmVolume);\r\n\tObject.assign(g_msgInfoObj, g_lang_msgInfoObj[g_localeObj.val]);\r\n\tObject.assign(g_kCd, g_lang_kCd[g_localeObj.val]);\r\n\r\n\t// 作品別ローカルストレージの読込\r\n\tif (g_langStorage.safeMode === C_FLG_OFF) {\r\n\t\tg_localStorage = parseStorageData(g_localStorageUrl, {\r\n\t\t\tadjustment: 0, hitPosition: 0, volume: 100, highscores: {},\r\n\t\t});\r\n\t} else {\r\n\t\tg_localStorage = {};\r\n\t\tg_stateObj.dataSaveFlg = false;\r\n\t\tmakeWarningWindow(g_msgInfoObj.W_0031);\r\n\t}\r\n\r\n\t// Adjustment, Volume, Appearance, Opacity, HitPosition初期値設定\r\n\tcheckLocalParam(`adjustment`, C_TYP_FLOAT, g_settings.adjustmentNum);\r\n\tcheckLocalParam(`volume`, C_TYP_NUMBER, g_settings.volumes.length - 1);\r\n\tcheckLocalParam(`appearance`);\r\n\tcheckLocalParam(`opacity`, C_TYP_NUMBER, g_settings.opacitys.length - 1);\r\n\tcheckLocalParam(`hitPosition`, C_TYP_FLOAT, g_settings.hitPositionNum);\r\n\r\n\t// ハイスコア取得準備\r\n\tif (g_localStorage.highscores === undefined) {\r\n\t\tg_localStorage.highscores = {};\r\n\t}\r\n\r\n\t// 廃棄済みリストからデータを消去\r\n\tg_storeSettingsEx.filter(val => g_localStorage[val] !== undefined)\r\n\t\t.forEach(val => delete g_localStorage[val]);\r\n};\r\n\r\n/**\r\n * 譜面データを分割して値を取得\r\n * @param {string} _dos 譜面データ\r\n * @returns \r\n */\r\nconst dosConvert = (_dos = ``) => {\r\n\r\n\tconst obj = {};\r\n\tconst paramsTmp = g_enableAmpersandSplit ? _dos.split(`&`).join(`|`) : _dos;\r\n\tparamsTmp.split(`|`).filter(param => param.indexOf(`=`) > 0).forEach(param => {\r\n\t\tconst pos = param.indexOf(`=`);\r\n\t\tconst pKey = param.substring(0, pos);\r\n\t\tconst pValue = param.substring(pos + 1);\r\n\r\n\t\tif (pKey !== undefined) {\r\n\t\t\tobj[pKey] = g_enableDecodeURI ? decodeURIComponent(pValue) : pValue;\r\n\t\t}\r\n\t});\r\n\treturn obj;\r\n};\r\n\r\n/**\r\n * 譜面読込\r\n * @param {number} _scoreId 譜面番号\r\n */\r\nconst loadChartFile = async (_scoreId = g_stateObj.scoreId) => {\r\n\r\n\tconst dosInput = document.getElementById(`dos`);\r\n\tconst divRoot = document.getElementById(`divRoot`);\r\n\tconst queryDos = getQueryParamVal(`dos`) !== null ?\r\n\t\t`dos/${getQueryParamVal('dos')}.txt` : encodeURI(document.getElementById(`externalDos`)?.value ?? ``);\r\n\r\n\tif (dosInput === null && queryDos === ``) {\r\n\t\tmakeWarningWindow(g_msgInfoObj.E_0023);\r\n\t\tg_loadObj.main = false;\r\n\t\treturn;\r\n\t}\r\n\r\n\t// 譜面分割あり、譜面番号固定時のみ譜面データを一時クリア\r\n\tif (queryDos !== `` && g_stateObj.dosDivideFlg && g_stateObj.scoreLockFlg) {\r\n\t\tObject.keys(g_rootObj).filter(data => fuzzyListMatching(data, g_checkStr.resetDosHeader, g_checkStr.resetDosFooter))\r\n\t\t\t.forEach(scoredata => g_rootObj[scoredata] = ``);\r\n\t}\r\n\r\n\t// HTML埋め込みdos\r\n\tif (dosInput !== null && _scoreId === 0) {\r\n\t\tObject.assign(g_rootObj, dosConvert(dosInput.value));\r\n\t}\r\n\r\n\t// 外部dos読み込み\r\n\tif (queryDos !== ``) {\r\n\t\tconst charset = document.getElementById(`externalDosCharset`)?.value ?? document.characterSet;\r\n\t\tconst fileBase = queryDos.match(/.+\\..*/)[0];\r\n\t\tconst fileExtension = fileBase.split(`.`).pop();\r\n\t\tconst fileCommon = fileBase.split(`.${fileExtension}`)[0];\r\n\t\tconst filename = `${fileCommon}${g_stateObj.dosDivideFlg ?\r\n\t\t\tsetDosIdHeader(_scoreId, g_stateObj.scoreLockFlg) : ''}.${fileExtension}`;\r\n\r\n\t\tawait loadScript2(`${filename}?${Date.now()}`, false, charset);\r\n\t\tif (typeof externalDosInit === C_TYP_FUNCTION) {\r\n\t\t\tdeleteDiv(divRoot, `lblLoading`);\r\n\r\n\t\t\t// 外部データを読込（ファイルが見つからなかった場合は譜面追記をスキップ）\r\n\t\t\texternalDosInit();\r\n\t\t\tif (g_loadObj[filename]) {\r\n\t\t\t\tObject.assign(g_rootObj, dosConvert(g_externalDos));\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\tmakeWarningWindow(g_msgInfoObj.E_0022);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * 譜面をファイルで分割している場合に初期色を追加取得\r\n * @param {string} _scoreId \r\n */\r\nconst resetColorSetting = _scoreId => {\r\n\t// 初期矢印・フリーズアロー色の再定義\r\n\tif (g_stateObj.scoreLockFlg) {\r\n\t\tObject.assign(g_rootObj, copySetColor(g_rootObj, _scoreId));\r\n\r\n\t\t// 分割先のファイルで初期色が未定義の場合はデフォルト値を適用\r\n\t\t[``, `Shadow`].forEach(pattern =>\r\n\t\t\t[`set`, `frz`].forEach(arrow => {\r\n\t\t\t\t// frzShadowColorStrのみ、空で構成された初期配列があるためその条件を追加して除外条件とする\r\n\t\t\t\tif (!hasVal(g_rootObj[`${arrow}${pattern}Color${_scoreId + 1}`])\r\n\t\t\t\t\t&& g_headerObj[`${arrow}${pattern}ColorStr`]?.flat()?.some(val => hasVal(val))) {\r\n\t\t\t\t\tg_rootObj[`${arrow}${pattern}Color`] = g_headerObj[`${arrow}${pattern}ColorStr`].join(`,`);\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\tObject.assign(g_headerObj, resetBaseColorList(g_headerObj, g_rootObj, { scoreId: _scoreId, scoreLockFlg: false }));\r\n};\r\n\r\n/**\r\n * 譜面をファイルで分割している場合にゲージ情報を追加取得\r\n * @param {string} _scoreId \r\n */\r\nconst resetGaugeSetting = _scoreId => {\r\n\t// ライフ設定のカスタム部分再取得（譜面ヘッダー加味）\r\n\tObject.assign(g_gaugeOptionObj, resetCustomGauge(g_rootObj, { scoreId: _scoreId }));\r\n\tObject.keys(g_gaugeOptionObj.customFulls).forEach(gaugePtn => getGaugeSetting(g_rootObj, gaugePtn, g_headerObj.difLabels.length, { scoreId: _scoreId }));\r\n};\r\n\r\n/**\r\n * 譜面番号固定かつ譜面ファイル分割時に初期色情報を他譜面へコピー\r\n * @param {object} _baseObj \r\n * @param {number} _scoreId\r\n * @returns \r\n */\r\nconst copySetColor = (_baseObj, _scoreId) => {\r\n\tconst obj = {};\r\n\t// Todo: dosIdを引数にして、dosIdと一致するscoreIdを算出\r\n\t//       算出したscoreIdすべてに対して下記処理を実行\r\n\tconst srcIdHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg, true);\r\n\tconst targetIdHeader = setScoreIdHeader(_scoreId, false, true);\r\n\t[``, `Shadow`].forEach(pattern =>\r\n\t\t[`set`, `frz`].filter(arrow => hasVal(_baseObj[`${arrow}${pattern}Color${srcIdHeader}`] || _baseObj[`${arrow}${pattern}Color`]))\r\n\t\t\t.forEach(arrow => obj[`${arrow}${pattern}Color${targetIdHeader}`] =\r\n\t\t\t\t_baseObj[`${arrow}${pattern}Color${srcIdHeader}`] || _baseObj[`${arrow}${pattern}Color`]));\r\n\treturn obj;\r\n};\r\n\r\n/**\r\n * MusicUrlの基本情報を取得\r\n * @param {number} _scoreId\r\n * @returns {string}\r\n */\r\nconst getMusicUrl = _scoreId =>\r\n\tg_headerObj.musicUrls?.[g_headerObj.musicNos[_scoreId]] ?? g_headerObj.musicUrls?.[0] ?? `nosound.mp3`;\r\n\r\n/**\r\n * 音源データの実際のパスを取得\r\n * @param {string} _musicUrl \r\n * @returns {string}\r\n */\r\nconst getFullMusicUrl = (_musicUrl = ``) => {\r\n\tlet baseMusicUrl = _musicUrl;\r\n\tlet baseDir = `../${g_headerObj.musicFolder}/`;\r\n\r\n\tif (_musicUrl.includes(C_MRK_CURRENT_DIRECTORY)) {\r\n\t\t// musicUrl, musicFolder両方にカレントパス指定がある場合は、musicUrlの値を優先\r\n\r\n\t} else if (g_headerObj.musicFolder.includes(C_MRK_CURRENT_DIRECTORY)) {\r\n\t\t// musicFolderにカレントパス指定がある場合は、ファイル名にmusicFolderの値も含める\r\n\t\tbaseMusicUrl = `${g_headerObj.musicFolder}/${_musicUrl}`;\r\n\t}\r\n\tif (g_headerObj.musicFolder.includes(C_MRK_CURRENT_DIRECTORY)) {\r\n\t\t// musicFolderにカレントパス指定がある場合は、ディレクトリは指定しない\r\n\t\tbaseDir = ``;\r\n\t}\r\n\tconst [musicFile, musicPath] = getFilePath(baseMusicUrl, baseDir);\r\n\treturn `${musicPath}${musicFile}`;\r\n}\r\n\r\n/**\r\n * 譜面ファイル読込後処理（譜面詳細情報取得用）\r\n * @param {number} _scoreId \r\n */\r\nconst getScoreDetailData = _scoreId => {\r\n\tconst keyCtrlPtn = `${g_headerObj.keyLabels[_scoreId]}_0`;\r\n\tstoreBaseData(_scoreId, scoreConvert(g_rootObj, _scoreId, 0, ``, keyCtrlPtn, true), keyCtrlPtn);\r\n};\r\n\r\n/**\r\n * 譜面詳細データの格納\r\n * @param {number} _scoreId \r\n * @param {object} _scoreObj \r\n * @param {number} _keyCtrlPtn \r\n */\r\nconst storeBaseData = (_scoreId, _scoreObj, _keyCtrlPtn) => {\r\n\tconst lastFrame = getLastFrame(_scoreObj, _keyCtrlPtn) + 1;\r\n\tconst startFrame = getStartFrame(lastFrame, 0, _scoreId);\r\n\tconst firstArrowFrame = getFirstArrowFrame(_scoreObj, _keyCtrlPtn);\r\n\tconst playingFrame = lastFrame - firstArrowFrame;\r\n\tconst keyNum = g_keyObj[`${g_keyObj.defaultProp}${_keyCtrlPtn}`].length;\r\n\r\n\t// 譜面密度グラフ用のデータ作成\r\n\tconst noteCnt = { arrow: [], frz: [] };\r\n\tconst densityData = fillArray(g_limitObj.densityDivision);\r\n\tlet allData = 0;\r\n\r\n\tconst types = [`arrow`, `frz`];\r\n\tlet fullData = [];\r\n\tfor (let j = 0; j < keyNum; j++) {\r\n\t\tnoteCnt.arrow[j] = 0;\r\n\t\tnoteCnt.frz[j] = 0;\r\n\r\n\t\tconst tmpFrzData = _scoreObj.frzData[j].filter((data, k) => k % 2 === 0);\r\n\t\t[_scoreObj.arrowData[j], tmpFrzData].forEach((typeData, m) =>\r\n\t\t\ttypeData.forEach(note => {\r\n\t\t\t\tif (isNaN(parseFloat(note))) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tconst point = Math.floor((note - firstArrowFrame) / playingFrame * g_limitObj.densityDivision);\r\n\t\t\t\tif (point >= 0) {\r\n\t\t\t\t\tdensityData[point]++;\r\n\t\t\t\t\tnoteCnt[types[m]][j]++;\r\n\t\t\t\t\tallData++;\r\n\t\t\t\t}\r\n\t\t\t}));\r\n\t\tfullData = fullData.concat(..._scoreObj.arrowData[j], ...tmpFrzData);\r\n\t}\r\n\r\n\tfullData = fullData.filter(val => !isNaN(parseFloat(val))).sort((a, b) => a - b);\r\n\tlet pushCnt = 1;\r\n\tconst density2PushData = fillArray(g_limitObj.densityDivision);\r\n\tconst density3PushData = fillArray(g_limitObj.densityDivision);\r\n\tfullData.forEach((note, j) => {\r\n\t\tif (fullData[j] === fullData[j + 1]) {\r\n\t\t\tpushCnt++;\r\n\t\t} else {\r\n\t\t\tconst point = Math.floor((note - firstArrowFrame) / playingFrame * g_limitObj.densityDivision);\r\n\t\t\tif (point >= 0) {\r\n\t\t\t\tif (pushCnt >= 2) {\r\n\t\t\t\t\tdensity2PushData[point] += pushCnt;\r\n\t\t\t\t\tif (pushCnt >= 3) {\r\n\t\t\t\t\t\tdensity3PushData[point] += pushCnt;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tpushCnt = 1;\r\n\t\t}\r\n\t});\r\n\r\n\tg_detailObj.toolDif[_scoreId] = calcLevel(_scoreObj);\r\n\tg_detailObj.speedData[_scoreId] = _scoreObj.speedData.concat();\r\n\tg_detailObj.boostData[_scoreId] = _scoreObj.boostData.concat();\r\n\r\n\tconst storeDensity = _densityData => {\r\n\t\tconst dataList = [];\r\n\t\tfor (let j = 0; j < g_limitObj.densityDivision; j++) {\r\n\t\t\tdataList.push(allData === 0 ? 0 : Math.round(_densityData[j] / allData * g_limitObj.densityDivision * 10000) / 100);\r\n\t\t}\r\n\t\treturn dataList;\r\n\t};\r\n\tconst diffArray = (_array1, _array2) => {\r\n\t\tconst list = [];\r\n\t\t_array1.forEach((val, j) => list.push(_array1[j] - _array2[j]));\r\n\t\treturn list;\r\n\t};\r\n\tg_detailObj.densityData[_scoreId] = storeDensity(densityData);\r\n\tg_detailObj.density2PushData[_scoreId] = storeDensity(density2PushData);\r\n\tg_detailObj.density3PushData[_scoreId] = storeDensity(density3PushData);\r\n\r\n\tg_detailObj.densityDiff[_scoreId] = diffArray(g_detailObj.densityData[_scoreId], g_detailObj.density2PushData[_scoreId]);\r\n\tg_detailObj.density2PushDiff[_scoreId] = diffArray(g_detailObj.density2PushData[_scoreId], g_detailObj.density3PushData[_scoreId]);\r\n\tg_detailObj.density3PushDiff[_scoreId] = g_detailObj.density3PushData[_scoreId].concat();\r\n\r\n\tg_detailObj.maxDensity[_scoreId] = getMaxValIdxs(densityData, g_limitObj.densityMaxVals).flat();\r\n\r\n\tg_detailObj.arrowCnt[_scoreId] = noteCnt.arrow.concat();\r\n\tg_detailObj.frzCnt[_scoreId] = noteCnt.frz.map((val, k) => _scoreObj.frzData[k].length % 2 === 0 ? val : val - 0.5);\r\n\tg_detailObj.startFrame[_scoreId] = startFrame;\r\n\tg_detailObj.playingFrame[_scoreId] = playingFrame;\r\n\tg_detailObj.playingFrameWithBlank[_scoreId] = lastFrame - startFrame;\r\n};\r\n\r\n/**\r\n * ツール計算\r\n * @param {object} _scoreObj \r\n * @param {number[][]} _scoreObj.arrowData 矢印データ\r\n * @param {number[][]} _scoreObj.frzData フリーズデータ\r\n * @returns {{tool: string, tate: number, douji: number, push3Cnt: number, push3: number[]}}\r\n */\r\nconst calcLevel = _scoreObj => {\r\n\t//--------------------------------------------------------------\r\n\t//＜フリーズデータ分解＞\r\n\t//  フリーズデータを分解し、矢印データに組み込む\r\n\t//\r\n\t//  (イメージ)\r\n\t//    &left_data=400,500,700&\r\n\t//    &frzLeft_data=550,650&\r\n\t//  ⇒\r\n\t//    left_data=[400,500,550,700];  // フリーズの始点を組込\r\n\t//    frzStartData=[550];\t// フリーズ始点\r\n\t//    frzEndData  =[650];\t// フリーズ終点\r\n\t//--------------------------------------------------------------\r\n\tconst frzStartData = [];\r\n\tconst frzEndData = [];\r\n\r\n\t_scoreObj.frzData.forEach((frzs, j) => {\r\n\t\tif (frzs.length > 1) {\r\n\t\t\tfor (let k = 0; k < frzs.length; k += 2) {\r\n\t\t\t\t_scoreObj.arrowData[j].push(frzs[k]);\r\n\t\t\t\tfrzStartData.push(frzs[k]);\r\n\t\t\t\tfrzEndData.push(frzs[k + 1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\t_scoreObj.arrowData[j] = _scoreObj.arrowData[j].sort((a, b) => a - b)\r\n\t\t\t.filter((x, i, self) => self.indexOf(x) === i && !isNaN(parseFloat(x)));\r\n\t})\r\n\r\n\tfrzStartData.sort((a, b) => a - b);\r\n\tfrzEndData.sort((a, b) => a - b);\r\n\r\n\t//--------------------------------------------------------------\r\n\t//＜データ結合･整理＞\r\n\t//  矢印データを連結してソートする。\r\n\t//\r\n\t//  重複は後の同時押し補正で使用する。\r\n\t//  後の同時押し補正の都合上、firstFrame-100, lastFrame+100 のデータを末尾に追加。\r\n\t//\r\n\t//  (イメージ)\r\n\t//    |left_data=300,400,550|\t// フリーズデータ(始点)を含む\r\n\t//    |down_data=500|\r\n\t//    |up_data=600|\r\n\t//    |right_data=700,800|\r\n\t//    |space_data=200,300,1000|\r\n\t//    frzEndData = [650];\t// フリーズデータ(終点) ※allScorebook対象外\r\n\t//  ⇒\r\n\t//    allScorebook = [100,200,300,300,400,500,550,600,700,800,1000,1100];\r\n\t//\r\n\t//--------------------------------------------------------------\r\n\tlet allScorebook = [];\r\n\t_scoreObj.arrowData.forEach(data => allScorebook = allScorebook.concat(data));\r\n\r\n\tallScorebook.sort((a, b) => a - b);\r\n\tallScorebook.unshift(allScorebook[0] - 100);\r\n\tallScorebook.push(allScorebook.at(-1) + 100);\r\n\tconst allCnt = allScorebook.length;\r\n\r\n\tfrzEndData.push(allScorebook.at(-1));\r\n\r\n\t//--------------------------------------------------------------\r\n\t//＜間隔フレーム数の調和平均計算+いろいろ補正＞\r\n\t//  レベル計算メイン。\r\n\t//\r\n\t//  [レベル計算ツール++ ver1.18] 3つ押し以上でも同時押し補正ができるよう調整\r\n\t//--------------------------------------------------------------\r\n\tlet levelcount = 0;   // 難易度レベル\r\n\tlet freezenum = 0; // フリーズアロー数\r\n\tlet pushCnt = 1;   // 同時押し数カウント\r\n\tlet twoPushCount = 0; // 同時押し補正値\r\n\tconst push3List = [];    // 3つ押し判定数\r\n\r\n\tfor (let i = 1; i < allCnt - 2; i++) {\r\n\t\t// フリーズ始点の検索\r\n\t\twhile (frzStartData[0] === allScorebook[i]) {\r\n\t\t\t// 同時押しの場合\r\n\t\t\tif (allScorebook[i] === allScorebook[i + 1]) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\t// 現フレームに存在するフリーズ数を1増やす\r\n\t\t\t// (フリーズアローの同時チェック開始)\r\n\t\t\tfrzStartData.shift();\r\n\t\t\tfreezenum++;\r\n\t\t}\r\n\r\n\t\t// フリーズ終点の検索\r\n\t\twhile (frzEndData[0] < allScorebook[i + 1]) {\r\n\t\t\t// 現フレームに存在するフリーズ数を1減らす\r\n\t\t\tfrzEndData.shift();\r\n\t\t\tfreezenum--;\r\n\t\t}\r\n\r\n\t\t// 同時押し補正処理(フリーズアローが絡まない場合)\r\n\t\tif (allScorebook[i + 1] === allScorebook[i] && !freezenum) {\r\n\r\n\t\t\tconst chk = (allScorebook[i + 2] - allScorebook[i + 1]) * (allScorebook[i] - allScorebook[i - pushCnt]);\r\n\t\t\tif (chk !== 0) {\r\n\t\t\t\ttwoPushCount += 40 / chk;\r\n\t\t\t} else {\r\n\t\t\t\t// 3つ押しが絡んだ場合は加算しない\r\n\t\t\t\tpush3List.push(allScorebook[i]);\r\n\t\t\t}\r\n\t\t\tpushCnt++;\r\n\r\n\t\t} else {\r\n\t\t\t// 単押し＋フリーズアローの補正処理(フリーズアロー中の矢印)\r\n\t\t\tpushCnt = 1;\r\n\t\t\tconst chk2 = (2 - freezenum) * (allScorebook[i + 1] - allScorebook[i]);\r\n\t\t\tif (chk2 > 0) {\r\n\t\t\t\tlevelcount += 2 / chk2;\r\n\t\t\t} else {\r\n\t\t\t\t// 3つ押しが絡んだ場合は加算しない\r\n\t\t\t\tpush3List.push(allScorebook[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tlevelcount += twoPushCount;\r\n\tconst leveltmp = levelcount;\r\n\r\n\t//--------------------------------------------------------------\r\n\t//＜同方向連打補正＞\r\n\t//  同方向矢印(フリーズアロー)の隣接間隔が10フレーム未満の場合に加算する。\r\n\t//--------------------------------------------------------------\r\n\t_scoreObj.arrowData.forEach(arrows =>\r\n\t\tarrows.forEach((val, k) => {\r\n\t\t\tif (arrows[k + 1] - arrows[k] < 10) {\r\n\t\t\t\tlevelcount += 10 / Math.pow(arrows[k + 1] - arrows[k], 2) - 1 / 10;\r\n\t\t\t}\r\n\t\t}));\r\n\r\n\t//--------------------------------------------------------------\r\n\t//＜表示＞\r\n\t//  曲長、3つ押し補正を行い、最終的な難易度レベル値を表示する。\r\n\t//--------------------------------------------------------------\r\n\tconst push3Cnt = push3List.length;\r\n\tconst calcArrowCnt = allCnt - push3Cnt - 3;\r\n\tconst toDecimal2 = num => Math.round(num * 100) / 100;\r\n\tconst calcDifLevel = num => calcArrowCnt > 0 ? toDecimal2(num / Math.sqrt(calcArrowCnt) * 4) : 0;\r\n\r\n\tconst baseDifLevel = calcDifLevel(levelcount);\r\n\tconst difLevel = toDecimal2(baseDifLevel * (allCnt - 3) / calcArrowCnt);\r\n\r\n\t//--------------------------------------------------------------\r\n\t//＜計算結果を格納＞\r\n\t//--------------------------------------------------------------\r\n\treturn {\r\n\t\t// 難易度レベル\r\n\t\ttool: (allCnt === 3 ? `0.01` : `${difLevel.toFixed(2)}${(push3Cnt > 0 ? \"*\" : \"\")}`),\r\n\t\t// 縦連打補正\r\n\t\ttate: toDecimal2(baseDifLevel - calcDifLevel(leveltmp)),\r\n\t\t// 同時押し補正\r\n\t\tdouji: calcDifLevel(twoPushCount),\r\n\t\t// 3つ押し数\r\n\t\tpush3cnt: push3Cnt,\r\n\t\t// 3つ押しリスト\r\n\t\tpush3: makeDedupliArray(push3List),\r\n\t};\r\n};\r\n\r\n/**\r\n * ロケールを含んだヘッダーの優先度設定\r\n * @param {object} _obj \r\n * @param {...any} [_params]\r\n * @returns {string}\r\n */\r\nconst getHeader = (_obj, ..._params) => {\r\n\tlet headerLocale, headerDf;\r\n\tObject.keys(_params).forEach(j => {\r\n\t\theaderLocale ??= _obj[`${_params[j]}${g_localeObj.val}`];\r\n\t\theaderDf ??= _obj[_params[j]];\r\n\t});\r\n\treturn headerLocale ?? headerDf;\r\n};\r\n\r\n/**\r\n * ヘッダー名の互換設定\r\n * @param {string} _param \r\n * @returns {string[]}\r\n */\r\nconst getHname = _param => [_param, _param.toLowerCase()];\r\n\r\n/**\r\n * 譜面ヘッダーの分解（スキン、jsファイルなどの設定）\r\n * @param {object} _dosObj\r\n * @returns {object}\r\n */\r\nconst preheaderConvert = _dosObj => {\r\n\r\n\t// ヘッダー群の格納先\r\n\tconst obj = {};\r\n\r\n\t// ウィンドウ位置の設定\r\n\tconst align = _dosObj.windowAlign ?? g_presetObj.windowAlign;\r\n\tif (align !== undefined) {\r\n\t\tg_windowAlign[align]();\r\n\t}\r\n\r\n\tobj.jsData = [];\r\n\tobj.stepRtnUse = true;\r\n\r\n\tconst setJsFiles = (_files, _defaultDir, _type = `custom`) =>\r\n\t\t_files.filter(file => hasVal(file)).forEach(file => {\r\n\t\t\tconst [jsFile, jsDir] = getFilePath(file, _defaultDir);\r\n\t\t\tobj.jsData.push([_type === `skin` ? `danoni_skin_${jsFile}.js` : jsFile, jsDir]);\r\n\t\t});\r\n\r\n\tconst convLocalPath = (_file, _type) =>\r\n\t\tg_remoteFlg && hasVal(_file) && !_file.includes(C_MRK_CURRENT_DIRECTORY) && !hasRemoteDomain(_file)\r\n\t\t\t? `${C_MRK_CURRENT_DIRECTORY}../${_type}/${_file}`\r\n\t\t\t: _file;\r\n\r\n\t// 外部スキンファイルの指定\r\n\tconst tmpSkinType = _dosObj.skinType ?? g_presetObj.skinType ?? `default`;\r\n\tconst tmpSkinTypes = tmpSkinType.split(`,`).map(file => {\r\n\r\n\t\t// スキンタイプを取得（ディレクトリパス、カレント指定(..)を除去）\r\n\t\tconst match = file.match(/.*\\/(.+)|\\(\\.\\.\\)([^/]+)|(.+)/);\r\n\t\tconst skinName = match[1] || match[2] || match[3];\r\n\r\n\t\t// デフォルトセット以外はリモート先のデータを使用しない\r\n\t\treturn g_defaultSets.skinType.findIndex(val => val === skinName) < 0 ?\r\n\t\t\tconvLocalPath(file, `skin`) : file;\r\n\t});\r\n\tobj.defaultSkinFlg = tmpSkinTypes.includes(`default`) && setBoolVal(_dosObj.bgCanvasUse ?? g_presetObj.bgCanvasUse, true);\r\n\tsetJsFiles(tmpSkinTypes, C_DIR_SKIN, `skin`);\r\n\r\n\t// 外部jsファイルの指定\r\n\tconst tmpCustomjs = getHeader(_dosObj, ...getHname(`customJs`)) ?? g_presetObj.customJs ?? C_JSF_CUSTOM;\r\n\tsetJsFiles(tmpCustomjs.replaceAll(`*`, g_presetObj.customJs).split(`,`)\r\n\t\t.map(file => convLocalPath(file, `js`)), C_DIR_JS);\r\n\r\n\t// 外部cssファイルの指定\r\n\tconst tmpCustomcss = getHeader(_dosObj, ...getHname(`customCss`)) ?? g_presetObj.customCss ?? ``;\r\n\tsetJsFiles(tmpCustomcss.replaceAll(`*`, g_presetObj.customCss).split(`,`)\r\n\t\t.map(file => convLocalPath(file, `css`)), C_DIR_CSS);\r\n\r\n\t// デフォルト曲名表示、背景、Ready表示の利用有無\r\n\tg_titleLists.init.forEach(objName => {\r\n\t\tconst objUpper = toCapitalize(objName);\r\n\t\tobj[`custom${objUpper}Use`] =\r\n\t\t\tsetBoolVal(_dosObj[`custom${objUpper}Use`] ?? g_presetObj.customDesignUse?.[objName]);\r\n\t});\r\n\r\n\t// 背景・マスクモーションのパス指定方法を他の設定に合わせる設定\r\n\tobj.syncBackPath = setBoolVal(_dosObj.syncBackPath ?? g_presetObj.syncBackPath);\r\n\r\n\treturn obj;\r\n};\r\n\r\n/**\r\n * 譜面ヘッダーの分解（その他の設定）\r\n * @param {object} _dosObj 譜面データオブジェクト\r\n * @returns {object}\r\n */\r\nconst headerConvert = _dosObj => {\r\n\r\n\t// ヘッダー群の格納先\r\n\tconst obj = {};\r\n\r\n\t// 自動プリロードの設定\r\n\tobj.autoPreload = setBoolVal(_dosObj.autoPreload, true);\r\n\tg_headerObj.autoPreload = obj.autoPreload;\r\n\r\n\t// デフォルトスタイルのバックアップ\r\n\tgetCssCustomProperties();\r\n\r\n\t// 初期で変更するカスタムプロパティを設定\r\n\tObject.keys(_dosObj).filter(val => val.startsWith(`--`) && hasVal(_dosObj[val])).forEach(prop => {\r\n\t\tg_cssBkProperties[prop] = getCssCustomProperty(prop, _dosObj[prop]);\r\n\t\tdocument.documentElement.style.setProperty(prop, g_cssBkProperties[prop]);\r\n\t});\r\n\r\n\t// フォントの設定\r\n\tobj.customFont = _dosObj.customFont ?? ``;\r\n\tg_headerObj.customFont = obj.customFont;\r\n\r\n\t// 画像ルートパス、拡張子の設定 (サーバ上のみ)\r\n\tobj.imgType = [];\r\n\tif (!g_isFile) {\r\n\t\tlet tmpImgTypes = [];\r\n\t\tif (hasVal(_dosObj.imgType)) {\r\n\t\t\ttmpImgTypes = splitLF2(_dosObj.imgType);\r\n\t\t} else if (g_presetObj.imageSets !== undefined) {\r\n\t\t\ttmpImgTypes = g_presetObj.imageSets.concat();\r\n\t\t}\r\n\t\ttmpImgTypes.forEach((tmpImgType, j) => {\r\n\t\t\tconst imgTypes = tmpImgType.split(`,`);\r\n\t\t\tobj.imgType[j] = {\r\n\t\t\t\tname: imgTypes[0],\r\n\t\t\t\textension: imgTypes[1] || `svg`,\r\n\t\t\t\trotateEnabled: setBoolVal(imgTypes[2], true),\r\n\t\t\t\tflatStepHeight: setVal(imgTypes[3], C_ARW_WIDTH, C_TYP_FLOAT),\r\n\t\t\t\tremoteDir: imgTypes[4] || ``,\r\n\t\t\t};\r\n\t\t\tg_keycons.imgTypes[j] = (imgTypes[0] === `` ? `Original` : imgTypes[0]);\r\n\t\t});\r\n\t}\r\n\r\n\t// 末尾にデフォルト画像セットが入るよう追加\r\n\tif (obj.imgType.findIndex(imgSets => imgSets.name === ``) === -1) {\r\n\t\tobj.imgType.push({ name: ``, extension: `svg`, rotateEnabled: true, flatStepHeight: C_ARW_WIDTH, remoteDir: `` });\r\n\t\tg_keycons.imgTypes.push(`Original`);\r\n\t}\r\n\tg_imgType = g_keycons.imgTypes[0];\r\n\tg_stateObj.rotateEnabled = obj.imgType[0].rotateEnabled;\r\n\tg_stateObj.flatStepHeight = obj.imgType[0].flatStepHeight;\r\n\r\n\tconst [titleArrowName, titleArrowRotate] = padArray(_dosObj.titleArrowName?.split(`:`), [`Original`, 180]);\r\n\tobj.titleArrowNo = roundZero(g_keycons.imgTypes.findIndex(imgType => imgType === titleArrowName));\r\n\tobj.titleArrowRotate = titleArrowRotate;\r\n\r\n\t// サーバ上の場合、画像セットを再読込（ローカルファイル時は読込済みのためスキップ）\r\n\tif (!g_isFile) {\r\n\t\tupdateImgType(obj.imgType[obj.titleArrowNo], true);\r\n\t\tupdateImgType(obj.imgType[0]);\r\n\t} else {\r\n\t\tg_imgObj.titleArrow = C_IMG_ARROW;\r\n\t}\r\n\r\n\t// ラベルテキスト、オンマウステキスト、確認メッセージ定義の上書き設定\r\n\tObject.assign(g_lblNameObj, g_lang_lblNameObj[g_localeObj.val], g_presetObj.lblName?.[g_localeObj.val]);\r\n\tObject.assign(g_msgObj, g_lang_msgObj[g_localeObj.val], g_presetObj.msg?.[g_localeObj.val]);\r\n\r\n\t// 自動横幅拡張設定\r\n\tobj.autoSpread = setBoolVal(_dosObj.autoSpread, g_presetObj.autoSpread ?? true);\r\n\r\n\t// 横幅設定\r\n\tif (hasVal(_dosObj.windowWidth)) {\r\n\t\tg_sWidth = Math.max(setIntVal(_dosObj.windowWidth, g_sWidth), g_sWidth);\r\n\t\t$id(`canvas-frame`).width = wUnit(g_sWidth);\r\n\t}\r\n\t// 高さ設定\r\n\tobj.heightVariable = getQueryParamVal(`h`) !== null && (_dosObj.heightVariable || g_presetObj.heightVariable || false);\r\n\tif (hasVal(_dosObj.windowHeight || g_presetObj.autoMinHeight) || obj.heightVariable) {\r\n\t\tg_sHeight = Math.max(setIntVal(_dosObj.windowHeight, g_presetObj.autoMinHeight ?? g_sHeight),\r\n\t\t\tsetIntVal(getQueryParamVal(`h`), g_sHeight), g_sHeight);\r\n\t\t$id(`canvas-frame`).height = wUnit(g_sHeight);\r\n\t}\r\n\tif (!(_dosObj.heightVariable || g_presetObj.heightVariable || false)) {\r\n\t\tobj.heightLockFlg = true;\r\n\t\tg_settings.playWindows = g_settings.playWindows.filter(val => !val.endsWith(`Slope`) && !val.endsWith(`SideScroll`));\r\n\t}\r\n\r\n\t// 曲名\r\n\tobj.musicTitles = [`musicName`];\r\n\tobj.musicTitlesForView = [[`musicName`]];\r\n\tobj.artistNames = [``];\r\n\tobj.artistUrls = [``];\r\n\tobj.bpms = [`----`];\r\n\tobj.musicNos = hasVal(_dosObj.musicNo)\r\n\t\t? splitLF2(_dosObj.musicNo).map(Number).map(val => isNaN(val) ? 0 : val)\r\n\t\t: fillArray(_dosObj.difData?.split(`$`).length ?? 1);\r\n\r\n\tconst dosMusicTitle = getHeader(_dosObj, `musicTitle`);\r\n\tlet alternativeTitle;\r\n\tif (hasVal(dosMusicTitle)) {\r\n\t\tconst musicData = splitLF2(dosMusicTitle);\r\n\r\n\t\tconst lastIdx = Math.max(...obj.musicNos, musicData.length - 1);\r\n\t\tfor (let j = 0; j <= lastIdx; j++) {\r\n\t\t\tconst tmpMusicData = musicData[j] ?? ``;\r\n\t\t\tconst musics = splitComma(tmpMusicData);\r\n\r\n\t\t\tobj.musicTitles[j] = hasVal(musics[0])\r\n\t\t\t\t? escapeHtml(getMusicNameSimple(musics[0]))\r\n\t\t\t\t: obj.musicTitles[0];\r\n\t\t\tobj.musicTitlesForView[j] = hasVal(musics[0])\r\n\t\t\t\t? escapeHtmlForArray(getMusicNameMultiLine(musics[0]))\r\n\t\t\t\t: obj.musicTitlesForView[0];\r\n\t\t\tobj.artistNames[j] = hasVal(musics[1])\r\n\t\t\t\t? escapeHtml(musics[1])\r\n\t\t\t\t: obj.artistNames[0];\r\n\t\t\tobj.artistUrls[j] = musics[2] || obj.artistUrls[0];\r\n\t\t\tobj.bpms[j] = musics[4] || obj.bpms[0];\r\n\r\n\t\t\t// 代替タイトル名\r\n\t\t\tif (j === 0 && hasVal(_dosObj.musicNo)) {\r\n\t\t\t\talternativeTitle = musics[3];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t} else {\r\n\t\tmakeWarningWindow(g_msgInfoObj.E_0012);\r\n\t}\r\n\r\n\t// 単一作品用の項目としての管理変数\r\n\tobj.musicTitle = obj.musicTitles[0];\r\n\tobj.musicTitleForView = obj.musicTitlesForView[0];\r\n\tobj.artistName = obj.artistNames[0];\r\n\tif (obj.artistName === ``) {\r\n\t\tmakeWarningWindow(g_msgInfoObj.E_0011);\r\n\t\tobj.artistName = `artistName`;\r\n\t}\r\n\tobj.artistUrl = obj.artistUrls[0];\r\n\r\n\t// 代替タイトル名は曲名定義の後に設定する（複数曲を束ねる名前であり、曲名ではないため）\r\n\tif (hasVal(alternativeTitle)) {\r\n\t\tobj.musicTitles[0] = escapeHtml(getMusicNameSimple(alternativeTitle));\r\n\t\tobj.musicTitlesForView[0] = escapeHtmlForArray(getMusicNameMultiLine(alternativeTitle));\r\n\t}\r\n\r\n\t// 選曲機能の利用有無\r\n\tobj.packageNames = (_dosObj.packageName || ``).split(`<br>`);\r\n\tobj.musicSelectUse = _dosObj.packageName !== undefined;\r\n\r\n\t// 最小・最大速度の設定\r\n\tobj.minSpeed = Math.round(setVal(_dosObj.minSpeed, C_MIN_SPEED, C_TYP_FLOAT) * 4) / 4;\r\n\tobj.maxSpeed = Math.round(setVal(_dosObj.maxSpeed, C_MAX_SPEED, C_TYP_FLOAT) * 4) / 4;\r\n\tif (obj.minSpeed > obj.maxSpeed || obj.minSpeed < 0.5 || obj.maxSpeed < 0.5) {\r\n\t\tobj.minSpeed = C_MIN_SPEED;\r\n\t\tobj.maxSpeed = C_MAX_SPEED;\r\n\t}\r\n\tg_settings.speeds = makeSpeedList(obj.minSpeed, obj.maxSpeed);\r\n\r\n\t// プレイ中のショートカットキー\r\n\tobj.keyRetry = setIntVal(getKeyCtrlVal(_dosObj.keyRetry), C_KEY_RETRY);\r\n\tobj.keyRetryDef = obj.keyRetry;\r\n\tobj.keyRetryDef2 = obj.keyRetry;\r\n\tobj.keyTitleBack = setIntVal(getKeyCtrlVal(_dosObj.keyTitleBack), C_KEY_TITLEBACK);\r\n\tobj.keyTitleBackDef = obj.keyTitleBack;\r\n\tobj.keyTitleBackDef2 = obj.keyTitleBack;\r\n\r\n\t// フリーズアローの許容フレーム数設定\r\n\tobj.frzAttempt = setIntVal(_dosObj.frzAttempt, C_FRM_FRZATTEMPT);\r\n\r\n\t// 製作者表示\r\n\tconst dosTuning = getHeader(_dosObj, `tuning`);\r\n\tobj.tuningNames = [];\r\n\tobj.tuningUrls = [];\r\n\tif (hasVal(dosTuning)) {\r\n\t\tsplitLF2(dosTuning).forEach(tuning => {\r\n\t\t\tconst tuningData = tuning.split(`,`);\r\n\t\t\tobj.tuningNames.push(escapeHtmlForEnabledTag(tuningData[0]));\r\n\t\t\tobj.tuningUrls.push(tuningData[1] ||\r\n\t\t\t\t(getHeader(g_presetObj, `tuning`) === tuningData[0] ? g_presetObj.tuningUrl : ``));\r\n\t\t});\r\n\t\tobj.tuning = obj.tuningNames[0];\r\n\t\tobj.creatorUrl = obj.tuningUrls[0] || g_presetObj.tuningUrl || ``;\r\n\t} else {\r\n\t\tobj.tuning = escapeHtmlForEnabledTag(getHeader(g_presetObj, `tuning`) ?? `name`);\r\n\t\tobj.creatorUrl = g_presetObj.tuningUrl ?? ``;\r\n\t}\r\n\tobj.tuningInit = obj.tuning;\r\n\r\n\tobj.dosNos = [];\r\n\tobj.scoreNos = [];\r\n\tif (hasVal(_dosObj.dosNo)) {\r\n\t\tsplitLF2(_dosObj.dosNo).map((val, j) => [obj.dosNos[j], obj.scoreNos[j]] = val.split(`,`));\r\n\t\tconst dosNoCnt = {};\r\n\t\tobj.dosNos.forEach((val, j) => {\r\n\t\t\tif (dosNoCnt[val] === undefined) {\r\n\t\t\t\tdosNoCnt[val] = 0;\r\n\t\t\t}\r\n\t\t\tif (obj.scoreNos[j] === undefined) {\r\n\t\t\t\tdosNoCnt[val]++;\r\n\t\t\t\tobj.scoreNos[j] = dosNoCnt[val];\r\n\t\t\t} else {\r\n\t\t\t\tdosNoCnt[val] = Number(obj.scoreNos[j]);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// 譜面情報\r\n\tif (hasVal(_dosObj.difData)) {\r\n\t\tconst difs = splitLF2(_dosObj.difData);\r\n\t\tconst difpos = {\r\n\t\t\tKey: 0, Name: 1, Speed: 2, Border: 3, Recovery: 4, Damage: 5, Init: 6,\r\n\t\t};\r\n\t\tobj.keyLabels = [];\r\n\t\tobj.difLabels = [];\r\n\t\tobj.initSpeeds = [];\r\n\t\tobj.lifeBorders = [];\r\n\t\tobj.lifeRecoverys = [];\r\n\t\tobj.lifeDamages = [];\r\n\t\tobj.lifeInits = [];\r\n\t\tobj.creatorNames = [];\r\n\t\tg_stateObj.scoreId = (g_stateObj.scoreId < difs.length ? g_stateObj.scoreId : 0);\r\n\r\n\t\tdifs.forEach(dif => {\r\n\t\t\tconst difDetails = dif.split(`,`);\r\n\t\t\tconst lifeData = (_type, _default) =>\r\n\t\t\t\tdifDetails[difpos[_type]] || g_presetObj.gauge?.[_type] || _default;\r\n\r\n\t\t\t// ライフ：ノルマ、回復量、ダメージ量、初期値の設定\r\n\t\t\tobj.lifeBorders.push(lifeData(`Border`, `x`));\r\n\t\t\tobj.lifeRecoverys.push(lifeData(`Recovery`, 6));\r\n\t\t\tobj.lifeDamages.push(lifeData(`Damage`, 40));\r\n\t\t\tobj.lifeInits.push(lifeData(`Init`, 25));\r\n\r\n\t\t\t// キー数\r\n\t\t\tconst keyLabel = difDetails[difpos.Key] || `7`;\r\n\t\t\tobj.keyLabels.push(g_keyObj.keyTransPattern[keyLabel] ?? keyLabel);\r\n\r\n\t\t\t// 譜面名、制作者名\r\n\t\t\tif (hasVal(difDetails[difpos.Name])) {\r\n\t\t\t\tconst difNameInfo = difDetails[difpos.Name].split(`::`);\r\n\t\t\t\tobj.difLabels.push(escapeHtml(difNameInfo[0] ?? `Normal`));\r\n\t\t\t\tobj.creatorNames.push(difNameInfo.length > 1 ? escapeHtml(difNameInfo[1]) : obj.tuning);\r\n\t\t\t} else {\r\n\t\t\t\tobj.difLabels.push(`Normal`);\r\n\t\t\t\tobj.creatorNames.push(obj.tuning);\r\n\t\t\t}\r\n\r\n\t\t\t// 初期速度\r\n\t\t\tobj.initSpeeds.push(setVal(difDetails[difpos.Speed], 3.5, C_TYP_FLOAT));\r\n\t\t});\r\n\t} else {\r\n\t\tmakeWarningWindow(g_msgInfoObj.E_0021);\r\n\t\tobj.keyLabels = [`7`];\r\n\t\tobj.difLabels = [`Normal`];\r\n\t\tobj.initSpeeds = [3.5];\r\n\t\tobj.lifeBorders = [`x`];\r\n\t\tobj.lifeRecoverys = [6];\r\n\t\tobj.lifeDamages = [40];\r\n\t\tobj.lifeInits = [25];\r\n\t\tobj.creatorNames = [obj.tuning];\r\n\t}\r\n\tconst keyLists = makeDedupliArray(obj.keyLabels);\r\n\tobj.viewLists = [...Array(obj.keyLabels.length).keys()];\r\n\tobj.keyLists = keyLists.sort((a, b) => parseInt(a) - parseInt(b));\r\n\tobj.undefinedKeyLists = obj.keyLists.filter(key => g_keyObj[`${g_keyObj.defaultProp}${key}_0`] === undefined);\r\n\r\n\t// 楽曲別のグループ化設定（選曲モードのみ）\r\n\tif (hasVal(_dosObj.musicGroup)) {\r\n\t\tobj.musicGroups = _dosObj.musicGroup.split(`,`)\r\n\t\t\t.map((val, j) => setVal(val, j, C_TYP_NUMBER))\r\n\t\t\t.map((val, j) => val < 0 ? j + val : val);\r\n\t\tfor (let k = obj.musicGroups.length; k <= Math.max(...obj.musicNos); k++) {\r\n\t\t\tobj.musicGroups[k] = k;\r\n\t\t}\r\n\t\tobj.musicIdxList = makeDedupliArray(obj.musicGroups);\r\n\t} else {\r\n\t\tobj.musicIdxList = [...Array(Math.max(...obj.musicNos) + 1).keys()];\r\n\t}\r\n\r\n\t// 譜面変更セレクターの利用有無\r\n\tobj.difSelectorUse = getDifSelectorUse(_dosObj.difSelectorUse, obj.viewLists);\r\n\r\n\t// 初期速度の設定\r\n\tg_stateObj.speed = obj.initSpeeds[g_stateObj.scoreId];\r\n\tg_settings.speedNum = roundZero(g_settings.speeds.findIndex(speed => speed === g_stateObj.speed));\r\n\r\n\t// グラデーションのデフォルト中間色を設定\r\n\tdivRoot.appendChild(createDivCss2Label(`dummyLabel`, ``));\r\n\tobj.baseBrightFlg = setBoolVal(_dosObj.baseBright, checkLightOrDark(colorNameToCode(window.getComputedStyle(dummyLabel, ``).color)));\r\n\tconst intermediateColor = obj.baseBrightFlg ? `#111111` : `#eeeeee`;\r\n\r\n\t// 矢印の色変化を常時グラデーションさせる設定\r\n\tobj.defaultColorgrd = [false, intermediateColor];\r\n\tif (hasVal(_dosObj.defaultColorgrd)) {\r\n\t\tobj.defaultColorgrd = _dosObj.defaultColorgrd.split(`,`);\r\n\t\tobj.defaultColorgrd[0] = setBoolVal(obj.defaultColorgrd[0]);\r\n\t\tobj.defaultColorgrd[1] = obj.defaultColorgrd[1] ?? intermediateColor;\r\n\t}\r\n\tg_rankObj.rankColorAllPerfect = intermediateColor;\r\n\r\n\t// カラーコードのゼロパディング有無設定\r\n\tobj.colorCdPaddingUse = setBoolVal(_dosObj.colorCdPaddingUse);\r\n\r\n\t// 最大ライフ\r\n\tobj.maxLifeVal = setVal(_dosObj.maxLifeVal, C_VAL_MAXLIFE, C_TYP_FLOAT);\r\n\tif (obj.maxLifeVal <= 0) {\r\n\t\tobj.maxLifeVal = C_VAL_MAXLIFE;\r\n\t\tmakeWarningWindow(g_msgInfoObj.E_0042.split(`{0}`).join(`maxLifeVal`));\r\n\t}\r\n\r\n\t// ゲージ初期設定（最大ライフ反映）\r\n\tg_gaugeOptionObj.defaultList.forEach(type => {\r\n\t\tconst pos = g_gaugeOptionObj[`dmg${toCapitalize(type)}`].findIndex(val => val === C_LFE_MAXLIFE);\r\n\t\tg_gaugeOptionObj[`dmg${toCapitalize(type)}`][pos] = obj.maxLifeVal;\r\n\t});\r\n\r\n\t// フリーズアローのデフォルト色セットの利用有無 (true: 使用, false: 矢印色を優先してセット)\r\n\tobj.defaultFrzColorUse = setBoolVal(_dosObj.defaultFrzColorUse ?? g_presetObj.frzColors, true);\r\n\r\n\t// 矢印色変化に対応してフリーズアロー色を追随する範囲の設定\r\n\t// (defaultFrzColorUse=false時のみ)\r\n\tobj.frzScopeFromArrowColors = [];\r\n\r\n\tif (!obj.defaultFrzColorUse) {\r\n\t\tconst tmpFrzScope = [];\r\n\r\n\t\tif (hasVal(_dosObj.frzScopeFromAC)) {\r\n\t\t\ttmpFrzScope.push(..._dosObj.frzScopeFromAC.split(`,`));\r\n\t\t} else if (g_presetObj.frzScopeFromAC !== undefined) {\r\n\t\t\ttmpFrzScope.push(...g_presetObj.frzScopeFromAC);\r\n\t\t}\r\n\t\ttmpFrzScope.filter(type => [`Normal`, `Hit`].includes(type))\r\n\t\t\t.forEach(data => obj.frzScopeFromArrowColors.push(data));\r\n\t}\r\n\r\n\t// 初期色情報\r\n\tconst baseColor = (obj.baseBrightFlg ? `light` : `dark`);\r\n\tObject.assign(g_dfColorObj, g_dfColorBaseObj[baseColor]);\r\n\tObject.keys(g_dfColorObj).forEach(key => obj[key] = g_dfColorObj[key].concat());\r\n\tobj.frzColorDefault = [];\r\n\r\n\t// ダミー用初期矢印色\r\n\tobj.setDummyColor = [`#777777`, `#444444`, `#777777`, `#444444`, `#777777`];\r\n\tobj.dfColorgrdSet = {\r\n\t\t'': obj.defaultColorgrd,\r\n\t\t'Type0': [!obj.defaultColorgrd[0], obj.defaultColorgrd[1]],\r\n\t};\r\n\r\n\t// カスタムゲージ設定（共通設定ファイル）\r\n\taddGaugeFulls(g_gaugeOptionObj.survival);\r\n\taddGaugeFulls(g_gaugeOptionObj.border);\r\n\r\n\tif (g_presetObj.gaugeList !== undefined) {\r\n\t\tObject.keys(g_presetObj.gaugeList).forEach(key => {\r\n\t\t\tg_gaugeOptionObj.customDefault.push(key);\r\n\t\t\tg_gaugeOptionObj.varCustomDefault.push(boolToSwitch(g_presetObj.gaugeList[key] === `V`));\r\n\t\t});\r\n\t\tg_gaugeOptionObj.custom = g_gaugeOptionObj.customDefault.concat();\r\n\t\tg_gaugeOptionObj.varCustom = g_gaugeOptionObj.varCustomDefault.concat();\r\n\t\taddGaugeFulls(g_gaugeOptionObj.customDefault);\r\n\t}\r\n\r\n\t// カスタムゲージ設定、初期色設定（譜面ヘッダー）の譜面別設定\r\n\tObject.assign(obj, resetBaseColorList(obj, _dosObj));\r\n\tfor (let j = 0; j < obj.difLabels.length; j++) {\r\n\t\tObject.assign(g_gaugeOptionObj, resetCustomGauge(_dosObj, { scoreId: j }));\r\n\t\tObject.assign(obj, resetBaseColorList(obj, _dosObj, { scoreId: j }));\r\n\t}\r\n\r\n\t// ダミー譜面の設定\r\n\tif (hasVal(_dosObj.dummyId)) {\r\n\t\tobj.dummyScoreNos = _dosObj.dummyId.split(`$`);\r\n\t}\r\n\r\n\t// 無音のフレーム数\r\n\tobj.blankFrameDefs = [200];\r\n\tif (isNaN(parseFloat(_dosObj.blankFrame))) {\r\n\t} else {\r\n\t\tobj.blankFrameDefs = splitLF2(_dosObj.blankFrame).map(val => parseInt(val));\r\n\t}\r\n\tobj.blankFrame = obj.blankFrameDefs[0];\r\n\tobj.blankFrameDef = obj.blankFrameDefs[0];\r\n\r\n\t// 開始フレーム数（0以外の場合はフェードインスタート）、終了フレーム数\r\n\t[`startFrame`, `endFrame`].filter(tmpParam => hasVal(_dosObj[tmpParam]))\r\n\t\t.forEach(param => obj[param] = splitLF2(_dosObj[param]).map(frame => transTimerToFrame(frame)));\r\n\r\n\t// フェードアウトフレーム数(譜面別)\r\n\tif (hasVal(_dosObj.fadeFrame)) {\r\n\t\tconst fadeFrames = splitLF2(_dosObj.fadeFrame);\r\n\t\tobj.fadeFrame = [];\r\n\t\tfadeFrames.forEach((fadeInfo, j) => {\r\n\t\t\tobj.fadeFrame[j] = fadeInfo.split(`,`);\r\n\t\t\tobj.fadeFrame[j][0] = transTimerToFrame(obj.fadeFrame[j][0]);\r\n\t\t});\r\n\t}\r\n\r\n\t// タイミング調整\r\n\tobj.adjustment = (hasVal(_dosObj.adjustment) ? _dosObj.adjustment.split(`$`) : [0]);\r\n\r\n\t// 再生速度\r\n\tobj.playbackRate = setVal(_dosObj.playbackRate, 1, C_TYP_FLOAT);\r\n\tif (obj.playbackRate <= 0) {\r\n\t\tobj.playbackRate = 1;\r\n\t\tmakeWarningWindow(g_msgInfoObj.E_0042.split(`{0}`).join(`playbackRate`));\r\n\t}\r\n\r\n\t// プレイサイズ(X方向, Y方向)\r\n\tobj.playingWidth = setIntVal(_dosObj.playingWidth, g_presetObj.playingWidth ?? `default`);\r\n\tconst tmpPlayingHeight = setIntVal(_dosObj.playingHeight, g_presetObj.playingHeight ?? g_sHeight);\r\n\tobj.playingHeight = Math.max(obj.heightVariable ?\r\n\t\tsetIntVal(getQueryParamVal(`h`) - (g_sHeight - tmpPlayingHeight), tmpPlayingHeight) : tmpPlayingHeight, 400);\r\n\r\n\t// プレイ左上位置(X座標, Y座標)\r\n\tobj.playingX = setIntVal(_dosObj.playingX, g_presetObj.playingX ?? 0);\r\n\tobj.playingY = setIntVal(_dosObj.playingY, g_presetObj.playingY ?? 0);\r\n\r\n\t// ステップゾーン位置\r\n\tg_posObj.stepY = (isNaN(parseFloat(_dosObj.stepY)) ? C_STEP_Y : parseFloat(_dosObj.stepY));\r\n\tg_posObj.stepYR = (isNaN(parseFloat(_dosObj.stepYR)) ? C_STEP_YR : parseFloat(_dosObj.stepYR));\r\n\tg_posObj.stepDiffY = g_posObj.stepY - C_STEP_Y;\r\n\tg_posObj.distY = obj.playingHeight - C_STEP_Y + g_posObj.stepYR;\r\n\tg_posObj.reverseStepY = g_posObj.distY - g_posObj.stepY - g_posObj.stepDiffY - C_ARW_WIDTH;\r\n\tg_posObj.arrowHeight = obj.playingHeight + g_posObj.stepYR - g_posObj.stepDiffY * 2;\r\n\tobj.bottomWordSetFlg = setBoolVal(_dosObj.bottomWordSet);\r\n\r\n\t// ウィンドウサイズ(高さ)とステップゾーン位置の組み合わせで基準速度を変更\r\n\tobj.baseSpeed = 1 + ((g_posObj.distY - (g_posObj.stepY - C_STEP_Y) * 2) / (500 - C_STEP_Y) - 1) * 0.85;\r\n\r\n\t// 矢印・フリーズアロー判定位置補正\r\n\tg_diffObj.arrowJdgY = (isNaN(parseFloat(_dosObj.arrowJdgY)) ? 0 : parseFloat(_dosObj.arrowJdgY));\r\n\tg_diffObj.frzJdgY = (isNaN(parseFloat(_dosObj.frzJdgY)) ? 0 : parseFloat(_dosObj.frzJdgY));\r\n\r\n\t// musicフォルダ設定\r\n\tobj.musicFolder = _dosObj.musicFolder ?? (g_remoteFlg ? `${C_MRK_CURRENT_DIRECTORY}../music` : `music`);\r\n\r\n\t// 楽曲URL\r\n\tif (hasVal(_dosObj.musicUrl)) {\r\n\t\tconst musicUrls = splitLF2(_dosObj.musicUrl);\r\n\t\tobj.musicUrls = [], obj.musicStarts = [], obj.musicEnds = [];\r\n\t\tmusicUrls.forEach((val, j) => {\r\n\t\t\tconst musicUrlPair = val.split(`,`);\r\n\t\t\tobj.musicUrls[j] = musicUrlPair[0] || ``;\r\n\t\t\tif (musicUrlPair[1] !== undefined) {\r\n\t\t\t\tconst musicBGMTime = musicUrlPair[1].split(`-`).map(str => str.trim());\r\n\t\t\t\tobj.musicStarts[j] = Math.floor(transTimerToFrame(musicBGMTime[0] ?? 0) / g_fps);\r\n\t\t\t\tobj.musicEnds[j] = musicBGMTime[1] !== undefined ?\r\n\t\t\t\t\tMath.floor((transTimerToFrame(musicBGMTime[1] ?? 0)) / g_fps) :\r\n\t\t\t\t\tMath.floor((transTimerToFrame(musicBGMTime[0] ?? 0) + transTimerToFrame(`0:20`)) / g_fps);\r\n\t\t\t} else {\r\n\t\t\t\tobj.musicStarts[j] = 0;\r\n\t\t\t\tobj.musicEnds[j] = 20;\r\n\t\t\t}\r\n\t\t});\r\n\t} else {\r\n\t\tmakeWarningWindow(g_msgInfoObj.E_0031);\r\n\t}\r\n\r\n\t// ハッシュタグ\r\n\tobj.hashTag = _dosObj.hashTag ?? ``;\r\n\r\n\t// 読込対象の画像を指定(rel:preload)と同じ\r\n\tobj.preloadImages = [];\r\n\tif (hasVal(_dosObj.preloadImages)) {\r\n\t\tobj.preloadImages = _dosObj.preloadImages.split(`,`).filter(image => hasVal(image)).map(preloadImage => preloadImage);\r\n\t}\r\n\r\n\t// 初期表示する部分キーの設定\r\n\tobj.keyGroupOrder = [];\r\n\t_dosObj.keyGroupOrder?.split(`$`).forEach((val, j) => {\r\n\t\tif (val !== ``) {\r\n\t\t\tobj.keyGroupOrder[j] = val.split(`,`);\r\n\t\t}\r\n\t});\r\n\r\n\t// 最終演出表示有無（noneで無効化）\r\n\tobj.finishView = _dosObj.finishView ?? ``;\r\n\r\n\t// 更新日\r\n\tobj.releaseDate = _dosObj.releaseDate ?? ``;\r\n\r\n\t// デフォルトReady/リザルト表示の遅延時間設定\r\n\t[`ready`, `result`].forEach(objName =>\r\n\t\tobj[`${objName}DelayFrame`] = setIntVal(_dosObj[`${objName}DelayFrame`]));\r\n\r\n\t// デフォルトReady表示のアニメーション時間設定\r\n\tobj.readyAnimationFrame = setIntVal(_dosObj.readyAnimationFrame, 150);\r\n\r\n\t// デフォルトReady表示のアニメーション名\r\n\tobj.readyAnimationName = _dosObj.readyAnimationName ?? `leftToRightFade`;\r\n\r\n\t// デフォルトReady表示の先頭文字色\r\n\tobj.readyColor = _dosObj.readyColor ?? ``;\r\n\r\n\t// デフォルトReady表示を上書きするテキスト\r\n\tobj.readyHtml = _dosObj.readyHtml ?? ``;\r\n\r\n\t// デフォルト曲名表示のフォントサイズ\r\n\tobj.titlesize = getHeader(_dosObj, ...getHname(`titleSize`)) ?? ``;\r\n\r\n\t// デフォルト曲名表示のフォント名\r\n\t// (使用例： |titlefont=Century,Meiryo UI|)\r\n\tobj.titlefonts = g_titleLists.defaultFonts.concat();\r\n\tgetHeader(_dosObj, ...getHname(`titleFont`))?.split(`$`).forEach((font, j) => obj.titlefonts[j] = `'${(font.replaceAll(`,`, `', '`))}'`);\r\n\tif (obj.titlefonts[1] === undefined) {\r\n\t\tobj.titlefonts[1] = obj.titlefonts[0];\r\n\t}\r\n\r\n\t// デフォルト曲名表示, 背景矢印のグラデーション指定css\r\n\t[`titlegrd`, `titleArrowgrd`].forEach(_name => {\r\n\t\tconst objName = `${_name.toLowerCase()}`;\r\n\t\tobj[`${objName}s`] = [];\r\n\t\tconst tmpTitlegrd = getHeader(_dosObj, ...getHname(_name))?.replaceAll(`,`, `:`);\r\n\t\tif (hasVal(tmpTitlegrd)) {\r\n\t\t\tobj[`${objName}s`] = tmpTitlegrd.split(`$`);\r\n\t\t\tobj[`${objName}`] = obj[`${objName}s`][0] ?? ``;\r\n\t\t}\r\n\t});\r\n\r\n\t// デフォルト曲名表示の表示位置調整\r\n\tobj.titlepos = [[0, 0], [0, 0]];\r\n\tgetHeader(_dosObj, ...getHname(`titlePos`))?.split(`$`).forEach((pos, j) => obj.titlepos[j] = pos.split(`,`).map(x => parseFloat(x)));\r\n\r\n\t// タイトル文字のアニメーション設定\r\n\tobj.titleAnimationName = [`leftToRight`];\r\n\tobj.titleAnimationDuration = [1.5];\r\n\tobj.titleAnimationDelay = [0];\r\n\tobj.titleAnimationTimingFunction = [`ease`];\r\n\tobj.titleAnimationClass = [``];\r\n\r\n\tgetHeader(_dosObj, ...getHname(`titleAnimation`))?.split(`$`).forEach((pos, j) => {\r\n\t\tconst titleAnimation = pos.split(`,`);\r\n\t\tobj.titleAnimationName[j] = setVal(titleAnimation[0], obj.titleAnimationName[0]);\r\n\t\tobj.titleAnimationDuration[j] = setVal(titleAnimation[1] / g_fps, obj.titleAnimationDuration[0], C_TYP_FLOAT);\r\n\t\tobj.titleAnimationDelay[j] = setVal(titleAnimation[2] / g_fps, obj.titleAnimationDelay[0], C_TYP_FLOAT);\r\n\t\tobj.titleAnimationTimingFunction[j] = setVal(titleAnimation[3], obj.titleAnimationName[3]);\r\n\t});\r\n\tgetHeader(_dosObj, ...getHname(`titleAnimationClass`))?.split(`$`).forEach((animationClass, j) =>\r\n\t\tobj.titleAnimationClass[j] = animationClass ?? ``);\r\n\r\n\tif (obj.titleAnimationName.length === 1) {\r\n\t\tg_titleLists.animation.forEach(pattern =>\r\n\t\t\tobj[`titleAnimation${pattern}`][1] = obj[`titleAnimation${pattern}`][0]);\r\n\t}\r\n\tif (obj.titleAnimationClass.length === 1) {\r\n\t\tobj.titleAnimationClass[1] = obj.titleAnimationClass[0];\r\n\t}\r\n\r\n\t// デフォルト曲名表示の複数行時の縦間隔\r\n\tobj.titlelineheight = setIntVal(getHeader(_dosObj, ...getHname(`titleLineHeight`)), ``);\r\n\r\n\t// フリーズアローの始点で通常矢印の判定を行うか(dotさんソース方式)\r\n\tobj.frzStartjdgUse = setBoolVal(_dosObj.frzStartjdgUse ?? g_presetObj.frzStartjdgUse);\r\n\r\n\t// 空押し判定の設定\r\n\t// excessiveUses   : 譜面毎の空押し有効化設定\r\n\t// excessiveJdgUses: 譜面毎の空押し初期設定\r\n\tobj.excessiveUses = [];\r\n\tobj.excessiveJdgUses = [];\r\n\tsplitLF2(_dosObj.excessiveUse)?.forEach(val => {\r\n\t\tconst tmpVal = val.split(`,`);\r\n\t\tobj.excessiveUses.push(setBoolVal(tmpVal[0]));\r\n\t\tobj.excessiveJdgUses.push(setVal(tmpVal[1], C_FLG_OFF, C_TYP_SWITCH) === C_FLG_ON);\r\n\t});\r\n\tif ((obj.excessiveUses?.length || 0) < obj.difLabels.length) {\r\n\t\tobj.excessiveUses = makeBaseArray(obj.excessiveUses, obj.difLabels.length,\r\n\t\t\tsetBoolVal(obj.excessiveUses?.[0] ?? _dosObj.excessiveUse ?? g_presetObj.excessiveUse, true));\r\n\t\tobj.excessiveJdgUses = makeBaseArray(obj.excessiveJdgUses, obj.difLabels.length,\r\n\t\t\tsetBoolVal(obj.excessiveJdgUses?.[0] ?? g_presetObj.excessiveJdgUse ?? false));\r\n\t}\r\n\r\n\t// excessiveJdgUseが有効な場合は全譜面に対して強制的に上書き\r\n\tif (_dosObj.excessiveJdgUse !== undefined) {\r\n\t\tconst excessiveJdg = setBoolVal(_dosObj.excessiveJdgUse);\r\n\t\tif (excessiveJdg) {\r\n\t\t\tobj.excessiveJdgUses = obj.excessiveJdgUses.map(val => true);\r\n\t\t}\r\n\t}\r\n\tobj.excessiveJdgUse = obj.excessiveJdgUses[0];\r\n\tg_stateObj.excessive = boolToSwitch(obj.excessiveJdgUse);\r\n\tg_settings.excessiveNum = Number(obj.excessiveJdgUse);\r\n\r\n\t// 譜面名に制作者名を付加するかどうかのフラグ（選曲用に初期値を退避）\r\n\tobj.makerView = setBoolVal(_dosObj.makerView);\r\n\tobj.makerViewOrg = obj.makerView;\r\n\r\n\t// shuffleUse=group 時のみshuffle用配列を組み替える\r\n\tif (_dosObj.shuffleUse === `group`) {\r\n\t\t_dosObj.shuffleUse = true;\r\n\t\tg_settings.shuffles = g_settings.shuffles.filter(val => !val.endsWith(`+`));\r\n\t}\r\n\r\n\t// オプション利用可否設定\r\n\tg_canDisabledSettings.forEach(option =>\r\n\t\tobj[`${option}Use`] = setBoolVal(_dosObj[`${option}Use`] ?? g_presetObj.settingUse?.[option], true));\r\n\r\n\tlet interlockingErrorFlg = false;\r\n\tg_displays.forEach((option, j) => {\r\n\r\n\t\t// Display使用可否設定を分解 |displayUse=false,ON|\r\n\t\tconst displayTempUse = _dosObj[`${option}Use`] ?? g_presetObj.settingUse?.[option] ?? `true`;\r\n\t\tconst displayUse = displayTempUse?.split(`,`) ?? [true, C_FLG_ON];\r\n\r\n\t\t// displayUse -> ボタンの有効/無効, displaySet -> ボタンの初期値(ON/OFF)\r\n\t\tobj[`${option}Use`] = setBoolVal(displayUse[0], true);\r\n\t\tobj[`${option}Set`] = setVal(displayUse.length > 1 ? displayUse[1] :\r\n\t\t\tboolToSwitch(obj[`${option}Use`]), ``, C_TYP_SWITCH);\r\n\t\tg_stateObj[`d_${option.toLowerCase()}`] = setVal(obj[`${option}Set`], C_FLG_ON, C_TYP_SWITCH);\r\n\t\tobj[`${option}ChainOFF`] = _dosObj[`${option}ChainOFF`]?.split(`,`) ?? [];\r\n\r\n\t\t// Displayのデフォルト設定で、双方向に設定されている場合は設定をブロック\r\n\t\tg_displays.filter((option2, k) =>\r\n\t\t\tj > k && (obj[`${option}ChainOFF`].includes(option2) && obj[`${option2}ChainOFF`].includes(option)))\r\n\t\t\t.forEach(() => {\r\n\t\t\t\tinterlockingErrorFlg = true;\r\n\t\t\t\tmakeWarningWindow(g_msgInfoObj.E_0051);\r\n\t\t\t});\r\n\t\tif (!interlockingErrorFlg && obj[`${option}ChainOFF`].includes(option)) {\r\n\t\t\tinterlockingErrorFlg = true;\r\n\t\t\tmakeWarningWindow(g_msgInfoObj.E_0051);\r\n\t\t}\r\n\t});\r\n\r\n\tif (!interlockingErrorFlg) {\r\n\t\tg_displays.forEach(option =>\r\n\t\t\tobj[`${option}ChainOFF`].forEach(defaultOption => {\r\n\t\t\t\tg_stateObj[`d_${defaultOption.toLowerCase()}`] = C_FLG_OFF;\r\n\t\t\t\tinterlockingButton(obj, defaultOption, C_FLG_OFF, C_FLG_ON);\r\n\t\t\t}));\r\n\t}\r\n\tobj.arrowEffectUseOrg = obj.arrowEffectUse;\r\n\tobj.arrowEffectSetFlg = obj.arrowEffectSet === C_FLG_ON;\r\n\r\n\t// ローカルストレージに保存済みのColorType設定からDisplayのColor設定を反映\r\n\tif (g_localStorage.colorType !== undefined) {\r\n\t\tg_colorType = g_localStorage.colorType;\r\n\t\tif (obj.colorUse) {\r\n\t\t\tg_stateObj.d_color = boolToSwitch(g_keycons.colorDefTypes.findIndex(val => val === g_colorType) !== -1);\r\n\t\t}\r\n\t}\r\n\r\n\t// 別キーパターンの使用有無\r\n\tobj.transKeyUse = setBoolVal(_dosObj.transKeyUse, true);\r\n\r\n\t// タイトル画面用・背景/マスクデータの分解 (下記すべてで1セット、改行区切り)\r\n\t// [フレーム数,階層,背景パス,class(CSSで別定義),X,Y,width,height,opacity,animationName,animationDuration]\r\n\tg_animationData.forEach(sprite => {\r\n\t\tobj[`${sprite}TitleData`] = [];\r\n\t\tobj[`${sprite}TitleMaxDepth`] = -1;\r\n\r\n\t\tconst dataList = [_dosObj[`${sprite}title${g_localeObj.val}_data`], _dosObj[`${sprite}title_data`]];\r\n\t\tconst data = dataList.find((v) => v !== undefined);\r\n\t\tif (hasVal(data)) {\r\n\t\t\t[obj[`${sprite}TitleData`], obj[`${sprite}TitleMaxDepth`]] = g_animationFunc.make[sprite](data);\r\n\t\t}\r\n\t});\r\n\r\n\t// 結果画面用のマスク透過設定\r\n\tobj.masktitleButton = setBoolVal(_dosObj.masktitleButton);\r\n\r\n\t// 結果画面用のマスク透過設定\r\n\tobj.maskresultButton = setBoolVal(_dosObj.maskresultButton);\r\n\r\n\t// リザルトモーションをDisplay:BackgroundのON/OFFと連動させるかどうかの設定\r\n\tobj.resultMotionSet = setBoolVal(_dosObj.resultMotionSet, true);\r\n\r\n\t// 譜面明細の使用可否\r\n\tconst tmpDetails = getHeader(_dosObj, `scoreDetailUse`, `chartDetailUse`)?.split(`,`).filter(val => hasVal(val) && val !== `false`)\r\n\t\t.map(val => replaceStr(val, g_settings.scoreDetailTrans));\r\n\tg_settings.scoreDetails = g_settings.scoreDetailDefs.filter(val => tmpDetails?.includes(val) || tmpDetails === undefined);\r\n\r\n\tg_stateObj.scoreDetail = g_settings.scoreDetails[0] || ``;\r\n\tg_settings.scoreDetailCursors = g_settings.scoreDetails.map(val => `lnk${val}G`);\r\n\tg_settings.scoreDetailCursors.push(`btnGraphB`);\r\n\t[`option`, `difSelector`].forEach(page => g_shortcutObj[page].KeyQ.id = g_settings.scoreDetailCursors[0]);\r\n\r\n\t// 判定位置をBackgroundのON/OFFと連動してリセットする設定\r\n\tobj.jdgPosReset = setBoolVal(_dosObj.jdgPosReset, true);\r\n\r\n\t// タイトル表示用コメント\r\n\tconst newlineTag = setBoolVal(_dosObj.commentAutoBr, true) ? `<br>` : ``;\r\n\tconst tmpComment = (_dosObj[`commentVal${g_localeObj.val}`] ?? _dosObj.commentVal ?? ``).split(`\\r\\n`).join(`\\n`);\r\n\tobj.commentVal = tmpComment.split(`\\n`).join(newlineTag);\r\n\r\n\tconst maxMusicNo = Math.max(...obj.musicNos);\r\n\tfor (let j = 0; j <= maxMusicNo; j++) {\r\n\t\tobj[`commentVal${j}`] = (_dosObj[`commentVal${j}`] || ``).split(`\\n`)\r\n\t\t\t.filter((val, k) => k !== 0 || val !== ``).join(`<br>`);\r\n\t}\r\n\r\n\t// コメントの外部化設定\r\n\tobj.commentExternal = setBoolVal(_dosObj.commentExternal);\r\n\r\n\t// Reverse時の歌詞の自動反転制御\r\n\tobj.wordAutoReverse = _dosObj.wordAutoReverse ?? g_presetObj.wordAutoReverse ?? C_DIS_AUTO;\r\n\r\n\t// プレイ中クレジットを表示しないエリアのサイズ(X方向)\r\n\tobj.customViewWidth = setVal(_dosObj.customViewWidth ?? _dosObj.customCreditWidth, 0, C_TYP_FLOAT);\r\n\r\n\t// ショートカットキーが既定値ではない場合の左右の拡張エリアのサイズ\r\n\tif (hasVal(_dosObj.scArea)) {\r\n\t\tconst tmp = _dosObj.scArea.split(`,`);\r\n\t\tobj.scAreaWidth = setVal(tmp[0], 0, C_TYP_FLOAT);\r\n\t\tobj.playingLayout = tmp[1] !== `left`;\r\n\t} else {\r\n\t\tobj.scAreaWidth = g_presetObj.scAreaWidth ?? 0;\r\n\t\tobj.playingLayout = g_presetObj.playingLayout ?? true;\r\n\t}\r\n\r\n\t// ジャストフレームの設定 (ローカル: 0フレーム, リモートサーバ上: 1フレーム以内)\r\n\tobj.justFrames = (g_isLocal) ? 0 : 1;\r\n\r\n\t// リザルトデータのカスタマイズ\r\n\tobj.resultFormat = escapeHtmlForEnabledTag(_dosObj.resultFormat ?? g_presetObj.resultFormat ?? g_templateObj.resultFormatDf);\r\n\r\n\t// リザルト画像データのカスタム設定\r\n\tobj.resultValsView = _dosObj.resultValsView?.split(`,`) ?? g_presetObj.resultValsView ?? Array.from(Object.keys(g_presetObj.resultVals ?? {}));\r\n\r\n\t// フェードイン時にそれ以前のデータを蓄積しない種別(word, back, mask)を指定\r\n\tobj.unStockCategories = (_dosObj.unStockCategory ?? ``).split(`,`);\r\n\tif (g_presetObj.unStockCategories !== undefined) {\r\n\t\tobj.unStockCategories = makeDedupliArray(obj.unStockCategories, g_presetObj.unStockCategories);\r\n\t}\r\n\tg_fadeinStockList = g_fadeinStockList.filter(cg => obj.unStockCategories.indexOf(cg) === -1);\r\n\r\n\t// フェードイン時にそれ以前のデータを蓄積しないパターンを指定\r\n\tif (g_presetObj.stockForceDelList !== undefined) {\r\n\t\tObject.assign(g_stockForceDelList, g_presetObj.stockForceDelList);\r\n\t}\r\n\tg_fadeinStockList.filter(type => hasVal(_dosObj[`${type}StockForceDel`]))\r\n\t\t.forEach(type => g_stockForceDelList[type] = makeDedupliArray(g_stockForceDelList[type], _dosObj[`${type}StockForceDel`].split(`,`)));\r\n\r\n\treturn obj;\r\n};\r\n\r\n/**\r\n * 譜面リスト作成有無の状態を取得\r\n * @param {boolean} _headerFlg \r\n * @param {number[]} _viewLists \r\n * @returns {boolean}\r\n */\r\nconst getDifSelectorUse = (_headerFlg, _viewLists = g_headerObj.viewLists) => setBoolVal(_headerFlg, _viewLists.length > 5);\r\n\r\n/**\r\n * カラーセットの格納\r\n * @param {string} object._from コピー元矢印カラーセット（の譜面番号）\r\n * @param {string} object._to コピー先矢印のカラーセット（の譜面番号）\r\n * @param {object} object._fromObj コピー元オブジェクト\r\n * @param {object} object._toObj コピー先オブジェクト\r\n */\r\nconst resetColorType = ({ _from = ``, _to = ``, _fromObj = g_headerObj, _toObj = g_headerObj } = {}) => {\r\n\t_toObj[`setColor${_to}`] = structuredClone(_fromObj[`setColor${_from}`]);\r\n\t_toObj[`setShadowColor${_to}`] = structuredClone(_fromObj[`setShadowColor${_from}`]);\r\n\t_toObj[`frzColor${_to}`] = structuredClone(_fromObj[`frzColor${_from}`]);\r\n\t_toObj[`frzShadowColor${_to}`] = structuredClone(_fromObj[`frzShadowColor${_from}`]);\r\n};\r\n\r\n/**\r\n * 配列に対象がいない場合、配列の先頭にその対象を追加\r\n * @param {string[]|number[]} _arr 検索対象の配列\r\n * @param {string|number} _target 検索対象\r\n * @returns {string[]|number[]}\r\n */\r\nconst addValtoArray = (_arr, _target) => {\r\n\tif (!_arr.includes(_target)) {\r\n\t\t_arr.unshift(_target);\r\n\t}\r\n\treturn _arr;\r\n};\r\n\r\n/**\r\n * 曲名（1行）の取得\r\n * @param {string} _musicName \r\n * @returns {string}\r\n */\r\nconst getMusicNameSimple = _musicName => replaceStr(_musicName, g_escapeStr.musicNameSimple);\r\n\r\n/**\r\n * 曲名（複数行）の取得\r\n * @param {string} _musicName \r\n * @returns {string[]}\r\n */\r\nconst getMusicNameMultiLine = _musicName => {\r\n\tconst tmpName = replaceStr(_musicName, g_escapeStr.musicNameMultiLine).split(`<br>`);\r\n\treturn tmpName.length === 1 ? [tmpName[0], ``] : tmpName;\r\n};\r\n\r\n/**\r\n * 画像セットの入れ替え処理\r\n * @param {object} _imgType\r\n * @param {string} _imgType.name\r\n * @param {string} _imgType.extension\r\n * @param {string} _imgType.remoteDir\r\n * @param {boolean} _initFlg  \r\n */\r\nconst updateImgType = (_imgType, _initFlg = false) => {\r\n\tif (_initFlg) {\r\n\t\tconst baseDir = (_imgType.name === `` ? `` : `${_imgType.name}/`);\r\n\t\tC_IMG_TITLE_ARROW = `../img/${baseDir}arrow.${_imgType.extension}`;\r\n\t}\r\n\tresetImgs(_imgType.name, _imgType.extension);\r\n\treloadImgObj();\r\n\tconst orgImgObj = structuredClone(g_imgObj);\r\n\tObject.keys(g_imgObj).forEach(key => g_imgObj[key] = `${g_rootPath}${orgImgObj[key]}`);\r\n\r\n\t// リモート時は作品ページ側にある画像を優先し、リモートに存在するもののみリモートから取得する\r\n\t// titleArrowについては他のImgTypeから取得するため、remoteDir属性には依存させない\r\n\tif (g_remoteFlg) {\r\n\t\tObject.keys(g_imgObj).forEach(key => g_imgObj[key] = `${g_workPath}${orgImgObj[key]}`);\r\n\t\tif (_imgType.remoteDir !== `` && hasRemoteDomain(_imgType.remoteDir)) {\r\n\t\t\tg_defaultSets.imgList.filter(val => val !== `titleArrow`)\r\n\t\t\t\t.forEach(key => g_imgObj[key] = `${_imgType.remoteDir}img/${orgImgObj[key]}`);\r\n\t\t} else if (g_defaultSets.imgType.findIndex(val => val === _imgType.name) >= 0) {\r\n\t\t\tg_defaultSets.imgList.forEach(key => g_imgObj[key] = `${g_rootPath}${orgImgObj[key]}`);\r\n\t\t}\r\n\t}\r\n\tif (_imgType.extension === undefined && g_presetObj.overrideExtension !== undefined) {\r\n\t\tObject.keys(g_imgObj).forEach(key => g_imgObj[key] = `${g_imgObj[key].slice(0, -3)}${g_presetObj.overrideExtension}`);\r\n\t}\r\n\tif (!g_isFile) {\r\n\t\tg_imgInitList.forEach(img => preloadFile(`image`, g_imgObj[img]));\r\n\t}\r\n};\r\n\r\n/**\r\n * ゲージ設定リストへの追加\r\n * @param {object} _obj\r\n */\r\nconst addGaugeFulls = _obj => _obj.map(key => g_gaugeOptionObj.customFulls[key] = false);\r\n\r\n/**\r\n * 矢印・フリーズアロー色のデータ変換\r\n * @param {object} _baseObj \r\n * @param {object} _dosObj\r\n * @param {string} [object.scoreId=''] \r\n * @param {boolean} [object.scoreLockFlg=g_stateObj.scoreLockFlg]\r\n * @returns {object} ※Object.assign(obj, resetBaseColorList(...))の形で呼び出しが必要\r\n */\r\nconst resetBaseColorList = (_baseObj, _dosObj, { scoreId = ``, scoreLockFlg = g_stateObj.scoreLockFlg } = {}) => {\r\n\r\n\tconst obj = {};\r\n\tconst idHeader = setScoreIdHeader(scoreId, scoreLockFlg, scoreId !== ``);\r\n\tconst getRefData = (_header, _dataName) => {\r\n\t\tconst data = _dosObj[`${_header}${_dataName}`];\r\n\t\treturn data?.startsWith(_header) ? _dosObj[data] : data;\r\n\t}\r\n\r\n\t[``, `Shadow`].forEach(pattern => {\r\n\t\tconst _arrowCommon = `set${pattern}Color`;\r\n\t\tconst _frzCommon = `frz${pattern}Color`;\r\n\r\n\t\tconst _name = `${_arrowCommon}${idHeader}`;\r\n\t\tconst _frzName = `${_frzCommon}${idHeader}`;\r\n\t\tconst _arrowInit = `${_arrowCommon}Init`;\r\n\t\tconst _frzInit = `${_frzCommon}Init`;\r\n\r\n\t\tconst arrowColorTxt = getRefData(_arrowCommon, idHeader) || _dosObj[_arrowCommon];\r\n\t\tconst frzColorTxt = getRefData(_frzCommon, idHeader) || _dosObj[_frzCommon];\r\n\r\n\t\t// 矢印色\r\n\t\tObject.keys(_baseObj.dfColorgrdSet).forEach(type => {\r\n\t\t\t[obj[`${_name}${type}`], obj[`${_name}Str${type}`], obj[`${_name}Org${type}`]] =\r\n\t\t\t\tsetColorList(arrowColorTxt, _baseObj[_arrowInit], _baseObj[_arrowInit].length, {\r\n\t\t\t\t\t_defaultColorgrd: _baseObj.dfColorgrdSet[type],\r\n\t\t\t\t\t_colorCdPaddingUse: _baseObj.colorCdPaddingUse,\r\n\t\t\t\t\t_shadowFlg: pattern === `Shadow`,\r\n\t\t\t\t});\r\n\r\n\t\t\tobj[`${_frzName}${type}`] = [];\r\n\t\t\tobj[`${_frzName}Str${type}`] = [];\r\n\t\t\tobj[`${_frzName}Org${type}`] = [];\r\n\t\t});\r\n\r\n\t\t// フリーズアロー色\r\n\t\tconst tmpFrzColors = (frzColorTxt !== undefined ? splitLF2(frzColorTxt) : []);\r\n\t\tconst firstFrzColors = tmpFrzColors[0]?.split(`,`) ?? [];\r\n\r\n\t\tfor (let j = 0; j < _baseObj.setColorInit.length; j++) {\r\n\r\n\t\t\t// デフォルト配列の作成（1番目の要素をベースに、フリーズアロー初期セット or 矢印色からデータを補完）\r\n\t\t\tconst currentFrzColors = [];\r\n\t\t\tconst baseLength = firstFrzColors.length === 0 || _baseObj.defaultFrzColorUse ?\r\n\t\t\t\t_baseObj[_frzInit].length : firstFrzColors.length;\r\n\t\t\tfor (let k = 0; k < baseLength; k++) {\r\n\t\t\t\tcurrentFrzColors[k] = setVal(firstFrzColors[k],\r\n\t\t\t\t\t_baseObj.defaultFrzColorUse ? _baseObj[_frzInit][k] : obj[`${_name}Str`][j]);\r\n\t\t\t}\r\n\r\n\t\t\tObject.keys(_baseObj.dfColorgrdSet).forEach(type =>\r\n\t\t\t\t[obj[`${_frzName}${type}`][j], obj[`${_frzName}Str${type}`][j], obj[`${_frzName}Org${type}`][j]] =\r\n\t\t\t\tsetColorList(tmpFrzColors[j], currentFrzColors, _baseObj[_frzInit].length, {\r\n\t\t\t\t\t_defaultColorgrd: _baseObj.dfColorgrdSet[type],\r\n\t\t\t\t\t_colorCdPaddingUse: _baseObj.colorCdPaddingUse,\r\n\t\t\t\t\t_defaultFrzColorUse: _baseObj.defaultFrzColorUse,\r\n\t\t\t\t\t_objType: `frz`,\r\n\t\t\t\t\t_shadowFlg: pattern === `Shadow`,\r\n\t\t\t\t}));\r\n\t\t}\r\n\r\n\t\tobj[`${_name}Default`] = obj[_name].concat();\r\n\t\tobj[`${_frzName}Default`] = obj[_frzName].concat();\r\n\t});\r\n\r\n\treturn obj;\r\n};\r\n\r\n/**\r\n * 矢印・フリーズアロー色のデータ展開\r\n * @param {string} _data \r\n * @param {string[]} _colorInit \r\n * @param {number} _colorInitLength\r\n * @param {string[]} [object._defaultColorgrd=g_headerObj.defaultColorgrd]\r\n * @param {boolean} [object._colorCdPaddingUse=false]\r\n * @param {boolean} [object._defaultFrzColorUse=true]\r\n * @param {string} [object._objType='normal']\r\n * @param {boolean} [object._shadowFlg=false]\r\n * @returns {string[][]}\r\n */\r\nconst setColorList = (_data, _colorInit, _colorInitLength,\r\n\t{ _defaultColorgrd = g_headerObj.defaultColorgrd, _colorCdPaddingUse = false,\r\n\t\t_defaultFrzColorUse = true, _objType = `normal`, _shadowFlg = false } = {}) => {\r\n\r\n\t// グラデーション文字列 #ffff99:#9999ff@linear-gradient\r\n\tlet colorStr = [];\r\n\r\n\t// カラーコード抽出用 #ffff99 - Ready文字、背景矢印のデフォルト色で使用\r\n\tlet colorOrg = [];\r\n\r\n\t// グラデーション適用後文字列 linear-gradient(to right, #ffff99, #9999ff)\r\n\tlet colorList = [];\r\n\r\n\t// 譜面側で指定されているデータを配列に変換\r\n\tif (hasVal(_data)) {\r\n\t\tcolorList = _data.split(`,`);\r\n\t\tcolorStr = colorList.concat();\r\n\r\n\t\t// データ補完処理\r\n\t\tconst defaultLength = colorStr.length;\r\n\t\tif (_objType === `frz` && _defaultFrzColorUse) {\r\n\t\t\t// デフォルト配列に満たない・足りない部分はデフォルト配列で穴埋め\r\n\t\t\tfor (let j = 0; j < _colorInitLength; j++) {\r\n\t\t\t\tif (!hasVal(colorStr[j])) {\r\n\t\t\t\t\tcolorStr[j] = _colorInit[j];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// デフォルト配列長をループさせて格納\r\n\t\t\tfor (let j = 0; j < _colorInitLength; j++) {\r\n\t\t\t\tcolorStr[j] = colorStr[j % defaultLength];\r\n\t\t\t}\r\n\t\t}\r\n\t\tcolorList = colorStr.concat();\r\n\r\n\t\tfor (let j = 0; j < colorList.length; j++) {\r\n\t\t\tconst tmpSetColorOrg = colorStr[j].replaceAll(`0x`, `#`).split(`:`);\r\n\t\t\tconst hasColor = tmpSetColorOrg.some(tmpColorOrg => {\r\n\t\t\t\tif (hasVal(tmpColorOrg) && (isColorCd(tmpColorOrg) || !hasAnglePointInfo(tmpColorOrg) || tmpColorOrg === `Default`)) {\r\n\t\t\t\t\tcolorOrg[j] = colorCdPadding(_colorCdPaddingUse, colorToHex(tmpColorOrg));\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tif (!hasColor) {\r\n\t\t\t\tcolorOrg[j] = _colorInit[j];\r\n\t\t\t}\r\n\t\t\tcolorList[j] = makeColorGradation(colorStr[j] === `` ? _colorInit[j] : colorStr[j], {\r\n\t\t\t\t_defaultColorgrd, _colorCdPaddingUse, _objType, _shadowFlg,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t} else {\r\n\r\n\t\t// 未定義の場合は指定されたデフォルト配列(_colorInit)で再定義\r\n\t\tcolorStr = _colorInit.concat();\r\n\t\tcolorOrg = _colorInit.concat();\r\n\t\tcolorList = _colorInit.map(colorStr => makeColorGradation(colorStr, {\r\n\t\t\t_defaultColorgrd, _colorCdPaddingUse, _shadowFlg,\r\n\t\t}));\r\n\t}\r\n\r\n\treturn [colorList, colorStr, colorOrg];\r\n};\r\n\r\n/**\r\n * 複合カスタムゲージの定義設定\r\n * |customGauge=Original::F,Normal::V,Escape::V|\r\n * @param {object} _dosObj \r\n * @param {string} [object.scoreId=0]\r\n * @returns {object} ※Object.assign(obj, resetCustomGauge(...))の形で呼び出しが必要\r\n */\r\nconst resetCustomGauge = (_dosObj, { scoreId = 0 } = {}) => {\r\n\r\n\tconst obj = {};\r\n\tconst scoreIdHeader = setScoreIdHeader(scoreId, g_stateObj.scoreLockFlg, false);\r\n\tconst dosCustomGauge = _dosObj[`customGauge${scoreIdHeader}`];\r\n\tif (hasVal(dosCustomGauge)) {\r\n\t\tif (g_gaugeOptionObj.defaultPlusList.includes(dosCustomGauge)) {\r\n\t\t\tobj[`custom${scoreId}`] = g_gaugeOptionObj[dosCustomGauge].concat();\r\n\t\t\tobj[`varCustom${scoreId}`] = g_gaugeOptionObj[`var${toCapitalize(dosCustomGauge)}`].concat();\r\n\t\t\tif (g_gaugeOptionObj.defaultList.includes(dosCustomGauge)) {\r\n\t\t\t\tobj[`defaultGauge${scoreId}`] = dosCustomGauge;\r\n\t\t\t\tobj[`typeCustom${scoreId}`] = g_gaugeOptionObj[`type${toCapitalize(dosCustomGauge)}`].concat();\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tconst customGauges = dosCustomGauge.split(`,`);\r\n\r\n\t\t\tobj[`custom${scoreId}`] = [];\r\n\t\t\tobj[`varCustom${scoreId}`] = [];\r\n\r\n\t\t\tfor (let j = 0; j < customGauges.length; j++) {\r\n\t\t\t\tconst customGaugeSets = customGauges[j].split(`::`);\r\n\t\t\t\tobj[`custom${scoreId}`][j] = customGaugeSets[0];\r\n\t\t\t\tobj[`varCustom${scoreId}`][j] = boolToSwitch(customGaugeSets[1] === `V`);\r\n\t\t\t}\r\n\t\t\tif (scoreId === 0) {\r\n\t\t\t\tobj.custom = obj.custom0.concat();\r\n\t\t\t\tobj.varCustom = obj.varCustom0.concat();\r\n\t\t\t}\r\n\t\t\taddGaugeFulls(obj[`custom${scoreId}`]);\r\n\t\t}\r\n\t}\r\n\treturn obj;\r\n};\r\n\r\n/**\r\n * ゲージ別個別設定の取得\r\n * @param {object} _dosObj \r\n * @param {string} _name \r\n * @param {number} _difLength\r\n * @param {string} [object.scoreId=0]\r\n */\r\nconst getGaugeSetting = (_dosObj, _name, _difLength, { scoreId = 0 } = {}) => {\r\n\r\n\tconst obj = {\r\n\t\tlifeBorders: [],\r\n\t\tlifeRecoverys: [],\r\n\t\tlifeDamages: [],\r\n\t\tlifeInits: []\r\n\t};\r\n\t/** ゲージ設定再作成フラグ */\r\n\tlet gaugeCreateFlg = false;\r\n\r\n\t/** ゲージ設定上書きフラグ */\r\n\tconst gaugeUpdateFlg = g_stateObj.scoreLockFlg && scoreId > 0;\r\n\r\n\t/**\r\n\t * ゲージ別個別配列への値格納\r\n\t * この時点では各種ゲージ設定は文字列のまま。setGauge関数にて数式に変換される\r\n\t * @param {number} _scoreId \r\n\t * @param {string[]} _gaugeDetails\r\n\t * @returns {boolean}\r\n\t */\r\n\tconst setGaugeDetails = (_scoreId, _gaugeDetails) => {\r\n\r\n\t\tobj.lifeBorders[_scoreId] = _gaugeDetails[0] === `x` ? `x` : _gaugeDetails[0];\r\n\t\tobj.lifeRecoverys[_scoreId] = _gaugeDetails[1];\r\n\t\tobj.lifeDamages[_scoreId] = _gaugeDetails[2];\r\n\t\tobj.lifeInits[_scoreId] = _gaugeDetails[3];\r\n\r\n\t\tif (gaugeUpdateFlg && hasVal(g_gaugeOptionObj[`gauge${_name}s`])) {\r\n\t\t\t// ゲージ上書き時は_gaugeDetails(obj)の値を優先し、デフォルト値で穴埋めする\r\n\t\t\tObject.keys(obj).forEach(key => g_gaugeOptionObj[`gauge${_name}s`][key] =\r\n\t\t\t\tfillMissingArrayElem(g_gaugeOptionObj[`gauge${_name}s`][key] || [], obj[key]));\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t};\r\n\r\n\t/**\r\n\t * gaugeNormal2, gaugeEasy2などの個別設定があった場合にその値から配列を作成\r\n\t * @param {number} _scoreId \r\n\t * @param {number[]} _defaultGaugeList\r\n\t * @returns {number[]}\r\n\t */\r\n\tconst getGaugeDetailList = (_scoreId, _defaultGaugeList) => {\r\n\t\tif (_scoreId > 0) {\r\n\t\t\tconst idHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg, false);\r\n\t\t\tconst dosId = (idHeader || 0) - 1;\r\n\t\t\tconst headerName = `gauge${_name}${idHeader}`;\r\n\t\t\tif (hasVal(_dosObj[headerName])) {\r\n\t\t\t\tconst gauges = splitLF2(_dosObj[headerName]);\r\n\t\t\t\treturn (gauges[dosId] || gauges[0])?.split(`,`);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn _defaultGaugeList;\r\n\t};\r\n\r\n\tif (hasVal(_dosObj[`gauge${_name}`])) {\r\n\r\n\t\tconst gauges = splitLF2(_dosObj[`gauge${_name}`]);\r\n\t\tif (gaugeUpdateFlg) {\r\n\t\t\tgaugeCreateFlg = setGaugeDetails(scoreId, (gauges[scoreId] || gauges[0])?.split(`,`));\r\n\t\t} else {\r\n\t\t\tfor (let j = 0; j < _difLength; j++) {\r\n\t\t\t\tgaugeCreateFlg = setGaugeDetails(j, getGaugeDetailList(j, (gauges[j] || gauges[0]).split(`,`)));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t} else if (g_presetObj.gaugeCustom?.[_name] !== undefined) {\r\n\r\n\t\tconst gaugeDetails = [\r\n\t\t\tg_presetObj.gaugeCustom[_name].Border, g_presetObj.gaugeCustom[_name].Recovery,\r\n\t\t\tg_presetObj.gaugeCustom[_name].Damage, g_presetObj.gaugeCustom[_name].Init,\r\n\t\t];\r\n\t\tif (gaugeUpdateFlg) {\r\n\t\t\tgaugeCreateFlg = setGaugeDetails(scoreId, gaugeDetails);\r\n\t\t} else {\r\n\t\t\tfor (let j = 0; j < _difLength; j++) {\r\n\t\t\t\tgaugeCreateFlg = setGaugeDetails(j, getGaugeDetailList(j, gaugeDetails));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (gaugeCreateFlg) {\r\n\t\tg_gaugeOptionObj[`gauge${_name}s`] = obj;\r\n\t}\r\n};\r\n\r\n/**\r\n * キー名の取得\r\n * @param {string} _key\r\n * @returns {string} キー名\r\n */\r\nconst getKeyName = _key => unEscapeHtml(escapeHtml(g_keyObj[`keyName${_key}`]?.[0] ?? _key));\r\n\r\n/**\r\n * キー単位名の取得\r\n * @param {string} _key \r\n * @returns {string} キー単位名(デフォルト: key)\r\n */\r\nconst getKeyUnitName = _key => unEscapeHtml(escapeHtml(g_keyObj[`keyName${_key}`]?.[1] ?? `key`));\r\n\r\n/**\r\n * 別キーモード時の表示名の取得\r\n * @param {boolean} _spaceFlg\r\n * @returns {string} 別キー名\r\n */\r\nconst getTransKeyName = (_spaceFlg = false) => hasVal(g_keyObj[`transKey${g_keyObj.currentKey}_${g_keyObj.currentPtn}`])\r\n\t? (_spaceFlg ? ` ` : ``) + `(${g_keyObj[`transKey${g_keyObj.currentKey}_${g_keyObj.currentPtn}`]})` : ``;\r\n\r\n/**\r\n * ハイスコア定義を行う際のストレージキー名の取得\r\n * @param {string} _key \r\n * @param {string} _transName \r\n * @param {string} _assistFlg \r\n * @param {string} _mirrorName \r\n * @param {string} _scoreId \r\n * @returns {string}\r\n */\r\nconst getStorageKeyName = (_key, _transName, _assistFlg, _mirrorName, _scoreId) => {\r\n\tlet scoreName = `${_key}${_transName}${getStgDetailName('k-')}${g_headerObj.difLabels[_scoreId]}${_assistFlg}${_mirrorName}`;\r\n\tif (g_headerObj.makerView) {\r\n\t\tscoreName += `-${g_headerObj.creatorNames[_scoreId]}`;\r\n\t}\r\n\treturn scoreName;\r\n};\r\n\r\n/**\r\n * KeyBoardEvent.code の値をCW Edition用のキーコードに変換\r\n * 簡略指定ができるように、以下の記述を許容\r\n * 例) KeyD -> D, ArrowDown -> Down, AltLeft -> Alt\r\n * @param {string} _kCdN\r\n * @returns {number}\r\n */\r\nconst getKeyCtrlVal = _kCdN => {\r\n\tconst convVal = Object.keys(g_kCdN).findIndex(val =>\r\n\t\t[_kCdN, `Key${_kCdN}`, `Arrow${_kCdN}`].includes(g_kCdN[val]) || _kCdN === replaceStr(g_kCdN[val], g_escapeStr.keyCtrlName));\r\n\treturn convVal !== -1 ? convVal : parseInt(_kCdN, 10);\r\n};\r\n\r\n/**\r\n * 一時的な追加キーの設定\r\n * - keyExtraListの指定がない場合は、_dosObj.keyCtrlXに合致するXを追加キーとして追加\r\n * @param {object} _dosObj \r\n * @param {string[]} object.keyExtraList\r\n * @returns {string[]}\r\n */\r\nconst keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`) } = {}) => {\r\n\r\n\tif (keyExtraList === undefined) {\r\n\t\tkeyExtraList = [];\r\n\t\tObject.keys(_dosObj).filter(val => val.startsWith(g_keyObj.defaultProp))\r\n\t\t\t.forEach(keyName => keyExtraList.push(keyName.slice(g_keyObj.defaultProp.length)));\r\n\r\n\t\tif (keyExtraList.length === 0) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t}\r\n\r\n\tconst existParam = (_data, _paramName) => !hasVal(_data) && g_keyObj[_paramName] !== undefined;\r\n\tconst toString = _str => _str;\r\n\tconst toInt = _num => isNaN(parseInt(_num)) ? _num : parseInt(_num);\r\n\tconst toFloat = _num => isNaN(parseFloat(_num)) ? _num : parseFloat(_num);\r\n\tconst toKeyCtrlArray = _str =>\r\n\t\tmakeBaseArray(_str.split(`/`).map(n => getKeyCtrlVal(n)), g_keyObj.minKeyCtrlNum, 0);\r\n\tconst toSplitArrayStr = _str => _str.split(`/`).map(n => n);\r\n\r\n\t// 略記記法を元の文字列に復元後、配列に変換 (1...3,5...7 -> 1,2,3,5,6,7)\r\n\tconst toOriginalArray = (_val, _func) => _val?.split(`,`).map(n => _func(n)).join(`,`).split(`,`);\r\n\r\n\t/**\r\n\t * 略記記法を元の文字列に変換 (1...5 -> 1,2,3,4,5 / 3...+4 -> 3,4,5,6,7)\r\n\t * @param {string} _str \r\n\t * @returns {string}\r\n\t */\r\n\tconst toFloatStr = _str => {\r\n\t\tconst nums = _str?.split(`...`);\r\n\t\tconst bottomMark = nums[0].startsWith(`b`) ? `b` : ``;\r\n\t\tconst [startN, endN] = [parseFloat(bottomMark === `b` ? nums[0].slice(1) : nums[0]), parseFloat(nums[1])];\r\n\r\n\t\tif (nums.length === 2 && !isNaN(startN) && !isNaN(endN)) {\r\n\t\t\tconst endN2 = nums[1].startsWith(`+`) ? startN + endN : endN;\r\n\t\t\tconst arr = [];\r\n\t\t\tfor (let k = startN; k <= endN2; k++) {\r\n\t\t\t\tarr.push(`${bottomMark}${k}`);\r\n\t\t\t}\r\n\t\t\treturn arr.join(`,`);\r\n\t\t} else {\r\n\t\t\treturn _str;\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * 略記記法を元の文字列に変換 (1@:5 -> 1,1,1,1,1 / onigiri!giko!c@:2 -> onigiri,giko,c,onigiri,giko,c)\r\n\t * @param {string} _str\r\n\t * @returns {string}\r\n\t */\r\n\tconst toSameValStr = _str => {\r\n\t\tconst nums = _str?.split(`@:`);\r\n\t\tconst groupStr = toFloatStr(nums[0]).split(`!`).join(`,`);\r\n\t\treturn nums.length === 2 && !isNaN(parseInt(nums[1])) ?\r\n\t\t\tfillArray(Math.floor(parseInt(nums[1])), groupStr).join(`,`) : groupStr;\r\n\t};\r\n\r\n\t/**\r\n\t * キーパターン（相対パターン）をキーパターン（実際のパターン番号）に変換\r\n\t * 例) 12_(0) -> 12_4\r\n\t * それ以外の文字列が来た場合は、そのままの値を戻す\r\n\t * @param {string} _str\r\n\t * @returns {string}\r\n\t */\r\n\tconst getKeyPtnName = _str => {\r\n\t\tconst regex = /\\((\\d+)\\)/;\r\n\t\tconst checkStr = _str.match(regex);\r\n\t\tif (checkStr !== null) {\r\n\t\t\treturn _str.replace(regex, (match, p) => `${parseInt(p, 10) + setIntVal(g_keyObj.dfPtnNum)}`);\r\n\t\t}\r\n\t\treturn _str;\r\n\t};\r\n\r\n\t/**\r\n\t * divMaxX, posXの下段補完処理\r\n\t * ・divXの1番目の指定があるとき、その値を元に下段の位置を補完\r\n\t * 例) |div11x=7,b6|pos11x=0,1,2,3,4,5,6,b0,b1,b5,b6|\r\n\t *  -> |div11x=7,13|pos11x=0,1,2,3,4,5,6,7,8,12,13|\r\n\t * @param {number} _num \r\n\t * @param {number} _divNum \r\n\t * @returns {number}\r\n\t */\r\n\tconst getKeyPosNum = (_num, _divNum = 0) => {\r\n\t\tif (!hasVal(_num) || (!_num.startsWith(`b`) && isNaN(parseFloat(_num)))) {\r\n\t\t\treturn _num;\r\n\t\t}\r\n\t\treturn _num.startsWith(`b`) ? parseFloat(_num.slice(1)) + _divNum : parseFloat(_num);\r\n\t}\r\n\r\n\t/**\r\n\t * キーパターンの略名から実際のデータへ展開\r\n\t * - charaX の場合に限り、a>5_0 の形式を aleft, adown, aup, aright, aspace に変換する\r\n\t * @param {string} _str \r\n\t * @param {string} _name \r\n\t * @param {function} _convFunc\r\n\t * @returns {string[]|number[]}\r\n\t */\r\n\tconst expandKeyPtn = (_str, _name, _convFunc) => {\r\n\t\tconst pos = _str.indexOf(`>`);\r\n\t\tconst expandData = _ptnstr => structuredClone(g_keyObj[`${_name}${getKeyPtnName(_ptnstr)}`]) ?? [_convFunc(_ptnstr)];\r\n\r\n\t\tif (pos > 0 && _name === `chara`) {\r\n\t\t\tconst [header, ptn] = [_str.substring(0, pos), _str.substring(pos + 1)];\r\n\t\t\treturn expandData(ptn)?.map(n => `${header}${n}`);\r\n\t\t} else {\r\n\t\t\treturn expandData(_str);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * 新キー用複合パラメータ\r\n\t * @param {string} _key キー数\r\n\t * @param {string} _name 名前\r\n\t * @param {function} _convFunc マッピング関数\r\n\t * @param {string} object.errCd エラーコード\r\n\t * @param {boolean} object.baseCopyFlg コピー配列の準備可否\r\n\t * @param {function} object.loopFunc パターン別に処理する個別関数\r\n\t * @returns {number} 最小パターン数\r\n\t */\r\n\tconst newKeyMultiParam = (_key, _name, _convFunc, { errCd = ``, baseCopyFlg = false, loopFunc = () => true } = {}) => {\r\n\t\tlet tmpMinPatterns = 1;\r\n\t\tconst keyheader = _name + _key;\r\n\t\tconst dfPtn = setIntVal(g_keyObj.dfPtnNum);\r\n\r\n\t\tif (hasVal(_dosObj[keyheader])) {\r\n\t\t\tconst tmpArray = splitLF2(_dosObj[keyheader]);\r\n\t\t\ttmpMinPatterns = tmpArray.length;\r\n\t\t\tfor (let k = 0; k < tmpMinPatterns; k++) {\r\n\t\t\t\tif (existParam(tmpArray[k], `${keyheader}_${k + dfPtn}`)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\t// |keyCtrl9j=Tab,7_0,Enter| -> |keyCtrl9j=Tab,S,D,F,Space,J,K,L,Enter| のように補完\r\n\t\t\t\t// |pos9j=0..4,6..9| -> |pos9j=0,1,2,3,4,6,7,8,9|\r\n\t\t\t\tg_keyObj[`${keyheader}_${k + dfPtn}`] =\r\n\t\t\t\t\ttoOriginalArray(tmpArray[k], toSameValStr).map(n => expandKeyPtn(n, _name, _convFunc)).flat();\r\n\t\t\t\tif (baseCopyFlg) {\r\n\t\t\t\t\tg_keyObj[`${keyheader}_${k + dfPtn}d`] = structuredClone(g_keyObj[`${keyheader}_${k + dfPtn}`]);\r\n\t\t\t\t}\r\n\t\t\t\tloopFunc(k, keyheader);\r\n\t\t\t}\r\n\r\n\t\t} else if (errCd !== `` && g_keyObj[`${keyheader}_0`] === undefined) {\r\n\t\t\tmakeWarningWindow(g_msgInfoObj[errCd].split(`{0}`).join(_key));\r\n\t\t}\r\n\t\treturn tmpMinPatterns;\r\n\t};\r\n\r\n\t/**\r\n\t * 新キー用複合パラメータ（特殊）\r\n\t * @param {string} _key キー数\r\n\t * @param {string} _name 名前\r\n\t */\r\n\tconst newKeyTripleParam = (_key, _name) => {\r\n\t\tconst keyheader = _name + _key;\r\n\t\tconst dfPtn = setIntVal(g_keyObj.dfPtnNum);\r\n\r\n\t\tif (hasVal(_dosObj[keyheader])) {\r\n\t\t\tsplitLF2(_dosObj[keyheader])?.forEach((tmpParam, k) => {\r\n\t\t\t\tif (existParam(tmpParam, `${keyheader}_${k + dfPtn}`)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet ptnCnt = 0;\r\n\t\t\t\ttmpParam.split(`/`).forEach(list => {\r\n\r\n\t\t\t\t\tconst keyPtn = getKeyPtnName(list);\r\n\t\t\t\t\tif (list === ``) {\r\n\t\t\t\t\t\t// 空指定の場合は一律同じグループへ割り当て\r\n\t\t\t\t\t\tg_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = fillArray(g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length);\r\n\r\n\t\t\t\t\t} else if (g_keyObj[`${_name}${keyPtn}_0`] !== undefined) {\r\n\t\t\t\t\t\t// 他のキーパターン (例: |shuffle8i=8_0| ) を直接指定した場合、該当があれば既存パターンからコピー\r\n\t\t\t\t\t\t// 既存パターンが複数ある場合、全てコピーする\r\n\t\t\t\t\t\tlet m = 0;\r\n\t\t\t\t\t\twhile (g_keyObj[`${_name}${keyPtn}_${m}`] !== undefined) {\r\n\t\t\t\t\t\t\tg_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = structuredClone(g_keyObj[`${_name}${keyPtn}_${m}`]);\r\n\t\t\t\t\t\t\tm++;\r\n\t\t\t\t\t\t\tptnCnt++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// 通常の指定方法 (例: |shuffle8i=1,1,1,2,0,0,0,0/1,1,1,1,0,0,0,0| )の場合の取り込み\r\n\t\t\t\t\t\t// 部分的にキーパターン指定があった場合は既存パターンを展開 (例: |shuffle9j=2,7_0_0,2|)\r\n\t\t\t\t\t\tg_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] =\r\n\t\t\t\t\t\t\tmakeBaseArray(toOriginalArray(list, toSameValStr).map(n =>\r\n\t\t\t\t\t\t\t\texpandKeyPtn(n, _name, _str => isNaN(parseInt(_str)) ? _str : parseInt(_str, 10))\r\n\t\t\t\t\t\t\t).flat(), g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length, 0);\r\n\t\t\t\t\t\tptnCnt++;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tg_keyObj[`${keyheader}_${k + dfPtn}`] = structuredClone(g_keyObj[`${keyheader}_${k + dfPtn}_0`]);\r\n\t\t\t});\r\n\r\n\t\t} else if (g_keyObj[`${keyheader}_${dfPtn}_0`] === undefined) {\r\n\t\t\t// 特に指定が無い場合はkeyCtrlX_Yの配列長で決定\r\n\t\t\tfor (let k = 0; k < g_keyObj.minPatterns; k++) {\r\n\t\t\t\tconst ptnName = `${_key}_${k + dfPtn}`;\r\n\t\t\t\tg_keyObj[`${_name}${ptnName}_0`] = fillArray(g_keyObj[`${g_keyObj.defaultProp}${ptnName}`].length);\r\n\t\t\t\tg_keyObj[`${_name}${ptnName}`] = structuredClone(g_keyObj[`${_name}${ptnName}_0`]);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * 新キー用単一パラメータ\r\n\t * @param {string} _key キー数\r\n\t * @param {string} _name 名前\r\n\t * @param {string} _type float, number, string, boolean\r\n\t * @param {string} _defaultVal\r\n\t */\r\n\tconst newKeySingleParam = (_key, _name, _type, _defaultVal) => {\r\n\t\tconst keyheader = _name + _key;\r\n\t\tconst dfPtn = setIntVal(g_keyObj.dfPtnNum);\r\n\t\tif (_dosObj[keyheader] !== undefined) {\r\n\t\t\tconst tmps = _dosObj[keyheader].split(`$`);\r\n\t\t\tfor (let k = 0; k < tmps.length; k++) {\r\n\t\t\t\tg_keyObj[`${keyheader}_${k + dfPtn}`] = setVal(g_keyObj[`${_name}${getKeyPtnName(tmps[k])}`],\r\n\t\t\t\t\ttmps[k].indexOf(`_`) !== -1 ? _defaultVal : setVal(tmps[k], ``, _type));\r\n\t\t\t}\r\n\t\t\tfor (let k = tmps.length; k < g_keyObj.minPatterns; k++) {\r\n\t\t\t\tg_keyObj[`${keyheader}_${k + dfPtn}`] = g_keyObj[`${keyheader}_0`];\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * 新キー用複合パラメータ（パターン設定用）\r\n\t * @param {string} _key キー数\r\n\t * @param {string} _name 名前\r\n\t * @param {string} _pairName 詳細設定する変数名\r\n\t * @param {string} _defaultName パラメータの初期値\r\n\t * @param {number} _defaultVal パラメータの初期値の場合の一律設定値（colorX_Yの配列幅に対して設定値で埋める）\r\n\t */\r\n\tconst newKeyPairParam = (_key, _name, _pairName, _defaultName = ``, _defaultVal = 0) => {\r\n\t\tconst keyheader = _name + _key;\r\n\t\tconst dfPtn = setIntVal(g_keyObj.dfPtnNum);\r\n\r\n\t\tsplitLF2(_dosObj[keyheader])?.forEach((tmpParam, k) => {\r\n\t\t\tconst pairName = `${_pairName}${_key}_${k + dfPtn}`;\r\n\t\t\tif (!hasVal(tmpParam)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tg_keyObj[pairName] = {};\r\n\r\n\t\t\t// デフォルト項目がある場合は先に定義\r\n\t\t\tif (_defaultName !== ``) {\r\n\t\t\t\tg_keyObj[pairName][_defaultName] = fillArray(g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length, _defaultVal);\r\n\t\t\t}\r\n\t\t\ttmpParam.split(`/`).forEach(pairs => {\r\n\t\t\t\tconst keyPtn = getKeyPtnName(pairs);\r\n\t\t\t\tif (pairs === ``) {\r\n\t\t\t\t} else if (g_keyObj[`${_pairName}${keyPtn}`] !== undefined) {\r\n\t\t\t\t\t// 他のキーパターン指定時、該当があればプロパティを全コピー\r\n\t\t\t\t\tObject.assign(g_keyObj[pairName], g_keyObj[`${_pairName}${keyPtn}`]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 通常の指定方法（例：|scroll8i=Cross::1,1,1,-,-,-,1,1/Split::1,1,1,1,-,-,-,-|）から取り込み\r\n\t\t\t\t\t// 部分的にキーパターン指定があった場合は既存パターンを展開 (例: |scroll9j=Cross::1,7_0,1|)\r\n\t\t\t\t\tconst tmpParamPair = pairs.split(`::`);\r\n\t\t\t\t\tg_keyObj[pairName][tmpParamPair[0]] =\r\n\t\t\t\t\t\tmakeBaseArray(toOriginalArray(tmpParamPair[1], toSameValStr)?.map(n =>\r\n\t\t\t\t\t\t\tstructuredClone(g_keyObj[`${_pairName}${getKeyPtnName(n)}`]?.[tmpParamPair[0]]) ??\r\n\t\t\t\t\t\t\t[n === `-` ? -1 : parseInt(n, 10)]\r\n\t\t\t\t\t\t).flat(), g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length, _defaultVal);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n\r\n\t// 対象キー毎に処理\r\n\tkeyExtraList.forEach(newKey => {\r\n\t\tg_keyObj.minPatterns = 1;\r\n\t\tg_keyObj.dfPtnNum = 0;\r\n\r\n\t\t// キーパターンの追記 (appendX)\r\n\t\tif (setBoolVal(_dosObj[`append${newKey}`])) {\r\n\t\t\tfor (let j = 0; ; j++) {\r\n\t\t\t\tif (g_keyObj[`${g_keyObj.defaultProp}${newKey}_${j}`] === undefined) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tg_keyObj.dfPtnNum++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst dfPtnNum = g_keyObj.dfPtnNum;\r\n\r\n\t\t// キーの名前 (keyNameX)\r\n\t\tg_keyObj[`keyName${newKey}`] = _dosObj[`keyName${newKey}`]?.split(`,`) ?? [newKey, `key`];\r\n\r\n\t\t// キーの最小横幅 (minWidthX)\r\n\t\tg_keyObj[`minWidth${newKey}`] = _dosObj[`minWidth${newKey}`] ?? g_keyObj[`minWidth${newKey}`] ?? g_keyObj.minWidthDefault;\r\n\r\n\t\t// キーコンフィグ (keyCtrlX_Y)\r\n\t\tg_keyObj.minPatterns = newKeyMultiParam(newKey, `keyCtrl`, toKeyCtrlArray, {\r\n\t\t\terrCd: `E_0104`, baseCopyFlg: true,\r\n\t\t});\r\n\r\n\t\t// 読込変数の接頭辞 (charaX_Y)\r\n\t\tnewKeyMultiParam(newKey, `chara`, toString);\r\n\r\n\t\t// 矢印色パターン (colorX_Y)\r\n\t\tnewKeyTripleParam(newKey, `color`);\r\n\r\n\t\t// 矢印の回転量指定、キャラクタパターン (stepRtnX_Y)\r\n\t\tnewKeyTripleParam(newKey, `stepRtn`);\r\n\r\n\t\t// 各キーの区切り位置 (divX_Y)\r\n\t\t_dosObj[`div${newKey}`]?.split(`$`).forEach((tmpDiv, k) => {\r\n\t\t\tconst tmpDivPtn = tmpDiv.split(`,`);\r\n\t\t\tconst ptnName = `${newKey}_${k + dfPtnNum}`;\r\n\r\n\t\t\tif (g_keyObj[`div${tmpDivPtn[0]}`] !== undefined) {\r\n\t\t\t\t// 既定キーパターンが指定された場合、存在すればその値を適用\r\n\t\t\t\tg_keyObj[`div${ptnName}`] = g_keyObj[`div${tmpDivPtn[0]}`];\r\n\t\t\t\tg_keyObj[`divMax${ptnName}`] = setVal(g_keyObj[`divMax${tmpDivPtn[0]}`], undefined, C_TYP_FLOAT);\r\n\t\t\t} else if (!hasVal(tmpDivPtn[0]) && setIntVal(g_keyObj[`div${ptnName}`], -1) !== -1) {\r\n\t\t\t\t// カスタムキー側のdivXが未定義だが、すでに初期設定で定義済みの場合はスキップ\r\n\t\t\t\treturn;\r\n\t\t\t} else {\r\n\t\t\t\t// それ以外の場合は指定された値を適用（未指定時はその後で指定）\r\n\t\t\t\tg_keyObj[`div${ptnName}`] = setVal(tmpDivPtn[0], undefined, C_TYP_NUMBER);\r\n\t\t\t\tg_keyObj[`divMax${ptnName}`] = setVal(getKeyPosNum(tmpDivPtn[1], g_keyObj[`div${ptnName}`]), undefined, C_TYP_FLOAT);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// ステップゾーン位置 (posX_Y)\r\n\t\tnewKeyMultiParam(newKey, `pos`, toFloat, {\r\n\t\t\tloopFunc: (k, keyheader) => {\r\n\t\t\t\tg_keyObj[`${keyheader}_${k + dfPtnNum}`].forEach((val, j) =>\r\n\t\t\t\t\tg_keyObj[`${keyheader}_${k + dfPtnNum}`][j] = getKeyPosNum(String(val), g_keyObj[`div${newKey}_${k + dfPtnNum}`]));\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\t// charaX_Y, posX_Y, keyGroupX_Y, divX_Y, divMaxX_Yが未指定の場合はkeyCtrlX_Yを元に適用\r\n\t\tfor (let k = 0; k < g_keyObj.minPatterns; k++) {\r\n\t\t\tsetKeyDfVal(`${newKey}_${k + dfPtnNum}`);\r\n\t\t}\r\n\r\n\t\t// ステップゾーン間隔 (blankX_Y)\r\n\t\tnewKeySingleParam(newKey, `blank`, C_TYP_FLOAT, g_keyObj.blank_def);\r\n\r\n\t\t// 矢印群の倍率 (scaleX_Y)\r\n\t\tnewKeySingleParam(newKey, `scale`, C_TYP_FLOAT, g_keyObj.scale_def);\r\n\r\n\t\t// プレイ中ショートカット：リトライ (keyRetryX_Y)\r\n\t\tnewKeySingleParam(newKey, `keyRetry`, C_TYP_STRING, C_KEY_RETRY);\r\n\r\n\t\t// プレイ中ショートカット：タイトルバック (keyTitleBackX_Y)\r\n\t\tnewKeySingleParam(newKey, `keyTitleBack`, C_TYP_STRING, C_KEY_TITLEBACK);\r\n\r\n\t\t// 別キーフラグ (transKeyX_Y)\r\n\t\tnewKeySingleParam(newKey, `transKey`, C_TYP_STRING, ``);\r\n\r\n\t\t// フラットモード (flatModeX_Y)\r\n\t\tnewKeySingleParam(newKey, `flatMode`, C_TYP_BOOLEAN, false);\r\n\r\n\t\t// シャッフルグループ (shuffleX_Y)\r\n\t\tnewKeyTripleParam(newKey, `shuffle`);\r\n\r\n\t\t// キーグループ (keyGroupX_Y)\r\n\t\tnewKeyMultiParam(newKey, `keyGroup`, toSplitArrayStr);\r\n\r\n\t\t// キーグループの表示制御 (keyGroupOrderX_Y)\r\n\t\tnewKeyMultiParam(newKey, `keyGroupOrder`, toString);\r\n\r\n\t\t// スクロールパターン (scrollX_Y)\r\n\t\t// |scroll(newKey)=Cross::1,1,-1,-1,-1,1,1/Split::1,1,1,-1,-1,-1,-1$...|\r\n\t\tnewKeyPairParam(newKey, `scroll`, `scrollDir`, `---`, 1);\r\n\r\n\t\t// アシストパターン (assistX_Y)\r\n\t\t// |assist(newKey)=Onigiri::0,0,0,0,0,1/AA::0,0,0,1,1,1$...|\r\n\t\tnewKeyPairParam(newKey, `assist`, `assistPos`);\r\n\r\n\t\t// レーンごとの割当レイヤーグループ (layerGroupX_Y)\r\n\t\tnewKeyMultiParam(newKey, `layerGroup`, toInt);\r\n\r\n\t\t// レイヤーごとのアニメーション情報 (layerTransX_Y)\r\n\t\tif (hasVal(_dosObj[`layerTrans${newKey}`])) {\r\n\t\t\t_dosObj[`layerTrans${newKey}`] = _dosObj[`layerTrans${newKey}`]?.replaceAll(`,`, `___`);\r\n\t\t\tnewKeyMultiParam(newKey, `layerTrans`, toSplitArrayStr, {\r\n\t\t\t\tloopFunc: (k, keyheader) => {\r\n\t\t\t\t\tg_keyObj[`${keyheader}_${k + dfPtnNum}`][0] = g_keyObj[`${keyheader}_${k + dfPtnNum}`]?.[0]?.map(val => val.replaceAll(`___`, `,`));\r\n\t\t\t\t},\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// keyRetry, keyTitleBackのキー名をキーコードに変換\r\n\t\tconst keyTypePatterns = Object.keys(g_keyObj).filter(val => val.startsWith(`keyRetry${newKey}`) || val.startsWith(`keyTitleBack${newKey}`));\r\n\t\tkeyTypePatterns.forEach(name => g_keyObj[name] = getKeyCtrlVal(g_keyObj[name]));\r\n\t});\r\n\r\n\treturn keyExtraList;\r\n};\r\n\r\n/**\r\n * キーパターンのデフォルト値設定\r\n * @param {string} _ptnName \r\n */\r\nconst setKeyDfVal = _ptnName => {\r\n\tconst baseLength = g_keyObj[`${g_keyObj.defaultProp}${_ptnName}`].length;\r\n\tg_keyObj[`chara${_ptnName}`] = padArray(g_keyObj[`chara${_ptnName}`], [...Array(baseLength).keys()].map(i => `${i + 1}a`));\r\n\tg_keyObj[`pos${_ptnName}`] = padArray(g_keyObj[`pos${_ptnName}`], [...Array(baseLength).keys()].map(i => i));\r\n\tg_keyObj[`keyGroup${_ptnName}`] = padArray(g_keyObj[`keyGroup${_ptnName}`], fillArray(baseLength, [`0`]));\r\n\r\n\tif (g_keyObj[`div${_ptnName}`] === undefined) {\r\n\t\tg_keyObj[`div${_ptnName}`] = Math.max(...g_keyObj[`pos${_ptnName}`]) + 1;\r\n\t}\r\n\tif (g_keyObj[`divMax${_ptnName}`] === undefined) {\r\n\t\tg_keyObj[`divMax${_ptnName}`] = Math.max(...g_keyObj[`pos${_ptnName}`]) + 1;\r\n\t}\r\n};\r\n\r\n/*-----------------------------------------------------------*/\r\n/* Scene : TITLE [melon] */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * タイトル画面初期化\r\n * @param {boolean} _initFlg 初期化フラグ\r\n */\r\nconst titleInit = (_initFlg = false) => {\r\n\r\n\tclearWindow(true);\r\n\tg_currentPage = `title`;\r\n\r\n\t// タイトル用フレーム初期化\r\n\tg_scoreObj.titleFrameNum = 0;\r\n\r\n\t// 設定画面位置初期化\r\n\tg_settings.settingWindowNum = 0;\r\n\r\n\t// タイトルアニメーション用フレーム初期化、ループカウンター設定\r\n\tg_animationData.forEach(sprite => {\r\n\t\tg_scoreObj[`${sprite}TitleFrameNum`] = 0;\r\n\t\tg_scoreObj[`${sprite}TitleLoopCount`] = 0;\r\n\t});\r\n\r\n\tconst keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;\r\n\r\n\t// 譜面初期情報ロード許可フラグ\r\n\t// (初回読み込み時はローカルストレージのロードが必要なため、\r\n\t//  ローカルストレージ保存時はフラグを解除しない)\r\n\tif (!g_stateObj.dataSaveFlg || hasVal(g_keyObj[`transKey${keyCtrlPtn}`])) {\r\n\t\tg_canLoadDifInfoFlg = false;\r\n\t}\r\n\tconst divRoot = document.getElementById(`divRoot`);\r\n\r\n\t// 曲時間制御変数\r\n\tlet thisTime;\r\n\tlet buffTime;\r\n\tlet titleStartTime = performance.now();\r\n\r\n\t// 背景スプライトを作成\r\n\tcreateMultipleSprite(`backTitleSprite`, g_headerObj.backTitleMaxDepth);\r\n\r\n\t// タイトル文字描画\r\n\tdivRoot.appendChild(\r\n\t\tgetTitleDivLabel(`lblTitle`,\r\n\t\t\t`<div class=\"settings_Title\">${g_lblNameObj.dancing}</div>\r\n\t\t<div class=\"settings_TitleStar\">${g_lblNameObj.star}</div>\r\n\t\t<div class=\"settings_Title2\">${g_lblNameObj.onigiri}</div>`\r\n\t\t\t\t.replace(/[\\t\\n]/g, ``), 0, 15, g_cssObj.flex_centering)\r\n\t);\r\n\r\n\t// 背景の矢印オブジェクトを表示\r\n\tconst tmpCreatorList = [];\r\n\tif (g_headerObj.musicSelectUse) {\r\n\t\tif (getQueryParamVal(`scoreId`) !== null) {\r\n\t\t\tg_headerObj.viewLists = [];\r\n\t\t\tg_headerObj.musicNos.forEach((val, j) => {\r\n\t\t\t\tif ((g_headerObj.musicGroups?.[val] ?? val) === g_settings.musicIdxNum) {\r\n\t\t\t\t\tg_headerObj.viewLists.push(j);\r\n\t\t\t\t\ttmpCreatorList.push(g_headerObj.creatorNames[j]);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tdivRoot.appendChild(drawBackArrow(g_headerObj.viewLists[0] + 1));\r\n\t\t\tloadLocalStorage(g_settings.musicIdxNum);\r\n\t\t\tmakeInfoWindow(g_msgInfoObj.W_0041.split(`{0}`).join(g_localStorageUrl), ``,\r\n\t\t\t\t{ _backColor: `#333333`, _textColor: `#cccccc`, _pointerEvents: C_DIS_INHERIT });\r\n\t\t}\r\n\t} else if (!g_headerObj.customTitleArrowUse) {\r\n\t\tdivRoot.appendChild(drawBackArrow());\r\n\t}\r\n\r\n\tlet wheelHandler;\r\n\tif (g_headerObj.musicSelectUse && getQueryParamVal(`scoreId`) === null) {\r\n\r\n\t\t// 選曲画面の初期化\r\n\t\tconst wheelCycle = 2;\r\n\t\tg_settings.musicLoopNum = 0;\r\n\r\n\t\t/**\r\n\t\t * メイン以外の選曲ボタンの作成\r\n\t\t * @param {number} _heightPos \r\n\t\t * @returns {HTMLDivElement}\r\n\t\t */\r\n\t\tconst createMSelectBtn = (_heightPos) => createCss2Button(`btnMusicSelect${_heightPos}`,\r\n\t\t\t``, () => changeMSelect(_heightPos), {\r\n\t\t\tx: g_btnX(1 / 3) + Math.abs(_heightPos) * 10,\r\n\t\t\ty: g_sHeight / 2 + _heightPos * 30 + (_heightPos > 0 ? 1 : -1) * 90,\r\n\t\t\tw: g_btnWidth(1 / 2), h: 27, siz: 14, border: `solid 1px #666666`,\r\n\t\t\talign: C_ALIGN_LEFT, padding: `0 10px`,\r\n\t\t}, g_cssObj.button_Default_NoColor, g_cssObj.title_base);\r\n\r\n\t\t/**\r\n\t\t * 選曲画面上の音量調整\r\n\t\t * @param {number} _num \r\n\t\t */\r\n\t\tconst setBGMVolume = (_num = 1) => {\r\n\t\t\tg_settings.bgmVolumeNum = nextPos(g_settings.bgmVolumeNum, _num, g_settings.volumes.length);\r\n\t\t\tg_stateObj.bgmVolume = g_settings.volumes[g_settings.bgmVolumeNum];\r\n\t\t\tg_audio.volume = g_stateObj.bgmVolume / 100;\r\n\t\t\tbtnBgmVolume.textContent = `${g_stateObj.bgmVolume}${g_lblNameObj.percent}`;\r\n\t\t};\r\n\r\n\t\tfor (let j = -g_settings.mSelectableTerms; j <= g_settings.mSelectableTerms; j++) {\r\n\t\t\tif (j !== 0) {\r\n\t\t\t\tdivRoot.appendChild(createMSelectBtn(j));\r\n\t\t\t}\r\n\t\t}\r\n\t\tcreateEmptySprite(divRoot, `keyTitleSprite`, g_windowObj.keyTitleSprite);\r\n\t\tmultiAppend(divRoot,\r\n\t\t\tcreateDivCss2Label(`lblMusicSelect`, ``, g_lblPosObj.lblMusicSelect),\r\n\t\t\tcreateDivCss2Label(`lblMusicSelectDetail`, ``, g_lblPosObj.lblMusicSelectDetail),\r\n\t\t\tcreateCss2Button(`btnStart`,\r\n\t\t\t\t`>`, () => {\r\n\t\t\t\t\tclearTimeout(g_timeoutEvtTitleId);\r\n\t\t\t\t\tpauseBGM();\r\n\t\t\t\t\tg_handler.removeListener(wheelHandler);\r\n\t\t\t\t\tg_keyObj.prevKey = `Dummy${g_settings.musicIdxNum}`;\r\n\t\t\t\t\tg_langStorage.bgmVolume = g_stateObj.bgmVolume;\r\n\t\t\t\t\tlocalStorage.setItem(`danoni-locale`, JSON.stringify(g_langStorage));\r\n\t\t\t\t}, Object.assign({\r\n\t\t\t\t\tresetFunc: () => optionInit(),\r\n\t\t\t\t}, g_lblPosObj.btnStart_music), g_cssObj.button_Tweet),\r\n\t\t\tcreateCss2Button(`btnMusicSelectPrev`, `↑`, () => changeMSelect(-1),\r\n\t\t\t\tg_lblPosObj.btnMusicSelectPrev, g_cssObj.button_Setting),\r\n\t\t\tcreateCss2Button(`btnMusicSelectNext`, `↓`, () => changeMSelect(1),\r\n\t\t\t\tg_lblPosObj.btnMusicSelectNext, g_cssObj.button_Setting),\r\n\t\t\tcreateCss2Button(`btnMusicSelectRandom`, `Random`, () =>\r\n\t\t\t\tchangeMSelect(Math.floor(Math.random() * (g_headerObj.musicIdxList.length - 1)) + 1),\r\n\t\t\t\tg_lblPosObj.btnMusicSelectRandom, g_cssObj.button_Default),\r\n\t\t\tcreateDivCss2Label(`lblMusicCnt`, ``, g_lblPosObj.lblMusicCnt),\r\n\t\t\tcreateDivCss2Label(`lblCommentM`, ``, g_lblPosObj.lblComment_music),\r\n\r\n\t\t\tcreateDivCss2Label(`lblBgmVolume`, `BGM Volume`, g_lblPosObj.lblBgmVolume),\r\n\t\t\tcreateCss2Button(`btnBgmMute`, g_stateObj.bgmMuteFlg ? g_emojiObj.muted : g_emojiObj.speaker, evt => {\r\n\t\t\t\tg_stateObj.bgmMuteFlg = !g_stateObj.bgmMuteFlg;\r\n\t\t\t\tg_stateObj.bgmMuteFlg ? pauseBGM() : playBGM(0);\r\n\t\t\t\tevt.target.innerHTML = g_stateObj.bgmMuteFlg ? g_emojiObj.muted : g_emojiObj.speaker;\r\n\t\t\t}, g_lblPosObj.btnBgmMute, g_cssObj.button_Default),\r\n\t\t\tcreateCss2Button(`btnBgmVolume`, `${g_stateObj.bgmVolume}${g_lblNameObj.percent}`, () => setBGMVolume(),\r\n\t\t\t\tObject.assign({\r\n\t\t\t\t\tcxtFunc: () => setBGMVolume(-1),\r\n\t\t\t\t}, g_lblPosObj.btnBgmVolume), g_cssObj.button_Default),\r\n\t\t\tcreateCss2Button(`btnBgmVolumeL`, `<`, () => setBGMVolume(-1),\r\n\t\t\t\tg_lblPosObj.btnBgmVolumeL, g_cssObj.button_Setting),\r\n\t\t\tcreateCss2Button(`btnBgmVolumeR`, `>`, () => setBGMVolume(),\r\n\t\t\t\tg_lblPosObj.btnBgmVolumeR, g_cssObj.button_Setting),\r\n\t\t);\r\n\t\tchangeMSelect(0, _initFlg);\r\n\r\n\t\tlet wheelCnt = 0;\r\n\t\twheelHandler = g_handler.addListener(divRoot, `wheel`, e => {\r\n\r\n\t\t\tif (document.getElementById(`lblComment`) !== null && lblComment.style.display === C_DIS_INHERIT) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// コメント欄（lblCommentM）のスクロール可能性をチェック\r\n\t\t\tconst isScrollable = lblCommentM.scrollHeight > lblCommentM.clientHeight;\r\n\r\n\t\t\t// マウスがコメント欄上にあり、スクロールが可能ならイベントをスキップ\r\n\t\t\tif (lblCommentM.contains(e.target) && isScrollable) {\r\n\t\t\t\t// スクロール位置の判定\r\n\t\t\t\tconst atTop = lblCommentM.scrollTop === 0 && e.deltaY < 0;\r\n\t\t\t\tconst atBottom = (lblCommentM.scrollTop + lblCommentM.clientHeight >= lblCommentM.scrollHeight) && e.deltaY > 0;\r\n\r\n\t\t\t\t// スクロール可能＆上端または下端ではないなら処理をスキップ\r\n\t\t\t\tif (!atTop && !atBottom) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\te.preventDefault();\r\n\t\t\tif (g_stateObj.keyInitial && wheelCnt === 0) {\r\n\t\t\t\tchangeMSelect(e.deltaY > 0 ? 1 : -1);\r\n\t\t\t}\r\n\t\t\twheelCnt = (wheelCnt + 1) % wheelCycle;\r\n\t\t});\r\n\r\n\t\t// 初期表示用 (2秒後に選曲画面を表示)\r\n\t\tif (_initFlg && !g_headerObj.customTitleUse) {\r\n\t\t\tg_audio.muted = true;\r\n\t\t\tconst mSelectTitleSprite = createEmptySprite(divRoot, `mSelectTitleSprite`,\r\n\t\t\t\tg_windowObj.mSelectTitleSprite, g_cssObj.settings_DifSelector);\r\n\t\t\tmultiAppend(mSelectTitleSprite,\r\n\t\t\t\tdrawBackArrow(),\r\n\t\t\t\tdrawTitle(g_headerObj.packageNames),\r\n\t\t\t);\r\n\r\n\t\t\tlet spriteOpacity = 1;\r\n\t\t\tlet fadeOpacity = null;\r\n\t\t\tconst fadeStartOpacity = setTimeout(() => {\r\n\t\t\t\tclearTimeout(fadeStartOpacity);\r\n\t\t\t\tsetOpacity(spriteOpacity);\r\n\t\t\t}, 2000);\r\n\r\n\t\t\tconst setOpacity = (_opacity) => {\r\n\t\t\t\tif (_opacity <= 0) {\r\n\t\t\t\t\tclearTimeout(fadeOpacity);\r\n\t\t\t\t\tmSelectTitleSprite.style.display = C_DIS_NONE;\r\n\t\t\t\t\tg_audio.muted = false;\r\n\t\t\t\t\tg_audio.currentTime = g_headerObj.musicStarts[g_headerObj.musicIdxList[g_settings.musicIdxNum]] ?? 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tmSelectTitleSprite.style.opacity = _opacity;\r\n\t\t\t\t\tfadeOpacity = setTimeout(() => {\r\n\t\t\t\t\t\tspriteOpacity -= 0.25;\r\n\t\t\t\t\t\tsetOpacity(spriteOpacity);\r\n\t\t\t\t\t}, 50);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t} else if (!g_headerObj.customTitleUse) {\r\n\t\t// 曲名文字描画（曲名は譜面データから取得）\r\n\t\tdivRoot.appendChild(\r\n\t\t\tg_headerObj.musicSelectUse\r\n\t\t\t\t? drawTitle(g_headerObj.musicTitlesForView[g_settings.musicIdxNum], g_headerObj.viewLists[0] + 1)\r\n\t\t\t\t: drawTitle()\r\n\t\t);\r\n\t}\r\n\r\n\t// クレジット表示\r\n\texternalWebTitle();\r\n\r\n\tif (g_errMsgObj.title !== ``) {\r\n\t\tmakeWarningWindow();\r\n\t}\r\n\r\n\t// ユーザカスタムイベント(初期)\r\n\tg_customJsObj.title.forEach(func => func());\r\n\r\n\t// バージョン情報取得\r\n\tlet customVersion = ``;\r\n\tif (g_localVersion !== ``) {\r\n\t\tcustomVersion = ` / ${g_localVersion}`;\r\n\t}\r\n\tif (g_localVersion2 !== ``) {\r\n\t\tcustomVersion += ` / ${g_localVersion2}`;\r\n\t}\r\n\tconst releaseDate = (g_headerObj.releaseDate !== `` ? ` @${g_headerObj.releaseDate}` : ``);\r\n\tconst versionName = `&copy; 2018-${g_revisedDate.slice(0, 4)} ティックル, CW ${g_version}${customVersion}${releaseDate}`;\r\n\tconst getLinkSiz = _name => getFontSize2(_name, g_sWidth / 2 - 20, { maxSiz: g_limitObj.lnkSiz, minSiz: 12 });\r\n\r\n\t/**\r\n\t * クレジット用リンク作成\r\n\t * @param {string} _id \r\n\t * @param {string} _text \r\n\t * @param {string} _url \r\n\t * @returns {HTMLDivElement}\r\n\t */\r\n\tconst createCreditBtn = (_id, _text, _url) =>\r\n\t\tcreateCss2Button(_id, _text, () => true,\r\n\t\t\tObject.assign(g_lblPosObj[_id], { siz: getLinkSiz(_text), whiteSpace: `normal`, resetFunc: () => openLink(_url) }), g_cssObj.button_Default);\r\n\r\n\tif (g_headerObj.musicSelectUse && getQueryParamVal(`scoreId`) === null) {\r\n\t\t// 選曲モードではクレジット表示は別で行われているため表示しない\r\n\t} else {\r\n\t\tif (tmpCreatorList.length === 0) {\r\n\t\t\ttmpCreatorList.push(g_headerObj.creatorNames[0]);\r\n\t\t}\r\n\t\tconst [creatorName, creatorUrl] = getCreatorInfo(tmpCreatorList);\r\n\r\n\t\tmultiAppend(divRoot,\r\n\r\n\t\t\t// Click Here\r\n\t\t\tcreateCss2Button(`btnStart`, g_lblNameObj.clickHere, () => {\r\n\t\t\t\tclearTimeout(g_timeoutEvtTitleId);\r\n\t\t\t\tg_keyObj.prevKey = `Dummy${g_settings.musicIdxNum}`;\r\n\t\t\t}, {\r\n\t\t\t\tx: g_btnX(), w: g_btnWidth(), siz: g_limitObj.titleSiz, resetFunc: () => optionInit(),\r\n\t\t\t}, g_cssObj.button_Start),\r\n\r\n\t\t\t// 製作者表示\r\n\t\t\tcreateCreditBtn(`lnkMaker`, `${g_lblNameObj.maker}: ${g_headerObj.musicSelectUse ? creatorName : g_headerObj.tuningInit}`,\r\n\t\t\t\tg_headerObj.musicSelectUse ? creatorUrl : g_headerObj.creatorUrl),\r\n\r\n\t\t\t// アーティスト表示\r\n\t\t\tcreateCreditBtn(`lnkArtist`, `${g_lblNameObj.artist}: ${g_headerObj.artistNames[g_settings.musicIdxNum]}`, g_headerObj.artistUrls[g_settings.musicIdxNum]),\r\n\t\t);\r\n\t}\r\n\r\n\tmultiAppend(divRoot,\r\n\r\n\t\t// Reset\r\n\t\tcreateCss2Button(`btnReset`, g_lblNameObj.dataReset, () => {\r\n\t\t\tclearTimeout(g_timeoutEvtTitleId);\r\n\t\t\tg_handler.removeListener(wheelHandler);\r\n\t\t\tdataMgtInit();\r\n\t\t}, g_lblPosObj.btnReset, g_cssObj.button_Reset),\r\n\r\n\t\t// ロケール切替\r\n\t\tcreateCss2Button(`btnReload`, g_localeObj.val, () => true,\r\n\t\t\tObject.assign(g_lblPosObj.btnReload, {\r\n\t\t\t\tresetFunc: () => {\r\n\t\t\t\t\tg_localeObj.num = (++g_localeObj.num) % g_localeObj.list.length;\r\n\t\t\t\t\tg_langStorage.locale = g_localeObj.list[g_localeObj.num];\r\n\t\t\t\t\tlocalStorage.setItem(`danoni-locale`, JSON.stringify(g_langStorage));\r\n\t\t\t\t\tlocation.reload();\r\n\t\t\t\t},\r\n\t\t\t}), g_cssObj.button_Start),\r\n\r\n\t\t// ヘルプ\r\n\t\tcreateCss2Button(`btnHelp`, `?`, () => true,\r\n\t\t\tObject.assign(g_lblPosObj.btnHelp, {\r\n\t\t\t\tresetFunc: () => openLink(g_lblNameObj.helpUrl),\r\n\t\t\t}), g_cssObj.button_Setting),\r\n\r\n\t\t// バージョン描画\r\n\t\tcreateCss2Button(`lnkVersion`, versionName, () => true,\r\n\t\t\tObject.assign(g_lblPosObj.lnkVersion, {\r\n\t\t\t\tsiz: getFontSize2(versionName, g_sWidth * 3 / 4 - 20, { maxSiz: 12 }),\r\n\t\t\t\tresetFunc: () => openLink(`https://github.com/cwtickle/danoniplus`),\r\n\t\t\t}), g_cssObj.button_Tweet),\r\n\r\n\t\t// セキュリティリンク\r\n\t\tcreateCss2Button(`lnkComparison`, g_emojiObj.shield, () => true,\r\n\t\t\tObject.assign(g_lblPosObj.lnkComparison, {\r\n\t\t\t\tresetFunc: () => openLink(g_lblNameObj.securityUrl),\r\n\t\t\t}), g_cssObj.button_Tweet),\r\n\t);\r\n\r\n\t// コメントエリア作成\r\n\tif (g_headerObj.commentVal !== ``) {\r\n\r\n\t\t// コメント文の加工\r\n\t\tconst convCommentVal = convertStrToVal(g_headerObj.commentVal);\r\n\t\tif (g_headerObj.commentExternal) {\r\n\t\t\tif (document.getElementById(`commentArea`) !== null) {\r\n\t\t\t\tcommentArea.innerHTML = convCommentVal;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tmultiAppend(divRoot,\r\n\t\t\t\tcreateDivCss2Label(`lblComment`, convCommentVal, g_lblPosObj.lblComment),\r\n\t\t\t\tcreateCss2Button(`btnComment`, g_lblNameObj.comment, () => {\r\n\t\t\t\t\tconst lblCommentDef = lblComment.style.display;\r\n\t\t\t\t\tlblComment.style.display = (lblCommentDef === C_DIS_NONE ? C_DIS_INHERIT : C_DIS_NONE);\r\n\t\t\t\t}, g_lblPosObj.btnComment, g_cssObj.button_Default),\r\n\t\t\t);\r\n\t\t\tif (g_headerObj.musicSelectUse && getQueryParamVal(`scoreId`) === null) {\r\n\t\t\t\tlblComment.style.height = `${g_sHeight - 100}px`;\r\n\t\t\t}\r\n\t\t\tsetUserSelect(lblComment.style, `text`);\r\n\t\t}\r\n\t}\r\n\r\n\t// マスクスプライトを作成\r\n\tconst maskTitleSprite = createMultipleSprite(`maskTitleSprite`, g_headerObj.maskTitleMaxDepth);\r\n\tmaskTitleSprite.style.pointerEvents = g_headerObj.masktitleButton ? C_DIS_AUTO : C_DIS_NONE;\r\n\r\n\t/**\r\n\t * タイトルのモーション設定\r\n\t */\r\n\tconst flowTitleTimeline = () => {\r\n\r\n\t\t// ユーザカスタムイベント(フレーム毎)\r\n\t\tg_customJsObj.titleEnterFrame.forEach(func => func());\r\n\r\n\t\t// 背景・マスクモーション、スキン変更\r\n\t\tdrawTitleResultMotion(g_currentPage);\r\n\r\n\t\tthisTime = performance.now();\r\n\t\tbuffTime = thisTime - titleStartTime - g_scoreObj.titleFrameNum * 1000 / g_fps;\r\n\r\n\t\tg_scoreObj.titleFrameNum++;\r\n\t\tg_animationData.forEach(sprite => g_scoreObj[`${sprite}TitleFrameNum`]++);\r\n\t\tg_timeoutEvtTitleId = setTimeout(flowTitleTimeline, 1000 / g_fps - buffTime);\r\n\t};\r\n\r\n\tg_timeoutEvtTitleId = setTimeout(flowTitleTimeline, 1000 / g_fps);\r\n\r\n\t// キー操作イベント（デフォルト）\r\n\tsetShortcutEvent(g_currentPage, () => true, { dfEvtFlg: true });\r\n\r\n\tdocument.oncontextmenu = () => true;\r\n\tdivRoot.oncontextmenu = () => false;\r\n\r\n\tg_skinJsObj.title.forEach(func => func());\r\n};\r\n\r\n/**\r\n * 外部のタイトル表示\r\n */\r\nconst externalWebTitle = () => {\r\n\tif (document.getElementById(`webMusicTitle`) !== null) {\r\n\t\twebMusicTitle.innerHTML =\r\n\t\t\t`<span style=\"font-size:${wUnit(32)}\">${g_headerObj.musicTitlesForView[g_settings.musicIdxNum].join(`<br>`)}</span><br>\r\n\t\t\t<span style=\"font-size:${wUnit(16)}\">(Artist: <a href=\"${g_headerObj.artistUrls[g_settings.musicIdxNum]}\" target=\"_blank\">${g_headerObj.artistNames[g_settings.musicIdxNum]}</a>)</span>`;\r\n\t}\r\n};\r\n\r\n/**\r\n * 背景矢印の表示\r\n * @param {string|number} _scoreId \r\n * @returns {HTMLDivElement}\r\n */\r\nconst drawBackArrow = (_scoreId = ``) =>\r\n\tcreateColorObject2(`lblArrow`, {\r\n\t\tx: (g_sWidth - 500) / 2, y: -15 + (g_sHeight - 500) / 2,\r\n\t\tw: 500, h: 500, rotateEnabled: true,\r\n\t\tbackground: makeColorGradation(g_headerObj.titlearrowgrds[0] ||\r\n\t\t\tg_headerObj[`setColor${_scoreId}Org`]?.[0] || g_headerObj.setColorOrg[0], {\r\n\t\t\t_defaultColorgrd: [false, `#eeeeee`],\r\n\t\t\t_objType: `titleArrow`,\r\n\t\t}), rotate: `titleArrow:${g_headerObj.titleArrowRotate}`,\r\n\t});\r\n\r\n/**\r\n * タイトル文字の表示\r\n * @param {string[]} _titleName \r\n * @returns {HTMLDivElement}\r\n */\r\nconst drawTitle = (_titleName = g_headerObj.musicTitleForView, _scoreId = ``) => {\r\n\r\n\t// グラデーションの指定がない場合、\r\n\t// 矢印色の1番目と3番目を使ってタイトルをグラデーション\r\n\tconst titlegrd1 = g_headerObj.titlegrds[0] || (g_headerObj[`setColor${_scoreId}Org`] ?\r\n\t\t`${g_headerObj[`setColor${_scoreId}Org`][0]}:${g_headerObj[`setColor${_scoreId}Org`][2]}` : `${g_headerObj.setColorOrg[0]}:${g_headerObj.setColorOrg[2]}`);\r\n\tconst titlegrd2 = g_headerObj.titlegrds[1] || titlegrd1;\r\n\r\n\tconst titlegrds = [];\r\n\t[titlegrd1, titlegrd2].forEach((titlegrd, j) =>\r\n\t\ttitlegrds[j] = makeColorGradation(titlegrd, { _defaultColorgrd: false, _objType: `titleMusic` }));\r\n\r\n\tlet titlefontsize = 64;\r\n\tfor (let j = 0; j < _titleName.length; j++) {\r\n\t\tif (_titleName[j] !== ``) {\r\n\t\t\ttitlefontsize = getFontSize2(_titleName[j], g_sWidth - 100, { font: g_headerObj.titlefonts[j], maxSiz: titlefontsize });\r\n\t\t}\r\n\t}\r\n\r\n\t// 変数 titlesize の定義 (使用例： |titlesize=40$20|)\r\n\tconst titlefontsizes = (g_headerObj.titlesize?.split(`$`).join(`,`).split(`,`) || [titlefontsize, titlefontsize]);\r\n\tconst titlefontsize1 = setIntVal(titlefontsizes[0], titlefontsize);\r\n\tconst titlefontsize2 = setIntVal(titlefontsizes[1], titlefontsize1);\r\n\r\n\t// 変数 titlelineheight の定義 (使用例： |titlelineheight=50|)\r\n\tconst titlelineheight = (g_headerObj.titlelineheight !== `` ? g_headerObj.titlelineheight - (titlefontsize2 + 10) : 0);\r\n\r\n\tconst txtAnimations = [``, ``];\r\n\tif (!g_headerObj.customTitleAnimationUse) {\r\n\t\tfor (let j = 0; j < txtAnimations.length; j++) {\r\n\t\t\ttxtAnimations[j] = `animation-name:${g_headerObj.titleAnimationName[j]};\r\n\t\t\tanimation-duration:${g_headerObj.titleAnimationDuration[j]}s;\r\n\t\t\tanimation-delay:${g_headerObj.titleAnimationDelay[j]}s;\r\n\t\t\tanimation-timing-function:${g_headerObj.titleAnimationTimingFunction[j]};`;\r\n\t\t}\r\n\t}\r\n\treturn createDivCss2Label(`lblmusicTitle`,\r\n\t\t`<div id=\"lblmusicTitle1\" style=\"\r\n\t\t\tfont-family:${g_headerObj.titlefonts[0]};\r\n\t\t\tbackground: ${titlegrds[0]};\r\n\t\t\tbackground-clip: text;\r\n\t\t\t-webkit-background-clip: text;\r\n\t\t\tcolor: rgba(255,255,255,0.0);\r\n\t\t\t${txtAnimations[0]}\r\n\t\t\" class=\"${g_headerObj.titleAnimationClass[0]}\">\r\n\t\t\t${_titleName[0]}\r\n\t\t</div>\r\n\t\t<div id=\"lblmusicTitle2\" style=\"\r\n\t\t\tfont-size:${wUnit(titlefontsize2)};\r\n\t\t\tposition:relative;left:${wUnit(g_headerObj.titlepos[1][0])};\r\n\t\t\ttop:${wUnit(g_headerObj.titlepos[1][1] + titlelineheight)};\r\n\t\t\tfont-family:${g_headerObj.titlefonts[1]};\r\n\t\t\tbackground: ${titlegrds[1]};\r\n\t\t\tbackground-clip: text;\r\n\t\t\t-webkit-background-clip: text;\r\n\t\t\tcolor: rgba(255,255,255,0.0);\r\n\t\t\t${txtAnimations[1]}\r\n\t\t\" class=\"${g_headerObj.titleAnimationClass[1]}\">\r\n\t\t\t${_titleName[1] ?? ``}\r\n\t\t</div>\r\n\t\t`,\r\n\t\t{\r\n\t\t\tx: Number(g_headerObj.titlepos[0][0]), y: Number(g_headerObj.titlepos[0][1]),\r\n\t\t\tw: g_sWidth, h: g_sHeight - 40, siz: titlefontsize1,\r\n\t\t\tdisplay: `flex`, flexDirection: `column`, justifyContent: `center`, alignItems: `center`,\r\n\t\t}\r\n\t);\r\n};\r\n\r\n/**\r\n * 製作者情報の取得\r\n * @param {string[]} _creatorList \r\n * @returns {[string, string, number]}\r\n */\r\nconst getCreatorInfo = (_creatorList) => {\r\n\tconst creatorName = makeDedupliArray(_creatorList).length === 1 ? _creatorList[0] : `Various`;\r\n\tg_headerObj.makerView = g_headerObj.makerViewOrg ? true : creatorName === `Various`;\r\n\tconst creatorIdx = g_headerObj.tuningNames.findIndex(val => val === creatorName);\r\n\tconst creatorUrl = creatorIdx >= 0 ? g_headerObj.tuningUrls[creatorIdx] : ``;\r\n\treturn [creatorName, creatorUrl, creatorIdx];\r\n}\r\n\r\n/**\r\n * BGMの停止\r\n */\r\nconst pauseBGM = () => {\r\n\tif (g_audio) {\r\n\t\tg_handler.removeListener(g_stateObj.bgmTimeupdateEvtId);\r\n\t\tg_audio.pause();\r\n\t\tif (!(g_audio instanceof AudioPlayer)) {\r\n\t\t\tg_audio.removeAttribute('src');\r\n\t\t\tg_audio.load();\r\n\t\t}\r\n\t}\r\n\t[`bgmLooped`, `bgmFadeIn`, `bgmFadeOut`].forEach(id => {\r\n\t\tif (g_stateObj[id]) {\r\n\t\t\tclearTimeout(g_stateObj[id]);\r\n\t\t\tg_stateObj[id] = null;\r\n\t\t}\r\n\t});\r\n};\r\n\r\n/**\r\n * BGM再生処理\r\n * @param {number} _num \r\n * @param {number} _currentLoopNum\r\n */\r\nconst playBGM = async (_num, _currentLoopNum = g_settings.musicLoopNum) => {\r\n\tconst FADE_STEP = 0.05 * g_stateObj.bgmVolume / 100;\r\n\tconst FADE_INTERVAL_MS = 100;\r\n\tconst FADE_DELAY_MS = 500;\r\n\r\n\tconst currentIdx = g_headerObj.musicIdxList[g_settings.musicIdxNum];\r\n\tconst musicUrl = getMusicUrl(g_headerObj.viewLists[0]);\r\n\tconst url = getFullMusicUrl(musicUrl);\r\n\tconst encodeFlg = listMatching(musicUrl, [`.js`, `.txt`], { suffix: `$` });\r\n\tconst musicStart = g_headerObj.musicStarts?.[currentIdx] ?? 0;\r\n\tconst musicEnd = g_headerObj.musicEnds?.[currentIdx] ?? 0;\r\n\tconst isTitle = () => g_currentPage === `title` && _currentLoopNum === g_settings.musicLoopNum;\r\n\r\n\t/**\r\n\t * 汎用フェード処理\r\n\t * @param {number} startVolume - 開始音量 (0〜1)\r\n\t * @param {number} endVolume - 終了音量 (0〜1)\r\n\t * @param {number} step - 1ステップの増減量\r\n\t * @param {function} onEnd - フェード完了時の処理\r\n\t * @param {function} isValid - フェード継続条件（true: 継続, false: 中断）\r\n\t * @returns {number} timeoutId\r\n\t */\r\n\tconst fadeVolume = (startVolume, endVolume, step, onEnd, isValid) => {\r\n\r\n\t\t// 開始時点で終了音量とイコールの場合は終了\r\n\t\tif (startVolume === endVolume || step === 0) {\r\n\t\t\tg_audio.volume = endVolume;\r\n\t\t\tonEnd(true);\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tlet volume = startVolume;\r\n\t\tg_audio.volume = startVolume;\r\n\r\n\t\tconst stepFunc = () => {\r\n\t\t\t// 継続条件チェック\r\n\t\t\tif (!isValid()) {\r\n\t\t\t\tonEnd(false); // 中断\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// 終了判定\r\n\t\t\tconst reached =\r\n\t\t\t\t(startVolume < endVolume && volume >= endVolume) ||\r\n\t\t\t\t(startVolume > endVolume && volume <= endVolume);\r\n\r\n\t\t\tif (reached) {\r\n\t\t\t\tg_audio.volume = endVolume;\r\n\t\t\t\tonEnd(true); // 正常終了\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// 音量更新\r\n\t\t\tvolume += step;\r\n\t\t\tg_audio.volume = Math.min(Math.max(volume, 0), 1);\r\n\r\n\t\t\t// 次のステップへ\r\n\t\t\tsetTimeout(stepFunc, FADE_INTERVAL_MS);\r\n\t\t};\r\n\r\n\t\treturn setTimeout(stepFunc, FADE_INTERVAL_MS);\r\n\t};\r\n\r\n\t/**\r\n\t * 汎用ポーリング（監視）処理\r\n\t * @param {function} check - 条件チェック関数（true なら終了）\r\n\t * @param {function} onEnd - 終了時の処理\r\n\t * @param {function} isValid - 継続条件（true: 継続, false: 中断）\r\n\t * @returns {number} timeoutId\r\n\t */\r\n\tconst poll = (check, onEnd, isValid) => {\r\n\t\tconst step = () => {\r\n\t\t\t// 継続条件チェック\r\n\t\t\tif (!isValid()) {\r\n\t\t\t\tonEnd(false); // 中断\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// 条件成立\r\n\t\t\tif (check()) {\r\n\t\t\t\tonEnd(true); // 正常終了\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// 次のチェックへ\r\n\t\t\tsetTimeout(step, FADE_INTERVAL_MS);\r\n\t\t};\r\n\r\n\t\treturn setTimeout(step, FADE_INTERVAL_MS);\r\n\t};\r\n\r\n\t/**\r\n\t * BGMのフェードアウトとシーク\r\n\t */\r\n\tconst fadeOutAndSeek = () => {\r\n\t\tconst start = g_audio.volume;\r\n\t\tconst end = 0;\r\n\r\n\t\tg_stateObj.bgmFadeOut = fadeVolume(\r\n\t\t\tstart,\r\n\t\t\tend,\r\n\t\t\t-FADE_STEP,\r\n\t\t\t/* onEnd */\r\n\t\t\t(finished) => {\r\n\t\t\t\tg_stateObj.bgmFadeOut = null;\r\n\r\n\t\t\t\tif (!finished) return; // 中断された\r\n\r\n\t\t\t\tg_audio.pause();\r\n\t\t\t\tg_audio.currentTime = musicStart;\r\n\r\n\t\t\t\tif (isTitle()) {\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tfadeIn();\r\n\t\t\t\t\t\tif (encodeFlg) repeatBGM();\r\n\t\t\t\t\t}, FADE_DELAY_MS);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpauseBGM();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t/* isValid */\r\n\t\t\t() =>\r\n\t\t\t\tisTitle() &&\r\n\t\t\t\tg_stateObj.bgmFadeOut !== null\r\n\t\t);\r\n\t};\r\n\r\n\t/**\r\n\t * BGMのフェードイン\r\n\t */\r\n\tconst fadeIn = () => {\r\n\t\tif (!(g_audio instanceof AudioPlayer) && !g_audio.src) return;\r\n\r\n\t\tconst start = 0;\r\n\t\tconst end = g_stateObj.bgmVolume / 100;\r\n\r\n\t\tg_audio.volume = 0;\r\n\t\tg_audio.play();\r\n\r\n\t\tg_stateObj.bgmFadeIn = fadeVolume(\r\n\t\t\tstart,\r\n\t\t\tend,\r\n\t\t\tFADE_STEP,\r\n\t\t\t/* onEnd */\r\n\t\t\t() => {\r\n\t\t\t\tg_stateObj.bgmFadeIn = null;\r\n\t\t\t},\r\n\t\t\t/* isValid */\r\n\t\t\t() =>\r\n\t\t\t\tisTitle() &&\r\n\t\t\t\tg_stateObj.bgmFadeIn !== null &&\r\n\t\t\t\tcurrentIdx === g_headerObj.musicIdxList[g_settings.musicIdxNum]\r\n\t\t);\r\n\t};\r\n\r\n\t/**\r\n\t * BGMのループ処理 (base64エンコード時用)\r\n\t * - base64エンコード時はtimeupdateイベントが発火しないため、setIntervalで時間を取得する\r\n\t */\r\n\tconst repeatBGM = () => {\r\n\t\tconst numAtStart = g_settings.musicIdxNum;\r\n\r\n\t\tg_stateObj.bgmLooped = poll(\r\n\t\t\t/* check */\r\n\t\t\t() => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\tg_audio.elapsedTime >= musicEnd ||\r\n\t\t\t\t\t\tnumAtStart !== g_settings.musicIdxNum\r\n\t\t\t\t\t);\r\n\t\t\t\t} catch {\r\n\t\t\t\t\treturn true; // エラー時は終了扱い\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t/* onEnd */\r\n\t\t\t(finished) => {\r\n\t\t\t\tg_stateObj.bgmLooped = null;\r\n\t\t\t\tif (finished) {\r\n\t\t\t\t\tfadeOutAndSeek();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t/* isValid */\r\n\t\t\t() => g_stateObj.bgmLooped !== null\r\n\t\t);\r\n\t};\r\n\r\n\tif (encodeFlg) {\r\n\t\ttry {\r\n\t\t\t// base64エンコードは読込に時間が掛かるため、曲変更時のみ読込\r\n\t\t\tif (!hasVal(g_musicdata) || Math.abs(_num) % g_headerObj.musicIdxList.length !== 0) {\r\n\t\t\t\tawait loadScript2(url);\r\n\t\t\t\tmusicInit();\r\n\t\t\t\tif (!isTitle()) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tconst tmpAudio = new AudioPlayer();\r\n\t\t\t\tconst array = Uint8Array.from(atob(g_musicdata), v => v.charCodeAt(0));\r\n\t\t\t\tawait tmpAudio.init(array.buffer);\r\n\t\t\t\tif (!isTitle()) {\r\n\t\t\t\t\ttmpAudio.close();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tg_audio = tmpAudio;\r\n\t\t\t}\r\n\t\t\tg_audio.volume = g_stateObj.bgmVolume / 100;\r\n\t\t\tif (g_currentPage === `title` && musicEnd > 0) {\r\n\t\t\t\tg_audio.currentTime = musicStart;\r\n\t\t\t\tg_audio.play();\r\n\t\t\t\trepeatBGM();\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\t// 音源の読み込みに失敗した場合、エラーを表示\r\n\t\t\tconsole.warn(`BGM load error: ${e}`);\r\n\t\t}\r\n\r\n\t} else {\r\n\t\tg_audio = new Audio();\r\n\t\tg_audio.src = url;\r\n\t\tg_audio.autoplay = false;\r\n\t\tg_audio.volume = g_stateObj.bgmVolume / 100;\r\n\t\tconst loadedMeta = g_handler.addListener(g_audio, `loadedmetadata`, () => {\r\n\t\t\tg_handler.removeListener(loadedMeta);\r\n\t\t\tif (!isTitle()) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tg_audio.currentTime = musicStart;\r\n\t\t\tg_audio.play();\r\n\t\t}, { once: true });\r\n\r\n\t\tif (musicEnd > 0) {\r\n\t\t\tg_stateObj.bgmTimeupdateEvtId = g_handler.addListener(g_audio, \"timeupdate\", () => {\r\n\t\t\t\tif (g_audio.currentTime >= musicEnd) {\r\n\t\t\t\t\tfadeOutAndSeek();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * 選曲ボタンを押したときの処理\r\n * @param {number} _num \r\n * @param {boolean} _initFlg \r\n */\r\nconst changeMSelect = (_num, _initFlg = false) => {\r\n\tif (document.getElementById(`lblComment`) !== null && lblComment.style.display === C_DIS_INHERIT) {\r\n\t\treturn;\r\n\t}\r\n\tconst limitedMLength = 35;\r\n\tpauseBGM();\r\n\r\n\t// 選択方向に合わせて楽曲リスト情報を再取得\r\n\tfor (let j = -g_settings.mSelectableTerms; j <= g_settings.mSelectableTerms; j++) {\r\n\t\tconst idx = g_headerObj.musicIdxList[(j + _num + g_settings.musicIdxNum + g_headerObj.musicIdxList.length * 10) % g_headerObj.musicIdxList.length];\r\n\t\tif (j === 0) {\r\n\t\t} else {\r\n\t\t\tdocument.getElementById(`btnMusicSelect${j}`).style.fontSize =\r\n\t\t\t\tgetFontSize2(g_headerObj.musicTitles[idx].slice(0, limitedMLength), g_btnWidth(1 / 2));\r\n\t\t\tdocument.getElementById(`btnMusicSelect${j}`).innerHTML =\r\n\t\t\t\t`${g_headerObj.musicTitles[idx].slice(0, limitedMLength)}${g_headerObj.musicTitles[idx].length > limitedMLength ? '...' : ''}<br>` +\r\n\t\t\t\t`<span style=\"font-size:0.7em;line-height:9px\"> / ${g_headerObj.artistNames[idx]}</span>`;\r\n\t\t}\r\n\t}\r\n\t// 現在選択中の楽曲IDを再設定\r\n\tg_settings.musicIdxNum = (g_settings.musicIdxNum + _num + g_headerObj.musicIdxList.length) % g_headerObj.musicIdxList.length;\r\n\r\n\t// 楽曲の多重読込防止（この値が変化していれば読み込まない）\r\n\tg_settings.musicLoopNum++;\r\n\tconst currentLoopNum = g_settings.musicLoopNum;\r\n\r\n\t// 選択した楽曲に対応する譜面番号、製作者情報、曲長を取得\r\n\tg_headerObj.viewLists = [];\r\n\tconst tmpKeyList = [], tmpCreatorList = [], tmpPlayingFrameList = [], tmpBpmList = [];\r\n\tconst targetIdx = g_headerObj.musicIdxList[(g_settings.musicIdxNum + g_headerObj.musicIdxList.length * 20) % g_headerObj.musicIdxList.length];\r\n\tg_headerObj.musicNos.forEach((val, j) => {\r\n\t\tif ((g_headerObj.musicGroups?.[val] ?? val) === targetIdx) {\r\n\t\t\tg_headerObj.viewLists.push(j);\r\n\t\t\ttmpKeyList.push(g_headerObj.keyLabels[j]);\r\n\t\t\ttmpCreatorList.push(g_headerObj.creatorNames[j]);\r\n\t\t\ttmpPlayingFrameList.push(g_detailObj.playingFrameWithBlank[j]);\r\n\t\t\ttmpBpmList.push(g_headerObj.bpms[g_headerObj.musicNos[j]]);\r\n\t\t}\r\n\t});\r\n\tconst playingFrames = makeDedupliArray(tmpPlayingFrameList.map(val => transFrameToTimer(val))).join(`, `);\r\n\tconst bpm = makeDedupliArray(tmpBpmList).join(`, `);\r\n\tconst [creatorName, creatorUrl, creatorIdx] = getCreatorInfo(tmpCreatorList);\r\n\tconst creatorLink = creatorIdx >= 0 ?\r\n\t\t`<a href=\"${creatorUrl}\" target=\"_blank\">${creatorName}</a>` : creatorName;\r\n\r\n\t// 選択した楽曲の情報表示\r\n\tconst idx = g_headerObj.musicIdxList[g_settings.musicIdxNum];\r\n\tdocument.getElementById(`lblMusicSelect`).innerHTML =\r\n\t\t`<span style=\"font-size:${getFontSize2(g_headerObj.musicTitlesForView[idx].join(`<br>`), g_btnWidth(1 / 2), { maxSiz: 18 })}px;` +\r\n\t\t`font-weight:bold\">${g_headerObj.musicTitlesForView[idx].join(`<br>`)}</span>`;\r\n\tdocument.getElementById(`lblMusicSelectDetail`).innerHTML =\r\n\t\t`Maker: ${creatorLink} / Artist: <a href=\"${g_headerObj.artistUrls[idx]}\" target=\"_blank\">` +\r\n\t\t`${g_headerObj.artistNames[idx]}</a><br>Duration: ${playingFrames} / BPM: ${bpm}`;\r\n\r\n\t// 選択した楽曲で使われているキー種の一覧を作成\r\n\tdeleteChildspriteAll(`keyTitleSprite`);\r\n\tmakeDedupliArray(tmpKeyList).sort((a, b) => parseInt(a) - parseInt(b))\r\n\t\t.forEach((val, j) => keyTitleSprite.appendChild(\r\n\t\t\tcreateDivCss2Label(`btnKeyTitle${val}`, val,\r\n\t\t\t\tObject.assign({ x: 10 + j * 40 }, g_lblPosObj.btnKeyTitle)\r\n\t\t\t)));\r\n\r\n\r\n\t// 選択した楽曲の選択位置を表示\r\n\tlblMusicCnt.innerHTML = `${g_settings.musicIdxNum + 1} / ${g_headerObj.musicIdxList.length}`;\r\n\r\n\t// 楽曲別のローカルストレージを再取得\r\n\tloadLocalStorage(g_settings.musicIdxNum);\r\n\tviewKeyStorage.cache = new Map();\r\n\r\n\t// 初期化もしくは楽曲変更時に速度を初期化\r\n\tif (_initFlg || Math.abs(_num) % g_headerObj.musicIdxList.length !== 0) {\r\n\t\tg_stateObj.speed = g_headerObj.initSpeeds[g_headerObj.viewLists[0]];\r\n\t\tg_settings.speedNum = getCurrentNo(g_settings.speeds, g_stateObj.speed);\r\n\t}\r\n\r\n\t// コメント文の加工\r\n\tlblCommentM.innerHTML = convertStrToVal(g_headerObj[`commentVal${g_settings.musicIdxNum}`]);\r\n\r\n\t// BGM再生処理\r\n\tif (!g_stateObj.bgmMuteFlg) {\r\n\t\tif (_initFlg) {\r\n\t\t\tplayBGM(_num);\r\n\t\t} else {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tif (currentLoopNum === g_settings.musicLoopNum) {\r\n\t\t\t\t\tplayBGM(_num, currentLoopNum);\r\n\t\t\t\t}\r\n\t\t\t}, 500);\r\n\t\t}\r\n\t}\r\n\r\n\t// 選曲変更時のカスタム関数実行\r\n\tg_customJsObj.musicSelect.forEach(func => func(g_settings.musicIdxNum));\r\n};\r\n\r\n/**\r\n * 警告用ウィンドウ（汎用）を表示\r\n * @param {string} _text \r\n * @param {boolean} [object.resetFlg=false] 警告リストをクリアして再作成\r\n * @param {boolean} [object.backBtnUse=false] Backボタンを付与\r\n */\r\nconst makeWarningWindow = (_text = ``, { resetFlg = false, backBtnUse = false } = {}) => {\r\n\tconst displayName = (g_currentPage === `initial` ? `title` : g_currentPage);\r\n\tif (_text !== ``) {\r\n\t\tif (resetFlg) {\r\n\t\t\tg_errMsgObj[displayName] = [_text];\r\n\t\t} else if (g_errMsgObj[displayName].findIndex(val => val === _text) === -1) {\r\n\t\t\tg_errMsgObj[displayName].push(_text);\r\n\t\t}\r\n\t}\r\n\tif (g_errMsgObj[displayName].length > 0) {\r\n\t\tdivRoot.appendChild(setWindowStyle(`<p>${g_errMsgObj[displayName].join('</p><p>')}</p>`, `#ffcccc`, `#660000`));\r\n\t\tsetUserSelect(lblWarning.style, `text`);\r\n\t}\r\n\tif (backBtnUse) {\r\n\t\t// タイトルバック用ボタン\r\n\t\tdivRoot.appendChild(createCss2Button(`btnBack`, g_lblNameObj.b_back, () => true, {\r\n\t\t\tresetFunc: () => titleInit(),\r\n\t\t}, g_cssObj.button_Back));\r\n\t}\r\n};\r\n\r\n/**\r\n * お知らせウィンドウ（汎用）を表示\r\n * @param {string} _text \r\n * @param {string} _animationName\r\n * @param {string} [object._backColor='#ccccff']\r\n * @param {string} [object._textColor='#000066']\r\n * @param {string} [object._pointerEvents=C_DIS_NONE]\r\n */\r\nconst makeInfoWindow = (_text, _animationName = ``, { _backColor = `#ccccff`, _textColor = `#000066`, _pointerEvents = C_DIS_NONE } = {}) => {\r\n\tconst lblWarning = setWindowStyle(`<p>${_text}</p>`, _backColor, _textColor, C_ALIGN_CENTER);\r\n\tlblWarning.style.pointerEvents = _pointerEvents;\r\n\r\n\tif (_animationName !== ``) {\r\n\t\tlblWarning.style.animationName = _animationName;\r\n\t\tlblWarning.style.animationDuration = `2.5s`;\r\n\t\tlblWarning.style.animationFillMode = `forwards`;\r\n\t\tlblWarning.style.animationTimingFunction = `cubic-bezier(1.000, 0.000, 0.000, 1.000)`;\r\n\t}\r\n\tdivRoot.appendChild(lblWarning);\r\n};\r\n\r\n/**\r\n * 警告ウィンドウのスタイル設定\r\n * @param {string} _text \r\n * @param {string} _bkColor \r\n * @param {string} _textColor \r\n * @param {string} _align\r\n * @param {number} [object._x=g_btnX()]\r\n * @param {number} [object._y=0]\r\n * @param {number} [object._w=g_btnWidth()]\r\n * @returns {HTMLDivElement}\r\n */\r\nconst setWindowStyle = (_text, _bkColor, _textColor, _align = C_ALIGN_LEFT, { _x = g_btnX(), _y = 0, _w = g_btnWidth() } = {}) => {\r\n\r\n\tdeleteDiv(divRoot, `lblWarning`);\r\n\r\n\t// ウィンドウ枠の行を取得するために一時的な枠を作成\r\n\tconst tmplbl = createDivCss2Label(`lblTmpWarning`, _text, {\r\n\t\tx: _x, y: 70, w: _w, h: 20, siz: g_limitObj.mainSiz, lineHeight: wUnit(15), fontFamily: getBasicFont(),\r\n\t\twhiteSpace: `normal`,\r\n\t});\r\n\tdivRoot.appendChild(tmplbl);\r\n\tconst range = new Range();\r\n\trange.selectNode(tmplbl);\r\n\r\n\t// ウィンドウ枠の行を元に縦の長さを決定(150pxを超えた場合は縦スクロールバーを付与)\r\n\tconst warnHeight = Math.min(150, Math.max(range.getClientRects().length,\r\n\t\t_text.split(`<br>`).length + _text.split(`<p>`).length - 1) * 21);\r\n\tconst lbl = createDivCss2Label(`lblWarning`, _text, {\r\n\t\tx: _x, y: 70 + _y, w: _w, h: warnHeight, siz: g_limitObj.mainSiz, backgroundColor: _bkColor,\r\n\t\topacity: 0.9, lineHeight: wUnit(15), color: _textColor, align: _align, fontFamily: getBasicFont(),\r\n\t\twhiteSpace: `normal`, pointerEvents: C_DIS_AUTO,\r\n\t});\r\n\tif (warnHeight === 150) {\r\n\t\tlbl.style.overflow = C_DIS_AUTO;\r\n\t}\r\n\r\n\t// 一時的な枠を削除\r\n\tdivRoot.removeChild(tmplbl);\r\n\r\n\treturn lbl;\r\n};\r\n\r\n/*-----------------------------------------------------------*/\r\n/* Scene : DATA MANAGEMENT [pear] */\r\n/*-----------------------------------------------------------*/\r\n\r\nconst dataMgtInit = () => {\r\n\tclearWindow(true);\r\n\tconst prevPage = g_currentPage;\r\n\tg_currentPage = `dataMgt`;\r\n\tlet selectedKey = g_keyObj.currentKey;\r\n\r\n\tmultiAppend(divRoot,\r\n\r\n\t\t// 画面タイトル\r\n\t\tgetTitleDivLabel(`lblTitle`,\r\n\t\t\t`<div class=\"settings_Title\">DATA</div><div class=\"settings_Title2\">MANAGEMENT</div>`\r\n\t\t\t\t.replace(/[\\t\\n]/g, ``), 0, 15, g_cssObj.flex_centering),\r\n\r\n\t\tcreateDescDiv(`dataDelMsg`, g_lblNameObj[`dataDelete${g_langStorage.safeMode}Desc`]),\r\n\t);\r\n\r\n\t// 各ボタン用のスプライトを作成\r\n\tconst optionsprite = createEmptySprite(divRoot, `optionsprite`, g_windowObj.dataSprite);\r\n\r\n\tlet reloadFlg = false;\r\n\tconst list = [C_FLG_OFF, C_FLG_ON];\r\n\tconst cssBarList = [C_FLG_OFF, C_FLG_ON];\r\n\tconst cssBgList = [g_settings.d_cssBgName, g_settings.d_cssBgName];\r\n\r\n\t/**\r\n\t * データ管理用ラベルの作成\r\n\t * @param {string} _name \r\n\t * @param {number} _heightPos \r\n\t * @param {number} [x=0] \r\n\t * @returns {HTMLDivElement}\r\n\t */\r\n\tconst createMgtLabel = (_name, _heightPos, { x = 0 } = {}) =>\r\n\t\tcreateDivCss2Label(`lbl${toCapitalize(_name)}`, getStgDetailName(toCapitalize(_name)), {\r\n\t\t\tx, y: g_limitObj.setLblHeight * _heightPos + 40,\r\n\t\t\tsiz: g_limitObj.setLblSiz, align: C_ALIGN_LEFT,\r\n\t\t});\r\n\r\n\t/**\r\n\t * データ管理用ボタンの作成\r\n\t * @param {string} _name \r\n\t * @param {number} _heightPos \r\n\t * @param {number} _widthPos \r\n\t * @param {number} [w=125]\r\n\t * @param {function} func \r\n\t * @returns {HTMLDivElement}\r\n\t */\r\n\tconst createMgtButton = (_name, _heightPos, _widthPos, { w = 125, func = () => true, ...rest } = {}) => {\r\n\t\tconst linkId = `btn${toCapitalize(_name)}`;\r\n\t\treturn createCss2Button(linkId, getStgDetailName(toCapitalize(_name)), () => {\r\n\t\t\tconst prevDisp = g_settings.dataMgtNum[_name];\r\n\t\t\tconst [prevBarColor, prevBgColor] = [cssBarList[prevDisp], cssBgList[prevDisp]];\r\n\r\n\t\t\tg_settings.dataMgtNum[_name] = (g_settings.dataMgtNum[_name] + 1) % 2;\r\n\t\t\tg_stateObj[`dm_${_name}`] = list[g_settings.dataMgtNum[_name]];\r\n\r\n\t\t\tconst nextDisp = g_settings.dataMgtNum[_name];\r\n\t\t\tconst [nextBarColor, nextBgColor] = [cssBarList[nextDisp], cssBgList[nextDisp]];\r\n\t\t\tdocument.getElementById(linkId).classList.replace(g_cssObj[`button_${prevBarColor}`], g_cssObj[`button_${nextBarColor}`]);\r\n\t\t\tdocument.getElementById(linkId).classList.replace(g_cssObj[`button_${prevBgColor}`], g_cssObj[`button_${nextBgColor}`]);\r\n\t\t\tfunc();\r\n\t\t}, {\r\n\t\t\tx: _widthPos * (w + 5) + 20, y: g_limitObj.setLblHeight * _heightPos + 40,\r\n\t\t\tw, h: 20, siz: g_limitObj.setLblSiz, borderStyle: `solid`, title: g_msgObj[_name], ...rest\r\n\t\t}, g_cssObj[`button_${cssBgList[g_settings.dataMgtNum[_name]]}`], g_cssObj[`button_${cssBarList[g_settings.dataMgtNum[_name]]}`]);\r\n\t};\r\n\r\n\tmultiAppend(optionsprite,\r\n\t\tcreateMgtLabel(`workData`, 0),\r\n\t\tcreateMgtButton(`environment`, 1.5, 0),\r\n\t\tcreateMgtButton(`highscores`, 2.5, 0),\r\n\t\tcreateMgtButton(`customKey`, 3.5, 0),\r\n\t\tcreateMgtButton(`others`, 4.5, 0),\r\n\t\tcreateMgtLabel(`keyData`, 6),\r\n\t\tcreateDivCss2Label(`lblTargetKey`, `(${getKeyName(selectedKey)})`, {\r\n\t\t\tx: 90, y: g_limitObj.setLblHeight * 6 + 40,\r\n\t\t\tsiz: g_limitObj.setLblSiz, align: C_ALIGN_LEFT,\r\n\t\t})\r\n\t);\r\n\r\n\tg_localStorageMgt = sortObjectByKeys(parseStorageData(g_localStorageUrl));\r\n\r\n\tmultiAppend(divRoot,\r\n\r\n\t\t// 保存データの表示\r\n\t\tcreateDivCss2Label(`lblWorkDataView`,\r\n\t\t\tviewKeyStorage(`workStorage`), g_lblPosObj.lblWorkDataView),\r\n\t\tcreateDivCss2Label(`lblKeyDataView`, viewKeyStorage(`keyStorage`, selectedKey), g_lblPosObj.lblKeyDataView),\r\n\r\n\t\t// 保存データの出力ボタン\r\n\t\tcreateCss2Button(`btnWorkStorage`, g_lblNameObj.b_copyStorage, () =>\r\n\t\t\tcopyTextToClipboard(formatObject(g_storageFunc.get(`workStorage`)(), 0, { colorFmt: false }), g_msgInfoObj.I_0006),\r\n\t\t\tg_lblPosObj.btnWorkStorage, g_cssObj.button_Default, g_cssObj.button_ON),\r\n\t\tcreateCss2Button(`btnKeyStorage`, g_lblNameObj.b_copyStorage, () =>\r\n\t\t\tcopyTextToClipboard(formatObject(g_storageFunc.get(`keyStorage`)(selectedKey), 0, { colorFmt: false }), g_msgInfoObj.I_0006),\r\n\t\t\tg_lblPosObj.btnKeyStorage, g_cssObj.button_Default, g_cssObj.button_ON),\r\n\t);\r\n\tsetUserSelect($id(`lblWorkDataView`), `text`);\r\n\tsetUserSelect($id(`lblKeyDataView`), `text`);\r\n\r\n\tconst keyList = makeDedupliArray(g_headerObj.keyLabels).sort((a, b) => parseInt(a) - parseInt(b));\r\n\tconst keyListSprite = createEmptySprite(optionsprite, `keyListSprite`, g_windowObj.keyListSprite);\r\n\tkeyList.forEach((key, j) => {\r\n\t\tg_stateObj[`dm_${key}`] = C_FLG_OFF;\r\n\t\tg_settings.dataMgtNum[key] = 0;\r\n\r\n\t\tconst keyWidth = Math.min(Math.max(50, getStrWidth(getKeyName(key), g_limitObj.setLblSiz, getBasicFont())), 80);\r\n\t\tkeyListSprite.appendChild(createMgtButton(key, j - 2, 0, {\r\n\t\t\tw: keyWidth,\r\n\t\t\tsiz: getFontSize2(getKeyName(key), keyWidth, { maxSiz: g_limitObj.setLblSiz, minSiz: 10 }),\r\n\t\t}));\r\n\t\tdocument.getElementById(`btn${toCapitalize(key)}`).innerHTML = getKeyName(key);\r\n\r\n\t\tkeyListSprite.appendChild(createCss2Button(`btnView${key}`, ``, evt => {\r\n\t\t\tkeyList.forEach(keyx => {\r\n\t\t\t\tdocument.getElementById(`btnView${keyx}`).classList.replace(g_cssObj.button_Next, g_cssObj.button_Default);\r\n\t\t\t\tdocument.getElementById(`btnView${keyx}`).classList.replace(g_cssObj.button_ON, g_cssObj.button_OFF);\r\n\t\t\t\tdocument.getElementById(`btnView${keyx}`).textContent = ``;\r\n\t\t\t});\r\n\t\t\tdocument.getElementById(`btnView${key}`).classList.replace(g_cssObj.button_Default, g_cssObj.button_Next);\r\n\t\t\tdocument.getElementById(`btnView${key}`).classList.replace(g_cssObj.button_OFF, g_cssObj.button_ON);\r\n\t\t\tselectedKey = key;\r\n\t\t\tevt.target.textContent = `x`;\r\n\t\t\tlblKeyDataView.innerHTML = viewKeyStorage(`keyStorage`, key);\r\n\t\t\tlblKeyDataView.scrollTop = 0;\r\n\t\t\tlblTargetKey.innerHTML = `(${getKeyName(key)})`;\r\n\t\t}, {\r\n\t\t\tx: 0, y: g_limitObj.setLblHeight * (j - 2) + 40, w: 16, h: 20, siz: 12, borderStyle: `solid`\r\n\t\t}, g_cssObj.button_Default, g_cssObj.button_OFF));\r\n\t});\r\n\tdocument.getElementById(`btnView${selectedKey}`).click();\r\n\r\n\t// ユーザカスタムイベント(初期)\r\n\tg_customJsObj.dataMgt.forEach(func => func());\r\n\r\n\tmultiAppend(divRoot,\r\n\t\tcreateCss2Button(`btnBack`, g_lblNameObj.b_back, () => true,\r\n\t\t\tObject.assign(g_lblPosObj.btnResetBack, {\r\n\t\t\t\tresetFunc: () => [`title`, `precondition`].includes(prevPage) ? titleInit() : g_moveSettingWindow(false),\r\n\t\t\t}), g_cssObj.button_Back),\r\n\r\n\t\tcreateCss2Button(`btnPrecond`, g_lblNameObj.b_precond, () => true,\r\n\t\t\tObject.assign(g_lblPosObj.btnPrecond, {\r\n\t\t\t\tresetFunc: () => preconditionInit(),\r\n\t\t\t}), g_cssObj.button_Setting),\r\n\r\n\t\tcreateCss2Button(`btnSafeMode`, g_lblNameObj.b_safeMode +\r\n\t\t\t(g_langStorage.safeMode === C_FLG_ON ? C_FLG_OFF : C_FLG_ON), () => {\r\n\t\t\t\tif (window.confirm(g_msgObj[`safeMode${g_langStorage.safeMode}Confirm`])) {\r\n\t\t\t\t\tg_langStorage.safeMode = g_langStorage.safeMode === C_FLG_ON ? C_FLG_OFF : C_FLG_ON;\r\n\t\t\t\t\tlocalStorage.setItem(`danoni-locale`, JSON.stringify(g_langStorage));\r\n\t\t\t\t\tlocation.reload();\r\n\t\t\t\t}\r\n\t\t\t}, g_lblPosObj.btnSafeMode, g_cssObj.button_Setting),\r\n\r\n\t\tcreateCss2Button(`btnReset`, g_lblNameObj.b_cReset, () => {\r\n\t\t\treloadFlg = false;\r\n\t\t\tconst backupData = new Map();\r\n\r\n\t\t\tconst selectedData = Object.keys(g_stateObj)\r\n\t\t\t\t.filter(key => key.startsWith('dm_') && g_stateObj[key] === C_FLG_ON)\r\n\t\t\t\t.map(key => key.slice(`dm_`.length));\r\n\r\n\t\t\tif (window.confirm(g_msgObj.dataResetConfirm +\r\n\t\t\t\t`\\n\\n${selectedData.map(val => `- ${g_msgObj[val] || g_msgObj.keyTypes.split('{0}').join(val)}`).join(`\\n`)}`)) {\r\n\t\t\t\tselectedData.forEach(key => {\r\n\t\t\t\t\tif (g_resetFunc.has(key)) {\r\n\t\t\t\t\t\tbackupData.set(key, JSON.parse(JSON.stringify(g_localStorageMgt)));\r\n\t\t\t\t\t\tg_resetFunc.get(key)();\r\n\t\t\t\t\t\tlocalStorage.setItem(g_localStorageUrl, JSON.stringify(g_localStorageMgt));\r\n\r\n\t\t\t\t\t} else if (keyList.includes(key)) {\r\n\t\t\t\t\t\tconst storage = parseStorageData(`danonicw-${key}k`);\r\n\r\n\t\t\t\t\t\tif (Object.keys(storage).length > 0) {\r\n\t\t\t\t\t\t\tbackupData.set(key, JSON.parse(JSON.stringify(storage)));\r\n\t\t\t\t\t\t\tg_settings.keyStorages.forEach(val => delete storage[val]);\r\n\t\t\t\t\t\t\tlocalStorage.setItem(`danonicw-${key}k`, JSON.stringify(storage));\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tbackupData.set(`XX` + key, JSON.parse(JSON.stringify(g_localStorageMgt)));\r\n\t\t\t\t\t\t\tg_settings.keyStorages.forEach(val => delete g_localStorageMgt[`${val}${key}`]);\r\n\t\t\t\t\t\t\tlocalStorage.setItem(g_localStorageUrl, JSON.stringify(g_localStorageMgt));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\treloadFlg = true;\r\n\t\t\t\tsessionStorage.setItem(`resetBackup${g_settings.musicIdxNum}`, JSON.stringify(Array.from(backupData.entries())));\r\n\t\t\t}\r\n\t\t}, Object.assign(g_lblPosObj.btnResetN, {\r\n\t\t\tvisibility: g_langStorage.safeMode === C_FLG_OFF ? C_DIS_INHERIT : `hidden`,\r\n\t\t\tresetFunc: () => {\r\n\t\t\t\tif (reloadFlg) {\r\n\t\t\t\t\tlocation.reload();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t}), g_cssObj.button_Reset),\r\n\r\n\t\t// リカバリー用のボタン\r\n\t\tcreateCss2Button(`btnUndo`, g_lblNameObj.b_undo, () => {\r\n\t\t\tconst backup = JSON.parse(sessionStorage.getItem(`resetBackup${g_settings.musicIdxNum}`));\r\n\t\t\tif (backup && window.confirm(g_msgObj.dataRestoreConfirm)) {\r\n\t\t\t\tbackup.forEach(([key, data]) => {\r\n\t\t\t\t\tif (g_resetFunc.has(key) || keyList.includes(key.slice(`XX`.length))) {\r\n\t\t\t\t\t\tObject.assign(g_localStorageMgt, data);\r\n\t\t\t\t\t\tlocalStorage.setItem(g_localStorageUrl, JSON.stringify(g_localStorageMgt));\r\n\t\t\t\t\t} else if (keyList.includes(key)) {\r\n\t\t\t\t\t\tlocalStorage.setItem(`danonicw-${key}k`, JSON.stringify(data));\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tsessionStorage.removeItem(`resetBackup${g_settings.musicIdxNum}`);\r\n\t\t\t\tlocation.reload();\r\n\t\t\t}\r\n\t\t}, g_lblPosObj.btnUndo, g_cssObj.button_Tweet)\r\n\t);\r\n\tif (sessionStorage.getItem(`resetBackup${g_settings.musicIdxNum}`) === null) {\r\n\t\tbtnUndo.style.display = C_DIS_NONE;\r\n\t}\r\n\r\n\t// キー操作イベント（デフォルト）\r\n\tsetShortcutEvent(g_currentPage, () => true, { dfEvtFlg: true });\r\n\r\n\tdocument.oncontextmenu = () => true;\r\n\tdivRoot.oncontextmenu = () => false;\r\n\r\n\tg_skinJsObj.dataMgt.forEach(func => func());\r\n};\r\n\r\n\r\n/*-----------------------------------------------------------*/\r\n/* Scene : PRECONDITION [mango] */\r\n/*-----------------------------------------------------------*/\r\n\r\nconst preconditionInit = () => {\r\n\tclearWindow(true);\r\n\tconst prevPage = g_currentPage;\r\n\tg_currentPage = `precondition`;\r\n\r\n\tmultiAppend(divRoot,\r\n\r\n\t\t// 画面タイトル\r\n\t\tgetTitleDivLabel(`lblTitle`,\r\n\t\t\t`<div class=\"settings_Title\">PRECONDITION</div>`\r\n\t\t\t\t.replace(/[\\t\\n]/g, ``), 0, 15, g_cssObj.flex_centering),\r\n\r\n\t\tcreateDivCss2Label(`lblPrecondView`, viewKeyStorage(`g_rootObj`), g_lblPosObj.lblPrecondView),\r\n\t\tcreateCss2Button(`btnPrecondView`, g_lblNameObj.b_copyStorage, () =>\r\n\t\t\tcopyTextToClipboard((() => {\r\n\t\t\t\tconst key = g_settings.preconditions[g_settings.preconditionNum * numOfPrecs + g_settings.preconditionNumSub];\r\n\t\t\t\tif (key === `g_editorTmp2`) {\r\n\t\t\t\t\treturn g_editorTmp2.replaceAll(`<br>`, `\\r\\n`).replaceAll(`&nbsp;`, ` `);\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn viewKeyStorage(key, ``, false);\r\n\t\t\t\t}\r\n\t\t\t})(), g_msgInfoObj.I_0007),\r\n\t\t\tg_lblPosObj.btnPrecondView, g_cssObj.button_Default, g_cssObj.button_ON),\r\n\t);\r\n\tsetUserSelect($id(`lblPrecondView`), `text`);\r\n\r\n\t// 1ページあたりに表示するオブジェクト数\r\n\tconst numOfPrecs = Math.round((g_btnWidth(1) / 500) / 2 * 10) * 2;\r\n\r\n\t// ボタン名切り替え\r\n\tconst switchPreconditions = () => {\r\n\t\tg_settings.preconditionNum = nextPos(g_settings.preconditionNum, 1, Math.round(g_settings.preconditions.length / numOfPrecs) + 1);\r\n\t\tfor (let j = 0; j < Math.min(g_settings.preconditions.length, numOfPrecs); j++) {\r\n\t\t\tif (g_settings.preconditionNum * numOfPrecs + j < g_settings.preconditions.length) {\r\n\t\t\t\tdocument.getElementById(`btnPrecond${j}`).innerHTML =\r\n\t\t\t\t\tg_settings.preconditions[g_settings.preconditionNum * numOfPrecs + j];\r\n\t\t\t\tdocument.getElementById(`btnPrecond${j}`).style.visibility = `visible`;\r\n\t\t\t} else {\r\n\t\t\t\tdocument.getElementById(`btnPrecond${j}`).style.visibility = `hidden`;\r\n\t\t\t}\r\n\t\t}\r\n\t\tbtnPrecond0.click();\r\n\t};\r\n\r\n\t// オブジェクト表示ボタンの作成\r\n\tfor (let j = 0; j < Math.min(g_settings.preconditions.length, numOfPrecs); j++) {\r\n\t\tdivRoot.appendChild(createCss2Button(`btnPrecond${j}`, g_settings.preconditions[j], evt => {\r\n\t\t\tfor (let k = 0; k < Math.min(g_settings.preconditions.length, numOfPrecs); k++) {\r\n\t\t\t\tdocument.getElementById(`btnPrecond${k}`).classList.replace(g_cssObj.button_Reset, g_cssObj.button_Default);\r\n\t\t\t}\r\n\t\t\tlblPrecondView.innerHTML = viewKeyStorage(g_settings.preconditions[g_settings.preconditionNum * numOfPrecs + j]);\r\n\t\t\tlblPrecondView.scrollTop = 0;\r\n\t\t\tg_settings.preconditionNumSub = j;\r\n\t\t\tevt.target.classList.replace(g_cssObj.button_Default, g_cssObj.button_Reset);\r\n\t\t}, {\r\n\t\t\tx: g_btnX() + g_btnWidth((j % (numOfPrecs / 2)) / (numOfPrecs / 2 + 1)),\r\n\t\t\ty: 70 + Number(j >= numOfPrecs / 2) * 20, w: g_btnWidth(1 / (numOfPrecs / 2 + 1)), h: 20, siz: 12,\r\n\t\t}, g_cssObj.button_Default));\r\n\t}\r\n\tbtnPrecond0.classList.replace(g_cssObj.button_Default, g_cssObj.button_Reset);\r\n\r\n\t// 次のオブジェクト表示群の表示\r\n\tdivRoot.appendChild(createCss2Button(`btnPrecondNext`, `>`, () => switchPreconditions(), {\r\n\t\tx: g_btnX() + g_btnWidth(numOfPrecs / 2 / (numOfPrecs / 2 + 1)),\r\n\t\ty: 70, w: g_btnWidth(1 / Math.max((numOfPrecs / 2 + 1), 12)), h: 40, siz: 12,\r\n\t\tvisibility: (g_settings.preconditions.length > numOfPrecs ? `visible` : `hidden`),\r\n\t}, g_cssObj.button_Setting));\r\n\r\n\t// ユーザカスタムイベント(初期)\r\n\tg_customJsObj.precondition.forEach(func => func());\r\n\r\n\tmultiAppend(divRoot,\r\n\r\n\t\t// データ管理画面へ移動\r\n\t\tcreateCss2Button(`btnReset`, g_lblNameObj.dataReset, () => {\r\n\t\t\tdataMgtInit();\r\n\t\t}, g_lblPosObj.btnReset, g_cssObj.button_Reset),\r\n\r\n\t\tcreateCss2Button(`btnBack`, g_lblNameObj.b_back, () => true,\r\n\t\t\tObject.assign(g_lblPosObj.btnPrecond, {\r\n\t\t\t\tresetFunc: () => {\r\n\t\t\t\t\tviewKeyStorage.cache = new Map();\r\n\t\t\t\t\tprevPage === `dataMgt` ? dataMgtInit() : g_moveSettingWindow(false);\r\n\t\t\t\t},\r\n\t\t\t}), g_cssObj.button_Back),\r\n\t);\r\n\t// キー操作イベント（デフォルト）\r\n\tsetShortcutEvent(g_currentPage, () => true, { dfEvtFlg: true });\r\n\r\n\tdocument.oncontextmenu = () => true;\r\n\tdivRoot.oncontextmenu = () => true;\r\n\r\n\tg_skinJsObj.precondition.forEach(func => func());\r\n};\r\n\r\n/*-----------------------------------------------------------*/\r\n/* Scene : SETTINGS [lime] */\r\n/*-----------------------------------------------------------*/\r\n\r\nconst commonSettingBtn = _labelName => {\r\n\r\n\tconst switchSave = evt => {\r\n\t\tconst from = boolToSwitch(g_stateObj.dataSaveFlg);\r\n\t\tg_stateObj.dataSaveFlg = !g_stateObj.dataSaveFlg;\r\n\r\n\t\tconst to = boolToSwitch(g_stateObj.dataSaveFlg);\r\n\t\tevt.target.classList.replace(g_cssObj[`button_${from}`], g_cssObj[`button_${to}`]);\r\n\t};\r\n\r\n\tmultiAppend(divRoot,\r\n\r\n\t\t// タイトル画面へ戻る\r\n\t\tcreateCss2Button(`btnBack`, g_lblNameObj.b_back, () => true,\r\n\t\t\tObject.assign(g_lblPosObj.btnBack, {\r\n\t\t\t\tanimationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: () => titleInit(),\r\n\t\t\t}), g_cssObj.button_Back),\r\n\r\n\t\t// キーコンフィグ画面へ移動\r\n\t\tcreateCss2Button(`btnKeyConfig`, g_lblNameObj.b_keyConfig, () => true,\r\n\t\t\tObject.assign(g_lblPosObj.btnKeyConfig, {\r\n\t\t\t\tanimationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: () => keyConfigInit(`Main`),\r\n\t\t\t}), g_cssObj.button_Setting),\r\n\r\n\t\t// プレイ開始\r\n\t\tmakePlayButton(() => loadMusic()),\r\n\r\n\t\t// Display設定へ移動\r\n\t\tcreateCss2Button(`btn${_labelName}`, `>`, () => true,\r\n\t\t\tObject.assign(g_lblPosObj.btnSwitchSetting, {\r\n\t\t\t\ttitle: g_msgObj[`to${_labelName}`], resetFunc: () => g_moveSettingWindow(),\r\n\t\t\t\tcxtFunc: () => g_moveSettingWindow(true, -1),\r\n\t\t\t}), g_cssObj.button_Mini),\r\n\r\n\t\t// データセーブフラグの切替\r\n\t\tcreateCss2Button(`btnSave`, g_lblNameObj.dataSave, evt => switchSave(evt),\r\n\t\t\tObject.assign(g_lblPosObj.btnSave, {\r\n\t\t\t\tcxtFunc: evt => switchSave(evt),\r\n\t\t\t\tvisibility: g_langStorage.safeMode === C_FLG_OFF ? C_DIS_INHERIT : `hidden`,\r\n\t\t\t}), g_cssObj.button_Default, (g_stateObj.dataSaveFlg ? g_cssObj.button_ON : g_cssObj.button_OFF)),\r\n\r\n\t\t// データ管理画面へ移動\r\n\t\tcreateCss2Button(`btnReset`, g_lblNameObj.dataReset, () => {\r\n\t\t\tdataMgtInit();\r\n\t\t}, g_lblPosObj.btnReset, g_cssObj.button_Reset),\r\n\r\n\t\t// 前提条件表示用画面へ移動（debug=trueの場合のみ）\r\n\t\tcreateCss2Button(`btnPrecond`, g_lblNameObj.b_precond, () => true,\r\n\t\t\tObject.assign(g_lblPosObj.btnPrecond, {\r\n\t\t\t\tresetFunc: () => preconditionInit(),\r\n\t\t\t}), g_cssObj.button_Setting),\r\n\t);\r\n};\r\n\r\n/**\r\n * PLAYボタンの作成\r\n * @param {function} _func \r\n * @returns {HTMLDivElement}\r\n */\r\nconst makePlayButton = _func => createCss2Button(`btnPlay`, g_lblNameObj.b_play, () => true,\r\n\tObject.assign(g_lblPosObj.btnPlay, {\r\n\t\tanimationName: (g_initialFlg ? `` : `smallToNormalY`), resetFunc: _func,\r\n\t}), g_cssObj.button_Next);\r\n\r\n/**\r\n * 設定・オプション画面初期化\r\n */\r\nconst optionInit = () => {\r\n\r\n\tclearWindow(true);\r\n\tconst divRoot = document.getElementById(`divRoot`);\r\n\tg_currentPage = `option`;\r\n\tg_stateObj.filterKeys = ``;\r\n\r\n\t// 楽曲データの表示\r\n\tconst text = getMusicInfoView();\r\n\tdivRoot.appendChild(createDivCss2Label(`lblMusicInfo`, text,\r\n\t\tObject.assign({ siz: getFontSize2(text, g_btnWidth(3 / 4), { maxSiz: 12 }) }, g_lblPosObj.lblMusicInfo)));\r\n\r\n\t// タイトル文字描画\r\n\tdivRoot.appendChild(getTitleDivLabel(`lblTitle`, g_lblNameObj.settings, 0, 15, `settings_Title`));\r\n\r\n\t// オプションボタン用の設置\r\n\tcreateOptionWindow(divRoot);\r\n\r\n\t// ユーザカスタムイベント(初期)\r\n\tg_customJsObj.option.forEach(func => func());\r\n\r\n\t// ボタン描画\r\n\tcommonSettingBtn(`Display`);\r\n\r\n\t// キー操作イベント（デフォルト）\r\n\tsetShortcutEvent(g_currentPage, () => true, { dfEvtFlg: true });\r\n\tdocument.oncontextmenu = () => true;\r\n\tg_initialFlg = true;\r\n\r\n\tg_skinJsObj.option.forEach(func => func());\r\n};\r\n\r\n/**\r\n * 設定画面に表示する楽曲・BPM情報の取得\r\n * @returns {string}\r\n */\r\nconst getMusicInfoView = () => {\r\n\tconst idx = g_headerObj.musicNos[g_stateObj.scoreId] || 0;\r\n\tlet text = `♪` + (g_headerObj.musicSelectUse ? `${unEscapeHtml(g_headerObj.musicTitles[idx])} / ` : ``) +\r\n\t\t`BPM: ${g_headerObj.bpms[idx]}`;\r\n\tif (!g_headerObj.musicSelectUse && g_headerObj.bpms[idx] === `----`) {\r\n\t\ttext = ``;\r\n\t}\r\n\treturn text;\r\n};\r\n\r\n/**\r\n * 設定画面用スプライトリストの作成\r\n * @param {object} _settingList (設定名、縦位置、縦位置差分、幅差分、高さ差分)を設定別にリスト化\r\n * @returns\r\n */\r\nconst setSpriteList = _settingList => {\r\n\tconst optionWidth = (g_sWidth - 450) / 2;\r\n\tconst spriteList = [];\r\n\tObject.keys(_settingList).forEach(setting =>\r\n\t\tspriteList[setting] = createEmptySprite(optionsprite, `${setting}Sprite`, {\r\n\t\t\tx: 25, y: _settingList[setting].heightPos * g_limitObj.setLblHeight + _settingList[setting].y + 20,\r\n\t\t\tw: optionWidth + _settingList[setting].dw, h: g_limitObj.setLblHeight + _settingList[setting].dh,\r\n\t\t}));\r\n\treturn spriteList;\r\n};\r\n\r\n/**\r\n * スライダー共通処理 (Fadein, Appearance)\r\n * @param {HTMLInputElement} _slider \r\n * @param {HTMLDivElement} _link \r\n * @param {string} _type \r\n * @returns {string}\r\n */\r\nconst inputSlider = (_slider, _link, _type) => {\r\n\tconst value = parseInt(_slider.value);\r\n\t_link.textContent = g_sliderView.get(_type)(value);\r\n\treturn value;\r\n};\r\n\r\n/**\r\n * 譜面変更セレクターの削除\r\n */\r\nconst resetDifWindow = () => {\r\n\tif (document.getElementById(`difList`) !== null) {\r\n\t\tdeleteChildspriteAll(`difList`);\r\n\t\t[`difList`, `difCover`, `btnDifU`, `btnDifD`].forEach(obj => document.getElementById(obj).remove());\r\n\t\tg_currentPage = `option`;\r\n\t\tsetShortcutEvent(g_currentPage, () => true, { displayFlg: false, dfEvtFlg: true });\r\n\t}\r\n};\r\n\r\n/**\r\n * 次の譜面番号を取得 \r\n * @param {number} _scoreId \r\n * @param {number} _scrollNum \r\n * @returns {number}\r\n */\r\nconst getNextDifficulty = (_scoreId, _scrollNum) => {\r\n\tconst currentPosIdx = g_headerObj.viewLists.findIndex(val => val === _scoreId);\r\n\tconst nextPosIdx = (currentPosIdx === -1 ? 0 : nextPos(currentPosIdx, _scrollNum, g_headerObj.viewLists.length));\r\n\treturn g_headerObj.viewLists[nextPosIdx];\r\n};\r\n\r\n/**\r\n * 譜面選択処理\r\n * @param {number} _scrollNum \r\n */\r\nconst nextDifficulty = (_scrollNum = 1) => {\r\n\tg_keyObj.prevKey = g_headerObj.keyLabels[g_stateObj.scoreId];\r\n\tg_stateObj.scoreId = getNextDifficulty(g_stateObj.scoreId, _scrollNum);\r\n\tsetDifficulty(true);\r\n\tresetDifWindow();\r\n};\r\n\r\n/**\r\n * 譜面リストの作成\r\n * @param {HTMLDivElement} _difList \r\n * @param {string} _targetKey \r\n */\r\nconst makeDifList = (_difList, _targetKey = ``) => {\r\n\tlet k = 0, pos = 0, curk = -1;\r\n\tg_headerObj.viewLists.forEach(j => {\r\n\t\tconst keyLabel = g_headerObj.keyLabels[j];\r\n\t\tif (_targetKey === `` || keyLabel === _targetKey) {\r\n\t\t\tlet text = `${getKeyName(keyLabel)} / ${g_headerObj.difLabels[j]}`;\r\n\t\t\tif (g_headerObj.makerView) {\r\n\t\t\t\ttext += ` (${g_headerObj.creatorNames[j]})`;\r\n\t\t\t}\r\n\t\t\t_difList.appendChild(makeDifLblCssButton(`dif${k}`, text, k, () => nextDifficulty(j - g_stateObj.scoreId),\r\n\t\t\t\t{ btnStyle: (j === g_stateObj.scoreId ? `Setting` : `Default`) }));\r\n\t\t\tif (j === g_stateObj.scoreId) {\r\n\t\t\t\tpos = k + 6.5 * (g_sHeight - 239) / 261;\r\n\t\t\t\tcurk = k;\r\n\t\t\t}\r\n\t\t\tk++;\r\n\t\t}\r\n\t});\r\n\tif (document.getElementById(`lblDifCnt`) === null) {\r\n\t\tdifCover.appendChild(createDivCss2Label(`lblDifCnt`, ``, {\r\n\t\t\tx: 0, y: 27, w: g_limitObj.difCoverWidth, h: 16, siz: 12, fontWeight: `bold`,\r\n\t\t}));\r\n\t}\r\n\t// フィルタなし> ALL: 1/ 5, フィルタあり> 7k: 1/ 1 のように現在位置と(フィルタされた)譜面数を表示\r\n\t// 現在位置が不確定の場合は、7k: -/ 1 のように現在位置を「-」で表示\r\n\tconst keyUnitAbbName = getStgDetailName(getKeyUnitName(_targetKey)).slice(0, 1) || ``;\r\n\tlblDifCnt.innerHTML = `${_targetKey === '' ? 'ALL' : getKeyName(_targetKey) + keyUnitAbbName}: ${curk === -1 ? '-' : curk + 1} / ${k}`;\r\n\t_difList.scrollTop = Math.max(pos * g_limitObj.setLblHeight - parseInt(_difList.style.height), 0);\r\n};\r\n\r\n/**\r\n * 譜面セレクター位置の変更ボタン\r\n * @param {number} _scrollNum \r\n */\r\nconst makeDifBtn = (_scrollNum = 1) => {\r\n\tconst dir = _scrollNum === 1 ? `D` : `U`;\r\n\treturn createCss2Button(`btnDif${dir}`, g_settingBtnObj.chara[dir], () => {\r\n\t\tdo {\r\n\t\t\tg_stateObj.scoreId = getNextDifficulty(g_stateObj.scoreId, _scrollNum);\r\n\t\t} while (g_stateObj.filterKeys !== `` && g_stateObj.filterKeys !== g_headerObj.keyLabels[g_stateObj.scoreId]);\r\n\t\tsetDifficulty(true);\r\n\t\tdeleteChildspriteAll(`difList`);\r\n\t\tmakeDifList(difList, g_stateObj.filterKeys);\r\n\t\tg_keyObj.prevKey = g_keyObj.currentKey;\r\n\t}, {\r\n\t\tx: 430 + _scrollNum * 10, y: 40, w: 20, h: 20, siz: g_limitObj.jdgCntsSiz,\r\n\t}, g_cssObj.button_Mini);\r\n};\r\n\r\n/**\r\n * 譜面変更セレクターの作成・再作成\r\n * @param {string} [_key=''] 絞り込みするキー名(無指定で絞り込みしない)\r\n */\r\nconst createDifWindow = (_key = ``) => {\r\n\tg_currentPage = `difSelector`;\r\n\tsetShortcutEvent(g_currentPage);\r\n\tconst difList = createEmptySprite(optionsprite, `difList`, g_windowObj.difList, g_cssObj.settings_DifSelector);\r\n\tconst difCover = createEmptySprite(optionsprite, `difCover`, g_windowObj.difCover, g_cssObj.settings_DifSelector);\r\n\tconst difFilter = createEmptySprite(difCover, `difFilter`, g_windowObj.difFilter, g_cssObj.settings_DifSelector)\r\n\r\n\t// リスト再作成\r\n\tmakeDifList(difList, _key);\r\n\r\n\t// ランダム選択\r\n\tdifCover.appendChild(\r\n\t\tmakeDifLblCssButton(`difRandom`, `RANDOM`, 0, () => {\r\n\t\t\tnextDifficulty(Math.floor(Math.random() * g_headerObj.keyLabels.length));\r\n\t\t}, { w: g_limitObj.difCoverWidth })\r\n\t);\r\n\r\n\t// 全リスト\r\n\tdifCover.appendChild(\r\n\t\tmakeDifLblCssButton(`keyFilter`, `ALL`, 1.9, () => {\r\n\t\t\tresetDifWindow();\r\n\t\t\tg_stateObj.filterKeys = ``;\r\n\t\t\tcreateDifWindow();\r\n\t\t}, { w: g_limitObj.difCoverWidth, btnStyle: (g_stateObj.filterKeys === `` ? `Setting` : `Default`) })\r\n\t);\r\n\r\n\t// キー別フィルタボタン作成\r\n\tlet pos = 0;\r\n\tg_headerObj.viewKeyLists.forEach((targetKey, m) => {\r\n\t\tdifFilter.appendChild(\r\n\t\t\tmakeDifLblCssButton(`keyFilter${m}`, `${getKeyName(targetKey)} ${getStgDetailName(getKeyUnitName(targetKey))}`, m, () => {\r\n\t\t\t\tresetDifWindow();\r\n\t\t\t\tg_stateObj.filterKeys = targetKey;\r\n\t\t\t\tcreateDifWindow(targetKey);\r\n\t\t\t}, { w: g_limitObj.difCoverWidth, btnStyle: (g_stateObj.filterKeys === targetKey ? `Setting` : `Default`) })\r\n\t\t);\r\n\t\tif (g_stateObj.filterKeys === targetKey) {\r\n\t\t\tpos = m + 5 * (g_sHeight - 300) / 200;\r\n\t\t}\r\n\t});\r\n\tdifFilter.scrollTop = Math.max(pos * g_limitObj.setLblHeight - parseInt(difFilter.style.height), 0);\r\n\r\n\tmultiAppend(optionsprite, makeDifBtn(-1), makeDifBtn());\r\n};\r\n\r\n/**\r\n * 譜面変更ボタンを押したときの処理\r\n * @param {number} [_num=1] \r\n */\r\nconst changeDifficulty = (_num = 1) => {\r\n\tif (g_headerObj.difSelectorUse) {\r\n\t\tg_stateObj.filterKeys = ``;\r\n\t\tif (document.getElementById(`difList`) === null) {\r\n\t\t\tg_keyObj.prevKey = g_keyObj.currentKey;\r\n\t\t\tcreateDifWindow();\r\n\t\t} else {\r\n\t\t\tresetDifWindow();\r\n\t\t}\r\n\t} else {\r\n\t\tnextDifficulty(_num);\r\n\t}\r\n};\r\n\r\n/**\r\n * 譜面基礎データの取得\r\n * @param {number} _scoreId \r\n * @returns {{ arrowCnts: number, frzCnts: number, apm: number, playingTime: string }}\r\n */\r\nconst getScoreBaseData = _scoreId => {\r\n\tconst arrowCnts = sumData(g_detailObj.arrowCnt[_scoreId]);\r\n\tconst frzCnts = sumData(g_detailObj.frzCnt[_scoreId]);\r\n\treturn {\r\n\t\tarrowCnts: arrowCnts,\r\n\t\tfrzCnts: frzCnts,\r\n\t\tapm: Math.round((arrowCnts + frzCnts) / (g_detailObj.playingFrame[_scoreId] / g_fps / 60)),\r\n\t\tplayingTime: transFrameToTimer(g_detailObj.playingFrame[_scoreId]),\r\n\t};\r\n};\r\n\r\n/**\r\n * 速度変化グラフの描画\r\n * @param {number} _scoreId\r\n */\r\nconst drawSpeedGraph = _scoreId => {\r\n\tconst startFrame = g_detailObj.startFrame[_scoreId];\r\n\tconst playingFrame = g_detailObj.playingFrameWithBlank[_scoreId];\r\n\tconst speedObj = {\r\n\t\tspeed: { frame: [0], speed: [1], cnt: 0, strokeColor: g_graphColorObj.speed },\r\n\t\tboost: { frame: [0], speed: [1], cnt: 0, strokeColor: g_graphColorObj.boost }\r\n\t};\r\n\r\n\tObject.keys(speedObj).forEach(speedType => {\r\n\t\tconst frame = speedObj[speedType].frame;\r\n\t\tconst speed = speedObj[speedType].speed;\r\n\t\tconst speedData = g_detailObj[`${speedType}Data`][_scoreId];\r\n\r\n\t\tfor (let i = 0; i < speedData?.length; i += 2) {\r\n\t\t\tif (speedData[i] >= startFrame) {\r\n\t\t\t\tframe.push(speedData[i] - startFrame);\r\n\t\t\t\tspeed.push(speedData[i + 1]);\r\n\t\t\t}\r\n\t\t\tspeedObj[speedType].cnt++;\r\n\t\t}\r\n\t\tframe.push(playingFrame);\r\n\t\tspeed.push(speed.at(-1));\r\n\t});\r\n\r\n\tconst canvas = document.getElementById(`graphSpeed`);\r\n\tconst context = canvas.getContext(`2d`);\r\n\tconst [_a, _b] = [-75, 100];\r\n\tconst [_min, _max] = [-0.2, 2.2];\r\n\tdrawBaseLine(context, { _fixed: 1, _mark: `x`, _a, _b, _min, _max });\r\n\r\n\tconst avgX = [0, 0];\r\n\tconst avgSubX = [0, 0];\r\n\tconst lineX = [0, 150], lineY = 208;\r\n\tObject.keys(speedObj).forEach((speedType, j) => {\r\n\t\tconst frame = speedObj[speedType].frame;\r\n\t\tconst speed = speedObj[speedType].speed;\r\n\r\n\t\tcontext.beginPath();\r\n\t\tlet preY;\r\n\t\tlet avgSubFrame = 0;\r\n\r\n\t\tfor (let i = 0; i < frame.length; i++) {\r\n\t\t\tconst x = frame[i] * (g_limitObj.graphWidth - 30) / playingFrame + 30;\r\n\t\t\tconst y = (Math.min(Math.max(speed[i], _min - 0.05), _max + 0.05) - 1) * _a + _b;\r\n\r\n\t\t\tcontext.lineTo(x, preY);\r\n\t\t\tcontext.lineTo(x, y);\r\n\t\t\tpreY = y;\r\n\r\n\t\t\tconst deltaFrame = frame[i] - (frame[i - 1] ?? startFrame);\r\n\t\t\tavgX[j] += deltaFrame * (speed[i - 1] ?? 1);\r\n\t\t\tif ((speed[i - 1] ?? 1) !== 1) {\r\n\t\t\t\tavgSubFrame += deltaFrame;\r\n\t\t\t\tavgSubX[j] += deltaFrame * (speed[i - 1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tavgX[j] /= playingFrame;\r\n\t\tavgSubX[j] /= Math.max(avgSubFrame, 1);\r\n\r\n\t\tcontext.lineWidth = 2;\r\n\t\tcontext.strokeStyle = speedObj[speedType].strokeColor;\r\n\t\tcontext.stroke();\r\n\r\n\t\tcontext.beginPath();\r\n\t\tcontext.moveTo(lineX[j], lineY);\r\n\t\tcontext.lineTo(lineX[j] + 25, lineY);\r\n\t\tcontext.stroke();\r\n\t\tcontext.font = `${wUnit(g_limitObj.mainSiz)} ${getBasicFont()}`;\r\n\t\tcontext.fillText(g_lblNameObj[`s_${speedType}`], lineX[j] + 30, lineY + 3);\r\n\r\n\t\tconst maxSpeed = Math.max(...speed);\r\n\t\tconst minSpeed = Math.min(...speed);\r\n\t\tcontext.font = `${wUnit(g_limitObj.graphMiniSiz)} ${getBasicFont()}`;\r\n\t\tcontext.fillText(`(${minSpeed.toFixed(2)}x` + (minSpeed === maxSpeed ? `` : ` -- ${Math.max(...speed).toFixed(2)}x`) + `)`, lineX[j] + 30, lineY + 16);\r\n\t\tcontext.fillText(`Avg. ` + (avgX[j] === 1 ? `----` : `${(avgSubX[j]).toFixed(2)}x`), lineX[j] + 30, lineY + 29);\r\n\t\tupdateScoreDetailLabel(`Speed`, `${speedType}S`, speedObj[speedType].cnt, j, g_lblNameObj[`s_${speedType}`]);\r\n\t});\r\n\tupdateScoreDetailLabel(`Speed`, `avgS`, `${(avgX[0] * avgX[1]).toFixed(2)}x`, 2, g_lblNameObj.s_avg);\r\n};\r\n\r\n/**\r\n * 譜面密度グラフの描画\r\n * @param {number} _scoreId \r\n */\r\nconst drawDensityGraph = _scoreId => {\r\n\r\n\tconst canvas = document.getElementById(`graphDensity`);\r\n\tconst context = canvas.getContext(`2d`);\r\n\tdrawBaseLine(context);\r\n\tfor (let j = 0; j < g_limitObj.densityDivision; j++) {\r\n\t\tcontext.beginPath();\r\n\t\t[``, `2Push`, `3Push`].forEach(val => {\r\n\t\t\tcontext.fillStyle = (g_detailObj.maxDensity[_scoreId].includes(j) ? g_graphColorObj[`max${val}`] : g_graphColorObj[`default${val}`]);\r\n\t\t\tcontext.fillRect(16 * j * 16 / g_limitObj.densityDivision + 30, 195 - 9 * g_detailObj[`density${val}Data`][_scoreId][j] / 10,\r\n\t\t\t\t15.5 * 16 / g_limitObj.densityDivision, 9 * g_detailObj[`density${val}Diff`][_scoreId][j] / 10\r\n\t\t\t);\r\n\t\t});\r\n\t\tcontext.stroke();\r\n\t}\r\n\r\n\tconst lineNames = [`Single`, `Chord`, `Triad+`];\r\n\tObject.keys(g_graphColorObj).filter(val => val.indexOf(`max`) !== -1).forEach((val, j) => {\r\n\t\tconst lineX = 70 + j * 70;\r\n\r\n\t\tcontext.beginPath();\r\n\t\tcontext.lineWidth = 3;\r\n\t\tcontext.fillStyle = g_rankObj.rankColorAllPerfect;\r\n\t\tcontext.strokeStyle = g_graphColorObj[val];\r\n\t\tcontext.moveTo(lineX, 215);\r\n\t\tcontext.lineTo(lineX + 20, 215);\r\n\t\tcontext.stroke();\r\n\t\tcontext.font = `${wUnit(g_limitObj.difSelectorSiz)} ${getBasicFont()}`;\r\n\t\tcontext.fillText(lineNames[j], lineX + 20, 218);\r\n\t});\r\n\r\n\tconst obj = getScoreBaseData(_scoreId);\r\n\tupdateScoreDetailLabel(`Density`, `APM`, obj.apm, 0, g_lblNameObj.s_apm);\r\n\tupdateScoreDetailLabel(`Density`, `Time`, obj.playingTime, 1, g_lblNameObj.s_time);\r\n\tupdateScoreDetailLabel(`Density`, `Arrow`, obj.arrowCnts, 3, g_lblNameObj.s_arrow);\r\n\tupdateScoreDetailLabel(`Density`, `Frz`, obj.frzCnts, 4, `${g_lblNameObj.s_frz}${g_headerObj.frzStartjdgUse ? ' <span class=\"common_bold\">(2x)</span>' : ''}`);\r\n};\r\n\r\n/**\r\n * 譜面明細内の補足情報の登録・更新\r\n * @param {string} _name 表示する譜面明細のラベル\r\n * @param {string} _label \r\n * @param {string} _value \r\n * @param {number} [_pos=0] 表示位置\r\n * @param {string} [_labelname=_label]\r\n */\r\nconst updateScoreDetailLabel = (_name, _label, _value, _pos = 0, _labelname = _label) => {\r\n\tconst baseLabel = (_bLabel, _bLabelname, _bAlign) =>\r\n\t\tdocument.getElementById(`detail${_name}`).appendChild(\r\n\t\t\tcreateDivCss2Label(_bLabel, _bLabelname, {\r\n\t\t\t\tx: 10, y: 110 + _pos * 20, w: 100, h: 20, siz: g_limitObj.difSelectorSiz, align: _bAlign,\r\n\t\t\t})\r\n\t\t);\r\n\tif (document.getElementById(`data${_label}`) === null) {\r\n\t\tbaseLabel(`lbl${_label}`, `${_labelname}`, C_ALIGN_LEFT);\r\n\t\tbaseLabel(`data${_label}`, `${_value}`, C_ALIGN_RIGHT);\r\n\t} else {\r\n\t\tdocument.getElementById(`data${_label}`).textContent = `${_value}`;\r\n\t}\r\n};\r\n\r\n/**\r\n * グラフの縦軸を描画\r\n * @param {CanvasRenderingContext2D} _context \r\n * @param {number} [object._fixed=2] y座標）目盛表記する小数桁数\r\n * @param {string} [object._mark=''] y座標）目盛の単位\r\n * @param {number} [object._resolution=10] y座標）明細分割数\r\n * @param {number} [object._a=-90]\r\n * @param {number} [object._b=105]\r\n * @param {number} [object._min=0] y座標）目盛の下限値\r\n * @param {number} [object._max=2] y座標）目盛の上限値\r\n */\r\nconst drawBaseLine = (_context, { _fixed = 2, _mark = ``, _resolution = 10, _a = -90, _b = 105, _min = 0, _max = 2 } = {}) => {\r\n\t_context.clearRect(0, 0, g_limitObj.graphWidth, g_limitObj.graphHeight);\r\n\r\n\tfor (let j = _min * _resolution; j <= _max * _resolution; j += 5) {\r\n\t\tfor (let k = 0; k < 5; k++) {\r\n\t\t\tif ((j + k) % 5 === 0) {\r\n\t\t\t\tdrawLine(_context, (j + k) / _resolution, `main`, { _fixed, _mark, _a, _b });\r\n\t\t\t} else {\r\n\t\t\t\tdrawLine(_context, (j + k) / _resolution, `sub`, { _fixed, _mark, _a, _b });\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * グラフ上に目盛を表示\r\n * @param {CanvasRenderingContext2D} _context \r\n * @param {number} _y \r\n * @param {string} _lineType \r\n * @param {number} [object._fixed] y座標）目盛表記する小数桁数\r\n * @param {string} [object._mark] y座標）目盛の単位\r\n * @param {number} [object._a]\r\n * @param {number} [object._b]\r\n */\r\nconst drawLine = (_context, _y, _lineType, { _fixed, _mark, _a, _b } = {}) => {\r\n\tconst lineY = (_y - 1) * _a + _b;\r\n\t_context.beginPath();\r\n\t_context.moveTo(30, lineY);\r\n\t_context.lineTo(g_limitObj.graphWidth, lineY);\r\n\t_context.lineWidth = 1;\r\n\r\n\tif (_lineType === `main`) {\r\n\t\tconst textBaseObj = document.getElementById(`lnkDifficulty`);\r\n\t\tconst textColor = window.getComputedStyle(textBaseObj, ``).color;\r\n\t\t_context.strokeStyle = textColor;\r\n\t\t_context.font = `${wUnit(12)} ${getBasicFont()}`;\r\n\t\t_context.fillStyle = textColor;\r\n\t\t_context.fillText(_y.toFixed(_fixed) + _mark, 2, lineY + 4);\r\n\t} else {\r\n\t\t_context.strokeStyle = `#646464`;\r\n\t}\r\n\t_context.stroke();\r\n};\r\n\r\n/**\r\n * 譜面の難易度情報用ラベル作成\r\n * @param {number} _scoreId \r\n */\r\nconst makeDifInfoLabels = _scoreId => {\r\n\r\n\t// ツール難易度\r\n\tconst detailToolDif = document.getElementById(`detailToolDif`);\r\n\t/**\r\n\t * 譜面の難易度情報ラベルの作成\r\n\t * @param {string} _lbl \r\n\t * @param {string} _data \r\n\t * @param {object} _obj \r\n\t * @returns {HTMLDivElement}\r\n\t */\r\n\tconst makeDifInfoLabel = (_lbl, _data, { x = 130, y = 25, w = 125, h = 35, siz = g_limitObj.difSelectorSiz, ...rest } = {}) =>\r\n\t\tcreateDivCss2Label(_lbl, _data, { x, y, w, h, siz, align: C_ALIGN_LEFT, ...rest });\r\n\r\n\tlet printData = ``;\r\n\tfor (let j = 0; j < g_detailObj.arrowCnt.length; j++) {\r\n\t\tconst obj = getScoreBaseData(j);\r\n\t\tprintData +=\r\n\t\t\t// 譜面番号\r\n\t\t\t`[${j + 1}]\\t` +\r\n\t\t\t// ツール値\r\n\t\t\t`${g_detailObj.toolDif[j].tool}\\t` +\r\n\t\t\t// 同時\r\n\t\t\t`${g_detailObj.toolDif[j].douji}\\t` +\r\n\t\t\t// 縦連\r\n\t\t\t`${g_detailObj.toolDif[j].tate}\\t` +\r\n\t\t\t// 総矢印数\r\n\t\t\t`${(obj.arrowCnts + obj.frzCnts)}\\t` +\r\n\t\t\t// 矢印\r\n\t\t\t`${obj.arrowCnts}\\t` +\r\n\t\t\t// フリーズアロー\r\n\t\t\t`${obj.frzCnts}\\t` +\r\n\t\t\t// APM\r\n\t\t\t`${obj.apm}\\t` +\r\n\t\t\t// 時間(分秒)\r\n\t\t\t`${obj.playingTime}\\r\\n`;\r\n\t}\r\n\tmultiAppend(detailToolDif,\r\n\t\tmakeDifInfoLabel(`lblTooldif`, g_lblNameObj.s_level, g_lblPosObj.lblTooldif),\r\n\t\tmakeDifInfoLabel(`dataTooldif`, ``, g_lblPosObj.dataTooldif),\r\n\t\tmakeDifInfoLabel(`lblDouji`, g_lblNameObj.s_douji, g_lblPosObj.lblDouji),\r\n\t\tmakeDifInfoLabel(`lblTate`, g_lblNameObj.s_tate, g_lblPosObj.lblTate),\r\n\t\tmakeDifInfoLabel(`dataDouji`, ``, g_lblPosObj.dataDouji),\r\n\t\tmakeDifInfoLabel(`dataTate`, ``, g_lblPosObj.dataTate),\r\n\t\tmakeDifInfoLabel(`lblArrowInfo`, g_lblNameObj.s_cnts, g_lblPosObj.lblArrowInfo),\r\n\t\tmakeDifInfoLabel(`dataArrowInfo`, ``, g_lblPosObj.dataArrowInfo),\r\n\t\tmakeDifInfoLabel(`lblArrowInfo2`, ``, g_lblPosObj.lblArrowInfo2),\r\n\t\tmakeDifInfoLabel(`dataArrowInfo2`, ``, g_lblPosObj.dataArrowInfo2),\r\n\t\tmakeDifLblCssButton(`lnkDifInfo`, g_lblNameObj.s_print, 8, () => {\r\n\t\t\tcopyTextToClipboard(\r\n\t\t\t\t`****** ${g_lblNameObj.s_printTitle} [${g_version}] ******\\r\\n\\r\\n`\r\n\t\t\t\t+ `\\t${g_lblNameObj.s_printHeader}\\r\\n\\r\\n${printData}`, g_msgInfoObj.I_0003\r\n\t\t\t);\r\n\t\t}, g_lblPosObj.lnkDifInfo),\r\n\t);\r\n\tcreateScText(lnkDifInfo, `DifInfo`, { targetLabel: `lnkDifInfo`, x: -10 });\r\n};\r\n\r\n/**\r\n * 譜面の難易度情報更新\r\n * @param {number} _scoreId \r\n */\r\nconst makeDifInfo = _scoreId => {\r\n\r\n\tconst arrowCnts = sumData(g_detailObj.arrowCnt[_scoreId]);\r\n\tconst frzCnts = sumData(g_detailObj.frzCnt[_scoreId].map(val => Math.floor(val)));\r\n\tconst push3CntStr = (g_detailObj.toolDif[_scoreId].push3.length === 0 ? `None` : `(${g_detailObj.toolDif[_scoreId].push3.join(', ')})`);\r\n\r\n\tif (document.getElementById(`lblTooldif`) === null) {\r\n\t\tmakeDifInfoLabels(_scoreId);\r\n\t}\r\n\tdataTooldif.textContent = g_detailObj.toolDif[_scoreId].tool;\r\n\tdataDouji.textContent = g_detailObj.toolDif[_scoreId].douji;\r\n\tdataTate.textContent = g_detailObj.toolDif[_scoreId].tate;\r\n\tlblArrowInfo2.innerHTML = g_lblNameObj.s_linecnts.split(`{0}`)\r\n\t\t.join(`${makeDedupliArray(g_detailObj.toolDif[_scoreId].push3).length} /cnt:${g_detailObj.toolDif[_scoreId].push3cnt}`);\r\n\tdataArrowInfo.innerHTML = `${arrowCnts + frzCnts * (g_headerObj.frzStartjdgUse ? 2 : 1)} \r\n\t<span style=\"font-size:${wUnit(g_limitObj.difSelectorSiz)};\">(${arrowCnts} + ${frzCnts}${g_headerObj.frzStartjdgUse ? ' <span class=\"common_bold\">x 2</span>' : ''})</span>`;\r\n\r\n\tconst makeArrowCntsView = (_cntlist) => {\r\n\t\tconst targetKey = g_headerObj.keyLabels[_scoreId];\r\n\t\tconst cntlist = [\r\n\t\t\t_cntlist.filter((val, j) =>\r\n\t\t\t\tg_keyObj[`pos${targetKey}_0`][j] < g_keyObj[`div${targetKey}_0`]),\r\n\t\t\t_cntlist.filter((val, j) =>\r\n\t\t\t\tg_keyObj[`pos${targetKey}_0`][j] >= g_keyObj[`div${targetKey}_0`])\r\n\t\t];\r\n\r\n\t\tlet cntlistStr = ``;\r\n\t\tcntlist.filter(array => array.length > 0).forEach(array => {\r\n\t\t\tconst maxVal = array.reduce((a, b) => Math.max(a, b));\r\n\t\t\tconst minVal = array.reduce((a, b) => Math.min(a, b));\r\n\r\n\t\t\tcntlistStr += `[ `;\r\n\t\t\tarray.forEach((val, j) => {\r\n\t\t\t\tif (maxVal !== minVal) {\r\n\t\t\t\t\tarray[j] = (val === minVal ? `<span class=\"settings_minArrowCnts\">${val}</span>` :\r\n\t\t\t\t\t\t(val === maxVal ? `<span class=\"settings_maxArrowCnts common_bold\">${val}</span>` : val));\r\n\t\t\t\t}\r\n\t\t\t\tif (val - Math.floor(val) > 0) {\r\n\t\t\t\t\tarray[j] = `<span class=\"keyconfig_warning\">${val}</span>`;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tcntlistStr += array.join(`, `) + ` ]`;\r\n\t\t});\r\n\r\n\t\treturn cntlistStr;\r\n\t}\r\n\r\n\tdataArrowInfo2.innerHTML = `<br>${makeArrowCntsView(g_detailObj.arrowCnt[_scoreId])}<br><br>\r\n\t\t\t${makeArrowCntsView(g_detailObj.frzCnt[_scoreId])}<br><br>${push3CntStr}`;\r\n};\r\n\r\n/**\r\n * ハイスコア表示\r\n * @param {number} _scoreId \r\n */\r\nconst makeHighScore = _scoreId => {\r\n\tconst detailHighScore = document.getElementById(`detailHighScore`);\r\n\r\n\t// 再描画のため一度クリア\r\n\tdeleteChildspriteAll(`detailHighScore`);\r\n\r\n\tconst keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;\r\n\tconst assistFlg = (g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `-${getStgDetailName(g_stateObj.autoPlay)}${getStgDetailName('less')}`);\r\n\tconst mirrorName = (g_stateObj.shuffle === C_FLG_OFF ? `` : `-${g_stateObj.shuffle}`);\r\n\tconst transKeyName = getTransKeyName();\r\n\tlet scoreName = getStorageKeyName(g_headerObj.keyLabels[_scoreId], transKeyName, assistFlg, mirrorName, _scoreId);\r\n\r\n\tif (!hasVal(g_localStorage.highscores?.[scoreName])) {\r\n\r\n\t\t// 古いキー定義の情報を検索\r\n\t\tconst relatedKeys = Object.entries(g_keyObj.keyTransPattern)\r\n\t\t\t.filter(([key, value]) => value === g_headerObj.keyLabels[_scoreId])\r\n\t\t\t.map(([key]) => key);\r\n\r\n\t\t// 古いキー定義のハイスコアがいる場合は、現行キー定義として表示\r\n\t\tfor (const legacyKey of relatedKeys) {\r\n\t\t\tlet tmpScoreName = getStorageKeyName(legacyKey, transKeyName, assistFlg, mirrorName, _scoreId);\r\n\t\t\tconst src = g_localStorage.highscores?.[tmpScoreName];\r\n\t\t\tif (hasVal(src)) {\r\n\t\t\t\tg_localStorage.highscores[scoreName] = structuredClone(src);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tconst createScoreLabel = (_id, _text, { xPos = 0, yPos = 0, dx = 0, w = 150, h = 17, colorName = _id, align = C_ALIGN_LEFT, overflow = `visible` } = {}) =>\r\n\t\tcreateDivCss2Label(`lblH${toCapitalize(_id)}`, _text, {\r\n\t\t\tx: xPos * 150 + 130 + dx, y: yPos * 16 + 5, w, h, siz: 14, align, overflow,\r\n\t\t}, g_cssObj[`common_${colorName}`]);\r\n\r\n\tconst charas = [\r\n\t\t`ii`, `shakin`, `matari`, `shobon`, `uwan`, `kita`, `iknai`, `maxCombo`, `fmaxCombo`, ``, `score`,\r\n\t];\r\n\tconst extData = {\r\n\t\tfast: `diffFast`, slow: `diffSlow`, adj: `estAdj`, excessive: `excessive`,\r\n\t};\r\n\t// 各判定 (FreezeComboとScoreの間に1行の空白を入れる)\r\n\tcharas.forEach((chara, j) => {\r\n\t\tif (chara === ``) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tmultiAppend(detailHighScore,\r\n\t\t\tcreateScoreLabel(chara, g_lblNameObj[`j_${chara}`], { yPos: j }),\r\n\t\t\tcreateScoreLabel(`${chara}S`, g_localStorage.highscores?.[scoreName]?.[chara] ?? `---`,\r\n\t\t\t\t{ xPos: 0, yPos: j, align: C_ALIGN_RIGHT }),\r\n\t\t);\r\n\t});\r\n\t// Fast, Slow, 推定Adj, Excessive (値が無ければスキップ)\r\n\tObject.keys(extData).forEach((chara, j) => {\r\n\t\tif (!hasVal(g_localStorage.highscores?.[scoreName]?.[chara], `---`)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tmultiAppend(detailHighScore,\r\n\t\t\tcreateScoreLabel(chara, g_lblNameObj[`j_${chara}`], { xPos: 1, yPos: j, dx: 20, colorName: extData[chara] }),\r\n\t\t\tcreateScoreLabel(`${chara}S`, g_localStorage.highscores?.[scoreName]?.[chara],\r\n\t\t\t\t{ xPos: 1, yPos: j, dx: -25, align: C_ALIGN_RIGHT }),\r\n\t\t);\r\n\t});\r\n\tif (hasVal(g_localStorage.highscores?.[scoreName]?.adj)) {\r\n\t\tmultiAppend(detailHighScore, createScoreLabel(`adjF`, `f`, { xPos: 2, yPos: 2, dx: -23 }));\r\n\t}\r\n\r\n\t// カスタム表示 (resultValsViewに指定した表示のみ)\r\n\tg_headerObj.resultValsView\r\n\t\t.filter(key => hasVal(g_localStorage.highscores?.[scoreName]?.[g_presetObj.resultVals?.[key]]))\r\n\t\t.forEach((key, j) => {\r\n\t\t\tmultiAppend(detailHighScore,\r\n\t\t\t\tcreateScoreLabel(key, g_presetObj.resultVals[key], { xPos: 1, yPos: j + 5, dx: 20 }),\r\n\t\t\t\tcreateScoreLabel(`${key}S`, g_localStorage.highscores?.[scoreName]?.[g_presetObj.resultVals[key]],\r\n\t\t\t\t\t{ xPos: 1, yPos: j + 5, dx: -25, align: C_ALIGN_RIGHT }),\r\n\t\t\t);\r\n\t\t});\r\n\t// ランク、クリアランプ、特殊設定条件\r\n\tmultiAppend(detailHighScore,\r\n\t\tcreateDivCss2Label(`lblHRank`, g_localStorage.highscores?.[scoreName]?.rankMark ?? `--`, Object.assign(g_lblPosObj.lblHRank, {\r\n\t\t\tcolor: g_localStorage.highscores?.[scoreName]?.rankColor ?? `#666666`,\r\n\t\t\tfontFamily: getBasicFont(`\"Bookman Old Style\"`),\r\n\t\t})),\r\n\t\tcreateScoreLabel(`lblHDateTime`, g_localStorage.highscores?.[scoreName]?.dateTime ?? `----/--/-- --:--`, { yPos: 12 }),\r\n\t\tcreateScoreLabel(`lblHMarks`,\r\n\t\t\t`${g_localStorage.highscores?.[scoreName]?.fullCombo ?? '' ? '<span class=\"result_FullCombo\">◆</span>' : ''}` +\r\n\t\t\t`${g_localStorage.highscores?.[scoreName]?.perfect ?? '' ? '<span class=\"result_Perfect\">◆</span>' : ''}` +\r\n\t\t\t`${g_localStorage.highscores?.[scoreName]?.allPerfect ?? '' ? '<span class=\"result_AllPerfect\">◆</span>' : ''}`, { xPos: 1, dx: 20, yPos: 12, w: 100, align: C_ALIGN_CENTER }),\r\n\t\tcreateScoreLabel(`lblHClearLamps`, `Cleared: ` + (g_localStorage.highscores?.[scoreName]?.clearLamps?.join(', ') ?? `---`), { yPos: 13, overflow: C_DIS_AUTO, w: g_sWidth / 2 + 40, h: 37 }),\r\n\r\n\t\tcreateScoreLabel(`lblHShuffle`, g_stateObj.shuffle.indexOf(`Mirror`) < 0 ? `` : `Shuffle: <span class=\"common_iknai\">${g_stateObj.shuffle}</span>`, { yPos: 11.5, dx: -130 }),\r\n\t\tcreateScoreLabel(`lblHAssist`, g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `Assist: <span class=\"common_kita\">${g_stateObj.autoPlay}</span>`, { yPos: 12.5, dx: -130 }),\r\n\t\tcreateScoreLabel(`lblHAnother`, !hasVal(g_keyObj[`transKey${keyCtrlPtn}`]) ? `` : `A.Keymode: <span class=\"common_ii\">${g_keyObj[`transKey${keyCtrlPtn}`]}</span>`, { yPos: 13.5, dx: -130 }),\r\n\t);\r\n\r\n\t// 結果をクリップボードへコピー (ハイスコア保存分)\r\n\tif (g_localStorage.highscores?.[scoreName] !== undefined) {\r\n\t\tconst twiturl = new URL(g_localStorageUrlOrg);\r\n\t\ttwiturl.searchParams.append(`scoreId`, _scoreId);\r\n\t\tconst baseTwitUrl = g_isLocal ? `` : `${twiturl.toString()}`.replace(/[\\t\\n]/g, ``);\r\n\r\n\t\tlet tweetFrzJdg = ``;\r\n\t\tlet tweetMaxCombo = `${g_localStorage.highscores?.[scoreName]?.maxCombo}`;\r\n\t\tif (g_allFrz > 0) {\r\n\t\t\ttweetFrzJdg = `${g_localStorage.highscores?.[scoreName]?.kita}-${g_localStorage.highscores?.[scoreName]?.iknai}`;\r\n\t\t\ttweetMaxCombo += `-${g_localStorage.highscores?.[scoreName]?.fmaxCombo}`;\r\n\t\t}\r\n\r\n\t\tconst musicTitle = g_headerObj.musicTitles[g_headerObj.musicNos[_scoreId]] || g_headerObj.musicTitle;\r\n\t\tlet tweetDifData = `${getKeyName(g_headerObj.keyLabels[_scoreId])}${transKeyName}${getStgDetailName('k-')}${g_headerObj.difLabels[_scoreId]}${assistFlg}`;\r\n\t\tif (g_stateObj.shuffle !== `OFF`) {\r\n\t\t\ttweetDifData += `:${getStgDetailName(g_stateObj.shuffle)}`;\r\n\t\t}\r\n\r\n\t\tconst resultParams = {\r\n\t\t\thashTag: (hasVal(g_headerObj.hashTag) ? ` ${g_headerObj.hashTag}` : ``),\r\n\t\t\ttuning: g_headerObj.creatorNames[_scoreId],\r\n\t\t\trankMark: g_localStorage.highscores?.[scoreName]?.rankMark || `--`,\r\n\t\t\tplayStyleData: g_localStorage.highscores[scoreName]?.playStyle || `--`,\r\n\t\t\thighscore: g_localStorage.highscores[scoreName],\r\n\t\t\ttweetExcessive: hasVal(g_localStorage.highscores[scoreName]?.excessive, `---`) ? `(+${g_resultObj.excessive})` : ``,\r\n\t\t\tmusicTitle, tweetDifData, tweetFrzJdg, tweetMaxCombo, baseTwitUrl,\r\n\t\t};\r\n\t\tconst resultCommon = unEscapeHtml(makeResultText(g_templateObj.resultFormatDf, resultParams));\r\n\t\tlet tweetResultTmp = makeResultText(g_headerObj.resultFormat, resultParams);\r\n\t\tif (g_presetObj.resultVals !== undefined) {\r\n\t\t\tObject.keys(g_presetObj.resultVals).forEach(key =>\r\n\t\t\t\ttweetResultTmp = tweetResultTmp.split(`[${key}]`).join(g_localStorage.highscores[scoreName][g_presetObj.resultVals[key]] || ``));\r\n\t\t}\r\n\t\tconst resultText = `${unEscapeHtml(tweetResultTmp)}`;\r\n\t\tmultiAppend(detailHighScore,\r\n\t\t\tmakeDifLblCssButton(`lnkResetHighScore`, g_lblNameObj.s_resetResult, 7, () => {\r\n\t\t\t\tif (window.confirm(g_msgObj.highscResetConfirm)) {\r\n\t\t\t\t\tdelete g_localStorage.highscores[scoreName];\r\n\t\t\t\t\tmakeHighScore(_scoreId);\r\n\t\t\t\t}\r\n\t\t\t}, Object.assign({ btnStyle: `Reset` }, g_lblPosObj.lnkHighScore)),\r\n\t\t\tmakeDifLblCssButton(`lnkHighScore`, g_lblNameObj.s_result, 8, () => {\r\n\t\t\t\tcopyTextToClipboard(keyIsShift() ? resultCommon : resultText, g_msgInfoObj.I_0001);\r\n\t\t\t}, g_lblPosObj.lnkHighScore),\r\n\t\t);\r\n\t}\r\n};\r\n\r\n/**\r\n * 譜面初期化処理\r\n * - 譜面の基本設定（キー数、初期速度、リバース、ゲージ設定）をここで行う\r\n * - g_canLoadDifInfoFlg は譜面初期化フラグで、初期化したくない場合は対象画面にて false にしておく\r\n *   (Display設定画面、キーコンフィグ画面では通常OFF)\r\n *   この関数を実行後、このフラグはONに戻るようになっている \r\n * - [キーコン]->[初期化]->[名称設定]の順に配置する。\r\n *   初期化処理にてキー数関連の設定を行っているため、この順序で無いとデータが正しく格納されない\r\n * \r\n * @param {boolean} _initFlg\r\n */\r\nconst setDifficulty = (_initFlg) => {\r\n\r\n\t// ---------------------------------------------------\r\n\t// 1. キーコンフィグ設定 (KeyConfig)\r\n\tg_keyObj.currentKey = g_headerObj.keyLabels[g_stateObj.scoreId];\r\n\tconst isNotSameKey = (g_keyObj.prevKey !== g_keyObj.currentKey);\r\n\r\n\tif (g_headerObj.dummyScoreNos !== undefined) {\r\n\t\tg_stateObj.dummyId = setIntVal(g_headerObj.dummyScoreNos[g_stateObj.scoreId], ``);\r\n\t}\r\n\t// 特殊キーフラグ\r\n\tg_stateObj.extraKeyFlg = g_headerObj.keyExtraList.includes(g_keyObj.currentKey);\r\n\r\n\t// ---------------------------------------------------\r\n\t// 2. 初期化設定\r\n\r\n\t// 保存した設定の再読込条件（設定画面切り替え時はスキップ）\r\n\t// ローカルストレージで保存した設定を呼び出し\r\n\tif ((g_canLoadDifInfoFlg && (isNotSameKey && g_stateObj.dataSaveFlg)) || _initFlg) {\r\n\r\n\t\tif (isNotSameKey && g_keyObj.prevKey !== `Dummy`) {\r\n\t\t\t// キーパターン初期化\r\n\t\t\tg_keyObj.currentPtn = 0;\r\n\t\t\tg_keycons.keySwitchNum = 0;\r\n\t\t}\r\n\t\tlet storageObj, addKey = ``;\r\n\r\n\t\tif (!g_stateObj.extraKeyFlg) {\r\n\r\n\t\t\t// キー別のローカルストレージの初期設定 ※特殊キーは除く\r\n\t\t\tg_localKeyStorage = parseStorageData(`danonicw-${g_keyObj.currentKey}k`, {\r\n\t\t\t\treverse: C_FLG_OFF,\r\n\t\t\t\tkeyCtrl: [[]],\r\n\t\t\t\tkeyCtrlPtn: 0,\r\n\t\t\t\tsetColor: [],\r\n\t\t\t});\r\n\t\t\tstorageObj = g_localKeyStorage;\r\n\r\n\t\t} else {\r\n\t\t\tstorageObj = g_localStorage;\r\n\t\t\taddKey = g_keyObj.currentKey;\r\n\t\t}\r\n\t\tif (isNotSameKey) {\r\n\t\t\tgetKeyReverse(storageObj, addKey);\r\n\r\n\t\t\t// キーコンフィグ初期値設定\r\n\t\t\tif (storageObj[`keyCtrlPtn${addKey}`] === undefined) {\r\n\t\t\t\tstorageObj[`keyCtrlPtn${addKey}`] = 0;\r\n\t\t\t}\r\n\t\t\tgetKeyCtrl(storageObj, addKey);\r\n\r\n\t\t\t// カラーセット初期値設定\r\n\t\t\tif (storageObj[`setColor${addKey}`] === undefined) {\r\n\t\t\t\tstorageObj[`setColor${addKey}`] = [];\r\n\t\t\t}\r\n\t\t\tif (storageObj[`setColor${addKey}`].length > 0) {\r\n\t\t\t\tg_keycons.colorTypes = addValtoArray(g_keycons.colorTypes, g_keycons.colorSelf);\r\n\t\t\t\tresetColorType({ _fromObj: storageObj, _from: addKey, _to: g_keycons.colorSelf });\r\n\t\t\t\tresetColorType({ _fromObj: storageObj, _from: addKey, _toObj: g_dfColorObj, _to: g_keycons.colorSelf });\r\n\r\n\t\t\t} else {\r\n\t\t\t\tif (g_localStorage.colorType === g_keycons.colorSelf) {\r\n\t\t\t\t\tg_colorType = `Default`;\r\n\t\t\t\t}\r\n\t\t\t\tg_keycons.colorTypes = g_keycons.colorTypes.filter(val => val !== g_keycons.colorSelf);\r\n\t\t\t}\r\n\r\n\t\t\tconst keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;\r\n\r\n\t\t\t// カラーグループ、シャッフルグループの設定\r\n\t\t\tg_keycons.groups.forEach(type => {\r\n\t\t\t\tresetGroupList(type, keyCtrlPtn);\r\n\t\t\t\tif (g_keyObj.currentPtn === -1) {\r\n\t\t\t\t\tconst storageKeyName = storageObj[`${type}${addKey}`] || storageObj[`${type}${g_keyObj.currentKey}_-1_-1`];\r\n\t\t\t\t\tif (storageKeyName !== undefined) {\r\n\t\t\t\t\t\tg_keyObj[`${type}${g_keyObj.currentKey}_-1`] = structuredClone(storageKeyName);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tg_keyObj[`${type}${g_keyObj.currentKey}_-1_-1`] = structuredClone(g_keyObj[`${type}${g_keyObj.currentKey}_-1`]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tg_keyObj[`${type}${keyCtrlPtn}`] = structuredClone(g_keyObj[`${type}${keyCtrlPtn}_0`]);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t}\r\n\t\t// 曲中ショートカットキーの切り替え\r\n\t\tsetPlayingShortcut();\r\n\t}\r\n\r\n\t// スクロール設定用の配列を入れ替え\r\n\tg_settings.scrolls = structuredClone(\r\n\t\ttypeof g_keyObj[`scrollDir${g_keyObj.currentKey}_${g_keyObj.currentPtn}`] === C_TYP_OBJECT ?\r\n\t\t\tObject.keys(g_keyObj[`scrollDir${g_keyObj.currentKey}_${g_keyObj.currentPtn}`]) : g_keyObj.scrollName_def\r\n\t);\r\n\r\n\t// アシスト設定の配列を入れ替え\r\n\tg_settings.autoPlays = (typeof g_keyObj[`assistPos${g_keyObj.currentKey}_${g_keyObj.currentPtn}`] === C_TYP_OBJECT ?\r\n\t\tg_autoPlaysBase.concat(Object.keys(g_keyObj[`assistPos${g_keyObj.currentKey}_${g_keyObj.currentPtn}`])) :\r\n\t\tg_autoPlaysBase.concat());\r\n\r\n\t// ゲージ設定及びカーソル位置調整\r\n\tsetGauge(0, true);\r\n\r\n\t// 速度、スクロール、アシスト設定のカーソル位置調整\r\n\tif (_initFlg) {\r\n\t\tg_stateObj.speed = g_headerObj.initSpeeds[g_stateObj.scoreId];\r\n\t\tg_settings.speedNum = getCurrentNo(g_settings.speeds, g_stateObj.speed);\r\n\t}\r\n\tg_settings.scrollNum = getCurrentNo(g_settings.scrolls, g_stateObj.scroll);\r\n\tg_settings.autoPlayNum = getCurrentNo(g_settings.autoPlays, g_stateObj.autoPlay);\r\n\r\n\t// ---------------------------------------------------\r\n\t// 3. 名称の設定\r\n\r\n\t// 譜面名設定 (Difficulty)\r\n\tconst difWidth = parseFloat(lnkDifficulty.style.width);\r\n\tconst transKeyName = getTransKeyName();\r\n\tconst keyUnitName = getStgDetailName(getKeyUnitName(g_keyObj.currentKey));\r\n\tconst difNames = [`${getKeyName(g_keyObj.currentKey)}${transKeyName} ${keyUnitName} / ${g_headerObj.difLabels[g_stateObj.scoreId]}`];\r\n\tlnkDifficulty.style.fontSize = wUnit(getFontSize2(difNames[0], difWidth, { maxSiz: g_limitObj.setLblSiz }));\r\n\r\n\tif (g_headerObj.makerView) {\r\n\t\tdifNames.push(`(${g_headerObj.creatorNames[g_stateObj.scoreId]})`);\r\n\t\tdifNames.forEach((difName, j) => {\r\n\t\t\tconst tmpSize = getFontSize2(difName, difWidth);\r\n\t\t\tdifNames[j] = `<span style=\"font-size:${wUnit(tmpSize)}\">${difName}</span>`;\r\n\t\t});\r\n\t}\r\n\tlnkDifficulty.innerHTML = difNames.join(``);\r\n\r\n\t// 速度設定 (Speed)\r\n\tsetSetting(0, `speed`, ` ${g_lblNameObj.multi}`);\r\n\r\n\t// リバース設定 (Reverse, Scroll)\r\n\tif (g_headerObj.scrollUse) {\r\n\t\tg_stateObj.scroll = g_settings.scrolls[g_settings.scrollNum];\r\n\t\tconst [visibleScr, hiddenScr] = (g_settings.scrolls.length > 1 ? [`scroll`, `reverse`] : [`reverse`, `scroll`]);\r\n\t\tdocument.getElementById(`${visibleScr}Sprite`).style.display = C_DIS_INHERIT;\r\n\t\tdocument.getElementById(`${hiddenScr}Sprite`).style.display = C_DIS_NONE;\r\n\t\tsetSetting(0, visibleScr);\r\n\r\n\t\tg_shortcutObj.option.KeyR.id = g_settings.scrolls.includes(`Reverse`) ?\r\n\t\t\tg_shortcutObj.option.KeyR.exId : g_shortcutObj.option.KeyR.dfId;\r\n\r\n\t\tif (g_settings.scrolls.length > 1) {\r\n\t\t\tsetReverseView(document.getElementById(`btnReverse`));\r\n\t\t}\r\n\t} else {\r\n\t\tg_settings.scrolls = structuredClone(g_keyObj.scrollName_def);\r\n\t\tsetSetting(0, `reverse`);\r\n\t}\r\n\r\n\t// オート・アシスト設定 (AutoPlay)\r\n\tg_stateObj.autoPlay = g_settings.autoPlays[g_settings.autoPlayNum];\r\n\tlnkAutoPlay.textContent = getStgDetailName(g_stateObj.autoPlay);\r\n\r\n\t// 譜面毎のExcessive再設定（意図的に変更した場合のみ元に戻さない）\r\n\tif (g_canLoadDifInfoFlg && (g_stateObj.excessiveScoreId !== g_stateObj.scoreId)) {\r\n\t\tg_headerObj.excessiveJdgUse = g_headerObj.excessiveJdgUses[g_stateObj.scoreId];\r\n\t\tg_stateObj.excessive = boolToSwitch(g_headerObj.excessiveJdgUse);\r\n\t}\r\n\tg_headerObj.excessiveUse = g_headerObj.excessiveUses[g_stateObj.scoreId];\r\n\tif (g_headerObj.excessiveUse) {\r\n\t\tsetExcessive(document.getElementById(`lnkExcessive`), g_stateObj.excessive === C_FLG_ON);\r\n\t\tlnkExcessive.style.display = C_DIS_INHERIT;\r\n\t} else {\r\n\t\tg_stateObj.excessiveChgFlg = false;\r\n\t\tlblExcessive.style.display = (g_stateObj.excessive === C_FLG_ON ? C_DIS_INHERIT : C_DIS_NONE);\r\n\t\tlnkExcessive.style.display = C_DIS_NONE;\r\n\t}\r\n\r\n\t// 譜面明細画面の再描画\r\n\tif (g_settings.scoreDetails.length > 0) {\r\n\t\tdrawSpeedGraph(g_stateObj.scoreId);\r\n\t\tdrawDensityGraph(g_stateObj.scoreId);\r\n\t\tmakeDifInfo(g_stateObj.scoreId);\r\n\t\tmakeHighScore(g_stateObj.scoreId);\r\n\t}\r\n\r\n\t// 楽曲データの表示\r\n\tlblMusicInfo.textContent = getMusicInfoView();\r\n\tlblMusicInfo.style.fontSize = wUnit(getFontSize2(lblMusicInfo.textContent, g_btnWidth(3 / 4), { maxSiz: 12 }));\r\n\r\n\t// ユーザカスタムイベント(初期)\r\n\tg_customJsObj.difficulty.forEach(func => func(_initFlg, g_canLoadDifInfoFlg));\r\n\r\n\t// ---------------------------------------------------\r\n\t// 4. 譜面初期情報ロード許可フラグの設定\r\n\tg_canLoadDifInfoFlg = true;\r\n};\r\n\r\n/**\r\n * 設定・オプション画面のラベル・ボタン処理の描画\r\n * @param {Object} _sprite 基準とするスプライト(ここで指定する座標は、そのスプライトからの相対位置)\r\n */\r\nconst createOptionWindow = _sprite => {\r\n\r\n\t// 各ボタン用のスプライトを作成\r\n\tconst optionsprite = createEmptySprite(_sprite, `optionsprite`, g_windowObj.optionSprite);\r\n\r\n\t// 設定毎に個別のスプライトを作成し、その中にラベル・ボタン類を配置\r\n\tconst spriteList = setSpriteList(g_settingPos.option);\r\n\r\n\t// ---------------------------------------------------\r\n\t// 難易度 (Difficulty)\r\n\t// 縦位置: 0 \r\n\tspriteList.difficulty.appendChild(createLblSetting(`Difficulty`, -5));\r\n\r\n\tconst lnkDifficulty = makeSettingLblCssButton(`lnkDifficulty`, ``, 0, () => changeDifficulty(), {\r\n\t\ty: -10, h: g_limitObj.setLblHeight + 10, cxtFunc: () => changeDifficulty(-1),\r\n\t});\r\n\r\n\t// 譜面選択ボタン（メイン、右回し、左回し）\r\n\tmultiAppend(spriteList.difficulty,\r\n\t\tlnkDifficulty,\r\n\t\tmakeMiniCssButton(`lnkDifficulty`, `R`, 0, () => nextDifficulty(), { dy: -10, dh: 10 }),\r\n\t\tmakeMiniCssButton(`lnkDifficulty`, `L`, 0, () => nextDifficulty(-1), { dy: -10, dh: 10 }),\r\n\t);\r\n\tcreateScText(spriteList.difficulty, `Difficulty`);\r\n\tif (g_headerObj.difSelectorUse) {\r\n\t\tcreateScText(spriteList.difficulty, `DifficultyList`, { x: 147, y: -10, targetLabel: `lnkDifficulty` });\r\n\t}\r\n\r\n\t// ---------------------------------------------------\r\n\t// ハイスコア機能実装時に使用予定のスペース\r\n\t// 縦位置: 1\r\n\r\n\t// ---------------------------------------------------\r\n\t// 速度(Speed)\r\n\t// 縦位置: 2  短縮ショートカットあり\r\n\tcreateGeneralSetting(spriteList.speed, `speed`, {\r\n\t\tskipTerms: g_settings.speedTerms, hiddenBtn: true, scLabel: g_lblNameObj.sc_speed, roundNum: 5,\r\n\t\tunitName: ` ${g_lblNameObj.multi}`,\r\n\t});\r\n\tif (g_headerObj.baseSpeed !== 1) {\r\n\t\tdivRoot.appendChild(\r\n\t\t\tcreateDivCss2Label(`lblBaseSpd`, `Δv: ${Math.round(g_headerObj.baseSpeed * 100) / 100}x`, g_lblPosObj.lblBaseSpd)\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * 譜面明細子画面・グラフの作成\r\n\t * @param {string} _name \r\n\t * @param {boolean} _graphUseFlg\r\n\t * @returns {HTMLDivElement}\r\n\t */\r\n\tconst createScoreDetail = (_name, _graphUseFlg = true) => {\r\n\t\tconst detailObj = createEmptySprite(scoreDetail, `detail${_name}`, g_windowObj.detailObj);\r\n\r\n\t\tif (_graphUseFlg) {\r\n\t\t\tconst graphObj = document.createElement(`canvas`);\r\n\t\t\tconst textBaseObj = document.getElementById(`lnkDifficulty`);\r\n\t\t\tconst bkColor = window.getComputedStyle(textBaseObj, ``).backgroundColor;\r\n\r\n\t\t\tgraphObj.id = `graph${_name}`;\r\n\t\t\tgraphObj.width = g_limitObj.graphWidth;\r\n\t\t\tgraphObj.height = g_limitObj.graphHeight;\r\n\t\t\tgraphObj.style.left = wUnit(125);\r\n\t\t\tgraphObj.style.top = wUnit(0);\r\n\t\t\tgraphObj.style.position = `absolute`;\r\n\t\t\tgraphObj.style.background = bkColor;\r\n\t\t\tgraphObj.style.border = `dotted ${wUnit(2)}`;\r\n\r\n\t\t\tdetailObj.appendChild(graphObj);\r\n\t\t}\r\n\r\n\t\treturn detailObj;\r\n\t};\r\n\r\n\tif (g_settings.scoreDetails.length > 0) {\r\n\t\tmultiAppend(spriteList.speed,\r\n\t\t\tcreateCss2Button(`btnGraphB`, ``, () => true, {\r\n\t\t\t\tx: -25, y: -60, w: 0, h: 0, opacity: 0, resetFunc: () => setScoreDetail(true),\r\n\t\t\t}, g_cssObj.button_Mini),\r\n\t\t\tcreateCss2Button(`btnGraph`, `i`, () => true, {\r\n\t\t\t\tx: -25, y: -60, w: 30, h: 30, siz: g_limitObj.jdgCharaSiz, title: g_msgObj.graph,\r\n\t\t\t\tresetFunc: () => setScoreDetail(), cxtFunc: () => setScoreDetail(),\r\n\t\t\t}, g_cssObj.button_Mini)\r\n\t\t);\r\n\t\tg_stateObj.scoreDetailViewFlg = false;\r\n\t\tconst scoreDetail = createEmptySprite(optionsprite, `scoreDetail`, g_windowObj.scoreDetail, g_cssObj.settings_DifSelector);\r\n\r\n\t\t/**\r\n\t\t * 譜面明細表示の切替\r\n\t\t * @param {number} _val \r\n\t\t */\r\n\t\tconst changeScoreDetail = (_val = 0) => {\r\n\t\t\tif (g_currentPage === `difSelector`) {\r\n\t\t\t\tresetDifWindow();\r\n\t\t\t}\r\n\t\t\tg_stateObj.scoreDetailViewFlg = true;\r\n\t\t\tscoreDetail.style.visibility = `visible`;\r\n\r\n\t\t\t// 表示内容を非表示化、ボタン色をデフォルトに戻す\r\n\t\t\t$id(`detail${g_stateObj.scoreDetail}`).visibility = `hidden`;\r\n\t\t\tdocument.getElementById(`lnk${g_stateObj.scoreDetail}G`).classList.replace(g_cssObj.button_Setting, g_cssObj.button_Default);\r\n\r\n\t\t\t// 選択先を表示、ボタン色を選択中に変更\r\n\t\t\t// Qキーを押したときのリンク先を次の明細へ変更\r\n\t\t\tg_stateObj.scoreDetail = g_settings.scoreDetails[_val];\r\n\t\t\t[`option`, `difSelector`].forEach(page => g_shortcutObj[page].KeyQ.id = g_settings.scoreDetailCursors[(_val + 1) % g_settings.scoreDetailCursors.length]);\r\n\r\n\t\t\t$id(`detail${g_stateObj.scoreDetail}`).visibility = `visible`;\r\n\t\t\tdocument.getElementById(`lnk${g_stateObj.scoreDetail}G`).classList.replace(g_cssObj.button_Default, g_cssObj.button_Setting);\r\n\t\t};\r\n\r\n\t\tmultiAppend(scoreDetail,\r\n\t\t\tcreateScoreDetail(`Speed`),\r\n\t\t\tcreateScoreDetail(`Density`),\r\n\t\t\tcreateScoreDetail(`ToolDif`, false),\r\n\t\t\tcreateScoreDetail(`HighScore`, false),\r\n\t\t);\r\n\t\tg_settings.scoreDetails.forEach((sd, j) => {\r\n\t\t\tscoreDetail.appendChild(\r\n\t\t\t\tmakeDifLblCssButton(`lnk${sd}G`, getStgDetailName(sd), j, () => changeScoreDetail(j), {\r\n\t\t\t\t\tw: g_limitObj.difCoverWidth, h: 20, title: g_msgObj[`s_${sd}`],\r\n\t\t\t\t\tbtnStyle: (g_stateObj.scoreDetail === sd ? `Setting` : `Default`),\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t\t\tcreateScText(document.getElementById(`lnk${sd}G`), `${sd}G`, { targetLabel: `lnk${sd}G`, x: -5 });\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * 譜面明細表示／非表示ボタンの処理\r\n\t * @param {boolean} _resetFlg\r\n\t */\r\n\tconst setScoreDetail = (_resetFlg = false) => {\r\n\t\tif (g_currentPage === `difSelector`) {\r\n\t\t\tresetDifWindow();\r\n\t\t\tg_stateObj.scoreDetailViewFlg = false;\r\n\t\t\tg_shortcutObj.difSelector.KeyQ.id = g_settings.scoreDetailCursors[0];\r\n\t\t}\r\n\t\tconst scoreDetail = document.getElementById(`scoreDetail`);\r\n\t\tconst detailObj = document.getElementById(`detail${g_stateObj.scoreDetail}`);\r\n\t\tconst visibles = [`hidden`, `visible`];\r\n\r\n\t\tg_stateObj.scoreDetailViewFlg = !g_stateObj.scoreDetailViewFlg;\r\n\t\tscoreDetail.style.visibility = visibles[Number(g_stateObj.scoreDetailViewFlg)];\r\n\t\tdetailObj.style.visibility = visibles[Number(g_stateObj.scoreDetailViewFlg)];\r\n\r\n\t\t// Qキーを押したときのカーソル位置を先頭に初期化\r\n\t\tif (_resetFlg) {\r\n\t\t\tg_shortcutObj.option.KeyQ.id = g_settings.scoreDetailCursors[0];\r\n\t\t}\r\n\t};\r\n\r\n\t// ---------------------------------------------------\r\n\t// 速度モーション (Motion)\r\n\t// 縦位置: 3\r\n\tcreateGeneralSetting(spriteList.motion, `motion`);\r\n\r\n\t// ---------------------------------------------------\r\n\t// リバース (Reverse) / スクロール (Scroll)\r\n\t// 縦位置: 4\r\n\tcreateGeneralSetting(spriteList.reverse, `reverse`, {\r\n\t\taddRFunc: () => {\r\n\t\t\tif (g_headerObj.scrollUse && g_settings.scrolls.length > 1) {\r\n\t\t\t\tsetReverseView(document.getElementById(`btnReverse`));\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\tif (g_headerObj.scrollUse) {\r\n\t\tcreateGeneralSetting(spriteList.scroll, `scroll`, { scLabel: g_lblNameObj.sc_scroll });\r\n\t\t[$id(`lnkScroll`).left, $id(`lnkScroll`).width] = [\r\n\t\t\twUnit(parseFloat($id(`lnkScroll`).left) + 90), wUnit(parseFloat($id(`lnkScroll`).width) - 90)\r\n\t\t];\r\n\r\n\t\tspriteList.scroll.appendChild(\r\n\t\t\tcreateCss2Button(`btnReverse`, `${g_lblNameObj.Reverse}:${getStgDetailName(g_stateObj.reverse)}`, evt => setReverse(evt.target),\r\n\t\t\t\tObject.assign(g_lblPosObj.btnReverse, {\r\n\t\t\t\t\tcxtFunc: evt => setReverse(evt.target),\r\n\t\t\t\t}), g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.reverse}`])\r\n\t\t);\r\n\t\tspriteList[g_settings.scrolls.length > 1 ? `reverse` : `scroll`].style.display = C_DIS_NONE;\r\n\t} else {\r\n\t\tspriteList.scroll.style.pointerEvents = C_DIS_NONE;\r\n\t}\r\n\r\n\t// ---------------------------------------------------\r\n\t// ミラー・ランダム (Shuffle)\r\n\t// 縦位置: 5.5\r\n\tcreateGeneralSetting(spriteList.shuffle, `shuffle`, g_settings.scoreDetails.length > 0 ? {\r\n\t\taddRFunc: () => makeHighScore(g_stateObj.scoreId),\r\n\t} : {});\r\n\r\n\t// ---------------------------------------------------\r\n\t// 鑑賞モード設定 (AutoPlay)\r\n\t// 縦位置: 6.5\r\n\tcreateGeneralSetting(spriteList.autoPlay, `autoPlay`, g_settings.scoreDetails.length > 0 ? {\r\n\t\taddRFunc: () => makeHighScore(g_stateObj.scoreId),\r\n\t} : {});\r\n\r\n\t// ---------------------------------------------------\r\n\t// ゲージ設定 (Gauge)\r\n\t// 縦位置: 7.5\r\n\tspriteList.gauge.appendChild(createLblSetting(`Gauge`));\r\n\r\n\t// ゲージ設定詳細 縦位置: ゲージ設定+1\r\n\tspriteList.gauge.appendChild(createDivCss2Label(`lblGauge2`, ``, g_lblPosObj.lblGauge2));\r\n\r\n\tif (g_headerObj.gaugeUse) {\r\n\t\tmultiAppend(spriteList.gauge,\r\n\t\t\tmakeSettingLblCssButton(`lnkGauge`, ``, 0, () => setGauge(1), { cxtFunc: () => setGauge(-1) }),\r\n\t\t\tmakeMiniCssButton(`lnkGauge`, `R`, 0, () => setGauge(1)),\r\n\t\t\tmakeMiniCssButton(`lnkGauge`, `L`, 0, () => setGauge(-1)),\r\n\t\t);\r\n\t\tcreateScText(spriteList.gauge, `Gauge`);\r\n\t} else {\r\n\t\tlblGauge.classList.add(g_cssObj.settings_Disabled);\r\n\t\tspriteList.gauge.appendChild(makeDisabledLabel(`lnkGauge`, 0, getStgDetailName(g_stateObj.gauge)));\r\n\t}\r\n\r\n\t// 空押し判定設定 (Excessive)\r\n\tspriteList.gauge.appendChild(\r\n\t\tcreateDivCss2Label(`lblExcessive`, `${g_lblNameObj.Excessive}:${C_FLG_ON}`,\r\n\t\t\tg_lblPosObj.lblExcessive, g_cssObj[`button_Disabled${C_FLG_ON}`]\r\n\t\t)\r\n\t);\r\n\tspriteList.gauge.appendChild(\r\n\t\tcreateCss2Button(`lnkExcessive`, g_lblNameObj.Excessive, evt => setExcessive(evt.target),\r\n\t\t\tObject.assign(g_lblPosObj.btnExcessive, {\r\n\t\t\t\ttitle: g_msgObj.excessive, cxtFunc: evt => setExcessive(evt.target),\r\n\t\t\t}), g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.excessive}`])\r\n\t);\r\n\r\n\t// ---------------------------------------------------\r\n\t// タイミング調整 (Adjustment)\r\n\t// 縦位置: 10.5  短縮ショートカットあり\r\n\tcreateGeneralSetting(spriteList.adjustment, `adjustment`, {\r\n\t\tskipTerms: g_settings.adjustmentTerms, hiddenBtn: true, scLabel: g_lblNameObj.sc_adjustment, roundNum: 5,\r\n\t\tunitName: g_lblNameObj.frame, addRFunc: () => viewAdjustment(),\r\n\t});\r\n\r\n\tconst viewAdjustment = () => {\r\n\t\tif (g_headerObj.playbackRate !== 1) {\r\n\t\t\tconst adjustmentVal = isLocalMusicFile(g_stateObj.scoreId) ?\r\n\t\t\t\tMath.round(g_stateObj.adjustment / g_headerObj.playbackRate) :\r\n\t\t\t\t(g_stateObj.adjustment / g_headerObj.playbackRate).toFixed(1);\r\n\t\t\tdocument.getElementById(`lnkAdjustment`).innerHTML = `${adjustmentVal}${g_lblNameObj.frame}`\r\n\t\t\t\t+ `<span style=\"font-size:${g_limitObj.adjustmentViewOrgSiz}px\"> (${g_stateObj.adjustment.toFixed(1)}${g_localStorage.adjustment === g_stateObj.adjustment ? '*' : ''})</span>`;\r\n\t\t\tdocument.getElementById(`lnkAdjustment`).style.fontSize = `${g_limitObj.adjustmentViewSiz}px`;\r\n\t\t\tdocument.getElementById(`lnkAdjustment`).style.lineHeight = `${g_limitObj.adjustmentLineHeight}px`;\r\n\t\t}\r\n\t};\r\n\tviewAdjustment();\r\n\r\n\t// ---------------------------------------------------\r\n\t// フェードイン (Fadein)\r\n\t// 縦位置: 11.5 スライダーあり\r\n\tspriteList.fadein.appendChild(createLblSetting(`Fadein`));\r\n\r\n\tconst lnkFadein = createDivCss2Label(`lnkFadein`, `${g_stateObj.fadein}${g_lblNameObj.percent}`,\r\n\t\tg_lblPosObj.lnkFadein, g_cssObj.settings_FadeinBar);\r\n\tspriteList.fadein.appendChild(lnkFadein);\r\n\r\n\tconst setFadein = _sign => {\r\n\t\tg_stateObj.fadein = nextPos(g_stateObj.fadein, _sign, 100);\r\n\t\tfadeinSlider.value = g_stateObj.fadein;\r\n\t\tlnkFadein.textContent = `${g_stateObj.fadein}${g_lblNameObj.percent}`;\r\n\t};\r\n\r\n\tmultiAppend(spriteList.fadein,\r\n\r\n\t\t// 右回し・左回しボタン\r\n\t\tmakeMiniCssButton(`lnkFadein`, `R`, 0, () => setFadein(1)),\r\n\t\tmakeMiniCssButton(`lnkFadein`, `L`, 0, () => setFadein(-1)),\r\n\r\n\t\t// フェードインのスライダー処理\r\n\t\tcreateDivCss2Label(`lblFadeinBar`, `<input id=\"fadeinSlider\" type=\"range\" value=\"${g_stateObj.fadein}\" min=\"0\" max=\"99\" step=\"1\">`,\r\n\t\t\tg_lblPosObj.lblFadeinBar),\r\n\r\n\t);\r\n\r\n\tconst fadeinSlider = document.getElementById(`fadeinSlider`);\r\n\tfadeinSlider.addEventListener(`input`, () =>\r\n\t\tg_stateObj.fadein = inputSlider(fadeinSlider, lnkFadein, `fadein`), false);\r\n\r\n\t// ---------------------------------------------------\r\n\t// ボリューム (Volume) \r\n\t// 縦位置: 12.5\r\n\tcreateGeneralSetting(spriteList.volume, `volume`, { unitName: g_lblNameObj.percent });\r\n\r\n\t// 譜面番号の再取得\r\n\tg_stateObj.scoreId = getNextDifficulty(g_stateObj.scoreId, 0);\r\n\tconst keyLists = makeDedupliArray(g_headerObj.viewLists.map(j => g_headerObj.keyLabels[j]));\r\n\tg_headerObj.viewKeyLists = keyLists.sort((a, b) => parseInt(a) - parseInt(b));\r\n\tg_headerObj.difSelectorUse = getDifSelectorUse(g_rootObj.difSelectorUse);\r\n\r\n\t// 設定画面の一通りのオブジェクトを作成後に譜面・速度・ゲージ設定をまとめて行う\r\n\tsetDifficulty(false);\r\n\toptionsprite.oncontextmenu = () => false;\r\n};\r\n\r\n/**\r\n * 汎用設定\r\n * @param {HTMLDivElement} _obj \r\n * @param {string} _settingName \r\n * @param {string} [object.unitName=''] 設定名の単位\r\n * @param {number[]} [object.skipTerms] ボタンの設定スキップ間隔(デフォルト:[1(外側), 1(内側), 1(最内側)])\r\n * @param {boolean} [object.hiddenBtn=false] 隠しボタン(ショートカットキーのみ)の利用有無\r\n * @param {function} [object.addRFunc] 右側のボタンを押したときの追加処理\r\n * @param {function} [object.addLFunc] 左側のボタンを押したときの追加処理\r\n * @param {string} [object.settingLabel=_settingName] 設定名\r\n * @param {string} [object.displayName] 画面名\r\n * @param {string} [object.scLabel=''] ショートカットキーの表示名\r\n * @param {number} [object.roundNum=0] 設定スキップ間隔の丸め基準数\r\n * @param {number} [object.adjY=0] 設定ボタンのY座標位置\r\n */\r\nconst createGeneralSetting = (_obj, _settingName, { unitName = ``,\r\n\tskipTerms = fillArray(3, 1), hiddenBtn = false, addRFunc = () => { }, addLFunc = addRFunc,\r\n\tsettingLabel = _settingName, displayName = g_currentPage, scLabel = ``, roundNum = 0, adjY = 0 } = {}) => {\r\n\r\n\tconst settingUpper = toCapitalize(_settingName);\r\n\tconst linkId = `lnk${settingUpper}`;\r\n\tconst initName = `${getStgDetailName(g_stateObj[_settingName])}${unitName}`;\r\n\t_obj.appendChild(createLblSetting(settingUpper, adjY, toCapitalize(settingLabel)));\r\n\r\n\tif (g_headerObj[`${_settingName}Use`] === undefined || g_headerObj[`${_settingName}Use`]) {\r\n\r\n\t\tmultiAppend(_obj,\r\n\t\t\tmakeSettingLblCssButton(linkId, `${initName}${g_localStorage[_settingName] === g_stateObj[_settingName] ? ' *' : ''}`, 0,\r\n\t\t\t\t() => {\r\n\t\t\t\t\tsetSetting(skipTerms[1], _settingName, unitName, roundNum, { func: () => addRFunc() });\r\n\t\t\t\t}, {\r\n\t\t\t\tcxtFunc: () => {\r\n\t\t\t\t\tsetSetting(skipTerms[1] * (-1), _settingName, unitName, roundNum, { func: () => addLFunc() });\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\r\n\t\t\t// 右回し・左回しボタン（外側）\r\n\t\t\tmakeMiniCssButton(linkId, `R`, 0, () =>\r\n\t\t\t\tsetSetting(skipTerms[0], _settingName, unitName, roundNum, { func: () => addRFunc() })),\r\n\t\t\tmakeMiniCssButton(linkId, `L`, 0, () =>\r\n\t\t\t\tsetSetting(skipTerms[0] * (-1), _settingName, unitName, roundNum, { func: () => addLFunc() })),\r\n\t\t);\r\n\r\n\t\t// 右回し・左回しボタン（内側）\r\n\t\tif (skipTerms[1] > 1) {\r\n\t\t\tmultiAppend(_obj,\r\n\t\t\t\tmakeMiniCssButton(linkId, `RR`, 0, () =>\r\n\t\t\t\t\tsetSetting(skipTerms[1], _settingName, unitName, roundNum, { func: () => addRFunc() })),\r\n\t\t\t\tmakeMiniCssButton(linkId, `LL`, 0, () =>\r\n\t\t\t\t\tsetSetting(skipTerms[1] * (-1), _settingName, unitName, roundNum, { func: () => addLFunc() })),\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// 右回し・左回しボタン（最内側）\r\n\t\tif (skipTerms[2] > 1) {\r\n\t\t\tmultiAppend(_obj,\r\n\t\t\t\tmakeMiniCssButton(linkId, `RRR`, 0, () =>\r\n\t\t\t\t\tsetSetting(skipTerms[2], _settingName, unitName, roundNum, { func: () => addRFunc() })\r\n\t\t\t\t\t, { dw: -g_limitObj.setMiniWidth / 2 }),\r\n\t\t\t\tmakeMiniCssButton(linkId, `LLL`, 0, () =>\r\n\t\t\t\t\tsetSetting(skipTerms[2] * (-1), _settingName, unitName, roundNum, { func: () => addLFunc() })\r\n\t\t\t\t\t, { dw: -g_limitObj.setMiniWidth / 2 }),\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// 右回し・左回しボタン（不可視）\r\n\t\tif (hiddenBtn) {\r\n\t\t\tmultiAppend(_obj,\r\n\t\t\t\tmakeMiniCssButton(linkId, `HR`, 0, () => setSetting(1, _settingName, unitName, roundNum, { func: () => addRFunc() }), { visibility: `hidden` }),\r\n\t\t\t\tmakeMiniCssButton(linkId, `HL`, 0, () => setSetting(-1, _settingName, unitName, roundNum, { func: () => addLFunc() }), { visibility: `hidden` }),\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// ショートカットキー表示\r\n\t\tcreateScText(_obj, settingUpper, { displayName: displayName, dfLabel: scLabel });\r\n\r\n\t} else {\r\n\t\tdocument.getElementById(`lbl${settingUpper}`).classList.add(g_cssObj.settings_Disabled);\r\n\t\t_obj.appendChild(makeDisabledLabel(linkId, 0, initName));\r\n\t}\r\n};\r\n\r\n/**\r\n * 設定画面用ラベルの作成\r\n * @param {string} _settingName \r\n * @param {number} _adjY \r\n * @param {string} _settingLabel \r\n * @returns {HTMLDivElement}\r\n */\r\nconst createLblSetting = (_settingName, _adjY = 0, _settingLabel = _settingName) => {\r\n\tconst lbl = createDivCss2Label(`lbl${_settingName}`, g_lblNameObj[_settingLabel], {\r\n\t\tx: -5, y: _adjY, w: 110, pointerEvents: C_DIS_AUTO,\r\n\t}, `settings_${_settingName}`);\r\n\tlbl.title = g_msgObj[`${_settingName.charAt(0).toLowerCase()}${_settingName.slice(1)}`];\r\n\treturn lbl;\r\n};\r\n\r\n/**\r\n * 設定名の置き換え処理\r\n * @param {string} _name \r\n * @returns {string}\r\n */\r\nconst getStgDetailName = _name => {\r\n\treturn g_lblNameObj[`u_${_name}`] !== undefined &&\r\n\t\t(g_presetObj.lblRenames === undefined || g_presetObj.lblRenames[g_currentPage]) ? g_lblNameObj[`u_${_name}`] : _name;\r\n};\r\n\r\n/**\r\n * 設定メイン・汎用\r\n * @param {number} _scrollNum \r\n * @param {string} _settingName\r\n * @param {string} [_unitName] 設定の単位名\r\n * @param {number} [_roundNum] 設定スキップ間隔の丸め基準数\r\n * @param {function} [object.func] 設定ボタンを押した後の追加処理\r\n */\r\nconst setSetting = (_scrollNum, _settingName, _unitName = ``, _roundNum = 0, { func = () => true } = {}) => {\r\n\tlet settingNum = g_settings[`${_settingName}Num`];\r\n\tconst settingList = g_settings[`${_settingName}s`];\r\n\tconst settingMax = settingList.length - 1;\r\n\r\n\t// _roundNum単位で丸める\r\n\tif (_roundNum > 0 && _scrollNum >= _roundNum) {\r\n\t\tsettingNum = Math.floor(settingNum / _roundNum) * _roundNum;\r\n\t} else if (_roundNum > 0 && -_scrollNum >= _roundNum) {\r\n\t\tsettingNum = Math.ceil(settingNum / _roundNum) * _roundNum;\r\n\t}\r\n\r\n\tif (_scrollNum > 0) {\r\n\t\tsettingNum = (settingNum === settingMax ? 0 : Math.min(settingNum + _scrollNum, settingMax));\r\n\t} else if (_scrollNum < 0) {\r\n\t\tsettingNum = (settingNum === 0 ? settingMax : Math.max(settingNum + _scrollNum, 0));\r\n\t}\r\n\tg_stateObj[_settingName] = settingList[settingNum];\r\n\tg_settings[`${_settingName}Num`] = settingNum;\r\n\tdocument.getElementById(`lnk${toCapitalize(_settingName)}`).textContent =\r\n\t\t`${getStgDetailName(g_stateObj[_settingName])}${_unitName}${g_localStorage[_settingName] === g_stateObj[_settingName] ? ' *' : ''}`;\r\n\tfunc();\r\n};\r\n\r\n/**\r\n * 無効化用ラベル作成\r\n * @param {string} _id \r\n * @param {number} _heightPos \r\n * @param {string} _defaultStr \r\n * @returns {HTMLDivElement}\r\n */\r\nconst makeDisabledLabel = (_id, _heightPos, _defaultStr) =>\r\n\tcreateDivCss2Label(_id, _defaultStr, {\r\n\t\tx: g_limitObj.setLblLeft, y: g_limitObj.setLblHeight * _heightPos,\r\n\t}, g_cssObj.settings_Disabled);\r\n\r\n/**\r\n * 保存済みリバース取得処理\r\n * @param {object} _localStorage 保存先のローカルストレージ名\r\n * @param {string} _extraKeyName 特殊キー名(通常キーは省略)\r\n */\r\nconst getKeyReverse = (_localStorage, _extraKeyName = ``) => {\r\n\tif (_localStorage[`reverse${_extraKeyName}`] !== undefined && g_headerObj.reverseUse) {\r\n\t\tg_stateObj.reverse = _localStorage[`reverse${_extraKeyName}`] ?? C_FLG_OFF;\r\n\t\tg_settings.reverseNum = roundZero(g_settings.reverses.findIndex(reverse => reverse === g_stateObj.reverse));\r\n\t} else {\r\n\t\tsetReverseDefault();\r\n\t}\r\n};\r\n\r\n/**\r\n * リバースのデフォルト化処理\r\n */\r\nconst setReverseDefault = () => {\r\n\tg_stateObj.reverse = C_FLG_OFF;\r\n\tg_settings.reverseNum = 0;\r\n};\r\n\r\nconst setReverse = _btn => {\r\n\tif (!g_settings.scrolls.includes(`Reverse`) && g_headerObj.reverseUse) {\r\n\t\tg_settings.reverseNum = (g_settings.reverseNum + 1) % 2;\r\n\t\tg_stateObj.reverse = g_settings.reverses[g_settings.reverseNum];\r\n\t\tsetReverseView(_btn);\r\n\t}\r\n};\r\n\r\nconst setReverseView = _btn => {\r\n\t_btn.classList.replace(g_cssObj[`button_Rev${g_settings.reverses[(g_settings.reverseNum + 1) % 2]}`],\r\n\t\tg_cssObj[`button_Rev${g_settings.reverses[g_settings.reverseNum]}`]);\r\n\tif (!g_settings.scrolls.includes(`Reverse`) && g_headerObj.reverseUse) {\r\n\t\t_btn.textContent = `${g_lblNameObj.Reverse}:${getStgDetailName(g_stateObj.reverse)}`;\r\n\t} else {\r\n\t\t_btn.textContent = `X`;\r\n\t\tsetReverseDefault();\r\n\t}\r\n};\r\n\r\n/**\r\n * ゲージ設定メイン\r\n * @param {number} _scrollNum \r\n * @param {boolean} _gaugeInitFlg\r\n */\r\nconst setGauge = (_scrollNum, _gaugeInitFlg = false) => {\r\n\r\n\t/**\r\n\t * 数式からゲージ値に変換\r\n\t * arrow[] -> 矢印数, frz[] -> フリーズアロー数, all[] -> 矢印＋フリーズアロー数に置換する\r\n\t * @param {string} _val \r\n\t * @param {string} _defaultVal\r\n\t * @returns {number}\r\n\t */\r\n\tconst getGaugeCalc = (_val, _defaultVal) => {\r\n\t\treturn setVal(convertStrToVal(\r\n\t\t\treplaceStr(_val, g_escapeStr.gaugeParamName)?.split(`{0}`).join(g_stateObj.scoreId)\r\n\t\t), _defaultVal, C_TYP_CALC);\r\n\t};\r\n\t/**\r\n\t * ゲージ詳細一括変更\r\n\t * @param {object} _baseObj \r\n\t * @param {number} object.magInit\r\n\t * @param {number} object.magRcv\r\n\t * @param {number} object.magDmg\r\n\t */\r\n\tconst setLifeCategory = (_baseObj, { _magInit = 1, _magRcv = 1, _magDmg = 1 } = {}) => {\r\n\t\tg_stateObj.lifeInit = getGaugeCalc(_baseObj.lifeInits[g_stateObj.scoreId], g_stateObj.lifeInit) * _magInit;\r\n\t\tg_stateObj.lifeRcv = getGaugeCalc(_baseObj.lifeRecoverys[g_stateObj.scoreId], g_stateObj.lifeRcv) * _magRcv;\r\n\t\tg_stateObj.lifeDmg = getGaugeCalc(_baseObj.lifeDamages[g_stateObj.scoreId], g_stateObj.lifeDmg) * _magDmg;\r\n\t};\r\n\r\n\t/**\r\n\t * ライフモード切替\r\n\t * @param {object} _baseObj \r\n\t */\r\n\tconst changeLifeMode = (_baseObj) => {\r\n\t\tif (_baseObj.lifeBorders[g_stateObj.scoreId] === `x`) {\r\n\t\t\tg_stateObj.lifeBorder = 0;\r\n\t\t\tg_stateObj.lifeMode = C_LFE_SURVIVAL;\r\n\t\t} else {\r\n\t\t\tg_stateObj.lifeBorder = getGaugeCalc(_baseObj.lifeBorders[g_stateObj.scoreId], g_stateObj.lifeBorder);\r\n\t\t\tg_stateObj.lifeMode = C_LFE_BORDER;\r\n\t\t}\r\n\t};\r\n\r\n\t// ゲージ初期化\r\n\r\n\t// カスタムゲージの設定取得\r\n\tconst defaultCustomGauge = g_gaugeOptionObj.custom0 || g_gaugeOptionObj.customDefault;\r\n\tif (hasVal(defaultCustomGauge)) {\r\n\t\tg_gaugeOptionObj.custom = (g_gaugeOptionObj[`custom${g_stateObj.scoreId}`] || defaultCustomGauge).concat();\r\n\t\tg_gaugeOptionObj.varCustom = (g_gaugeOptionObj[`varCustom${g_stateObj.scoreId}`] || g_gaugeOptionObj.varCustom0 || g_gaugeOptionObj.varCustomDefault).concat();\r\n\t}\r\n\r\n\t// ゲージタイプの設定\r\n\tchangeLifeMode(g_headerObj);\r\n\tg_gaugeType = (g_gaugeOptionObj.custom.length > 0 ? C_LFE_CUSTOM : g_stateObj.lifeMode);\r\n\r\n\t// ゲージ配列を入れ替え\r\n\tg_settings.gauges = structuredClone(g_gaugeOptionObj[g_gaugeType.toLowerCase()]);\r\n\tg_settings.gaugeNum = getCurrentNo(g_settings.gauges, g_stateObj.gauge);\r\n\tg_stateObj.gauge = g_settings.gauges[g_settings.gaugeNum];\r\n\r\n\tsetSetting(_scrollNum, `gauge`);\r\n\tg_stateObj.lifeVariable = g_gaugeOptionObj[`var${g_gaugeType}`][g_settings.gaugeNum];\r\n\r\n\t// デフォルトゲージの設定を適用（g_gaugeOptionObjから取得）\r\n\tif (g_settings.gaugeNum !== 0 &&\r\n\t\t(g_gaugeOptionObj.custom.length === 0 ||\r\n\t\t\tg_gaugeOptionObj.defaultList.includes(g_gaugeOptionObj[`defaultGauge${g_stateObj.scoreId}`]))) {\r\n\r\n\t\tconst gType = (g_gaugeType === C_LFE_CUSTOM ?\r\n\t\t\ttoCapitalize(g_gaugeOptionObj[`defaultGauge${g_stateObj.scoreId}`]) : g_gaugeType);\r\n\t\tconst getGaugeVal = _type => g_gaugeOptionObj[`${_type}${gType}`][g_settings.gaugeNum];\r\n\t\tg_stateObj.lifeMode = getGaugeVal(`type`);\r\n\t\tg_stateObj.lifeBorder = getGaugeVal(`clear`);\r\n\t\tg_stateObj.lifeInit = getGaugeVal(`init`);\r\n\t\tg_stateObj.lifeRcv = getGaugeVal(`rcv`);\r\n\t\tg_stateObj.lifeDmg = getGaugeVal(`dmg`);\r\n\t}\r\n\r\n\t// デフォルトゲージの初期設定（Light, Easyでは回復量を2倍にする）\r\n\tif ([`Original`, `Light`, `Normal`, `Easy`].includes(g_stateObj.gauge)) {\r\n\t\tsetLifeCategory(g_headerObj, { _magRcv: [`Light`, `Easy`].includes(g_stateObj.gauge) ? 2 : 1 });\r\n\t}\r\n\r\n\t// ゲージ設定別に個別設定した場合はここで設定を上書き\r\n\t// 譜面ヘッダー：gaugeXXX で設定した値がここで適用される\r\n\tif (hasVal(g_gaugeOptionObj[`gauge${g_stateObj.gauge}s`])) {\r\n\t\tconst tmpGaugeObj = g_gaugeOptionObj[`gauge${g_stateObj.gauge}s`];\r\n\t\tif (hasVal(tmpGaugeObj.lifeBorders[g_stateObj.scoreId])) {\r\n\t\t\tchangeLifeMode(tmpGaugeObj);\r\n\t\t}\r\n\t\tsetLifeCategory(tmpGaugeObj);\r\n\t}\r\n\r\n\t// ゲージ詳細情報を表示\r\n\tlblGauge2.innerHTML = gaugeFormat(g_stateObj.lifeMode,\r\n\t\tg_stateObj.lifeBorder, g_stateObj.lifeRcv, g_stateObj.lifeDmg, g_stateObj.lifeInit, g_stateObj.lifeVariable);\r\n};\r\n\r\n/**\r\n * ゲージ設定の詳細表示を整形\r\n * @param {string} _mode \r\n * @param {number} _border \r\n * @param {number} _rcv \r\n * @param {number} _dmg \r\n * @param {number} _init \r\n * @param {string} _lifeValFlg \r\n * @returns {string}\r\n */\r\nconst gaugeFormat = (_mode, _border, _rcv, _dmg, _init, _lifeValFlg) => {\r\n\tconst initVal = g_headerObj.maxLifeVal * _init / 100;\r\n\tconst borderVal = g_headerObj.maxLifeVal * _border / 100;\r\n\r\n\t// 整形用にライフ初期値を整数、回復・ダメージ量を小数第2位に丸める\r\n\tconst init = Math.round(initVal);\r\n\tconst borderText = (_mode === C_LFE_BORDER && _border !== 0 ? Math.round(borderVal) : `-`);\r\n\tconst round2 = _val => Math.round(_val * 100) / 100;\r\n\r\n\tlet rcvText = round2(_rcv), dmgText = round2(_dmg);\r\n\tlet realRcv = _rcv, realDmg = _dmg;\r\n\tconst allCnt = sumData(g_detailObj.arrowCnt[g_stateObj.scoreId]) +\r\n\t\t(g_headerObj.frzStartjdgUse ? 2 : 1) * sumData(g_detailObj.frzCnt[g_stateObj.scoreId]);\r\n\r\n\t// ゲージ設定が矢印数依存の場合、実際の値に変換して表示する\r\n\t// 表示上、計算した値は小数第二位までの表示とする（それ以外はそのまま）\r\n\tif (_lifeValFlg === C_FLG_ON) {\r\n\t\trcvText = ``, dmgText = ``;\r\n\t\tif (allCnt > 0) {\r\n\t\t\trealRcv = Math.min(calcLifeVal(_rcv, allCnt), g_headerObj.maxLifeVal);\r\n\t\t\trealDmg = Math.min(calcLifeVal(_dmg, allCnt), g_headerObj.maxLifeVal);\r\n\t\t\trcvText = `${realRcv.toFixed(2)}<br>`;\r\n\t\t\tdmgText = `${realDmg.toFixed(2)}<br>`;\r\n\t\t}\r\n\t\trcvText += `<span class=\"settings_lifeVal\">(${round2(_rcv)})</span>`;\r\n\t\tdmgText += `<span class=\"settings_lifeVal\">(${round2(_dmg)})</span>`;\r\n\t}\r\n\r\n\t// 達成率(Accuracy)・許容ミス数の計算\r\n\tconst [rateText, allowableCntsText] = getAccuracy(borderVal, realRcv, realDmg, initVal, allCnt);\r\n\tg_workObj.requiredAccuracy = rateText;\r\n\r\n\t// 許容ミス数のみ、オンマウスで表示するためpointer-eventsを有効にする\r\n\treturn `<div id=\"gaugeDivCover\" class=\"settings_gaugeDivCover\">\r\n\t\t<div id=\"lblGaugeDivTable\" class=\"settings_gaugeDivTable\">\r\n\t\t\t<div id=\"lblGaugeStart\" class=\"settings_gaugeDivTableCol settings_gaugeStart\">\r\n\t\t\t\t${g_lblNameObj.g_start}\r\n\t\t\t</div>\r\n\t\t\t<div id=\"lblGaugeBorder\" class=\"settings_gaugeDivTableCol settings_gaugeEtc\">\r\n\t\t\t\t${g_lblNameObj.g_border}\r\n\t\t\t</div>\r\n\t\t\t<div id=\"lblGaugeRecovery\" class=\"settings_gaugeDivTableCol settings_gaugeEtc\">\r\n\t\t\t\t${g_lblNameObj.g_recovery}\r\n\t\t\t</div>\r\n\t\t\t<div id=\"lblGaugeDamage\" class=\"settings_gaugeDivTableCol settings_gaugeEtc\">\r\n\t\t\t\t${g_lblNameObj.g_damage}\r\n\t\t\t</div>\r\n\t\t\t<div id=\"lblGaugeRate\" class=\"settings_gaugeDivTableCol settings_gaugeEtc\">\r\n\t\t\t\t${g_lblNameObj.g_rate}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div id=\"dataGaugeDivTable\" class=\"settings_gaugeDivTable\">\r\n\t\t\t<div id=\"dataGaugeStart\" class=\"settings_gaugeDivTableCol settings_gaugeVal settings_gaugeStart\">\r\n\t\t\t\t${init}/${g_headerObj.maxLifeVal}\r\n\t\t\t</div>\r\n\t\t\t<div id=\"dataGaugeBorder\" class=\"settings_gaugeDivTableCol settings_gaugeVal settings_gaugeEtc\">\r\n\t\t\t\t${borderText}\r\n\t\t\t</div>\r\n\t\t\t<div id=\"dataGaugeRecovery\" class=\"settings_gaugeDivTableCol settings_gaugeVal settings_gaugeEtc\">\r\n\t\t\t\t${rcvText}\r\n\t\t\t</div>\r\n\t\t\t<div id=\"dataGaugeDamage\" class=\"settings_gaugeDivTableCol settings_gaugeVal settings_gaugeEtc\">\r\n\t\t\t\t${dmgText}\r\n\t\t\t</div>\r\n\t\t\t<div id=\"dataGaugeRate\" class=\"settings_gaugeDivTableCol settings_gaugeVal settings_gaugeEtc\" \r\n\t\t\t\ttitle=\"${allowableCntsText}\" style=\"pointer-events: auto;\">\r\n\t\t\t\t${rateText}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t`;\r\n};\r\n\r\n/**\r\n * 達成率、許容ミス数の取得\r\n * @param {number} _border \r\n * @param {number} _rcv \r\n * @param {number} _dmg \r\n * @param {number} _init \r\n * @param {number} _allCnt \r\n * @returns {string[]}\r\n */\r\nconst getAccuracy = (_border, _rcv, _dmg, _init, _allCnt) => {\r\n\tconst justPoint = _rcv + _dmg > 0 ? Math.max(_border - _init + _dmg * _allCnt, 0) / (_rcv + _dmg) : 0;\r\n\tconst minRecovery = (_border === 0 ? Math.floor(justPoint + 1) : Math.ceil(justPoint));\r\n\tconst rate = Math.max(minRecovery / _allCnt * 100, 0);\r\n\tlet rateText = _allCnt > 0 ? (rate <= 100 ? `${rate.toFixed(2)}%` : `<span class=\"settings_lifeVal\">${rate.toFixed(2)}%</span>`) : `----`;\r\n\r\n\t// 許容ミス数の計算\r\n\tconst allowableCnts = Math.min(_allCnt - minRecovery, _allCnt);\r\n\tlet allowableCntsText = _allCnt > 0 ? (allowableCnts >= 0 ? `${allowableCnts}miss↓` : `Impossible (${allowableCnts}miss)`) : ``;\r\n\r\n\tif ((_rcv === 0 && _dmg === 0) || _rcv < 0 || _dmg < 0) {\r\n\t\trateText = `----`;\r\n\t\tallowableCntsText = ``;\r\n\t}\r\n\treturn [rateText, allowableCntsText];\r\n};\r\n\r\n/**\r\n * 空押し判定の設定\r\n * @param {HTMLDivElement} _btn\r\n */\r\nconst setExcessive = (_btn, _val) => {\r\n\tconst curExcessive = Number(g_settings.excessiveNum);\r\n\tg_settings.excessiveNum = _val !== undefined ? Number(_val) : (curExcessive + 1) % 2;\r\n\tg_stateObj.excessiveChgFlg = _val === undefined;\r\n\tif (g_stateObj.excessiveChgFlg) {\r\n\t\tg_stateObj.excessiveScoreId = g_stateObj.scoreId;\r\n\t}\r\n\tg_stateObj.excessive = g_settings.excessives[g_settings.excessiveNum];\r\n\t_btn.classList.replace(g_cssObj[`button_Rev${g_settings.excessives[curExcessive]}`],\r\n\t\tg_cssObj[`button_Rev${g_settings.excessives[g_settings.excessiveNum]}`]);\r\n};\r\n\r\n/**\r\n * 保存済みキーコンフィグ取得処理\r\n * @param {object} _localStorage 保存先のローカルストレージ名\r\n * @param {string} _extraKeyName 特殊キー名(通常キーは省略)\r\n */\r\nconst getKeyCtrl = (_localStorage, _extraKeyName = ``) => {\r\n\tg_keyObj.storagePtn = _localStorage[`keyCtrlPtn${_extraKeyName}`];\r\n\tconst basePtn = `${g_keyObj.currentKey}_${g_keyObj.storagePtn}`;\r\n\tconst baseKeyNum = g_keyObj[`${g_keyObj.defaultProp}${basePtn}`].length;\r\n\r\n\tif (_localStorage[`keyCtrl${_extraKeyName}`]?.[0].length > 0) {\r\n\t\tconst prevPtn = g_keyObj.currentPtn;\r\n\t\tg_keyObj.currentPtn = -1;\r\n\t\tconst copyPtn = `${g_keyObj.currentKey}_-1`;\r\n\t\tg_keyObj[`keyCtrl${copyPtn}`] = [...Array(baseKeyNum)].map(() => []);\r\n\t\tg_keyObj[`keyCtrl${copyPtn}d`] = [...Array(baseKeyNum)].map(() => []);\r\n\r\n\t\tfor (let j = 0; j < baseKeyNum; j++) {\r\n\t\t\tfor (let k = 0; k < g_keyObj[`keyCtrl${basePtn}`][j].length; k++) {\r\n\t\t\t\tg_keyObj[`keyCtrl${copyPtn}d`][j][k] = g_keyObj[`keyCtrl${copyPtn}`][j][k] = _localStorage[`keyCtrl${_extraKeyName}`][j][k];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst isUpdate = prevPtn !== -1 && g_keyObj.prevKey !== g_keyObj.currentKey;\r\n\t\tg_keyCopyLists.multiple.filter(header => g_keyObj[`${header}${basePtn}`] !== undefined && isUpdate)\r\n\t\t\t.forEach(header => g_keyObj[`${header}${copyPtn}`] = structuredClone(g_keyObj[`${header}${basePtn}`]));\r\n\t\tg_keyCopyLists.simple.filter(header => g_keyObj[`${header}${basePtn}`] !== undefined && isUpdate)\r\n\t\t\t.forEach(header => g_keyObj[`${header}${copyPtn}`] = g_keyObj[`${header}${basePtn}`]);\r\n\r\n\t\tg_keycons.groups.forEach(type => {\r\n\t\t\tlet maxPtn = 0;\r\n\t\t\twhile (g_keyObj[`${type}${basePtn}_${maxPtn}`] !== undefined) {\r\n\t\t\t\tmaxPtn++;\r\n\t\t\t}\r\n\t\t\tfor (let j = 0; j < maxPtn; j++) {\r\n\t\t\t\tg_keyObj[`${type}${copyPtn}_${j}`] = structuredClone(g_keyObj[`${type}${basePtn}_${j}`]);\r\n\t\t\t}\r\n\t\t\tg_keyObj[`${type}${copyPtn}_0d`] = structuredClone(g_keyObj[`${type}${copyPtn}_0`]);\r\n\t\t});\r\n\t}\r\n};\r\n\r\n/**\r\n * 設定・オプション表示用ボタン\r\n * @param {string} _id \r\n * @param {string} _name 初期設定文字\r\n * @param {number} _heightPos 上からの配置順\r\n * @param {function} _func 通常ボタン処理\r\n * @param {number} [object.x]\r\n * @param {number} [object.y]\r\n * @param {number} [object.w]\r\n * @param {number} [object.h]\r\n * @param {number} [object.siz]\r\n * @param {function} [object.cxtFunc] 右クリック時の処理\r\n * @param {...any} [object.rest]\r\n * @param {...any} _classes 追加するクラス\r\n * @returns {HTMLDivElement}\r\n */\r\nconst makeSettingLblCssButton = (_id, _name, _heightPos, _func, {\r\n\tx = g_limitObj.setLblLeft, y = g_limitObj.setLblHeight * _heightPos,\r\n\tw = g_limitObj.setLblWidth, h = g_limitObj.setLblHeight, siz = g_limitObj.setLblSiz,\r\n\tcxtFunc = () => true, ...rest } = {}, ..._classes) =>\r\n\tcreateCss2Button(_id, _name, _func, { x, y, w, h, siz, cxtFunc, ...rest }, g_cssObj.button_Default, ..._classes);\r\n\r\n/**\r\n * 譜面変更セレクター用ボタン\r\n * @param {string} _id\r\n * @param {string} _name 初期設定文字\r\n * @param {number} _heightPos 上からの配置順\r\n * @param {function} _func\r\n * @param {number} [object.x]\r\n * @param {number} [object.h]\r\n * @param {number} [object.y=h*_heightPos]\r\n * @param {number} [object.w]\r\n * @param {number} [object.siz]\r\n * @param {string} [object.btnStyle='Default']\r\n * @returns {HTMLDivElement}\r\n */\r\nconst makeDifLblCssButton = (_id, _name, _heightPos, _func, {\r\n\tx = 0, h = g_limitObj.setLblHeight, y = h * _heightPos,\r\n\tw = g_limitObj.difSelectorWidth, siz = g_limitObj.difSelectorSiz, btnStyle = `Default` } = {}) =>\r\n\tcreateCss2Button(_id, _name, _func, {\r\n\t\tx, y, w, h, siz, borderStyle: `solid`, title: g_msgObj[_id] ?? ``,\r\n\t}, g_cssObj[`button_${btnStyle}`], g_cssObj.button_ON);\r\n\r\n/**\r\n * 設定・オプション用の設定変更ミニボタン\r\n * @param {string} _id \r\n * @param {string} _directionFlg 表示用ボタンのどちら側に置くかを設定。(R, RR:右、L, LL:左)\r\n * @param {number} _heightPos 上からの配置順\r\n * @param {function} _func \r\n * @param {number} [object.dx=0]\r\n * @param {number} [object.dy=0]\r\n * @param {number} [object.dw=0]\r\n * @param {number} [object.dh=0]\r\n * @param {number} [object.dsiz=0]\r\n * @param {string} [object.visibility='visible']\r\n * @returns {HTMLDivElement}\r\n */\r\nconst makeMiniCssButton = (_id, _directionFlg, _heightPos, _func, { dx = 0, dy = 0, dw = 0, dh = 0, dsiz = 0, visibility = `visible` } = {}) =>\r\n\tcreateCss2Button(`${_id}${_directionFlg}`, g_settingBtnObj.chara[_directionFlg], _func, {\r\n\t\tx: g_settingBtnObj.pos[_directionFlg] + dx, y: g_limitObj.setLblHeight * _heightPos + dy,\r\n\t\tw: g_limitObj.setMiniWidth + dw, h: g_limitObj.setLblHeight + dh, siz: g_limitObj.setLblSiz + dsiz, visibility,\r\n\t}, g_cssObj.button_Mini);\r\n\r\n/**\r\n * カラーグループ、シャッフルグループの再設定\r\n * @param {string} _type \r\n * @param {string} _keyCtrlPtn\r\n */\r\nconst resetGroupList = (_type, _keyCtrlPtn) => {\r\n\tlet k = 1;\r\n\tg_keycons[`${_type}Groups`] = [0];\r\n\r\n\tif (g_keyObj.currentPtn === -1) {\r\n\t\tg_keycons[`${_type}Groups`] = addValtoArray(g_keycons[`${_type}Groups`], -1);\r\n\t}\r\n\tg_keycons[`${_type}GroupNum`] = Math.min(g_keyObj.currentPtn, 0);\r\n\twhile (g_keyObj[`${_type}${_keyCtrlPtn}_${k}`] !== undefined) {\r\n\t\tg_keycons[`${_type}Groups`].push(k);\r\n\t\tk++;\r\n\t}\r\n};\r\n\r\n/*-----------------------------------------------------------*/\r\n/* Scene : SETTINGS-DISPLAY [lemon] */\r\n/*-----------------------------------------------------------*/\r\n\r\nconst settingsDisplayInit = () => {\r\n\r\n\tclearWindow(true);\r\n\tconst divRoot = document.getElementById(`divRoot`);\r\n\tg_currentPage = `settingsDisplay`;\r\n\r\n\t// 譜面初期情報ロード許可フラグ\r\n\tg_canLoadDifInfoFlg = false;\r\n\r\n\t// タイトル文字描画\r\n\tdivRoot.appendChild(getTitleDivLabel(`lblTitle`, g_lblNameObj.display, 0, 15, `settings_Display`));\r\n\r\n\t// オプションボタン用の設置\r\n\tcreateSettingsDisplayWindow(divRoot);\r\n\r\n\t// ショートカットキーメッセージ\r\n\tdivRoot.appendChild(createDescDiv(`scMsg`, g_lblNameObj.sdShortcutDesc));\r\n\r\n\t// ユーザカスタムイベント(初期)\r\n\tg_customJsObj.settingsDisplay.forEach(func => func());\r\n\r\n\t// ボタン描画\r\n\tcommonSettingBtn(`Settings`);\r\n\r\n\t// キー操作イベント（デフォルト）\r\n\tsetShortcutEvent(g_currentPage);\r\n\tdocument.oncontextmenu = () => true;\r\n\r\n\tg_skinJsObj.settingsDisplay.forEach(func => func());\r\n};\r\n\r\n/**\r\n * 設定・オプション画面のラベル・ボタン処理の描画\r\n * @param {Object} _sprite 基準とするスプライト(ここで指定する座標は、そのスプライトからの相対位置)\r\n */\r\nconst createSettingsDisplayWindow = _sprite => {\r\n\r\n\t/**\r\n\t * Display表示/非表示ボタン\r\n\t * @param {string} _name \r\n\t * @param {number} _heightPos 縦位置\r\n\t * @param {number} _widthPos 横位置\r\n\t */\r\n\tconst makeDisplayButton = (_name, _heightPos, _widthPos) => {\r\n\r\n\t\tconst flg = g_stateObj[`d_${_name.toLowerCase()}`];\r\n\t\tconst linkId = `lnk${_name}`;\r\n\r\n\t\tif (g_headerObj[`${_name}Use`]) {\r\n\r\n\t\t\t// 設定名、CSS名(2種)、表示名\r\n\t\t\tconst list = [C_FLG_OFF, C_FLG_ON].concat(g_settings[`d_${_name}s`] || []);\r\n\t\t\tconst cssBarList = [C_FLG_OFF, C_FLG_ON].concat(Array(g_settings[`d_${_name}s`]?.length).fill(g_settings.d_cssBarExName) || []);\r\n\t\t\tconst cssBgList = [g_settings.d_cssBgName, g_settings.d_cssBgName].concat(Array(g_settings[`d_${_name}s`]?.length).fill(g_settings.d_cssBgExName) || []);\r\n\t\t\tconst lbls = [toCapitalize(_name), toCapitalize(_name)].concat(g_settings[`d_${_name}s`] || []);\r\n\r\n\t\t\tconst dispView = () => [C_FLG_OFF, C_FLG_ON].includes(g_stateObj[`d_${_name.toLowerCase()}`]) ?\r\n\t\t\t\tg_lblNameObj[`d_${toCapitalize(_name)}`] : getStgDetailName(lbls[g_settings.displayNum[_name]]);\r\n\r\n\t\t\tconst withShortCutDesc = () => createScText(document.getElementById(linkId), `${toCapitalize(_name)}`,\r\n\t\t\t\t{ displayName: g_currentPage, targetLabel: linkId, x: -5 });\r\n\r\n\t\t\t/**\r\n\t\t\t * Displayボタン処理\r\n\t\t\t * @param {number} _scrollNum \r\n\t\t\t * @param {boolean} _filterFlg \r\n\t\t\t */\r\n\t\t\tconst switchDisplay = (_scrollNum = 1, _filterFlg = true) => {\r\n\t\t\t\tconst prevDisp = g_settings.displayNum[_name];\r\n\t\t\t\tconst [prevBarColor, prevBgColor] = [cssBarList[prevDisp], cssBgList[prevDisp]];\r\n\r\n\t\t\t\tg_settings.displayNum[_name] = (prevDisp + _scrollNum) % (_filterFlg ? 2 : list.length);\r\n\t\t\t\tconst nextDisp = g_settings.displayNum[_name];\r\n\t\t\t\tconst [nextBarColor, nextBgColor] = [cssBarList[nextDisp], cssBgList[nextDisp]];\r\n\r\n\t\t\t\tg_stateObj[`d_${_name.toLowerCase()}`] = list[g_settings.displayNum[_name]];\r\n\t\t\t\tdocument.getElementById(linkId).innerHTML = dispView();\r\n\t\t\t\tdocument.getElementById(linkId).classList.replace(g_cssObj[`button_${prevBarColor}`], g_cssObj[`button_${nextBarColor}`]);\r\n\t\t\t\tdocument.getElementById(linkId).classList.replace(g_cssObj[`button_${prevBgColor}`], g_cssObj[`button_${nextBgColor}`]);\r\n\r\n\t\t\t\twithShortCutDesc();\r\n\t\t\t\tinterlockingButton(g_headerObj, _name, nextBarColor, prevBarColor, true);\r\n\t\t\t};\r\n\r\n\t\t\t// Displayボタン初期化\r\n\t\t\tg_settings.displayNum[_name] = list.findIndex(flg => flg === g_stateObj[`d_${_name.toLowerCase()}`]);\r\n\t\t\tdisplaySprite.appendChild(\r\n\t\t\t\tmakeSettingLblCssButton(linkId, dispView(), _heightPos, () => switchDisplay(), {\r\n\t\t\t\t\tx: 30 + 180 * _widthPos, w: 170,\r\n\t\t\t\t\ttitle: g_msgObj[`d_${_name.toLowerCase()}`], borderStyle: `solid`,\r\n\t\t\t\t\tcxtFunc: () => switchDisplay(-1),\r\n\t\t\t\t}, `button_${cssBgList[g_settings.displayNum[_name]]}`, `button_${cssBarList[g_settings.displayNum[_name]]}`)\r\n\t\t\t);\r\n\t\t\twithShortCutDesc();\r\n\r\n\t\t\t// Display切替ボタン（ON/OFF以外用）\r\n\t\t\tif (g_settings[`d_${_name}s`] !== undefined) {\r\n\t\t\t\tdisplaySprite.appendChild(\r\n\t\t\t\t\tmakeSettingLblCssButton(`${linkId}R`, `>`, _heightPos, () => switchDisplay(1, false), {\r\n\t\t\t\t\t\tx: 175 + 180 * _widthPos, w: 25,\r\n\t\t\t\t\t}, g_cssObj.button_Mini)\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tdisplaySprite.appendChild(\r\n\t\t\t\tcreateDivCss2Label(linkId, g_lblNameObj[`d_${toCapitalize(_name)}`] + `:${g_headerObj[`${_name}Set`]}`, {\r\n\t\t\t\t\tx: 30 + 180 * _widthPos, y: 3 + g_limitObj.setLblHeight * _heightPos,\r\n\t\t\t\t\tw: 170, siz: g_limitObj.difSelectorSiz,\r\n\t\t\t\t}, g_cssObj[`button_Disabled${flg}`])\r\n\t\t\t);\r\n\t\t}\r\n\t};\r\n\r\n\t// 各ボタン用のスプライトを作成\r\n\tconst optionsprite = createEmptySprite(_sprite, `optionsprite`, g_windowObj.optionSprite);\r\n\r\n\t// 設定毎に個別のスプライトを作成し、その中にラベル・ボタン類を配置\r\n\tconst displaySprite = createEmptySprite(optionsprite, `displaySprite`, g_windowObj.displaySprite);\r\n\tconst spriteList = setSpriteList(g_settingPos.settingsDisplay);\r\n\r\n\t_sprite.appendChild(createDivCss2Label(`sdDesc`, g_lblNameObj.sdDesc, g_lblPosObj.sdDesc));\r\n\tg_displays.forEach((name, j) => makeDisplayButton(name, j % 7, Math.floor(j / 7)));\r\n\r\n\t// ---------------------------------------------------\r\n\t// 矢印の見え方 (Appearance)\r\n\t// 縦位置: 7.4\r\n\tcreateGeneralSetting(spriteList.appearance, `appearance`, {\r\n\t\taddRFunc: () => dispAppearanceSlider(),\r\n\t});\r\n\r\n\t// Hidden+/Sudden+初期値用スライダー、ロックボタン\r\n\tmultiAppend(spriteList.appearance,\r\n\t\tcreateDivCss2Label(`lblAppearancePos`, `${g_hidSudObj.distH[g_stateObj.appearance](g_hidSudObj.filterPos)}`, g_lblPosObj.lblAppearancePos),\r\n\t\tcreateDivCss2Label(`lblAppearanceBar`, `<input id=\"appearanceSlider\" type=\"range\" value=\"${g_hidSudObj.filterPos}\" min=\"0\" max=\"100\" step=\"1\">`,\r\n\t\t\tg_lblPosObj.lblAppearanceBar),\r\n\t\tcreateCss2Button(`lnkLockBtn`, g_lblNameObj.filterLock, evt => setLockView(evt.target),\r\n\t\t\tObject.assign(g_lblPosObj.lnkLockBtn, {\r\n\t\t\t\tcxtFunc: evt => setLockView(evt.target),\r\n\t\t\t}), g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.filterLock}`]),\r\n\t);\r\n\r\n\tconst setLockView = (_btn) => {\r\n\t\tconst prevLock = g_stateObj.filterLock;\r\n\t\tg_settings.filterLockNum = (g_settings.filterLockNum + 1) % 2;\r\n\t\tg_stateObj.filterLock = g_settings.filterLocks[g_settings.filterLockNum];\r\n\r\n\t\t_btn.classList.replace(g_cssObj[`button_Rev${prevLock}`],\r\n\t\t\tg_cssObj[`button_Rev${g_stateObj.filterLock}`]);\r\n\t};\r\n\r\n\tconst appearanceSlider = document.getElementById(`appearanceSlider`);\r\n\tappearanceSlider.addEventListener(`input`, () =>\r\n\t\tg_hidSudObj.filterPos = inputSlider(appearanceSlider, lblAppearancePos, `appearance`), false);\r\n\r\n\tconst dispAppearanceSlider = () => {\r\n\t\t[`lblAppearanceBar`, `lnkLockBtn`, `lnkfilterLine`].forEach(obj =>\r\n\t\t\t$id(obj).visibility = g_appearanceRanges.includes(g_stateObj.appearance) ? `Visible` : `Hidden`);\r\n\t\tinputSlider(appearanceSlider, lblAppearancePos, `appearance`);\r\n\t};\r\n\tdispAppearanceSlider();\r\n\r\n\t// ---------------------------------------------------\r\n\t// 判定表示系の不透明度 (Opacity)\r\n\t// 縦位置: 9\r\n\tg_headerObj.opacityUse = false;\r\n\t[`judgment`, `fastSlow`, `filterLine`].forEach(display =>\r\n\t\tg_headerObj.opacityUse ||= g_headerObj[`${display}Use`] || g_headerObj[`${display}Set`] === C_FLG_ON);\r\n\r\n\tcreateGeneralSetting(spriteList.opacity, `opacity`, { unitName: g_lblNameObj.percent });\r\n\r\n\t// ---------------------------------------------------\r\n\t// タイミング調整 (HitPosition)\r\n\t// 縦位置: 10\r\n\tcreateGeneralSetting(spriteList.hitPosition, `hitPosition`, {\r\n\t\tskipTerms: g_settings.hitPositionTerms, scLabel: g_lblNameObj.sc_hitPosition, roundNum: 5,\r\n\t\tunitName: g_lblNameObj.pixel,\r\n\t});\r\n};\r\n\r\n/**\r\n * Displayボタンを切り替えたときに連動して切り替えるボタンの設定\r\n * @param {object} _headerObj \r\n * @param {string} _name \r\n * @param {string} _current 変更元\r\n * @param {string} _next 変更先\r\n * @param {boolean} _buttonFlg ボタンフラグ (false: 初期, true: ボタン)\r\n */\r\nconst interlockingButton = (_headerObj, _name, _current, _next, _buttonFlg = false) => {\r\n\tlet includeDefaults = [];\r\n\tif (g_stateObj[`d_${_name.toLowerCase()}`] === C_FLG_OFF) {\r\n\t\tg_displays.forEach(option => {\r\n\t\t\tif (option === _name) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (g_stateObj[`d_${option.toLowerCase()}`] === C_FLG_ON && _headerObj[`${option}Default`] !== undefined) {\r\n\t\t\t\tincludeDefaults = includeDefaults.concat(_headerObj[`${option}ChainOFF`]);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tif (_headerObj[`${_name}ChainOFF`].length !== 0) {\r\n\r\n\t\t// 連動してOFFにするボタンの設定\r\n\t\t_headerObj[`${_name}ChainOFF`].filter(defaultOption => !includeDefaults.includes(defaultOption))\r\n\t\t\t.forEach(defaultOption => {\r\n\t\t\t\tg_stateObj[`d_${defaultOption.toLowerCase()}`] = _next;\r\n\t\t\t\tif (_buttonFlg) {\r\n\t\t\t\t\tlet txtDisabled = ``;\r\n\t\t\t\t\tif (!g_headerObj[`${defaultOption}Use`]) {\r\n\t\t\t\t\t\ttxtDisabled = `Disabled`;\r\n\t\t\t\t\t\tdocument.getElementById(`lnk${defaultOption}`).textContent = `${toCapitalize(defaultOption)}:${_next}`;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdocument.getElementById(`lnk${defaultOption}`).classList.replace(g_cssObj[`button_${txtDisabled}${_current}`], g_cssObj[`button_Disabled${_next}`]);\r\n\t\t\t\t}\r\n\t\t\t\t// さらに連動する場合は設定を反転\r\n\t\t\t\tinterlockingButton(_headerObj, defaultOption, _next, _current, _buttonFlg);\r\n\t\t\t});\r\n\t}\r\n};\r\n\r\n/*-----------------------------------------------------------*/\r\n/* Scene : EX-SETTINGS [apple] */\r\n/*-----------------------------------------------------------*/\r\n\r\nconst exSettingInit = () => {\r\n\tclearWindow(true);\r\n\tg_currentPage = `exSetting`;\r\n\r\n\tmultiAppend(divRoot,\r\n\r\n\t\t// 画面タイトル\r\n\t\tgetTitleDivLabel(`lblTitle`,\r\n\t\t\t`<div class=\"settings_Title\">EX-</div><div class=\"settings_Title2\">SETTINGS</div>`\r\n\t\t\t\t.replace(/[\\t\\n]/g, ``), 0, 15, g_cssObj.flex_centering),\r\n\r\n\t);\r\n\r\n\t// 各ボタン用のスプライトを作成\r\n\tcreateEmptySprite(divRoot, `optionsprite`, g_windowObj.optionSprite);\r\n\tconst spriteList = setSpriteList(g_settingPos.exSetting);\r\n\r\n\tcreateGeneralSetting(spriteList.playWindow, `playWindow`);\r\n\tlblPlayWindow.title += g_headerObj.heightLockFlg ? g_msgObj.sideScrollDisable : g_msgObj.sideScrollMsg;\r\n\r\n\tcreateGeneralSetting(spriteList.stepArea, `stepArea`);\r\n\tcreateGeneralSetting(spriteList.frzReturn, `frzReturn`);\r\n\tcreateGeneralSetting(spriteList.shaking, `shaking`);\r\n\tcreateGeneralSetting(spriteList.effect, `effect`, {\r\n\t\taddRFunc: () => {\r\n\t\t\tg_stateObj.d_arroweffect = boolToSwitch(g_stateObj.effect !== C_FLG_OFF || g_headerObj.arrowEffectSetFlg);\r\n\t\t\tg_headerObj.arrowEffectUse = g_stateObj.effect === C_FLG_OFF && g_headerObj.arrowEffectUseOrg;\r\n\t\t\tg_headerObj.arrowEffectSet = g_stateObj.d_arroweffect;\r\n\t\t},\r\n\t});\r\n\tcreateGeneralSetting(spriteList.camoufrage, `camoufrage`);\r\n\tcreateGeneralSetting(spriteList.swapping, `swapping`);\r\n\tcreateGeneralSetting(spriteList.judgRange, `judgRange`, {\r\n\t\taddRFunc: () => {\r\n\t\t\t[g_judgObj.arrowJ, g_judgObj.frzJ] = g_judgRanges[g_stateObj.judgRange];\r\n\t\t\tlblJudgRangeView.innerHTML = getJudgRangeView();\r\n\t\t}\r\n\t});\r\n\tcreateGeneralSetting(spriteList.autoRetry, `autoRetry`);\r\n\r\n\t// 判定範囲の設定を表示\r\n\tconst getJudgRangeView = () => `| ` +\r\n\t\t`<span class=\"common_ii\">${g_lblNameObj.j_ii}</span>: ≦ <b>±${g_judgObj.arrowJ[0]} f</b> | ` +\r\n\t\t`<span class=\"common_shakin\">${g_lblNameObj.j_shakin}</span>: ≦ <b>±${g_judgObj.arrowJ[1]} f</b> | ` +\r\n\t\t`<span class=\"common_matari\">${g_lblNameObj.j_matari}</span>: ≦ <b>±${g_judgObj.arrowJ[2]} f</b> | <br>| ` +\r\n\t\t`<span class=\"common_shobon\">${g_lblNameObj.j_shobon}</span>: ≦ <b>±${g_judgObj.arrowJ[3]} f</b> | ` +\r\n\t\t`<span class=\"common_uwan\">${g_lblNameObj.j_uwan}</span>: > <b>±${g_judgObj.arrowJ[3]} f</b> | <br>| ` +\r\n\t\t`<span class=\"common_kita\">${g_lblNameObj.j_kita}</span>: ≦ <b>±${g_judgObj.frzJ[1]} f</b> | ` +\r\n\t\t`<span class=\"common_iknai\">${g_lblNameObj.j_iknai}</span>: > <b>±${g_judgObj.frzJ[1]} f</b> |`;\r\n\r\n\tmultiAppend(judgRangeSprite,\r\n\t\tcreateDivCss2Label(`lblJudgRangeView`, getJudgRangeView(), {\r\n\t\t\tx: parseFloat($id(`lblJudgRange`).left) + 10, y: parseFloat($id(`lblJudgRange`).top) + 25, w: 300, h: 30, siz: 13,\r\n\t\t\talign: C_ALIGN_LEFT,\r\n\t\t}),\r\n\t);\r\n\r\n\t// ユーザカスタムイベント(初期)\r\n\tg_customJsObj.exSetting.forEach(func => func());\r\n\r\n\t// 設定系のボタン群をまとめて作成（Data Save, Display切替, Back, KeyConfig, Playボタン）\r\n\tcommonSettingBtn(g_currentPage);\r\n\r\n\t// キー操作イベント（デフォルト）\r\n\tsetShortcutEvent(g_currentPage, () => true, { dfEvtFlg: true });\r\n\tdocument.oncontextmenu = () => true;\r\n\r\n\tg_skinJsObj.exSetting.forEach(func => func());\r\n};\r\n\r\n/*-----------------------------------------------------------*/\r\n/* Scene : KEYCONFIG [orange] */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * キーコンフィグ画面初期化\r\n * @param {string} _kcType\r\n */\r\nconst keyConfigInit = (_kcType = g_kcType) => {\r\n\r\n\tclearWindow(true);\r\n\tconst divRoot = document.getElementById(`divRoot`);\r\n\tg_kcType = _kcType;\r\n\tg_currentPage = `keyConfig`;\r\n\tlet selectedKc = `Default`;\r\n\r\n\t// 譜面初期情報ロード許可フラグ\r\n\tg_canLoadDifInfoFlg = false;\r\n\r\n\tmultiAppend(divRoot,\r\n\r\n\t\t// キーコンフィグ画面タイトル\r\n\t\tgetTitleDivLabel(`lblTitle`,\r\n\t\t\t`<div class=\"settings_Title\">${g_lblNameObj.key}</div><div class=\"settings_Title2\">${g_lblNameObj.config}</div>`\r\n\t\t\t\t.replace(/[\\t\\n]/g, ``), 0, 15, g_cssObj.flex_centering),\r\n\r\n\t\tcreateDescDiv(`kcDesc`, g_lblNameObj.kcDesc.split(`{0}`).join(g_kCd[C_KEY_RETRY])\r\n\t\t\t.split(`{1}:`).join(g_isMac ? `` : `Delete:`)),\r\n\r\n\t\tcreateDescDiv(`kcShuffleDesc`, g_headerObj.shuffleUse ? g_lblNameObj.kcShuffleDesc : g_lblNameObj.kcNoShuffleDesc),\r\n\t);\r\n\r\n\t// キーの一覧を表示\r\n\tconst keyconSprite = createEmptySprite(divRoot, `keyconSprite`, g_windowObj.keyconSprite);\r\n\tconst tkObj = getKeyInfo();\r\n\tconst [keyCtrlPtn, keyNum, posMax, divideCnt] =\r\n\t\t[tkObj.keyCtrlPtn, tkObj.keyNum, tkObj.posMax, tkObj.divideCnt];\r\n\r\n\tg_keyCopyLists.simpleDef.forEach(header => updateKeyInfo(header, keyCtrlPtn));\r\n\taddTransform(`keyconSprite`, `root`, `scale(${g_keyObj.scale})`)\r\n\tkeyconSprite.style.height = `${parseFloat(keyconSprite.style.height) / ((1 + g_keyObj.scale) / 2)}px`;\r\n\tconst kWidth = parseInt(keyconSprite.style.width);\r\n\tchangeSetColor();\r\n\r\n\tconst maxLeftPos = Math.max(divideCnt, posMax - divideCnt - 2) / 2;\r\n\tconst maxLeftX = Math.min(0, (kWidth - C_ARW_WIDTH) / 2 - maxLeftPos * g_keyObj.blank);\r\n\r\n\tg_keycons.cursorNumList = [...Array(keyNum).keys()].map(i => i);\r\n\tconst configKeyGroupList = g_headerObj.keyGroupOrder[g_stateObj.scoreId] ??\r\n\t\tg_keyObj[`keyGroupOrder${keyCtrlPtn}`] ?? tkObj.keyGroupList;\r\n\tg_keycons.colorCursorNum = 0;\r\n\r\n\t/**\r\n\t * keyconSpriteのスクロール位置調整\r\n\t * @param {number} _targetX \r\n\t */\r\n\tconst adjustScrollPoint = _targetX => {\r\n\t\tif (maxLeftX !== 0) {\r\n\t\t\tkeyconSprite.scrollLeft = Math.max(0, _targetX - g_sWidth / 2);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * キーコンフィグ用の矢印色を取得\r\n\t * @param {number} _j\r\n\t * @param {number} _colorPos\r\n\t * @returns {string} \r\n\t */\r\n\tconst getKeyConfigColor = (_j, _colorPos) => {\r\n\t\tlet arrowColor = g_headerObj.setColor[_colorPos];\r\n\t\tif (typeof g_keyObj[`assistPos${keyCtrlPtn}`] === C_TYP_OBJECT &&\r\n\t\t\tg_keyObj[`assistPos${keyCtrlPtn}`][g_stateObj.autoPlay] !== undefined &&\r\n\t\t\t!g_autoPlaysBase.includes(g_stateObj.autoPlay)) {\r\n\t\t\tif (g_keyObj[`assistPos${keyCtrlPtn}`][g_stateObj.autoPlay][_j] === 1) {\r\n\t\t\t\tarrowColor = g_headerObj.setDummyColor[_colorPos];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn arrowColor;\r\n\t};\r\n\r\n\t/**\r\n\t * 対象割り当てキーの色変更\r\n\t * @param {number} _j \r\n\t * @param {number} _k \r\n\t * @param {string} _cssName \r\n\t */\r\n\tconst changeKeyConfigColor = (_j, _k, _cssName) =>\r\n\t\tchangeConfigColor(document.getElementById(`keycon${_j}_${_k}`), _cssName);\r\n\r\n\t/**\r\n\t * 一時的に矢印色・シャッフルグループを変更（共通処理）\r\n\t * @param {string} _type \r\n\t * @param {number} _len \r\n\t * @param {number} _j \r\n\t * @param {number} _scrollNum \r\n\t * @returns {number}\r\n\t */\r\n\tconst changeTmpData = (_type, _len, _j, _scrollNum) => {\r\n\t\tconst tmpNo = nextPos(g_keyObj[`${_type}${keyCtrlPtn}_${g_keycons[`${_type}GroupNum`]}`][_j], _scrollNum, _len);\r\n\t\tg_keyObj[`${_type}${keyCtrlPtn}`][_j] = tmpNo;\r\n\t\tg_keyObj[`${_type}${keyCtrlPtn}_${g_keycons[`${_type}GroupNum`]}`][_j] = tmpNo;\r\n\r\n\t\treturn tmpNo;\r\n\t};\r\n\r\n\t/**\r\n\t * 一時的に矢印色を変更\r\n\t * @param {number} _j\r\n\t * @param {number} _scrollNum \r\n\t */\r\n\tconst changeTmpColor = (_j, _scrollNum = 1) => {\r\n\t\tchangeTmpData(`color`, g_headerObj.setColor.length, _j, _scrollNum);\r\n\t\tconst arrowColor = getKeyConfigColor(_j, g_keyObj[`color${keyCtrlPtn}`][_j]);\r\n\t\t$id(`arrow${_j}`).background = arrowColor;\r\n\t\t$id(`arrowShadow${_j}`).background = getShadowColor(g_keyObj[`color${keyCtrlPtn}`][_j], arrowColor);\r\n\r\n\t\tadjustScrollPoint(parseFloat($id(`arrow${_j}`).left));\r\n\t};\r\n\r\n\t/**\r\n\t * 一時的にシャッフルグループ番号を変更\r\n\t * @param {number} _j \r\n\t * @param {number} _scrollNum \r\n\t */\r\n\tconst changeTmpShuffleNum = (_j, _scrollNum = 1) => {\r\n\t\tconst tmpShuffle = changeTmpData(`shuffle`, g_keyObj[`keyCtrl${keyCtrlPtn}`].length - 1, _j, _scrollNum);\r\n\t\tdocument.getElementById(`sArrow${_j}`).textContent = tmpShuffle + 1;\r\n\r\n\t\tchangeShuffleConfigColor(keyCtrlPtn, g_keyObj[`shuffle${keyCtrlPtn}_${g_keycons.shuffleGroupNum}`][_j], _j);\r\n\t\tadjustScrollPoint(parseFloat($id(`arrow${_j}`).left));\r\n\t};\r\n\r\n\tconst addLeft = (maxLeftX === 0 ? 0 : - maxLeftX + g_limitObj.kcColorPickerX);\r\n\tfor (let j = 0; j < keyNum; j++) {\r\n\r\n\t\tconst posj = g_keyObj[`pos${keyCtrlPtn}`][j];\r\n\t\tconst stdPos = posj - ((posj > divideCnt ? posMax : 0) + divideCnt) / 2;\r\n\r\n\t\tconst keyconX = g_keyObj.blank * stdPos + (kWidth - C_ARW_WIDTH) / 2 + addLeft;\r\n\t\tconst keyconY = C_KYC_HEIGHT * (Number(posj > divideCnt)) + 12;\r\n\t\tconst colorPos = g_keyObj[`color${keyCtrlPtn}`][j];\r\n\t\tconst arrowColor = getKeyConfigColor(j, colorPos);\r\n\r\n\t\tkeyconSprite.appendChild(\r\n\t\t\tcreateCss2Button(`color${j}`, ``, () => changeTmpColor(j), {\r\n\t\t\t\tx: keyconX, y: keyconY, w: C_ARW_WIDTH, h: C_ARW_WIDTH,\r\n\t\t\t\tcxtFunc: () => changeTmpColor(j, -1),\r\n\t\t\t}, g_cssObj.button_Default_NoColor, g_cssObj.title_base)\r\n\t\t);\r\n\t\t// キーコンフィグ表示用の矢印・おにぎりを表示\r\n\t\tmultiAppend(keyconSprite,\r\n\t\t\t// 矢印の塗り部分\r\n\t\t\tcreateColorObject2(`arrowShadow${j}`, {\r\n\t\t\t\tx: keyconX, y: keyconY, background: hasVal(g_headerObj[`setShadowColor${g_colorType}`][colorPos]) ? getShadowColor(colorPos, arrowColor) : ``,\r\n\t\t\t\trotate: g_keyObj[`stepRtn${keyCtrlPtn}_${g_keycons.stepRtnGroupNum}`][j], styleName: `Shadow`,\r\n\t\t\t}),\r\n\t\t\t// 矢印本体\r\n\t\t\tcreateColorObject2(`arrow${j}`, {\r\n\t\t\t\tx: keyconX, y: keyconY, background: arrowColor, rotate: g_keyObj[`stepRtn${keyCtrlPtn}_${g_keycons.stepRtnGroupNum}`][j],\r\n\t\t\t}),\r\n\t\t);\r\n\t\tif (g_headerObj.shuffleUse && g_keyObj[`shuffle${keyCtrlPtn}`] !== undefined) {\r\n\t\t\tkeyconSprite.appendChild(\r\n\t\t\t\tcreateCss2Button(`sArrow${j}`, ``, () => changeTmpShuffleNum(j), {\r\n\t\t\t\t\tx: keyconX, y: keyconY - 12, w: C_ARW_WIDTH, h: 15, siz: 12, fontWeight: `bold`,\r\n\t\t\t\t\tpointerEvents: (g_settings.shuffles.filter(val => val.endsWith(`+`)).length > 0 ? C_DIS_AUTO : C_DIS_NONE),\r\n\t\t\t\t\tcxtFunc: () => changeTmpShuffleNum(j, -1),\r\n\t\t\t\t}, g_cssObj.button_Default_NoColor, g_cssObj.title_base)\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// 割り当て先のキー名を表示\r\n\t\tfor (let k = 0; k < g_keyObj[`keyCtrl${keyCtrlPtn}`][j].length; k++) {\r\n\t\t\tg_keyObj[`keyCtrl${keyCtrlPtn}`][j][k] = setIntVal(g_keyObj[`keyCtrl${keyCtrlPtn}`][j][k]);\r\n\t\t\tg_keyObj[`keyCtrl${keyCtrlPtn}d`][j][k] = setIntVal(g_keyObj[`keyCtrl${keyCtrlPtn}d`][j][k]);\r\n\r\n\t\t\tkeyconSprite.appendChild(\r\n\t\t\t\tcreateCss2Button(`keycon${j}_${k}`, g_kCd[g_keyObj[`keyCtrl${keyCtrlPtn}`][j][k]], () => {\r\n\t\t\t\t\tg_currentj = j;\r\n\t\t\t\t\tg_currentk = k;\r\n\t\t\t\t\tg_prevKey = -1;\r\n\t\t\t\t\tselectedKc = `Default`;\r\n\t\t\t\t\tg_keycons.cursorNum = g_keycons.cursorNumList.findIndex(val => val === g_currentj);\r\n\t\t\t\t\tsetKeyConfigCursor();\r\n\t\t\t\t}, {\r\n\t\t\t\t\tx: keyconX - 5, y: 50 + C_KYC_REPHEIGHT * k + keyconY,\r\n\t\t\t\t\tw: C_ARW_WIDTH + 10, h: C_KYC_REPHEIGHT, siz: g_limitObj.keySetSiz,\r\n\t\t\t\t}, g_cssObj.button_Default_NoColor, g_cssObj.title_base)\r\n\t\t\t);\r\n\r\n\t\t\t// キーに色付け\r\n\t\t\tif (g_keyObj[`keyCtrl${keyCtrlPtn}d`][j][k] !== g_keyObj[`keyCtrl${keyCtrlPtn}`][j][k]) {\r\n\t\t\t\tchangeKeyConfigColor(j, k, g_cssObj.keyconfig_Changekey);\r\n\t\t\t} else if (g_keyObj.currentPtn === -1) {\r\n\t\t\t\tchangeKeyConfigColor(j, k, g_cssObj.keyconfig_Defaultkey);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tconst posj = g_keyObj[`pos${keyCtrlPtn}`][0];\r\n\r\n\t// カーソルの作成\r\n\tconst cursor = keyconSprite.appendChild(createImg(`cursor`, g_imgObj.cursor,\r\n\t\t(kWidth - C_ARW_WIDTH) / 2 + g_keyObj.blank * (posj - divideCnt / 2) - 10, 57, 15, 30));\r\n\tcursor.style.transitionDuration = `0.125s`;\r\n\r\n\tconst viewGroupObj = {\r\n\t\tshuffle: (_type = ``) => {\r\n\t\t\tif (g_keyObj[`shuffle${keyCtrlPtn}`] !== undefined) {\r\n\t\t\t\tfor (let j = 0; j < keyNum; j++) {\r\n\t\t\t\t\tdocument.getElementById(`sArrow${j}`).textContent = g_keyObj[`shuffle${keyCtrlPtn}${_type}`][j] + 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tcolor: (_type = ``) => {\r\n\t\t\tfor (let j = 0; j < keyNum; j++) {\r\n\t\t\t\tconst colorPos = g_keyObj[`color${keyCtrlPtn}${_type}`][j];\r\n\t\t\t\tconst arrowColor = getKeyConfigColor(j, colorPos);\r\n\t\t\t\t$id(`arrow${j}`).background = arrowColor;\r\n\t\t\t\t$id(`arrowShadow${j}`).background = hasVal(g_headerObj.setShadowColor[colorPos]) ?\r\n\t\t\t\t\tgetShadowColor(colorPos, arrowColor) : ``;\r\n\t\t\t\tif (g_headerObj.setShadowColor[colorPos] === `Default`) {\r\n\t\t\t\t\t$id(`arrowShadow${j}`).opacity = 0.5;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tstepRtn: (_type = ``) => { },\r\n\t};\r\n\r\n\t/**\r\n\t * カラー・シャッフルグループ設定の表示\r\n\t * - シャッフルグループではデフォルトからの差異表示もここで行う\r\n\t * @param {string} _type \r\n\t */\r\n\tconst viewGroup = _type => {\r\n\t\tif (g_headerObj[`${_type}Use`]) {\r\n\t\t\tconst num = g_keycons[`${_type}GroupNum`] === -1 ? g_keycons.groupSelf : g_keycons[`${_type}GroupNum`] + 1;\r\n\t\t\tif (document.getElementById(`lnk${toCapitalize(_type)}Group`) !== null) {\r\n\t\t\t\tdocument.getElementById(`lnk${toCapitalize(_type)}Group`).textContent = getStgDetailName(num);\r\n\t\t\t}\r\n\t\t\tviewGroupObj[_type](`_${g_keycons[`${_type}GroupNum`]}`);\r\n\r\n\t\t\tif (_type === `shuffle`) {\r\n\t\t\t\tchangeShuffleConfigColor(keyCtrlPtn, g_keyObj[`shuffle${keyCtrlPtn}_${g_keycons.shuffleGroupNum}`]);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\t/**\r\n\t * カラー・シャッフルグループ設定\r\n\t * @param {string} _type \r\n\t * @param {number} [_scrollNum=1] \r\n\t */\r\n\tconst setGroup = (_type, _scrollNum = 1) => {\r\n\t\tg_keycons[`${_type}GroupNum`] = g_keycons[`${_type}Groups`][getNextNum(_scrollNum, `${_type}Groups`, g_keycons[`${_type}GroupNum`])];\r\n\t\tg_keyObj[`${_type}${keyCtrlPtn}`] = structuredClone(g_keyObj[`${_type}${keyCtrlPtn}_${g_keycons[`${_type}GroupNum`]}`]);\r\n\t\tviewGroup(_type);\r\n\t\tif (_type === `stepRtn`) {\r\n\t\t\tkeyConfigInit(g_kcType);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * キーコンフィグ用設定ラベル\r\n\t * @param {string} _id \r\n\t * @param {string} _name \r\n\t * @param {number} [object.x=g_btnX(5 / 6)]\r\n\t * @param {number} [object.y=0]\r\n\t * @param {number} [object.w=g_btnWidth(1 / 6)]\r\n\t * @param {number} [object.h=20]\r\n\t * @param {number} [object.siz=12]\r\n\t * @param {string} [object.align='left']\r\n\t * @param {...any} [object.rest]\r\n\t * @param {...any} _classes \r\n\t * @returns {HTMLDivElement}\r\n\t */\r\n\tconst makeKCButtonHeader = (_id, _name, {\r\n\t\tx = g_btnX(5 / 6) - 30, y = 0, w = g_btnWidth(1 / 6), h = 20, siz = 12, align = C_ALIGN_LEFT, ...rest\r\n\t} = {}, ..._classes) => createDivCss2Label(_id, g_lblNameObj[_name], { x, y, w, h, siz, align, ...rest }, ..._classes);\r\n\r\n\t/**\r\n\t * キーコンフィグ用設定ボタン\r\n\t * @param {string} _id \r\n\t * @param {string} _text \r\n\t * @param {function} _func \r\n\t * @param {number} [object.x=g_btnX(5 / 6) - 20]\r\n\t * @param {number} [object.y=15]\r\n\t * @param {number} [object.w=g_btnWidth(1 / 6)]\r\n\t * @param {number} [object.h=18]\r\n\t * @param {number} [object.siz=g_limitObj.jdgCntsSiz]\r\n\t * @param {string} [object.borderStyle='solid']\r\n\t * @param {function} [object.cxtFunc]\r\n\t * @param {...any} [object.rest]\r\n\t * @param {string} [_mainClass=g_cssObj.button_RevOFF] \r\n\t * @param  {...any} _classes \r\n\t * @returns {HTMLDivElement}\r\n\t */\r\n\tconst makeKCButton = (_id, _text, _func, { x = g_btnX(5 / 6) - 20, y = 15, w = g_btnWidth(1 / 6), h = 18,\r\n\t\tsiz = g_limitObj.jdgCntsSiz, borderStyle = `solid`, cxtFunc, ...rest } = {}, _mainClass = g_cssObj.button_RevOFF, ..._classes) =>\r\n\t\tmakeSettingLblCssButton(_id, getStgDetailName(_text), 0, _func, { x, y, w, h, siz, cxtFunc, borderStyle, ...rest }, _mainClass, ..._classes);\r\n\r\n\t/**\r\n\t * キーコンフィグ用ミニボタン\r\n\t * @param {string} _id \r\n\t * @param {string} _directionFlg \r\n\t * @param {function} _func \r\n\t * @param {number} [object.x=g_btnX(5 / 6) - 30]\r\n\t * @param {number} [object.y=15]\r\n\t * @param {number} [object.w=15]\r\n\t * @param {number} [object.h=20]\r\n\t * @param {number} [object.siz=g_limitObj.mainSiz]\r\n\t */\r\n\tconst makeMiniKCButton = (_id, _directionFlg, _func, { x = g_btnX(5 / 6) - 30, y = 15, w = 15, h = 20, siz = g_limitObj.mainSiz } = {}) =>\r\n\t\tcreateCss2Button(`${_id}${_directionFlg}`, g_settingBtnObj.chara[_directionFlg], _func, { x, y, w, h, siz }, g_cssObj.button_Mini);\r\n\r\n\t/**\r\n\t * キーコンフィグ用グループ設定ラベル・ボタンの作成\r\n\t * @param {string} _type \r\n\t * @param {number} [object.baseX=g_btnX(5 / 6) - 20]\r\n\t * @param {number} [object.baseY=0]\r\n\t * @param {string} [object.cssName]\r\n\t */\r\n\tconst makeGroupButton = (_type, { baseX = g_btnX(5 / 6) - 20, baseY = 0, cssName } = {}) => {\r\n\t\tif (g_headerObj[`${_type}Use`] && g_keycons[`${_type}Groups`].length > 1) {\r\n\t\t\tconst typeName = toCapitalize(_type);\r\n\t\t\tmultiAppend(divRoot,\r\n\t\t\t\tmakeKCButtonHeader(`lbl${_type}Group`, `${typeName}Group`, { x: baseX - 10, y: baseY }, cssName),\r\n\t\t\t\tmakeKCButton(`lnk${typeName}Group`, ``, () => setGroup(_type), {\r\n\t\t\t\t\tx: baseX, y: baseY + 13, w: g_btnWidth(1 / 18), title: g_msgObj[`${_type}Group`], cxtFunc: () => setGroup(_type, -1),\r\n\t\t\t\t}),\r\n\t\t\t\tmakeMiniKCButton(`lnk${typeName}Group`, `L`, () => setGroup(_type, -1), { x: baseX - 10, y: baseY + 13 }),\r\n\t\t\t\tmakeMiniKCButton(`lnk${typeName}Group`, `R`, () => setGroup(_type), { x: baseX + g_btnWidth(1 / 18), y: baseY + 13 }),\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\tg_keycons[`${_type}GroupNum`] = 0;\r\n\t\t}\r\n\t\tviewGroup(_type);\r\n\t};\r\n\r\n\tconst kcSubX = parseFloat(keyconSprite.style.width) * ((1 - g_keyObj.scale) / 4);\r\n\tconst kcSubY = parseFloat(keyconSprite.style.height) / ((1 + g_keyObj.scale) / 2) - parseFloat(keyconSprite.style.height);\r\n\tmultiAppend(divRoot,\r\n\r\n\t\t// ショートカットキーメッセージ\r\n\t\tcreateDescDiv(`scMsg`, g_lblNameObj.kcShortcutDesc, { altId: `scKcMsg` }),\r\n\r\n\t\t// タイトルバックのショートカットキー変更\r\n\t\tcreateCss2Button(`scTitleBack`, getScMsg.TitleBack(), () => {\r\n\t\t\tif (!g_isMac) {\r\n\t\t\t\tcursor.style.left = wUnit(g_btnX(1 / 4) - kcSubX);\r\n\t\t\t\tcursor.style.top = wUnit(g_sHeight - 160 + kcSubY);\r\n\t\t\t\tselectedKc = `TitleBack`;\r\n\t\t\t}\r\n\t\t}, g_lblPosObj.scTitleBack, g_cssObj.button_Default_NoColor,\r\n\t\t\tg_headerObj.keyTitleBack === g_headerObj.keyTitleBackDef2 ?\r\n\t\t\t\tg_cssObj.title_base : g_cssObj.keyconfig_Changekey),\r\n\r\n\t\t// リトライのショートカットキー変更\r\n\t\tcreateCss2Button(`scRetry`, getScMsg.Retry(), () => {\r\n\t\t\tcursor.style.left = wUnit(g_btnX(5 / 8) + kcSubX);\r\n\t\t\tcursor.style.top = wUnit(g_sHeight - 160 + kcSubY);\r\n\t\t\tselectedKc = `Retry`;\r\n\t\t}, g_lblPosObj.scRetry, g_cssObj.button_Default_NoColor,\r\n\t\t\tg_headerObj.keyRetry === g_headerObj.keyRetryDef2 ?\r\n\t\t\t\tg_cssObj.title_base : g_cssObj.keyconfig_Changekey),\r\n\r\n\t\t// 別キーモード警告メッセージ\r\n\t\tcreateDivCss2Label(\r\n\t\t\t`kcMsg`,\r\n\t\t\thasVal(g_keyObj[`transKey${keyCtrlPtn}`]) ? g_lblNameObj.transKeyDesc : ``,\r\n\t\t\tg_lblPosObj.kcMsg, g_cssObj.keyconfig_warning\r\n\t\t),\r\n\r\n\t\t// キーカラータイプ切替ボタン\r\n\t\tmakeKCButtonHeader(`lblcolorType`, `ColorType`, { x: 10 + g_btnX() }, g_cssObj.keyconfig_ColorType),\r\n\t\tmakeKCButton(`lnkColorType`, g_colorType, () => setColorType(), {\r\n\t\t\tx: 20 + g_btnX(), title: g_msgObj.colorType, cxtFunc: () => setColorType(-1),\r\n\t\t}),\r\n\t\tmakeMiniKCButton(`lnkColorType`, `L`, () => setColorType(-1), { x: 10 + g_btnX() }),\r\n\t\tmakeMiniKCButton(`lnkColorType`, `R`, () => setColorType(), { x: 20 + g_btnX(1 / 6) }),\r\n\t);\r\n\r\n\tif (g_headerObj.imgType.length > 1) {\r\n\t\tconst [imgBaseX, imgBaseY] = [20 + g_btnX(), 50];\r\n\t\tmultiAppend(divRoot,\r\n\t\t\t// オブジェクトタイプの切り替え（リロードあり）\r\n\t\t\tmakeKCButtonHeader(`lblImgType`, `ImgType`, { x: imgBaseX - 10, y: 37 }, g_cssObj.keyconfig_ConfigType),\r\n\t\t\tmakeKCButton(`lnkImgType`, g_imgType, () => setImgType(), {\r\n\t\t\t\tx: imgBaseX, y: imgBaseY, title: g_msgObj.imgType, cxtFunc: () => setImgType(-1),\r\n\t\t\t}),\r\n\t\t\tmakeMiniKCButton(`lnkImgType`, `L`, () => setImgType(-1), { x: imgBaseX - 10, y: imgBaseY }),\r\n\t\t\tmakeMiniKCButton(`lnkImgType`, `R`, () => setImgType(), { x: imgBaseX + g_btnWidth(1 / 6), y: imgBaseY }),\r\n\t\t);\r\n\t}\r\n\r\n\t// カラー/シャッフルグループ切替ボタン（カラー/シャッフルパターンが複数ある場合のみ）\r\n\tmakeGroupButton(`color`, { cssName: g_cssObj.keyconfig_ColorGr });\r\n\tmakeGroupButton(`shuffle`, { baseX: g_btnX(11 / 12) - 10, cssName: g_cssObj.keyconfig_ShuffleGr });\r\n\tmakeGroupButton(`stepRtn`, { baseY: 37, cssName: g_cssObj.keyconfig_StepRtnGr });\r\n\r\n\t/**\r\n\t * カーソル位置の設定\r\n\t */\r\n\tconst setKeyConfigCursor = () => {\r\n\t\tconst posj = g_keyObj[`pos${keyCtrlPtn}`][g_currentj];\r\n\t\tconst stdPos = posj - ((posj > divideCnt ? posMax : 0) + divideCnt) / 2;\r\n\r\n\t\tconst nextLeft = (kWidth - C_ARW_WIDTH) / 2 + g_keyObj.blank * stdPos + addLeft - 10;\r\n\t\tcursor.style.left = wUnit(nextLeft);\r\n\t\tcursor.style.top = wUnit(C_KYC_HEIGHT * Number(posj > divideCnt) + 57 + C_KYC_REPHEIGHT * g_currentk);\r\n\t\tg_kcType = (g_currentk === 0 ? `Main` : `Replaced`);\r\n\r\n\t\t// 次の位置が見えなくなったらkeyconSpriteの位置を調整する\r\n\t\tadjustScrollPoint(nextLeft);\r\n\t};\r\n\r\n\t/**\r\n\t * カーソル位置の変更\r\n\t * @param {number} [_nextj] 次のカーソル位置\r\n\t */\r\n\tconst changeConfigCursor = (_nextj = ++g_keycons.cursorNum % g_keycons.cursorNumList.length) => {\r\n\t\tg_keycons.cursorNum = _nextj;\r\n\r\n\t\tg_currentj = g_keycons.cursorNumList[_nextj];\r\n\t\tg_currentk = 0;\r\n\t\tif (g_kcType === `Replaced`) {\r\n\t\t\tg_currentk = 1;\r\n\r\n\t\t\t// 代替キー設定の場合は次の代替キーが見つかるまで移動\r\n\t\t\twhile (g_keyObj[`keyCtrl${keyCtrlPtn}`][g_currentj][1] === undefined) {\r\n\t\t\t\tg_keycons.cursorNum = (g_keycons.cursorNum + 1) % g_keycons.cursorNumList.length;\r\n\t\t\t\tg_currentj = g_keycons.cursorNumList[g_keycons.cursorNum];\r\n\r\n\t\t\t\t// 一周して対象が無い場合は代替キーが無いため処理を抜ける（無限ループ対策）\r\n\t\t\t\tif (g_keycons.cursorNum === _nextj) {\r\n\t\t\t\t\tg_kcType = `Main`;\r\n\t\t\t\t\tg_currentk = 0;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsetKeyConfigCursor();\r\n\t};\r\n\r\n\t/**\r\n\t * 次のカーソル位置の取得\r\n\t * @param {number} _scrollNum \r\n\t * @param {string} _groupName \r\n\t * @param {string} _target \r\n\t * @returns {number}\r\n\t */\r\n\tconst getNextNum = (_scrollNum, _groupName, _target) =>\r\n\t\tnextPos(g_keycons[_groupName].findIndex(value => value === _target), _scrollNum, g_keycons[_groupName].length);\r\n\r\n\t/**\r\n\t * ConfigTypeの制御\r\n\t * @param {number} _scrollNum \r\n\t */\r\n\tconst setConfigType = (_scrollNum = 1) => {\r\n\t\tg_kcType = g_keycons.configTypes[getNextNum(_scrollNum, `configTypes`, g_kcType)];\r\n\t\tchangeConfigCursor(g_keycons.cursorNum);\r\n\t};\r\n\r\n\t/**\r\n\t * 一部のキーコンフィグを表示する\r\n\t * （キーグループ毎にフィルターされたもののみを表示する）\r\n\t * @param {number} _num \r\n\t */\r\n\tconst appearConfigSteps = _num => {\r\n\r\n\t\tconst appearConfigView = (_j, _display) => {\r\n\t\t\t$id(`arrow${_j}`).display = _display;\r\n\t\t\t$id(`arrowShadow${_j}`).display = _display;\r\n\t\t\t$id(`color${_j}`).display = _display;\r\n\t\t\tif (document.getElementById(`sArrow${_j}`) !== null) {\r\n\t\t\t\t$id(`sArrow${_j}`).display = _display;\r\n\t\t\t}\r\n\t\t\tconst ctrlPtn = g_keyObj[`keyCtrl${g_headerObj.keyLabels[g_stateObj.scoreId]}_${g_keyObj.currentPtn}`][_j];\r\n\t\t\tfor (let k = 0; k < ctrlPtn.length; k++) {\r\n\t\t\t\t$id(`keycon${_j}_${k}`).display = _display;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tg_keycons.keySwitchNum = _num;\r\n\t\tg_keycons.cursorNumList = [];\r\n\t\tfor (let j = 0; j < keyNum; j++) {\r\n\t\t\tappearConfigView(j, C_DIS_NONE);\r\n\r\n\t\t\tif (tkObj.keyGroupMaps[j].includes(configKeyGroupList[_num])) {\r\n\t\t\t\tg_keycons.cursorNumList.push(j);\r\n\t\t\t\tappearConfigView(j, C_DIS_INHERIT);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (g_keycons.cursorNumList.length === 0) {\r\n\t\t\tappearConfigSteps(0);\r\n\t\t} else {\r\n\t\t\tchangeConfigCursor(0);\r\n\r\n\t\t\t// keySwitchボタンを一旦非選択にして、選択中のものを再度色付け\r\n\t\t\tif (configKeyGroupList.length > 1) {\r\n\t\t\t\tfor (let j = 0; j < configKeyGroupList.length; j++) {\r\n\t\t\t\t\tdocument.getElementById(`key${j}`).classList.replace(g_cssObj.button_Next, g_cssObj.button_Mini);\r\n\t\t\t\t}\r\n\t\t\t\tdocument.getElementById(`key${_num}`).classList.replace(g_cssObj.button_Mini, g_cssObj.button_Next);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * ColorPickerの色切替\r\n\t * @param {number} _j \r\n\t * @param {string} _type \r\n\t * @param {string} _color \r\n\t */\r\n\tconst changeColorPicker = (_j, _type, _color) => {\r\n\t\tif (_color !== ``) {\r\n\t\t\tdocument.getElementById(`pick${_type}${_j}`).value = _color.slice(0, 7);\r\n\t\t\t$id(`pick${_type}${_j}`).display = C_DIS_INHERIT;\r\n\t\t} else {\r\n\t\t\t$id(`pick${_type}${_j}`).display = C_DIS_NONE;\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * ColorPickerに対応する実際の番号を取得\r\n\t * @param {number} _j \r\n\t */\r\n\tconst getGroupNum = _j => _j + g_keycons.colorCursorNum * g_limitObj.kcColorPickerNum;\r\n\r\n\t/**\r\n\t * ColorPicker（一式）の切替\r\n\t */\r\n\tconst changeColorPickers = () => {\r\n\t\tlnkColorR.innerHTML = `[${g_keycons.colorCursorNum + 1} /`;\r\n\t\tfor (let j = 0; j < g_limitObj.kcColorPickerNum; j++) {\r\n\t\t\tconst m = getGroupNum(j);\r\n\t\t\tchangeColorPicker(j, `arrow`, g_headerObj.setColor[m]);\r\n\t\t\tchangeColorPicker(j, `arrowShadow`, g_headerObj.setShadowColor[m]);\r\n\t\t\tchangeColorPicker(j, `frz`, g_headerObj.frzColor[m][0]);\r\n\t\t\tchangeColorPicker(j, `frzBar`, g_headerObj.frzColor[m][1]);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * ColorTypeの制御\r\n\t * @param {number} [_scrollNum=1] \r\n\t * @param {boolean} [_reloadFlg=true]\r\n\t */\r\n\tconst setColorType = (_scrollNum = 1, _reloadFlg = true) => {\r\n\t\tconst nextNum = getNextNum(_scrollNum, `colorTypes`, g_colorType);\r\n\t\tg_colorType = g_keycons.colorTypes[nextNum];\r\n\t\tif (g_headerObj.colorUse) {\r\n\t\t\tg_stateObj.d_color = boolToSwitch(g_keycons.colorDefTypes.findIndex(val => val === g_colorType) !== -1);\r\n\t\t}\r\n\t\tchangeSetColor();\r\n\t\tviewGroupObj.color(`_${g_keycons.colorGroupNum}`);\r\n\t\tlnkColorType.textContent = `${getStgDetailName(g_colorType)}${g_localStorage.colorType === g_colorType ? ' *' : ''}`;\r\n\t\tif (_reloadFlg) {\r\n\t\t\tcolorPickSprite.style.display = ([`Default`, `Type0`].includes(g_colorType) ? C_DIS_NONE : C_DIS_INHERIT);\r\n\t\t\tg_keycons.colorCursorNum = g_keycons.colorCursorNum % Math.ceil(g_headerObj.setColor.length / g_limitObj.kcColorPickerNum);\r\n\t\t\tchangeColorPickers();\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * ImgTypeの制御\r\n\t * @param {number} [_scrollNum=1] \r\n\t */\r\n\tconst setImgType = (_scrollNum = 1) => {\r\n\t\tconst nextNum = getNextNum(_scrollNum, `imgTypes`, g_imgType);\r\n\t\tg_imgType = g_keycons.imgTypes[nextNum];\r\n\t\tg_stateObj.rotateEnabled = g_headerObj.imgType[nextNum].rotateEnabled;\r\n\t\tg_stateObj.flatStepHeight = g_headerObj.imgType[nextNum].flatStepHeight;\r\n\r\n\t\tupdateImgType(g_headerObj.imgType[nextNum]);\r\n\t\tkeyConfigInit(g_kcType);\r\n\t};\r\n\r\n\tconst colorPickSprite = createEmptySprite(divRoot, `colorPickSprite`, Object.assign({ title: g_msgObj.pickArrow }, g_windowObj.colorPickSprite));\r\n\tif ([`Default`, `Type0`].includes(g_colorType)) {\r\n\t\tcolorPickSprite.style.display = C_DIS_NONE;\r\n\t}\r\n\tmultiAppend(colorPickSprite,\r\n\r\n\t\t// ColorPickerの切替\r\n\t\tcreateCss2Button(`lnkColorR`, `[${g_keycons.colorCursorNum + 1} /`, () => {\r\n\t\t\tg_keycons.colorCursorNum = (g_keycons.colorCursorNum + 1) % Math.ceil(g_headerObj.setColor.length / g_limitObj.kcColorPickerNum);\r\n\t\t\tchangeColorPickers();\r\n\t\t}, g_lblPosObj.lnkColorR, g_cssObj.button_Start),\r\n\r\n\t\t// 矢印の配色をフリーズアローへ反映\r\n\t\tcreateCss2Button(`lnkColorCopy`, `↓]`, () => {\r\n\t\t\tif (window.confirm(g_msgObj.colorCopyConfirm)) {\r\n\t\t\t\tfor (let j = 0; j < g_headerObj.setColor.length; j++) {\r\n\t\t\t\t\tg_headerObj.frzColor[j] = g_headerObj[`frzColor${g_colorType}`][j] =\r\n\t\t\t\t\t\tfillArray(g_headerObj[`frzColor${g_colorType}`][j].length, g_headerObj[`setColor${g_colorType}`][j]);\r\n\t\t\t\t}\r\n\t\t\t\tfor (let j = 0; j < g_limitObj.kcColorPickerNum; j++) {\r\n\t\t\t\t\tconst m = getGroupNum(j);\r\n\t\t\t\t\t[``, `Bar`].forEach((val, k) =>\r\n\t\t\t\t\t\tdocument.getElementById(`pickfrz${val}${j}`).value = g_headerObj[`frzColor${g_colorType}`][m][k]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, g_lblPosObj.lnkColorCopy, g_cssObj.button_Start),\r\n\r\n\t\tcreateDivCss2Label(`lblPickArrow`, g_lblNameObj.s_arrow, Object.assign({ y: 0 }, g_lblPosObj.pickPos)),\r\n\t\tcreateDivCss2Label(`lblPickFrz`, g_lblNameObj.s_frz, Object.assign({ y: 140 }, g_lblPosObj.pickPos)),\r\n\r\n\t\t// ColorPickerの色を元に戻す\r\n\t\tcreateCss2Button(`lnkColorReset`, g_lblNameObj.b_cReset, () => {\r\n\t\t\tif (window.confirm(g_msgObj.colorResetConfirm)) {\r\n\t\t\t\tresetColorType({ _from: g_colorType, _to: ``, _fromObj: g_dfColorObj });\r\n\t\t\t\tresetColorType({ _from: g_colorType, _to: g_colorType, _fromObj: g_dfColorObj });\r\n\r\n\t\t\t\t// 影矢印が未指定の場合はType1, Type2の影矢印指定を無くす\r\n\t\t\t\tconst _idHeader = setScoreIdHeader(g_stateObj.scoreId, false, true);\r\n\t\t\t\tconst _shadowDefault = g_headerObj[`setShadowColor${_idHeader}Default`];\r\n\t\t\t\tif ((!Array.isArray(_shadowDefault) || !hasVal(_shadowDefault[0])) &&\r\n\t\t\t\t\t[`Type1`, `Type2`].includes(g_colorType)) {\r\n\r\n\t\t\t\t\tg_headerObj.setShadowColor = fillArray(g_headerObj.setColorInit.length, ``);\r\n\t\t\t\t\tg_headerObj[`setShadowColor${g_colorType}`] = fillArray(g_headerObj.setColorInit.length, ``);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tchangeColorPickers();\r\n\t\t\t\tviewGroupObj.color(`_${g_keycons.colorGroupNum}`);\r\n\t\t\t}\r\n\t\t}, g_lblPosObj.lnkColorReset, g_cssObj.button_Reset),\r\n\t);\r\n\r\n\t/**\r\n\t * ColorPicker部分の作成\r\n\t * @param {number} _j \r\n\t * @param {string} _type \r\n\t * @param {function} _func \r\n\t * @param {number} [object.x=0]\r\n\t * @param {number} [object.y=15] \r\n\t */\r\n\tconst createColorPickWindow = (_j, _type, _func, { x = 0, y = 15 } = {}) =>\r\n\t\tcreateColorPicker(colorPickSprite, `pick${_type}${_j}`, _func, { x, y: y + 25 * _j });\r\n\r\n\tfor (let j = 0; j < g_limitObj.kcColorPickerNum; j++) {\r\n\t\tcreateColorPickWindow(j, `arrow`, () => {\r\n\t\t\tg_headerObj[`setColor${g_colorType}`][getGroupNum(j)] = document.getElementById(`pickarrow${j}`).value;\r\n\t\t\tsetColorType(0, false);\r\n\t\t});\r\n\r\n\t\tcreateColorPickWindow(j, `arrowShadow`, () => {\r\n\t\t\tg_headerObj[`setShadowColor${g_colorType}`][getGroupNum(j)] = `${document.getElementById(`pickarrowShadow${j}`).value}80`;\r\n\t\t\tsetColorType(0, false);\r\n\t\t}, { x: 25 });\r\n\r\n\t\t[``, `Bar`].forEach((val, k) =>\r\n\t\t\tcreateColorPickWindow(j, `frz${val}`, () => {\r\n\t\t\t\tg_headerObj[`frzColor${g_colorType}`][getGroupNum(j)][k] = document.getElementById(`pickfrz${val}${j}`).value;\r\n\t\t\t}, { x: 25 * k, y: 155 }));\r\n\t}\r\n\r\n\t// ConfigType, ColorTypeの初期設定\r\n\tsetConfigType(0);\r\n\tsetColorType(0);\r\n\tkeyconSprite.scrollLeft = - maxLeftX;\r\n\r\n\t// キーパターン表示\r\n\tconst lblTransKey = hasVal(g_keyObj[`transKey${keyCtrlPtn}`]) ? `(${g_keyObj[`transKey${keyCtrlPtn}`] ?? ''})` : ``;\r\n\r\n\t/**\r\n\t * キーパターン検索\r\n\t * @param {number} _tempPtn \r\n\t * @param {number} _sign \r\n\t * @param {boolean} [_transKeyUse=false] \r\n\t * @param {boolean} [_skipFlg=false]\r\n\t */\r\n\tconst searchPattern = (_tempPtn, _sign, _transKeyUse = false, _skipFlg = false) => {\r\n\t\tlet nextPtn = _tempPtn + _sign;\r\n\t\tconst initialPtn = hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_-1`]) ? -1 : 0;\r\n\r\n\t\tconst searchStart = () => {\r\n\t\t\tif (!hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {\r\n\t\t\t\tnextPtn = 0;\r\n\t\t\t\twhile (hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {\r\n\t\t\t\t\tnextPtn -= _sign;\r\n\t\t\t\t}\r\n\t\t\t\tnextPtn += _sign;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst searchNextGroup = () => {\r\n\t\t\twhile (nextPtn !== initialPtn &&\r\n\t\t\t\tg_keyObj[`transKey${g_keyObj.currentKey}_${_tempPtn}`] === g_keyObj[`transKey${g_keyObj.currentKey}_${nextPtn}`] &&\r\n\t\t\t\thasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {\r\n\t\t\t\tnextPtn += _sign;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tsearchStart();\r\n\t\tif (_skipFlg) {\r\n\t\t\tsearchNextGroup();\r\n\t\t\tsearchStart();\r\n\t\t}\r\n\t\tif (!_transKeyUse) {\r\n\t\t\twhile (hasVal(g_keyObj[`transKey${g_keyObj.currentKey}_${nextPtn}`])) {\r\n\t\t\t\tnextPtn += _sign;\r\n\t\t\t}\r\n\t\t\tsearchStart();\r\n\t\t}\r\n\t\treturn nextPtn;\r\n\t};\r\n\r\n\t/**\r\n\t * キーパターン変更時処理\r\n\t * @param {number} [_sign=1] \r\n\t * @param {boolean} [_skipFlg=false]\r\n\t */\r\n\tconst changePattern = (_sign = 1, _skipFlg = false) => {\r\n\r\n\t\t// キーパターンの変更\r\n\t\tg_keyObj.currentPtn = searchPattern(g_keyObj.currentPtn, _sign, g_headerObj.transKeyUse, _skipFlg);\r\n\r\n\t\t// カラーグループ、シャッフルグループの再設定\r\n\t\tg_keycons.groups.forEach(type => resetGroupList(type, `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`));\r\n\r\n\t\t// 曲中ショートカットキーの切り替え\r\n\t\tsetPlayingShortcut();\r\n\r\n\t\t// キーコンフィグ画面を再呼び出し\r\n\t\tkeyConfigInit();\r\n\r\n\t\t// シャッフルグループのデフォルト値からの差異表示（色付け）\r\n\t\t// 再描画後で無いと色付けできないため、keyConfigInit() 実行後に処理\r\n\t\tif (g_headerObj.shuffleUse) {\r\n\t\t\tchangeShuffleConfigColor(`${g_keyObj.currentKey}_${g_keyObj.currentPtn}`, g_keyObj[`shuffle${g_keyObj.currentKey}_${g_keyObj.currentPtn}_${g_keycons.shuffleGroupNum}`]);\r\n\t\t}\r\n\t};\r\n\r\n\t// ユーザカスタムイベント(初期)\r\n\tg_customJsObj.keyconfig.forEach(func => func());\r\n\r\n\t// 部分キー表示用ボタン描画\r\n\tif (configKeyGroupList.length > 1) {\r\n\t\tmultiAppend(divRoot,\r\n\t\t\tcreateDivCss2Label(`lblkey`, `KeySwitch`, g_lblPosObj.lblkey));\r\n\t\tconfigKeyGroupList.forEach((val, j) =>\r\n\t\t\tdivRoot.appendChild(\r\n\t\t\t\tcreateCss2Button(`key${j}`, `${j + 1}`, () => appearConfigSteps(j),\r\n\t\t\t\t\tObject.assign({ y: 110 + j * 20 }, g_lblPosObj.lnkKeySwitch), g_cssObj.button_Mini),\r\n\t\t\t));\r\n\t}\r\n\r\n\t// カーソル位置の初期化\r\n\tappearConfigSteps(g_keycons.keySwitchNum);\r\n\r\n\t// ラベル・ボタン描画\r\n\tmultiAppend(divRoot,\r\n\r\n\t\t// 設定画面へ戻る\r\n\t\tcreateCss2Button(`btnBack`, g_lblNameObj.b_settings, () => {\r\n\t\t\tg_currentj = 0;\r\n\t\t\tg_currentk = 0;\r\n\t\t\tg_prevKey = 0;\r\n\t\t}, Object.assign(g_lblPosObj.btnKcBack, {\r\n\t\t\tresetFunc: () => g_moveSettingWindow(false),\r\n\t\t}), g_cssObj.button_Back),\r\n\r\n\t\tcreateDivCss2Label(`lblPattern`, `${g_lblNameObj.KeyPattern}: ${g_keyObj.currentPtn === -1 ?\r\n\t\t\t'Self' : g_keyObj.currentPtn + 1}${lblTransKey}`, g_lblPosObj.lblPattern),\r\n\r\n\t\t// パターン変更ボタン描画(右回り)\r\n\t\tcreateCss2Button(`btnPtnChangeR`, `>`, () => true, Object.assign(g_lblPosObj.btnPtnChangeR, {\r\n\t\t\tresetFunc: () => changePattern(),\r\n\t\t}), g_cssObj.button_Mini),\r\n\r\n\t\t// パターン変更ボタン描画(左回り)\r\n\t\tcreateCss2Button(`btnPtnChangeL`, `<`, () => true, Object.assign(g_lblPosObj.btnPtnChangeL, {\r\n\t\t\tresetFunc: () => changePattern(-1),\r\n\t\t}), g_cssObj.button_Mini),\r\n\r\n\t\t// パターン変更ボタン描画(右回り/別キーモード間スキップ)\r\n\t\tcreateCss2Button(`btnPtnChangeRR`, `|>`, () => true, Object.assign(g_lblPosObj.btnPtnChangeRR, {\r\n\t\t\tresetFunc: () => changePattern(1, true),\r\n\t\t}), g_cssObj.button_Setting),\r\n\r\n\t\t// パターン変更ボタン描画(左回り/別キーモード間スキップ)\r\n\t\tcreateCss2Button(`btnPtnChangeLL`, `<|`, () => true, Object.assign(g_lblPosObj.btnPtnChangeLL, {\r\n\t\t\tresetFunc: () => changePattern(-1, true),\r\n\t\t}), g_cssObj.button_Setting),\r\n\r\n\t\t// キーコンフィグリセットボタン描画\r\n\t\tcreateCss2Button(`btnReset`, g_lblNameObj.b_reset, () => {\r\n\t\t\tif (window.confirm(g_msgObj.keyResetConfirm)) {\r\n\t\t\t\tconst keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;\r\n\r\n\t\t\t\tfor (let m = 0; m < g_keycons.cursorNumList.length; m++) {\r\n\t\t\t\t\tconst j = g_keycons.cursorNumList[m];\r\n\t\t\t\t\tfor (let k = 0; k < g_keyObj[`keyCtrl${keyCtrlPtn}`][j].length; k++) {\r\n\t\t\t\t\t\tg_keyObj[`keyCtrl${keyCtrlPtn}`][j][k] = setIntVal(g_keyObj[`keyCtrl${keyCtrlPtn}d`][j][k]);\r\n\t\t\t\t\t\tdocument.getElementById(`keycon${j}_${k}`).textContent = g_kCd[g_keyObj[`keyCtrl${keyCtrlPtn}`][j][k]];\r\n\t\t\t\t\t\tchangeKeyConfigColor(j, k, g_keyObj.currentPtn === -1 ? g_cssObj.keyconfig_Defaultkey : g_cssObj.title_base);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tchangeConfigCursor(0);\r\n\t\t\t}\r\n\t\t}, g_lblPosObj.btnKcReset, g_cssObj.button_Reset),\r\n\r\n\t\t// プレイ開始\r\n\t\tmakePlayButton(() => loadMusic())\r\n\t);\r\n\r\n\t// キーボード押下時処理\r\n\tsetShortcutEvent(g_currentPage, (kbCode) => {\r\n\t\tconst keyCdObj = document.getElementById(`keycon${g_currentj}_${g_currentk}`);\r\n\t\tlet setKey = g_kCdN.findIndex(kCd => kCd === kbCode);\r\n\r\n\t\t// 全角切替、BackSpace、Deleteキー、Escキーは割り当て禁止\r\n\t\t// また、直前と同じキーを押した場合(BackSpaceを除く)はキー操作を無効にする\r\n\t\tconst disabledKeys = [240, 242, 243, 244, 91, 29, 28, 27, 259, g_prevKey];\r\n\r\n\t\tif (selectedKc === `TitleBack` || selectedKc === `Retry`) {\r\n\t\t\t// プレイ中ショートカットキー変更\r\n\t\t\tif (disabledKeys.includes(setKey) || g_kCdN[setKey] === undefined) {\r\n\t\t\t\tmakeInfoWindow(g_msgInfoObj.I_0002, `fadeOut0`);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tg_headerObj[`key${selectedKc}`] = setKey;\r\n\t\t\tg_headerObj[`key${selectedKc}Def`] = setKey;\r\n\t\t\tdocument.getElementById(`sc${selectedKc}`).textContent = getScMsg[selectedKc]();\r\n\t\t\tdocument.getElementById(`sc${selectedKc}`).style.fontSize = `${getFontSize2(getScMsg[selectedKc](), g_btnWidth(5 / 12) - 40, { maxSiz: 13 })}px`;\r\n\t\t\tif (g_isMac) {\r\n\t\t\t\tscTitleBack.textContent = getScMsg.TitleBack();\r\n\t\t\t\tscTitleBack.style.fontSize = `${getFontSize2(getScMsg.TitleBack(), g_btnWidth(5 / 12) - 40, { maxSiz: 13 })}px`;\r\n\t\t\t}\r\n\t\t\tchangeConfigColor(document.getElementById(`sc${selectedKc}`),\r\n\t\t\t\tg_headerObj[`key${selectedKc}`] === g_headerObj[`key${selectedKc}Def2`] ?\r\n\t\t\t\t\tg_cssObj.title_base : g_cssObj.keyconfig_Changekey);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (g_localeObj.val === `Ja`) {\r\n\t\t\tdisabledKeys.unshift(229);\r\n\t\t}\r\n\t\tif (disabledKeys.includes(setKey) || g_kCdN[setKey] === undefined) {\r\n\t\t\tmakeInfoWindow(g_msgInfoObj.I_0002, `fadeOut0`);\r\n\t\t\treturn;\r\n\t\t} else if ((setKey === C_KEY_TITLEBACK && g_currentk === 0) ||\r\n\t\t\t((keyIsDown(g_kCdNameObj.metaLKey) || keyIsDown(g_kCdNameObj.metaRKey)) && keyIsShift())) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (setKey === C_KEY_RETRY && (!g_isMac || g_currentk === 0)) {\r\n\t\t\t// スキップ\r\n\t\t} else {\r\n\t\t\t// キー割り当て処理\r\n\t\t\tif (setKey === C_KEY_TITLEBACK || setKey === C_KEY_RETRY) {\r\n\t\t\t\t// キー無効化（代替キーのみ）\r\n\t\t\t\tsetKey = 0;\r\n\t\t\t}\r\n\t\t\tif (g_keyObj[`keyCtrl${keyCtrlPtn}d`][g_currentj][g_currentk] !== setKey) {\r\n\t\t\t\t// 既定キーと異なる場合は色付け\r\n\t\t\t\tchangeKeyConfigColor(g_currentj, g_currentk, g_cssObj.keyconfig_Changekey);\r\n\t\t\t}\r\n\t\t\tkeyCdObj.textContent = g_kCd[setKey];\r\n\t\t\tg_keyObj[`keyCtrl${keyCtrlPtn}`][g_currentj][g_currentk] = setKey;\r\n\t\t\tg_prevKey = setKey;\r\n\t\t}\r\n\r\n\t\t// カーソル移動\r\n\t\tif (g_currentk < g_keyObj[`keyCtrl${keyCtrlPtn}`][g_currentj].length - 1 && g_kcType !== `Main`) {\r\n\t\t\t// 後続に代替キーが存在する場合\r\n\t\t\tg_currentk++;\r\n\t\t\tcursor.style.top = wUnit(parseInt(cursor.style.top) + C_KYC_REPHEIGHT);\r\n\r\n\t\t} else {\r\n\t\t\tchangeConfigCursor();\r\n\t\t}\r\n\t});\r\n\r\n\tg_skinJsObj.keyconfig.forEach(func => func());\r\n\tdocument.onkeyup = evt => commonKeyUp(evt);\r\n\tdocument.oncontextmenu = () => false;\r\n};\r\n\r\n/**\r\n * 影矢印色の取得\r\n * @param {number} _colorPos \r\n * @param {string} _arrowColor \r\n * @returns {string}\r\n */\r\nconst getShadowColor = (_colorPos, _arrowColor) => g_headerObj.setShadowColor[_colorPos] === `Default` ?\r\n\t_arrowColor : g_headerObj.setShadowColor[_colorPos];\r\n\r\n/**\r\n * キー数基礎情報の取得\r\n * @returns {{ \r\n * \tkeyCtrlPtn: string, keyNum: number, posMax: number,\r\n * \tdivideCnt: number, keyGroupMaps: string[], keyGroupList: string[] \r\n * }}\r\n */\r\nconst getKeyInfo = () => {\r\n\tconst keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;\r\n\tconst keyNum = g_keyObj[`${g_keyObj.defaultProp}${keyCtrlPtn}`].length;\r\n\tconst posMax = g_keyObj[`divMax${keyCtrlPtn}`] ?? Math.max(...g_keyObj[`pos${keyCtrlPtn}`]) + 1;\r\n\tconst divideCnt = g_keyObj[`div${keyCtrlPtn}`] - 1;\r\n\tconst keyGroupMaps = setVal(g_keyObj[`keyGroup${keyCtrlPtn}`], fillArray(keyNum, [`0`]), C_TYP_STRING);\r\n\tconst keyGroupList = makeDedupliArray(keyGroupMaps.flat()).sort((a, b) => parseInt(a) - parseInt(b));\r\n\r\n\treturn {\r\n\t\tkeyCtrlPtn, keyNum, posMax, divideCnt, keyGroupMaps, keyGroupList,\r\n\t};\r\n};\r\n\r\n/**\r\n * デフォルトの曲中ショートカットをキー数・キーパターンにより切り替え\r\n * - キーコンフィグ画面で個別に変えていた場合は変更しない\r\n */\r\nconst setPlayingShortcut = () => {\r\n\tconst keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;\r\n\tif (g_headerObj.keyRetryDef === C_KEY_RETRY) {\r\n\t\tg_headerObj.keyRetry = setIntVal(getKeyCtrlVal(g_keyObj[`keyRetry${keyCtrlPtn}`]), g_headerObj.keyRetryDef);\r\n\t}\r\n\tif (g_headerObj.keyTitleBackDef === C_KEY_TITLEBACK) {\r\n\t\tg_headerObj.keyTitleBack = setIntVal(getKeyCtrlVal(g_keyObj[`keyTitleBack${keyCtrlPtn}`]), g_headerObj.keyTitleBackDef);\r\n\t}\r\n};\r\n\r\n/**\r\n * ステップゾーン間隔、大きさの更新\r\n * @param {string} _header \r\n * @param {string} _keyCtrlPtn \r\n */\r\nconst updateKeyInfo = (_header, _keyCtrlPtn) => {\r\n\tconst kcPtn = hasVal(g_keyObj[`${_header}${_keyCtrlPtn}`]) ? _keyCtrlPtn : `_def`;\r\n\tg_keyObj[_header] = g_keyObj[`${_header}${kcPtn}`];\r\n};\r\n\r\n/**\r\n * 初期矢印色・フリーズアロー色の変更\r\n * - ここでのID管理は1譜面目も区別して設定する (setScoreIdHeaderの第三引数を使用)\r\n */\r\nconst changeSetColor = () => {\r\n\tconst isDefault = [`Default`, `Type0`].includes(g_colorType);\r\n\tconst idHeader = setScoreIdHeader(g_stateObj.scoreId, false, true);\r\n\tconst defaultType = idHeader + g_colorType;\r\n\tconst currentTypes = {\r\n\t\t'': (isDefault ? defaultType : g_colorType),\r\n\t\t'Shadow': (isDefault ? defaultType : `${idHeader}Default`),\r\n\t};\r\n\tObject.keys(currentTypes).forEach(pattern => {\r\n\t\tg_headerObj[`set${pattern}Color`] = structuredClone(g_headerObj[`set${pattern}Color${currentTypes[pattern]}`]);\r\n\t\tif (g_headerObj[`frz${pattern}Color`] === undefined) {\r\n\t\t\tg_headerObj[`frz${pattern}Color`] = fillArray(g_headerObj.setColorInit.length, ``);\r\n\t\t}\r\n\t\tfor (let j = 0; j < g_headerObj.setColorInit.length; j++) {\r\n\t\t\tg_headerObj[`frz${pattern}Color`][j] = structuredClone(g_headerObj[`frz${pattern}Color${currentTypes[pattern]}`][j]);\r\n\t\t}\r\n\t\tif (!isDefault) {\r\n\t\t\tg_headerObj[`set${pattern}Color`] = structuredClone(g_headerObj[`set${pattern}Color${g_colorType}`]);\r\n\t\t}\r\n\t});\r\n\r\n\t// 影矢印が未指定の場合はType1, Type2の影矢印指定を無くす\r\n\tif (!hasVal(g_headerObj[`setShadowColor${idHeader}Default`][0]) && [`Type1`, `Type2`].includes(g_colorType)) {\r\n\t\tg_headerObj.setShadowColor = fillArray(g_headerObj.setColorInit.length, ``);\r\n\t}\r\n};\r\n\r\n/**\r\n * コンフィグの色変更\r\n * @param {HTMLDivElement} _obj \r\n * @param {string} _cssName \r\n */\r\nconst changeConfigColor = (_obj, _cssName) => {\r\n\t_obj.classList.remove(g_cssObj.keyconfig_Changekey, g_cssObj.keyconfig_Defaultkey, g_cssObj.title_base);\r\n\t_obj.classList.add(_cssName);\r\n};\r\n\r\n/**\r\n * シャッフルグループの色変更\r\n * - デフォルト値と違う番号になった場合、色付けする\r\n * @param {string} _keyCtrlPtn キーコンフィグパターン\r\n * @param {number[]} _vals シャッフルグループ番号（群）\r\n * @param {number} _j (-1: 全体に対して色付け, それ以外: 指定箇所のみ色付け)\r\n */\r\nconst changeShuffleConfigColor = (_keyCtrlPtn, _vals, _j = -1) => {\r\n\tconst changeTargetColor = (_val, _k) => {\r\n\t\tconst isEqualShuffleGr = (_val === g_keyObj[`shuffle${_keyCtrlPtn}_0d`][_k]);\r\n\t\tchangeConfigColor(document.getElementById(`sArrow${_k}`), isEqualShuffleGr ? g_cssObj.title_base : g_cssObj.keyconfig_Changekey);\r\n\t};\r\n\r\n\tif (_j === -1) {\r\n\t\t_vals.forEach((val, m) => changeTargetColor(val, m));\r\n\t} else {\r\n\t\tchangeTargetColor(_vals, _j);\r\n\t}\r\n};\r\n\r\n/*-----------------------------------------------------------*/\r\n/* Scene : LOADING [strawberry] */\r\n/*-----------------------------------------------------------*/\r\n\r\nconst loadMusic = () => {\r\n\r\n\tclearWindow(true);\r\n\tg_currentPage = `loading`;\r\n\r\n\tconst musicUrl = getMusicUrl(g_stateObj.scoreId);\r\n\tconst url = getFullMusicUrl(musicUrl);\r\n\tg_headerObj.musicUrl = musicUrl;\r\n\tg_musicEncodedFlg = listMatching(musicUrl, [`.js`, `.txt`], { suffix: `$` });\r\n\r\n\t// Now Loadingを表示\r\n\tconst lblLoading = getLoadingLabel();\r\n\tdivRoot.appendChild(lblLoading);\r\n\r\n\t// ローカル動作時\r\n\tif (g_isFile) {\r\n\t\tsetAudio(url);\r\n\t\treturn;\r\n\t}\r\n\r\n\t// XHRで読み込み\r\n\tconst request = new XMLHttpRequest();\r\n\trequest.open(`GET`, url, true);\r\n\trequest.responseType = `blob`;\r\n\r\n\t// 読み込み完了時\r\n\trequest.addEventListener(`load`, () => {\r\n\t\tif (request.status >= 200 && request.status < 300) {\r\n\t\t\tconst blobUrl = URL.createObjectURL(request.response);\r\n\t\t\tcreateEmptySprite(divRoot, `loader`, g_windowObj.loader);\r\n\t\t\tlblLoading.textContent = g_lblNameObj.pleaseWait;\r\n\t\t\tsetAudio(blobUrl);\r\n\t\t} else {\r\n\t\t\tmakeWarningWindow(`${g_msgInfoObj.E_0041.split('{0}').join(getFullPath(url))}<br>(${request.status} ${request.statusText})`, { backBtnUse: true });\r\n\t\t}\r\n\t});\r\n\r\n\t// 進捗時\r\n\trequest.addEventListener(`progress`, _event => {\r\n\t\tconst lblLoading = document.getElementById(`lblLoading`);\r\n\r\n\t\tif (_event.lengthComputable) {\r\n\t\t\tconst rate = _event.loaded / _event.total;\r\n\t\t\tcreateEmptySprite(divRoot, `loader`, { y: g_sHeight - 10, h: 10, w: g_sWidth * rate, backgroundColor: `#eeeeee` });\r\n\t\t\tlblLoading.textContent = `${g_lblNameObj.nowLoading} ${Math.floor(rate * 100)}%`;\r\n\t\t} else {\r\n\t\t\tlblLoading.textContent = `${g_lblNameObj.nowLoading} ${_event.loaded}Bytes`;\r\n\t\t}\r\n\t\t// ユーザカスタムイベント\r\n\t\tg_customJsObj.progress.forEach(func => func(_event));\r\n\t});\r\n\r\n\t// エラー処理\r\n\trequest.addEventListener(`timeout`, () => makeWarningWindow(g_msgInfoObj.E_0033, { backBtnUse: true }));\r\n\trequest.addEventListener(`error`, () => makeWarningWindow(g_msgInfoObj.E_0034, { backBtnUse: true }));\r\n\r\n\trequest.send();\r\n};\r\n\r\n/**\r\n * 音楽データの設定\r\n * iOSの場合はAudioタグによる再生\r\n * @param {string} _url \r\n */\r\nconst setAudio = async (_url) => {\r\n\r\n\tconst loadMp3 = () => {\r\n\t\tif (g_isFile) {\r\n\t\t\tg_audio = new Audio();\r\n\t\t\tg_audio.src = _url;\r\n\t\t\tmusicAfterLoaded();\r\n\t\t} else {\r\n\t\t\tinitWebAudioAPIfromURL(_url);\r\n\t\t}\r\n\t};\r\n\r\n\tconst readyToStart = _func => {\r\n\t\tif (g_isIos) {\r\n\t\t\tg_currentPage = `loadingIos`;\r\n\t\t\tlblLoading.textContent = `Click to Start!`;\r\n\t\t\tdivRoot.appendChild(makePlayButton(evt => {\r\n\t\t\t\tg_currentPage = `loading`;\r\n\t\t\t\tresetKeyControl();\r\n\t\t\t\tdivRoot.removeChild(evt.target);\r\n\t\t\t\t_func();\r\n\t\t\t}));\r\n\t\t\tsetShortcutEvent(g_currentPage);\r\n\t\t} else {\r\n\t\t\t_func();\r\n\t\t}\r\n\t};\r\n\r\n\tif (g_musicEncodedFlg) {\r\n\t\tawait loadScript2(_url);\r\n\t\tif (typeof musicInit === C_TYP_FUNCTION) {\r\n\t\t\tmusicInit();\r\n\t\t\treadyToStart(() => initWebAudioAPIfromBase64(g_musicdata));\r\n\t\t} else {\r\n\t\t\tmakeWarningWindow(g_msgInfoObj.E_0031);\r\n\t\t\tmusicAfterLoaded();\r\n\t\t}\r\n\t} else {\r\n\t\treadyToStart(() => loadMp3());\r\n\t}\r\n};\r\n\r\n// Base64から音声データに変換してWebAudioAPIで再生する準備\r\nconst initWebAudioAPIfromBase64 = async (_base64) => {\r\n\tg_audio = new AudioPlayer();\r\n\tmusicAfterLoaded();\r\n\tconst array = Uint8Array.from(atob(_base64), v => v.charCodeAt(0))\r\n\tawait g_audio.init(array.buffer);\r\n};\r\n\r\n// 音声ファイルを読み込んでWebAudioAPIで再生する準備\r\nconst initWebAudioAPIfromURL = async (_url) => {\r\n\tg_audio = new AudioPlayer();\r\n\tmusicAfterLoaded();\r\n\tconst promise = await fetch(_url);\r\n\tconst arrayBuffer = await promise.arrayBuffer();\r\n\tawait g_audio.init(arrayBuffer);\r\n};\r\n\r\nconst musicAfterLoaded = () => {\r\n\tg_audio.load();\r\n\r\n\tif (g_audio.readyState === 4) {\r\n\t\t// audioの読み込みが終わった後の処理\r\n\t\tloadingScoreInit();\r\n\t} else {\r\n\t\t// 読込中の状態\r\n\t\tg_audio.addEventListener(`canplaythrough`, (() => function f() {\r\n\t\t\tg_audio.removeEventListener(`canplaythrough`, f, false);\r\n\t\t\tloadingScoreInit();\r\n\t\t})(), false);\r\n\r\n\t\t// エラー時\r\n\t\tg_audio.addEventListener(`error`, (() => function f() {\r\n\t\t\tg_audio.removeEventListener(`error`, f, false);\r\n\t\t\tmakeWarningWindow(g_msgInfoObj.E_0041.split(`{0}`).join(g_audio.src), { backBtnUse: true });\r\n\t\t})(), false);\r\n\t}\r\n};\r\n\r\n/**\r\n * 読込画面初期化\r\n */\r\nconst loadingScoreInit = async () => {\r\n\r\n\t// 譜面データの読み込み\r\n\tawait loadChartFile();\r\n\tconst tkObj = getKeyInfo();\r\n\tconst [keyCtrlPtn, keyNum] = [tkObj.keyCtrlPtn, tkObj.keyNum];\r\n\tg_headerObj.blankFrameDef = setVal(g_headerObj.blankFrameDefs[g_stateObj.scoreId], g_headerObj.blankFrameDefs[0]);\r\n\tg_headerObj.blankFrame = g_headerObj.blankFrameDef;\r\n\r\n\t// ユーザカスタムイベント\r\n\tg_customJsObj.preloading.forEach(func => func());\r\n\tg_skinJsObj.preloading.forEach(func => func());\r\n\r\n\tlet dummyIdHeader = ``;\r\n\tif (g_stateObj.dummyId !== ``) {\r\n\t\tif (g_stateObj.dummyId === 0 || g_stateObj.dummyId === 1) {\r\n\t\t\tdummyIdHeader = ``;\r\n\t\t} else {\r\n\t\t\tdummyIdHeader = g_stateObj.dummyId;\r\n\t\t}\r\n\t}\r\n\tg_scoreObj = scoreConvert(g_rootObj, g_stateObj.scoreId, 0, dummyIdHeader);\r\n\r\n\t// 最終フレーム数の取得\r\n\tlet lastFrame = getLastFrame(g_scoreObj) + g_headerObj.blankFrame;\r\n\r\n\t// 最初の矢印データがあるフレーム数を取得\r\n\tlet firstArrowFrame = getFirstArrowFrame(g_scoreObj);\r\n\r\n\t// 開始フレーム数の取得(フェードイン加味)\r\n\tg_scoreObj.frameNum = getStartFrame(lastFrame, g_stateObj.fadein);\r\n\r\n\t// フレームごとの速度を取得（配列形式）\r\n\tlet speedOnFrame = setSpeedOnFrame(g_scoreObj.speedData, lastFrame);\r\n\r\n\t// Motionオプション適用時の矢印別の速度を取得（配列形式）\r\n\tg_workObj.motionOnFrames = setMotionOnFrame();\r\n\r\n\t// 最初のフレームで出現する矢印が、ステップゾーンに到達するまでのフレーム数を取得\r\n\tconst firstFrame = (g_scoreObj.frameNum === 0 ? 0 : g_scoreObj.frameNum + g_headerObj.blankFrame);\r\n\tlet arrivalFrame = getFirstArrivalFrame(firstFrame, speedOnFrame);\r\n\r\n\t// キーパターン(デフォルト)に対応する矢印番号を格納\r\n\tconvertReplaceNums();\r\n\r\n\tconst setData = (_data, _minLength = 1) => hasArrayList(_data, _minLength) ? _data.concat() : [];\r\n\r\n\t// フレーム・曲開始位置調整\r\n\tlet preblankFrame = 0;\r\n\tif (g_scoreObj.frameNum === 0) {\r\n\t\tif (firstArrowFrame - g_limitObj.adjustment < arrivalFrame) {\r\n\t\t\tpreblankFrame = arrivalFrame - firstArrowFrame + g_limitObj.adjustment;\r\n\r\n\t\t\t// 譜面データの再読み込み\r\n\t\t\tconst noteExistObj = {\r\n\t\t\t\tarrow: true,\r\n\t\t\t\tfrz: true,\r\n\t\t\t\tdummyArrow: g_stateObj.shuffle === C_FLG_OFF,\r\n\t\t\t\tdummyFrz: g_stateObj.shuffle === C_FLG_OFF,\r\n\t\t\t};\r\n\t\t\tconst tmpObj = scoreConvert(g_rootObj, g_stateObj.scoreId, preblankFrame, dummyIdHeader);\r\n\t\t\tfor (let j = 0; j < keyNum; j++) {\r\n\t\t\t\tObject.keys(noteExistObj).filter(name => tmpObj[`${name}Data`][j] !== undefined && noteExistObj[name])\r\n\t\t\t\t\t.forEach(name => g_scoreObj[`${name}Data`][j] = structuredClone(tmpObj[`${name}Data`][j]));\r\n\t\t\t}\r\n\r\n\t\t\tObject.keys(g_dataMinObj).forEach(dataType =>\r\n\t\t\t\tg_scoreObj[`${dataType}Data`] = setData(tmpObj[`${dataType}Data`], g_dataMinObj[dataType]));\r\n\r\n\t\t\tlastFrame += preblankFrame;\r\n\t\t\tfirstArrowFrame += preblankFrame;\r\n\t\t\tspeedOnFrame = setSpeedOnFrame(g_scoreObj.speedData, lastFrame);\r\n\t\t\tarrivalFrame = getFirstArrivalFrame(firstFrame, speedOnFrame);\r\n\t\t\tg_headerObj.blankFrame += preblankFrame;\r\n\t\t}\r\n\t}\r\n\tg_scoreObj.baseFrame = g_scoreObj.frameNum - g_stateObj.intAdjustment;\r\n\r\n\t// シャッフルグループ未定義の場合\r\n\tif (g_keyObj[`shuffle${keyCtrlPtn}`] === undefined) {\r\n\t\tg_keyObj[`shuffle${keyCtrlPtn}`] = fillArray(keyNum);\r\n\t}\r\n\r\n\t// シャッフルグループを扱いやすくする\r\n\t// [0, 0, 0, 1, 0, 0, 0] -> [[0, 1, 2, 4, 5, 6], [3]]\r\n\tg_workObj.shuffleGroupMap = {};\r\n\tg_keyObj[`shuffle${keyCtrlPtn}`].forEach((_val, _i) =>\r\n\t\tg_workObj.shuffleGroupMap[_val]?.push(_i) || (g_workObj.shuffleGroupMap[_val] = [_i]));\r\n\r\n\t// Mirror,Random,S-Randomの適用\r\n\tg_shuffleFunc.get(g_stateObj.shuffle)(keyNum, Object.values(g_workObj.shuffleGroupMap));\r\n\r\n\t// アシスト用の配列があれば、ダミーデータで上書き\r\n\tif (typeof g_keyObj[`assistPos${keyCtrlPtn}`] === C_TYP_OBJECT &&\r\n\t\t!g_autoPlaysBase.includes(g_stateObj.autoPlay)) {\r\n\t\tconst assistArray = g_keyObj[`assistPos${keyCtrlPtn}`][g_stateObj.autoPlay];\r\n\t\tfor (let j = 0; j < keyNum; j++) {\r\n\t\t\tif (assistArray[j] === 1) {\r\n\t\t\t\tg_scoreObj.dummyArrowData[j] = g_scoreObj.arrowData[j].concat();\r\n\t\t\t\tg_scoreObj.arrowData[j] = [];\r\n\t\t\t\tg_scoreObj.dummyFrzData[j] = g_scoreObj.frzData[j].concat();\r\n\t\t\t\tg_scoreObj.frzData[j] = [];\r\n\t\t\t} else {\r\n\t\t\t\tg_scoreObj.dummyArrowData[j] = [];\r\n\t\t\t\tg_scoreObj.dummyFrzData[j] = [];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// 矢印・フリーズアロー数をカウント\r\n\tg_allArrow = 0;\r\n\tg_allFrz = 0;\r\n\tg_scoreObj.arrowData.forEach(data => g_allArrow += data.length);\r\n\tg_scoreObj.frzData.forEach(data => g_allFrz += Math.floor(data.length / 2) * 2);\r\n\r\n\t// ライフ回復・ダメージ量の計算\r\n\t// フリーズ始点でも通常判定させる場合は総矢印数を水増しする\r\n\tif (g_headerObj.frzStartjdgUse) {\r\n\t\tg_allArrow += g_allFrz / 2;\r\n\t}\r\n\tg_fullArrows = g_allArrow + g_allFrz / 2;\r\n\r\n\tcalcLifeVals(g_fullArrows);\r\n\r\n\t// 矢印・フリーズアロー・速度/色変化格納処理\r\n\tpushArrows(g_scoreObj, speedOnFrame, arrivalFrame);\r\n\r\n\t// メインに入る前の最終初期化処理\r\n\tgetArrowSettings();\r\n\r\n\t// ユーザカスタムイベント\r\n\tg_customJsObj.loading.forEach(func => func());\r\n\r\n\tmainInit();\r\n};\r\n\r\n/**\r\n * 譜面番号の取得\r\n * @param {number} _scoreId \r\n * @param {boolean} _scoreLockFlg \r\n * @param {boolean} _useOne 1譜面目指定有無フラグ (初期色に関する箇所のみ指定)\r\n * @returns {number|string}\r\n */\r\nconst setScoreIdHeader = (_scoreId = 0, _scoreLockFlg = false, _useOne = false) => {\r\n\tif (!_scoreLockFlg && _scoreId > 0) {\r\n\t\treturn Number(_scoreId) + 1;\r\n\t} else if (_scoreLockFlg && g_headerObj.scoreNos?.[_scoreId] > 1) {\r\n\t\treturn g_headerObj.scoreNos[_scoreId];\r\n\t}\r\n\treturn _useOne ? 1 : ``;\r\n};\r\n\r\n/**\r\n * 譜面ファイル番号の取得\r\n * @param {number} [_scoreId=0] \r\n * @param {boolean} [_scoreLockFlg=false] \r\n * @returns {number|string}\r\n */\r\nconst setDosIdHeader = (_scoreId = 0, _scoreLockFlg = false) => {\r\n\tif (_scoreLockFlg && g_headerObj.dosNos?.[_scoreId] > 0) {\r\n\t\treturn g_headerObj.dosNos?.[_scoreId] > 1 ? g_headerObj.dosNos[_scoreId] : ``;\r\n\t} else if (_scoreId > 0) {\r\n\t\treturn Number(_scoreId) + 1;\r\n\t}\r\n\treturn ``;\r\n};\r\n\r\n/**\r\n * Mirror,Randomの適用\r\n * @param {number} _keyNum\r\n * @param {number[][]} _shuffleGroup\r\n * @param {number[][]} _style\r\n */\r\nconst applyShuffle = (_keyNum, _shuffleGroup, _style) => {\r\n\t// 並べ替え用の配列を作成\r\n\t// index[i]番目のキーの譜面がi番目のキーに流れるようになります\r\n\tconst index = [...Array(_keyNum).keys()];\r\n\tfor (let i = 0; i < _shuffleGroup.length; i++) {\r\n\t\tfor (let j = 0; j < _shuffleGroup[i].length; j++) {\r\n\t\t\tindex[_shuffleGroup[i][j]] = _style[i][j];\r\n\t\t}\r\n\t}\r\n\r\n\t// indexに従って並べ替え\r\n\tg_typeLists.arrow.forEach(type => {\r\n\t\tconst tmpData = structuredClone(g_scoreObj[`${type}Data`]);\r\n\t\tfor (let i = 0; i < _keyNum; i++) {\r\n\t\t\tg_scoreObj[`${type}Data`][i] = tmpData[index[i]] || [];\r\n\t\t}\r\n\t});\r\n};\r\n\r\n/**\r\n * X-Mirror作成用の入れ替え関数\r\n * グループが4の倍数のとき、4n+1, 4n+2のみ入れ替える\r\n * @param {number[][]} _style \r\n * @param {number[]} _group \r\n * @param {number} _i \r\n * @param {number} _divideNum \r\n * @returns \r\n */\r\nconst swapGroupNums = (_style, _group, _i, _divideNum) => {\r\n\tif (_group.length % _divideNum === 0) {\r\n\t\tfor (let k = 0; k < _group.length / _divideNum; k++) {\r\n\t\t\tconst swap1 = Math.floor(_divideNum * (k + 1 / 2) - 1);\r\n\t\t\tconst swap2 = Math.ceil(_divideNum * (k + 1 / 2));\r\n\t\t\t[_style[_i][swap1], _style[_i][swap2]] = [_style[_i][swap2], _style[_i][swap1]];\r\n\t\t}\r\n\t}\r\n\treturn _style;\r\n};\r\n\r\n/**\r\n * Mirrorの適用\r\n * @param {number} _keyNum\r\n * @param {number[][]} _shuffleGroup\r\n * @param {boolean} [_swapFlg=false]\r\n */\r\nconst applyMirror = (_keyNum, _shuffleGroup, _swapFlg = false) => {\r\n\r\n\t// シャッフルグループごとにミラー\r\n\tconst style = structuredClone(_shuffleGroup).map(_group => _group.reverse());\r\n\tconst mirStyle = structuredClone(style);\r\n\r\n\tif (_swapFlg) {\r\n\t\tstyle.forEach((group, i) => g_settings.swapPattern.forEach(val => swapGroupNums(style, group, i, val)));\r\n\t\tlet swapUseFlg = false;\r\n\t\tstyle.forEach((_group, j) => {\r\n\t\t\t_group.forEach((val, k) => {\r\n\t\t\t\tif (style[j][k] !== mirStyle[j][k]) {\r\n\t\t\t\t\tswapUseFlg = true;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t\tif (!swapUseFlg) {\r\n\t\t\tg_stateObj.shuffle = `Mirror`;\r\n\t\t}\r\n\t}\r\n\tapplyShuffle(_keyNum, _shuffleGroup, style);\r\n};\r\n\r\n/**\r\n * Turningの適用\r\n * @param {number} _keyNum \r\n * @param {number[][]} _shuffleGroup \r\n */\r\nconst applyTurning = (_keyNum, _shuffleGroup) => {\r\n\tconst mirrorOrNot = _array => Math.random() >= 0.5 ? _array.reverse() : _array;\r\n\tconst style = structuredClone(_shuffleGroup).map(_group => {\r\n\t\tconst startNum = Math.floor(Math.random() * (_group.length - 1)) + 1;\r\n\t\treturn mirrorOrNot(makeDedupliArray(_group.slice(startNum), _group.slice(0, startNum)));\r\n\t});\r\n\tapplyShuffle(_keyNum, _shuffleGroup, style);\r\n};\r\n\r\n/**\r\n * Randomの適用\r\n * @param {number} _keyNum\r\n * @param {number[][]} _shuffleGroup\r\n */\r\nconst applyRandom = (_keyNum, _shuffleGroup) => {\r\n\t// シャッフルグループごとにシャッフル(Fisher-Yates)\r\n\tconst style = structuredClone(_shuffleGroup).map(_group => {\r\n\t\tfor (let i = _group.length - 1; i > 0; i--) {\r\n\t\t\tconst random = Math.floor(Math.random() * (i + 1));\r\n\t\t\t[_group[i], _group[random]] = [_group[random], _group[i]];\r\n\t\t}\r\n\t\treturn _group;\r\n\t});\r\n\tapplyShuffle(_keyNum, _shuffleGroup, style);\r\n};\r\n\r\n/**\r\n * S-Randomの適用\r\n * @param {number} _keyNum\r\n * @param {number[][]} _shuffleGroup\r\n * @param {string} _arrowHeader\r\n * @param {string} _frzHeader\r\n */\r\nconst applySRandom = (_keyNum, _shuffleGroup, _arrowHeader, _frzHeader) => {\r\n\r\n\tconst tmpArrowData = [...Array(_keyNum)].map(() => []);\r\n\tconst tmpFrzData = [...Array(_keyNum)].map(() => []);\r\n\tconst scatterFrame = 10;\r\n\r\n\t// シャッフルグループごとに処理\r\n\t_shuffleGroup.forEach(_group => {\r\n\t\t// 全フリーズを開始フレーム順に並べる\r\n\t\tconst allFreezeArrows = [];\r\n\t\t_group.forEach(_key => {\r\n\t\t\tconst frzData = g_scoreObj[`${_frzHeader}Data`][_key] || [];\r\n\t\t\tfor (let i = 0; i < frzData.length; i += 2) {\r\n\t\t\t\tallFreezeArrows.push({ begin: frzData[i], end: frzData[i + 1] });\r\n\t\t\t}\r\n\t\t});\r\n\t\tallFreezeArrows.sort((_a, _b) => _a.begin - _b.begin);\r\n\r\n\t\t// 重ならないようにフリーズを配置\r\n\t\tallFreezeArrows.forEach(_freeze => {\r\n\t\t\t// 置ける場所を検索\r\n\t\t\tconst freeSpacesFlat = _group.filter(\r\n\t\t\t\t_key => tmpFrzData[_key].find(_other => _freeze.begin - scatterFrame <= _other.end + scatterFrame) === undefined\r\n\t\t\t);\r\n\t\t\tconst freeSpaces = _group.filter(\r\n\t\t\t\t_key => tmpFrzData[_key].find(_other => _freeze.begin <= _other.end) === undefined\r\n\t\t\t);\r\n\t\t\tlet currentFreeSpaces = freeSpaces;\r\n\t\t\tif (g_stateObj.shuffle.startsWith(`Scatter`)) {\r\n\t\t\t\tcurrentFreeSpaces = freeSpacesFlat.length > 0 ? freeSpacesFlat : freeSpaces;\r\n\t\t\t}\r\n\t\t\t// ランダムに配置\r\n\t\t\tconst random = Math.floor(Math.random() * currentFreeSpaces.length);\r\n\t\t\ttmpFrzData[currentFreeSpaces[random]].push(_freeze);\r\n\t\t});\r\n\r\n\t\t// 通常矢印の配置\r\n\t\tconst allArrows = _group.map(_key => g_scoreObj[`${_arrowHeader}Data`][_key]).flat();\r\n\t\tallArrows.sort((_a, _b) => _a - _b);\r\n\t\tlet prev2Num = 0, prevNum = 0, sameFlg = true;\r\n\t\tallArrows.forEach(_arrow => {\r\n\r\n\t\t\t// 直前の矢印のフレーム数を取得\r\n\t\t\tsameFlg = true;\r\n\t\t\tif (prev2Num !== _arrow && prevNum !== _arrow) {\r\n\t\t\t\tprev2Num = prevNum;\r\n\t\t\t\tprevNum = _arrow;\r\n\t\t\t\tsameFlg = false;\r\n\t\t\t}\r\n\r\n\t\t\tconst getFreeSpaces = ({ scatterFrame = 0, frzFlg = false, prevFlg = false } = {}) =>\r\n\t\t\t\t_group.filter(_key =>\r\n\t\t\t\t\t// 通常矢印と重ならない\r\n\t\t\t\t\ttmpArrowData[_key].find(_other => _arrow >= _other - scatterFrame && _arrow <= _other + scatterFrame) === undefined\r\n\t\t\t\t\t// フリーズと重ならない\r\n\t\t\t\t\t&& (!frzFlg || tmpFrzData[_key].find(_freeze => _arrow >= _freeze.begin - scatterFrame && _arrow <= _freeze.end + scatterFrame) === undefined)\r\n\t\t\t\t\t// 直前の矢印と重ならない\r\n\t\t\t\t\t&& (!prevFlg || tmpArrowData[_key].find(_other => prev2Num === _other) === undefined)\r\n\t\t\t\t);\r\n\r\n\t\t\t// 置ける場所を検索\r\n\t\t\tconst freeSpacesFlat = getFreeSpaces({ scatterFrame, frzFlg: true, prevFlg: true });\r\n\t\t\tconst freeSpaces = getFreeSpaces({ frzFlg: true });\r\n\t\t\tconst freeSpacesAlt = getFreeSpaces();\r\n\r\n\t\t\t// ランダムに配置\r\n\t\t\tlet currentFreeSpaces = freeSpaces.length > 0 ? freeSpaces : freeSpacesAlt;\r\n\t\t\tif (g_stateObj.shuffle.startsWith(`Scatter`)) {\r\n\t\t\t\tcurrentFreeSpaces = freeSpacesFlat.length > 0 && !sameFlg ? freeSpacesFlat : currentFreeSpaces;\r\n\t\t\t}\r\n\t\t\tconst random = Math.floor(Math.random() * currentFreeSpaces.length);\r\n\t\t\ttmpArrowData[currentFreeSpaces[random]].push(_arrow);\r\n\t\t})\r\n\t});\r\n\r\n\tg_scoreObj[`${_arrowHeader}Data`] = tmpArrowData;\r\n\tg_scoreObj[`${_frzHeader}Data`] = tmpFrzData.map(_freezes =>\r\n\t\t_freezes.map(_freeze => [_freeze.begin, _freeze.end]).flat()\r\n\t);\r\n};\r\n\r\n/**\r\n * 譜面データの分解\r\n * @param {object} _dosObj \r\n * @param {number} _scoreId 譜面番号\r\n * @param {number} _preblankFrame 補完フレーム数\r\n * @param {string} [_dummyNo] ダミー用譜面番号添え字\r\n * @param {string} [_keyCtrlPtn] 選択キー及びパターン\r\n * @param {boolean} [_scoreAnalyzeFlg=false] 譜面詳細データのために必要分で読込を中断\r\n * @returns\r\n */\r\nconst scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,\r\n\t_keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`, _scoreAnalyzeFlg = false) => {\r\n\r\n\t// 矢印群の格納先\r\n\tconst obj = {};\r\n\r\n\tconst scoreIdHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg, false);\r\n\tconst keyNum = g_keyObj[`${g_keyObj.defaultProp}${_keyCtrlPtn}`].length;\r\n\tobj.arrowData = [];\r\n\tobj.frzData = [];\r\n\tobj.dummyArrowData = [];\r\n\tobj.dummyFrzData = [];\r\n\r\n\t// realAdjustment: 全体, intAdjustment: 整数値のみ(切り捨て、ファイル時のみ四捨五入), decimalAdjustment: 小数値のみ\r\n\tconst headerAdjustment = parseFloat(g_headerObj.adjustment[g_stateObj.scoreId] || g_headerObj.adjustment[0]);\r\n\tg_stateObj.realAdjustment = (parseFloat(g_stateObj.adjustment) + headerAdjustment) / g_headerObj.playbackRate + _preblankFrame;\r\n\tg_stateObj.intAdjustment = isLocalMusicFile(g_stateObj.scoreId) ?\r\n\t\tMath.round(g_stateObj.realAdjustment) : Math.floor(g_stateObj.realAdjustment);\r\n\tg_stateObj.decimalAdjustment = g_stateObj.realAdjustment - g_stateObj.intAdjustment;\r\n\r\n\tconst blankFrame = g_headerObj.blankFrame;\r\n\tconst calcFrame = _frame => Math.round((parseFloat(_frame) - blankFrame) / g_headerObj.playbackRate + blankFrame + g_stateObj.intAdjustment);\r\n\r\n\t/**\r\n\t * 矢印データの格納\r\n\t * @param {string} _data \r\n\t * @returns {number[]}\r\n\t */\r\n\tconst storeArrowData = _data => hasVal(_data) ?\r\n\t\tsplitLF(_data)?.join(``).split(`,`).filter(data => !isNaN(parseFloat(data))).map(data => calcFrame(data)).sort((_a, _b) => _a - _b) : [];\r\n\r\n\tfor (let j = 0; j < keyNum; j++) {\r\n\r\n\t\t// 矢印データの分解\r\n\t\tconst arrowName = g_keyObj[`chara${_keyCtrlPtn}`][j];\r\n\t\tobj.arrowData[j] = storeArrowData(_dosObj[`${arrowName}${scoreIdHeader}_data`]);\r\n\r\n\t\tif (g_stateObj.dummyId !== ``) {\r\n\t\t\tobj.dummyArrowData[j] = storeArrowData(_dosObj[`${arrowName}${_dummyNo}_data`]);\r\n\t\t}\r\n\r\n\t\t// 矢印名からフリーズアロー名への変換\r\n\t\tlet frzName = replaceStr(g_keyObj[`chara${_keyCtrlPtn}`][j], g_escapeStr.frzName);\r\n\t\tif (frzName.indexOf(`frz`) === -1 && frzName.indexOf(`foni`) === -1) {\r\n\t\t\tfrzName = frzName.replaceAll(frzName, `frz${toCapitalize(frzName)}`);\r\n\t\t}\r\n\r\n\t\t// フリーズアローデータの分解 (2つで1セット)\r\n\t\tobj.frzData[j] = storeArrowData(_dosObj[`${frzName}${scoreIdHeader}_data`]);\r\n\r\n\t\tif (g_stateObj.dummyId !== ``) {\r\n\t\t\tobj.dummyFrzData[j] = storeArrowData(_dosObj[`${frzName}${_dummyNo}_data`]);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 速度変化データの分解・格納（フレーム数, 矢印番号）\r\n\t * @param {string} _header \r\n\t * @param {number} _scoreNo \r\n\t * @param {string} _footer \r\n\t * @returns {number[]}\r\n\t */\r\n\tconst setSpeedData = (_header, _scoreNo, _footer = `_data`) => {\r\n\t\tconst dosSpeedData = getRefData(_header, `${_scoreNo}${_footer}`);\r\n\t\tconst speedData = [];\r\n\r\n\t\tif (hasVal(dosSpeedData) && g_stateObj.d_speed === C_FLG_ON) {\r\n\t\t\tconst tmpArrayData = splitLF(dosSpeedData);\r\n\r\n\t\t\ttmpArrayData.filter(data => hasVal(data)).forEach(tmpData => {\r\n\t\t\t\tconst tmpSpeedData = tmpData.split(`,`);\r\n\t\t\t\tfor (let k = 0; k < tmpSpeedData.length; k += 2) {\r\n\t\t\t\t\tif (!hasVal(tmpSpeedData[k])) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t} else if (tmpSpeedData[k + 1] === `-`) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst frame = calcFrame(setVal(tmpSpeedData[k], ``, C_TYP_CALC));\r\n\t\t\t\t\tconst speed = setVal(tmpSpeedData[k + 1], 1, C_TYP_CALC);\r\n\r\n\t\t\t\t\tspeedData.push([frame, speed]);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\treturn speedData.sort((_a, _b) => _a[0] - _b[0]).flat();\r\n\t\t}\r\n\t\treturn [];\r\n\t};\r\n\r\n\t/**\r\n\t * 個別・全体色変化データをマージして整列し、単純配列として返却\r\n\t * @param {string} _header \r\n\t * @returns {any[]}\r\n\t */\r\n\tconst mergeColorData = (_header = ``) => {\r\n\t\tif (obj[`color${_header}Data`] === undefined) return [];\r\n\t\tconst tmpArr = obj[`color${_header}Data`].concat(obj[`acolor${_header}Data`]);\r\n\t\tdelete obj[`acolor${_header}Data`];\r\n\t\treturn tmpArr.sort((_a, _b) => _a[0] - _b[0]).flat();\r\n\t};\r\n\r\n\t/**\r\n\t * 色変化データの分解・格納（フレーム数, 矢印番号）\r\n\t * 後で個別・全体色変化をマージするため、二次元配列として返却\r\n\t * @param {string} _header \r\n\t * @param {number} _scoreNo \r\n\t * @returns {any[][]}\r\n\t */\r\n\tconst setColorData = (_header, _scoreNo) => {\r\n\t\tconst dosColorData = getRefData(_header, `${_scoreNo}_data`);\r\n\t\tconst colorData = [];\r\n\t\tconst allFlg = (_header.charAt(0) === `a`);\r\n\r\n\t\tif (hasVal(dosColorData) && g_stateObj.d_color === C_FLG_ON) {\r\n\t\t\tconst tmpArrayData = splitLF(dosColorData);\r\n\r\n\t\t\ttmpArrayData.filter(data => hasVal(data)).forEach(tmpData => {\r\n\t\t\t\tconst tmpColorData = tmpData.split(`,`);\r\n\t\t\t\tfor (let k = 0; k < tmpColorData.length; k += 3) {\r\n\t\t\t\t\tif (!hasVal(tmpColorData[k])) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t} else if (tmpColorData[k + 1] === `-`) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst frame = calcFrame(setVal(tmpColorData[k], ``, C_TYP_CALC));\r\n\t\t\t\t\tconst colorNum = setVal(tmpColorData[k + 1], 0, C_TYP_CALC);\r\n\t\t\t\t\tconst colorCd = tmpColorData[k + 2];\r\n\r\n\t\t\t\t\t// フレーム数、色番号、カラーコード、全体色変化フラグをセットとして配列化\r\n\t\t\t\t\tcolorData.push([frame, colorNum, colorCd, allFlg]);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\treturn colorData.sort((_a, _b) => _a[0] - _b[0]);\r\n\t\t}\r\n\t\treturn [];\r\n\t};\r\n\r\n\t/**\r\n\t * 色変化データの分解・格納（新形式）\r\n\t * - 個別・全体色変化を一体で管理するため通常の配列で返却\r\n\t * @param {string} _header \r\n\t * @param {number} _scoreNo \r\n\t * @returns \r\n\t */\r\n\tconst setColor2Data = (_header, _scoreNo) => {\r\n\t\tconst dosColorData = getRefData(_header, `${_scoreNo}_data`);\r\n\t\tconst colorData = {\r\n\t\t\tArrow: [], ArrowShadow: [], Normal: [], NormalBar: [], NormalShadow: [],\r\n\t\t\tHit: [], HitBar: [], HitShadow: [],\r\n\t\t};\r\n\r\n\t\tif (hasVal(dosColorData) && g_stateObj.d_color === C_FLG_ON) {\r\n\r\n\t\t\tsplitLF(dosColorData).filter(data => hasVal(data)).forEach(tmpData => {\r\n\t\t\t\tconst tmpColorData = tmpData.split(`,`).map(val => trimStr(val));\r\n\t\t\t\tif (!hasVal(tmpColorData[0]) || tmpColorData[1] === `-`) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tconst frame = calcFrame(setVal(tmpColorData[0], ``, C_TYP_CALC));\r\n\t\t\t\tconst colorCd = tmpColorData[2];\r\n\r\n\t\t\t\t// 色変化対象の取得\r\n\t\t\t\tconst pos = tmpColorData[1]?.indexOf(`:`);\r\n\t\t\t\tconst patternStr = pos > 0 ? [trimStr(tmpColorData[1].substring(0, pos)), trimStr(tmpColorData[1].substring(pos + 1))]\r\n\t\t\t\t\t: [tmpColorData[1]];\r\n\t\t\t\tconst patterns = replaceStr(trimStr(patternStr[1] || `Arrow`), g_escapeStr.colorPatternName).split(`/`);\r\n\r\n\t\t\t\t// 矢印番号の組み立て\r\n\t\t\t\tconst colorVals = [];\r\n\t\t\t\treplaceStr(patternStr[0], g_escapeStr.targetPatternName)?.split(`/`)?.forEach(val => {\r\n\t\t\t\t\tif (val.indexOf(`...`) > 0) {\r\n\t\t\t\t\t\t// 範囲指定表記の補完 例. 0...3 -> 0/1/2/3\r\n\t\t\t\t\t\tconst [valMin, valMax] = [val.split(`...`)[0], val.split(`...`)[1]].map(val => setIntVal(val));\r\n\t\t\t\t\t\tfor (let k = valMin; k <= valMax; k++) {\r\n\t\t\t\t\t\t\tcolorVals.push(String(k));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tcolorVals.push(val);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// フレーム数、色番号、カラーコード、全体色変化フラグ、変更対象をセットとして配列化し、色変化対象ごとのプロパティへ追加\r\n\t\t\t\tpatterns.forEach(pattern => {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tcolorVals.forEach(val => colorData[pattern].push([frame, val, colorCd, hasVal(tmpColorData[3]), pattern]));\r\n\t\t\t\t\t} catch (error) {\r\n\t\t\t\t\t\tmakeWarningWindow(g_msgInfoObj.E_0201.split(`{0}`).join(pattern));\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\t// 色変化対象ごとにフレーム数をキーにソートしてフラット化\r\n\t\t\tObject.keys(colorData).forEach(pattern =>\r\n\t\t\t\tcolorData[pattern] = colorData[pattern].sort((_a, _b) => _a[0] - _b[0]).flat());\r\n\t\t}\r\n\t\treturn colorData;\r\n\t};\r\n\r\n\t/**\r\n\t * 矢印モーションデータの分解・格納（フレーム数, 矢印番号）\r\n\t * @param {string} _header \r\n\t * @param {number} _scoreNo \r\n\t * @returns {any[]}\r\n\t */\r\n\tconst setCssMotionData = (_header, _scoreNo) => {\r\n\t\tconst dosCssMotionData = getRefData(`${_header}Motion`, `${_scoreNo}_data`) || _dosObj[`${_header}Motion_data`];\r\n\t\tconst cssMotionData = [];\r\n\r\n\t\tif (hasVal(dosCssMotionData) && g_stateObj.d_arroweffect === C_FLG_ON) {\r\n\t\t\tsplitLF(dosCssMotionData).filter(data => hasVal(data)).forEach(tmpData => {\r\n\t\t\t\tconst tmpcssMotionData = tmpData.split(`,`);\r\n\t\t\t\tif (isNaN(parseInt(tmpcssMotionData[0]))) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tconst frame = calcFrame(tmpcssMotionData[0]);\r\n\t\t\t\tconst arrowNum = parseFloat(tmpcssMotionData[1]);\r\n\t\t\t\tconst styleUp = (tmpcssMotionData[2] === `none` ? `` : tmpcssMotionData[2]);\r\n\t\t\t\tconst styleDown = (tmpcssMotionData[3] === `none` ? `` : setVal(tmpcssMotionData[3], styleUp));\r\n\r\n\t\t\t\tcssMotionData.push([frame, arrowNum, styleUp, styleDown]);\r\n\t\t\t});\r\n\r\n\t\t\t// 個別のモーションデータが存在する場合、Effect設定を自動リセット\r\n\t\t\tif (cssMotionData.length > 0) {\r\n\t\t\t\tg_stateObj.effect = C_FLG_OFF;\r\n\t\t\t\tg_settings.effectNum = 0;\r\n\t\t\t}\r\n\t\t\treturn cssMotionData.sort((_a, _b) => _a[0] - _b[0]).flat();\r\n\t\t}\r\n\t\treturn [];\r\n\t};\r\n\r\n\t/**\r\n\t * スクロール変化データの分解\r\n\t * @param {number} _scoreNo \r\n\t * @returns {number[]}\r\n\t */\r\n\tconst setScrollchData = (_scoreNo) => {\r\n\t\tconst dosScrollchData = getRefData(`scrollch`, `${_scoreNo}_data`) || _dosObj.scrollch_data;\r\n\t\tconst scrollchData = [];\r\n\t\tlet maxLayerGroup = 0;\r\n\r\n\t\tif (hasVal(dosScrollchData)) {\r\n\t\t\tsplitLF(dosScrollchData).filter(data => hasVal(data)).forEach(tmpData => {\r\n\t\t\t\tconst tmpScrollchData = tmpData.split(`,`);\r\n\t\t\t\tif (isNaN(parseInt(tmpScrollchData[0]))) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tconst frame = calcFrame(tmpScrollchData[0]);\r\n\t\t\t\tconst arrowNum = parseFloat(tmpScrollchData[1]);\r\n\t\t\t\tconst scrollDir = parseFloat(tmpScrollchData[2] ?? `1`);\r\n\t\t\t\tconst layerGroup = parseFloat(tmpScrollchData[3] ?? `-1`);\r\n\t\t\t\tconst layerTrans = tmpScrollchData[4] ?? ``;\r\n\t\t\t\tmaxLayerGroup = Math.max(maxLayerGroup, layerGroup);\r\n\r\n\t\t\t\tscrollchData.push([frame, arrowNum, frame, scrollDir, layerGroup, layerTrans]);\r\n\t\t\t});\r\n\t\t\tg_stateObj.layerNumDf = Math.max((maxLayerGroup + 1) * 2, 2);\r\n\t\t\treturn scrollchData.sort((_a, _b) => _a[0] - _b[0]).flat();\r\n\t\t}\r\n\t\treturn [];\r\n\t};\r\n\r\n\t/**\r\n\t * 譜面データに別の関連名が含まれていた場合、関連名の変数を返す\r\n\t * 例) |backA2_data=back_data| -> back_dataで定義された値を使用\r\n\t * @param {string} _header \r\n\t * @param {string} _dataName \r\n\t * @returns\r\n\t */\r\n\tconst getRefData = (_header, _dataName) => {\r\n\t\tconst data = _dosObj[`${_header}${_dataName}`];\r\n\t\tlet dataStr = data;\r\n\t\tsplitLF(data)?.filter(val => val?.startsWith(_header) && _dosObj[val] !== undefined)\r\n\t\t\t.forEach(val => dataStr = dataStr.replace(val, _dosObj[val]));\r\n\t\treturn dataStr;\r\n\t}\r\n\r\n\t/**\r\n\t * 譜面データの優先順配列パターンの取得\r\n\t * @param {string} _type \r\n\t * @param {number} _scoreNo \r\n\t * @returns {string[]}\r\n\t */\r\n\tconst getPriorityVal = (_type, _scoreNo) => [\r\n\t\t`${_type}${g_localeObj.val}${_scoreNo}_data`,\r\n\t\t`${_type}${g_localeObj.val}_data`,\r\n\t\t`${_type}${_scoreNo}_data`,\r\n\t\t`${_type}_data`\r\n\t];\r\n\r\n\t/**\r\n\t * 歌詞表示、背景・マスクデータの優先順取得\r\n\t * @param {string[]} _defaultHeaders \r\n\t * @returns {string[]}\r\n\t */\r\n\tconst getPriorityHeader = (_defaultHeaders = []) => {\r\n\t\tif (_defaultHeaders.length > 0) {\r\n\t\t\treturn makeDedupliArray(_defaultHeaders);\r\n\t\t}\r\n\r\n\t\tconst list = [];\r\n\t\tconst ptnName = `${(g_keyObj.currentPtn === -1 ? g_keyObj.storagePtn : g_keyObj.currentPtn) + 1}`;\r\n\t\tconst keyName = setVal(g_keyObj[`transKey${_keyCtrlPtn}`], g_keyObj.currentKey);\r\n\t\tlet type = ``;\r\n\t\tif (g_stateObj.scroll !== `---`) {\r\n\t\t\ttype = `Alt`;\r\n\t\t} else if (g_stateObj.reverse === C_FLG_ON) {\r\n\t\t\ttype = `Rev`;\r\n\t\t}\r\n\r\n\t\t[g_stateObj.scroll, type, ``].forEach(header => {\r\n\t\t\tlist.push(`${header}[${ptnName}]`, `${header}<${keyName}>`);\r\n\t\t\tif (hasVal(g_keyObj[`transKey${_keyCtrlPtn}`])) {\r\n\t\t\t\tlist.push(`${header}A`);\r\n\t\t\t}\r\n\t\t});\r\n\t\tlist.push(g_stateObj.scroll, type, ``);\r\n\r\n\t\treturn makeDedupliArray(list);\r\n\t};\r\n\r\n\t/**\r\n\t * 歌詞データの分解\r\n\t * @param {string} _scoreNo \r\n\t * @returns\r\n\t */\r\n\tconst makeWordData = _scoreNo => {\r\n\t\tconst wordDataList = [];\r\n\t\tconst wordTargets = [];\r\n\t\tlet wordReverseFlg = false;\r\n\t\tconst divideCnt = getKeyInfo().divideCnt;\r\n\t\tconst addDataList = (_type = ``) => wordTargets.push(...getPriorityVal(_type, _scoreNo));\r\n\t\tgetPriorityHeader().forEach(val => addDataList(val));\r\n\t\tmakeDedupliArray(wordTargets).forEach(val => wordDataList.push(getRefData(`word`, val)));\r\n\r\n\t\tif (g_stateObj.reverse === C_FLG_ON) {\r\n\t\t\tlet wordTarget = ``;\r\n\t\t\tfor (let val of makeDedupliArray(wordTargets)) {\r\n\t\t\t\tif (getRefData(`word`, val) !== undefined) {\r\n\t\t\t\t\twordTarget = val;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// wordRev_dataが指定されている場合はそのままの位置を採用\r\n\t\t\t// word_dataのみ指定されている場合、下記ルールに従って設定\r\n\t\t\tif (!wordTarget.includes(`Rev`) && g_stateObj.scroll === `---`) {\r\n\t\t\t\t// Reverse時の歌詞の自動反転制御設定\r\n\t\t\t\tif (g_headerObj.wordAutoReverse !== C_DIS_AUTO) {\r\n\t\t\t\t\twordReverseFlg = g_headerObj.wordAutoReverse === C_FLG_ON;\r\n\t\t\t\t} else if (keyNum === divideCnt + 1) {\r\n\t\t\t\t\twordReverseFlg = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst inputWordData = wordDataList.find((v) => v !== undefined);\r\n\t\treturn (inputWordData !== undefined ? makeSpriteWordData(inputWordData, wordReverseFlg) : [[], -1]);\r\n\t};\r\n\r\n\t/**\r\n\t * 多層歌詞データの格納処理\r\n\t * @param {object} _data \r\n\t * @param {boolean} _reverseFlg\r\n\t * @returns\r\n\t */\r\n\tconst makeSpriteWordData = (_data, _reverseFlg = false) => {\r\n\t\tconst wordData = [];\r\n\t\tlet wordMaxDepth = -1;\r\n\t\tlet wordReverseFlg = _reverseFlg;\r\n\t\tconst tmpArrayData = splitLF(_data);\r\n\r\n\t\tif (g_headerObj.wordAutoReverse === C_DIS_AUTO) {\r\n\t\t\ttmpArrayData.filter(data => hasVal(data) && data?.indexOf(`<br>`) !== -1).forEach(() => wordReverseFlg = false);\r\n\t\t}\r\n\r\n\t\ttmpArrayData.filter(data => hasVal(data)).forEach(tmpData => {\r\n\t\t\tconst tmpWordData = tmpData.split(`,`).map(val => trimStr(val));\r\n\t\t\tfor (let k = 0; k < tmpWordData.length; k += 3) {\r\n\t\t\t\tif (!hasVal(tmpWordData[k])) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t} else if (tmpWordData[k + 1] === `-`) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\ttmpWordData[k] = calcFrame(setVal(tmpWordData[k], ``, C_TYP_CALC));\r\n\t\t\t\ttmpWordData[k + 1] = setVal(tmpWordData[k + 1], 0, C_TYP_CALC);\r\n\t\t\t\ttmpWordData[k + 1] = Math.floor(tmpWordData[k + 1] / 2) * 2 +\r\n\t\t\t\t\t(tmpWordData[k + 1] + Number(wordReverseFlg)) % 2;\r\n\r\n\t\t\t\tif (tmpWordData[k + 1] > wordMaxDepth) {\r\n\t\t\t\t\twordMaxDepth = tmpWordData[k + 1];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 同一行数で数字が取得できるまでは歌詞表示と見做して結合\r\n\t\t\t\tlet m = 3;\r\n\t\t\t\twhile (hasVal(tmpWordData[m]) && isNaN(parseInt(tmpWordData[m])) && m < tmpWordData.length) {\r\n\t\t\t\t\ttmpWordData[k + 2] += `,${tmpWordData[k + m]}`;\r\n\t\t\t\t\ttmpWordData.splice(k + m, 1);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 歌詞表示データの格納\r\n\t\t\t\tlet dataCnts = 0;\r\n\t\t\t\t[wordData[tmpWordData[k]], dataCnts] =\r\n\t\t\t\t\tcheckDuplicatedObjects(wordData[tmpWordData[k]]);\r\n\r\n\t\t\t\tif (tmpWordData.length > 3 && tmpWordData.length < 6) {\r\n\t\t\t\t\ttmpWordData[3] = setIntVal(tmpWordData[3], C_WOD_FRAME);\r\n\t\t\t\t\twordData[tmpWordData[0]][dataCnts].push(tmpWordData[1],\r\n\t\t\t\t\t\tescapeHtmlForEnabledTag(tmpWordData[2]), tmpWordData[3]);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else {\r\n\t\t\t\t\twordData[tmpWordData[k]][dataCnts].push(tmpWordData[k + 1],\r\n\t\t\t\t\t\tescapeHtmlForEnabledTag(tmpWordData[k + 2] ?? ``));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn [wordData, wordMaxDepth];\r\n\t};\r\n\r\n\t/**\r\n\t * 背景・マスク、スキン変更データの分解\r\n\t * @param {string} _header \r\n\t * @param {string} _scoreNo 譜面番号\r\n\t * @param {string[]} [object.resultTypes] リザルトモーションの種類 (result, failedB, failedS)\r\n\t * @returns\r\n\t */\r\n\tconst makeBackgroundData = (_header, _scoreNo, { resultTypes = [] } = {}) => {\r\n\t\tconst dataList = [];\r\n\t\tconst animationTargets = [];\r\n\t\tconst calcFrameFunc = resultTypes.length > 0 ? undefined : calcFrame;\r\n\t\tconst addDataList = (_type = ``) => animationTargets.push(...getPriorityVal(_type, _scoreNo));\r\n\t\tgetPriorityHeader(resultTypes).forEach(val => addDataList(val));\r\n\t\tmakeDedupliArray(animationTargets).forEach(val => dataList.push(getRefData(_header, val)));\r\n\r\n\t\tconst data = dataList.find((v) => v !== undefined);\r\n\t\treturn (data !== undefined ? g_animationFunc.make[_header](data, calcFrameFunc) : [[], -1]);\r\n\t};\r\n\r\n\t// 速度変化データの分解 (2つで1セット)\r\n\tlet speedFooter = ``;\r\n\tif (hasVal(_dosObj[`speed${scoreIdHeader}_data`])) {\r\n\t\tspeedFooter = `_data`;\r\n\t}\r\n\tif (hasVal(_dosObj[`speed${scoreIdHeader}_change`])) {\r\n\t\tspeedFooter = `_change`;\r\n\t}\r\n\r\n\t// 速度変化（個別・全体）の分解 (2つで1セット, セット毎の改行区切り可)\r\n\tobj.boostData = setSpeedData(`boost`, scoreIdHeader);\r\n\tobj.speedData = setSpeedData(`speed`, scoreIdHeader, speedFooter);\r\n\r\n\t// 色変化（個別・全体）の分解 (3つで1セット, セット毎の改行区切り可)\r\n\tg_typeLists.color.forEach(sprite => {\r\n\t\tobj[`${sprite}Data`] = setColorData(sprite, scoreIdHeader);\r\n\t\tif (g_stateObj.dummyId !== ``) {\r\n\t\t\tobj[`${sprite}DummyData`] = setColorData(sprite, _dummyNo);\r\n\t\t}\r\n\t});\r\n\t// 色変化（新形式）の分解（3～4つで1セット, セット毎の改行区切り）\r\n\tobj.ncolorData = setColor2Data(`ncolor`, scoreIdHeader);\r\n\tif (g_stateObj.dummyId !== ``) {\r\n\t\tobj.ncolorDummyData = setColor2Data(`ncolor`, _dummyNo);\r\n\t}\r\n\r\n\tif (_scoreAnalyzeFlg) {\r\n\t\treturn obj;\r\n\t}\r\n\r\n\tobj.colorData = mergeColorData();\r\n\tobj.dummyColorData = mergeColorData(`Dummy`);\r\n\r\n\t// レイヤー数の初期値設定（譜面ごとに設定のため）\r\n\tg_stateObj.layerNumDf = 2;\r\n\r\n\t// 矢印モーション（個別）データの分解（3～4つで1セット, セット毎の改行区切り）\r\n\tobj.arrowCssMotionData = setCssMotionData(`arrow`, scoreIdHeader);\r\n\tobj.frzCssMotionData = setCssMotionData(`frz`, scoreIdHeader);\r\n\tif (g_stateObj.dummyId !== ``) {\r\n\t\tobj.dummyArrowCssMotionData = setCssMotionData(`arrow`, _dummyNo);\r\n\t\tobj.dummyFrzCssMotionData = setCssMotionData(`frz`, _dummyNo);\r\n\t}\r\n\r\n\t// スクロール変化データの分解\r\n\tobj.scrollchData = setScrollchData(scoreIdHeader);\r\n\r\n\t// 歌詞データの分解 (3つで1セット, セット毎の改行区切り可)\r\n\tobj.wordData = [];\r\n\tobj.wordMaxDepth = -1;\r\n\tif (g_stateObj.d_lyrics === C_FLG_OFF) {\r\n\t} else {\r\n\t\t[obj.wordData, obj.wordMaxDepth] = makeWordData(scoreIdHeader);\r\n\t}\r\n\r\n\t// 背景・マスク・スキン変更データの分解 (下記すべてで1セット、改行区切り)\r\n\t// - 背景・マスク: [フレーム数, 階層, 背景パス, class(CSSで別定義), X, Y, width, height, opacity, animationName, animationDuration, animationFillMode]\r\n\t// - スキン変更  : [フレーム数, CSSカスタムプロパティ名, 設定内容]\r\n\tg_animationData.forEach(sprite => {\r\n\t\tobj[`${sprite}Data`] = [];\r\n\t\tobj[`${sprite}MaxDepth`] = -1;\r\n\r\n\t\tif (g_stateObj.d_background === C_FLG_OFF) {\r\n\t\t} else {\r\n\t\t\t[obj[`${sprite}Data`], obj[`${sprite}MaxDepth`]] = makeBackgroundData(sprite, scoreIdHeader);\r\n\t\t}\r\n\r\n\t\tif (g_stateObj.d_background === C_FLG_OFF && g_headerObj.resultMotionSet) {\r\n\t\t\t[`Result`, `Failed`].forEach(backName => {\r\n\t\t\t\tg_headerObj[`${backName}Data`] = [];\r\n\t\t\t\tg_headerObj[`${backName}MaxDepth`] = -1;\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t[g_headerObj[`${sprite}ResultData`], g_headerObj[`${sprite}ResultMaxDepth`]] =\r\n\t\t\t\tmakeBackgroundData(sprite, scoreIdHeader, { resultTypes: [`result`] });\r\n\t\t\t[g_headerObj[`${sprite}FailedData`], g_headerObj[`${sprite}FailedMaxDepth`]] =\r\n\t\t\t\tmakeBackgroundData(sprite, scoreIdHeader, { resultTypes: [`failed${g_stateObj.lifeMode.slice(0, 1)}`, `result`] });\r\n\t\t}\r\n\t});\r\n\r\n\t// キー変化定義\r\n\tobj.keychFrames = [];\r\n\tobj.keychTarget = [];\r\n\tobj.keychTargetAlpha = [];\r\n\tif (hasVal(getRefData(`keych`, `${scoreIdHeader}_data`))) {\r\n\t\tconst keychdata = splitLF2(getRefData(`keych`, `${scoreIdHeader}_data`), `,`);\r\n\t\tobj.keychFrames.push(...(keychdata.filter((val, j) => j % 2 === 0)).map(val => val === `0` ? 0 : calcFrame(val)));\r\n\r\n\t\tkeychdata.filter((val, j) => j % 2 === 1)?.forEach(targets => {\r\n\t\t\tconst targetKeyList = [], targetKeyAlpha = [];\r\n\t\t\ttargets?.split(`/`).forEach(target => {\r\n\t\t\t\ttargetKeyList.push(trimStr(target?.split(`:`)[0]));\r\n\t\t\t\ttargetKeyAlpha.push(trimStr(target?.split(`:`)[1]) || 1);\r\n\t\t\t})\r\n\t\t\tobj.keychTarget.push(targetKeyList);\r\n\t\t\tobj.keychTargetAlpha.push(targetKeyAlpha);\r\n\t\t});\r\n\t}\r\n\tobj.keychFrames.unshift(0);\r\n\tobj.keychTarget.unshift([`0`]);\r\n\tobj.keychTargetAlpha.unshift([1]);\r\n\r\n\treturn obj;\r\n};\r\n\r\n/**\r\n * ライフ回復量・ダメージ量の算出\r\n * @param {number} _allArrows \r\n */\r\nconst calcLifeVals = _allArrows => {\r\n\r\n\tif (g_stateObj.lifeVariable === C_FLG_ON) {\r\n\t\tg_workObj.lifeRcv = calcLifeVal(g_stateObj.lifeRcv, _allArrows);\r\n\t\tg_workObj.lifeDmg = calcLifeVal(g_stateObj.lifeDmg, _allArrows);\r\n\t} else {\r\n\t\tg_workObj.lifeRcv = g_stateObj.lifeRcv;\r\n\t\tg_workObj.lifeDmg = g_stateObj.lifeDmg;\r\n\t}\r\n\tg_workObj.lifeBorder = g_headerObj.maxLifeVal * g_stateObj.lifeBorder / 100;\r\n\tg_workObj.lifeInit = g_headerObj.maxLifeVal * g_stateObj.lifeInit / 100;\r\n};\r\n\r\n/**\r\n * ライフ回復量・ダメージ量の算出\r\n * @param {number} _val \r\n * @param {number} _allArrows \r\n */\r\nconst calcLifeVal = (_val, _allArrows) => _val * g_headerObj.maxLifeVal / _allArrows;\r\n\r\n/**\r\n * 最終フレーム数の取得\r\n * @param {object} _dataObj \r\n * @param {string} [_keyCtrlPtn]\r\n * @returns {number}\r\n */\r\nconst getLastFrame = (_dataObj, _keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`) => {\r\n\r\n\tlet tmpLastNum = 0;\r\n\tconst keyNum = g_keyObj[`${g_keyObj.defaultProp}${_keyCtrlPtn}`].length;\r\n\r\n\tfor (let j = 0; j < keyNum; j++) {\r\n\t\tconst data = [\r\n\t\t\t_dataObj.arrowData[j],\r\n\t\t\t_dataObj.frzData[j],\r\n\t\t\t_dataObj.dummyArrowData[j],\r\n\t\t\t_dataObj.dummyFrzData[j]\r\n\t\t];\r\n\r\n\t\tdata.filter(data => hasVal(data)).forEach(_objData => {\r\n\t\t\tif (_objData.at(-1) > tmpLastNum) {\r\n\t\t\t\ttmpLastNum = _objData.at(-1);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\treturn tmpLastNum;\r\n};\r\n\r\n/**\r\n * 最初の矢印フレームの取得\r\n * @param {object} _dataObj \r\n * @param {string} [_keyCtrlPtn]\r\n * @returns {number}\r\n */\r\nconst getFirstArrowFrame = (_dataObj, _keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`) => {\r\n\r\n\tlet tmpFirstNum = Infinity;\r\n\tconst keyNum = g_keyObj[`${g_keyObj.defaultProp}${_keyCtrlPtn}`].length;\r\n\r\n\tfor (let j = 0; j < keyNum; j++) {\r\n\t\tconst data = [\r\n\t\t\t_dataObj.arrowData[j],\r\n\t\t\t_dataObj.frzData[j],\r\n\t\t\t_dataObj.dummyArrowData[j],\r\n\t\t\t_dataObj.dummyFrzData[j]\r\n\t\t];\r\n\r\n\t\tdata.filter(data => hasVal(data)).forEach(_objData => {\r\n\t\t\tif (_objData[0] !== `` && _objData[0] < tmpFirstNum && _objData[0] + g_limitObj.adjustment > 0) {\r\n\t\t\t\ttmpFirstNum = _objData[0];\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\treturn (tmpFirstNum === Infinity ? 0 : tmpFirstNum);\r\n};\r\n\r\n/**\r\n * 開始フレームの取得\r\n * @param {number} _lastFrame \r\n * @param {number} [_fadein=0]\r\n * @param {number} [_scoreId=g_scoreObj.scoreId]\r\n * @returns {number}\r\n */\r\nconst getStartFrame = (_lastFrame, _fadein = 0, _scoreId = g_stateObj.scoreId) => {\r\n\tlet frameNum = setIntVal(g_headerObj.startFrame?.[_scoreId], setIntVal(g_headerObj.startFrame?.[0], 0));\r\n\tif (_lastFrame >= frameNum) {\r\n\t\tframeNum = Math.round(_fadein / 100 * (_lastFrame - frameNum)) + frameNum;\r\n\t}\r\n\treturn frameNum;\r\n};\r\n\r\n/**\r\n * 各フレームごとの速度を格納\r\n * @param {object} _speedData \r\n * @param {number} _lastFrame \r\n * @returns {number[]}\r\n */\r\nconst setSpeedOnFrame = (_speedData, _lastFrame) => {\r\n\r\n\tconst speedOnFrame = [];\r\n\tlet currentSpeed = g_stateObj.speed * g_headerObj.baseSpeed * 2;\r\n\r\n\tfor (let frm = 0, s = 0; frm <= _lastFrame; frm++) {\r\n\t\twhile (frm >= _speedData?.[s]) {\r\n\t\t\tcurrentSpeed = _speedData[s + 1] * g_stateObj.speed * g_headerObj.baseSpeed * 2;\r\n\t\t\ts += 2;\r\n\t\t}\r\n\t\tspeedOnFrame[frm] = currentSpeed;\r\n\t}\r\n\treturn speedOnFrame;\r\n};\r\n\r\n/**\r\n * Motionオプション適用時の矢印別の速度設定\r\n * - 矢印が表示される最大フレーム数を 101フレーム と定義。\r\n */\r\nconst setMotionOnFrame = () => g_motionFunc.get(g_stateObj.motion)(fillArray(101));\r\n\r\n/**\r\n * Boost用の適用関数\r\n * - ステップゾーンに近づくにつれて加速量を大きく/小さくする (16 → 85)\r\n * @param {number[]} _frms \r\n * @param {number} _spd \r\n * @param {number} [_pnFlg=1] 正負(1 もしくは -1) \r\n * @returns {number[]}\r\n */\r\nconst getBoostTrace = (_frms, _spd, _pnFlg = 1) => {\r\n\tfor (let j = C_MOTION_STD_POS + 1; j < C_MOTION_STD_POS + 70; j++) {\r\n\t\t_frms[j] = (C_MOTION_STD_POS + 70 - j) * _pnFlg * _spd / 50;\r\n\t}\r\n\treturn _frms;\r\n};\r\n\r\n/**\r\n * Brake用の適用関数\r\n * - 初期は+2x、ステップゾーンに近づくにつれて加速量を下げる (20 → 34)\r\n * @param {number[]} _frms\r\n * @returns {number[]} \r\n */\r\nconst getBrakeTrace = _frms => {\r\n\tfor (let j = C_MOTION_STD_POS + 5; j < C_MOTION_STD_POS + 19; j++) {\r\n\t\t_frms[j] = (j - 15) * 4 / 14;\r\n\t}\r\n\tfor (let j = C_MOTION_STD_POS + 19; j <= g_headerObj.playingHeight / 2; j++) {\r\n\t\t_frms[j] = 4;\r\n\t}\r\n\treturn _frms;\r\n};\r\n\r\n/**\r\n * Fountain用の適用関数\r\n * - 反対側から出現し、画面中央付近で折り返す。タイミングは初期速度により変化。\r\n * @param {number[]} _frms \r\n * @param {number} _spd\r\n * @returns {number[]}\r\n */\r\nconst getFountainTrace = (_frms, _spd) => {\r\n\tconst minj = C_MOTION_STD_POS + 1;\r\n\tconst maxj = C_MOTION_STD_POS + Math.ceil(400 / _spd) + 1;\r\n\tconst maxMotionFrm = Math.max(maxj, C_MOTION_STD_POS + g_sHeight / 2);\r\n\tconst diff = 50 / (maxj - minj);\r\n\tconst factor = 0.5 + _spd / 40;\r\n\r\n\tfor (let j = minj; j < maxMotionFrm; j++) {\r\n\t\t_frms[j] = Math.floor((10 - (j - C_MOTION_STD_POS - 1) * diff) * factor);\r\n\t}\r\n\treturn _frms;\r\n}\r\n\r\n/**\r\n * 最初のフレームで出現する矢印が、ステップゾーンに到達するまでのフレーム数を取得\r\n * @param {number} _startFrame \r\n * @param {object} _speedOnFrame\r\n * @returns {number} \r\n */\r\nconst getFirstArrivalFrame = (_startFrame, _speedOnFrame) => {\r\n\tlet startY = 0;\r\n\tlet frm = _startFrame;\r\n\r\n\twhile (g_posObj.distY - startY > 0) {\r\n\t\tstartY += _speedOnFrame[frm];\r\n\t\tfrm++;\r\n\t}\r\n\treturn frm;\r\n};\r\n\r\n/**\r\n * 矢印・フリーズアロー・速度/色変化格納処理\r\n * @param {object} _dataObj \r\n * @param {object} _speedOnFrame \r\n * @param {number} _firstArrivalFrame\r\n */\r\nconst pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {\r\n\r\n\t// 矢印・フリーズアロー・速度/色変化用 フレーム別処理配列\r\n\t[``, `Dummy`].forEach(header =>\r\n\t\tg_typeLists.dataList.forEach(name => g_workObj[`mk${header}${name}`] = []));\r\n\r\n\t/** 矢印の移動距離 */\r\n\tg_workObj.initY = [];\r\n\t/** 矢印の移動距離 (Motion加算分) */\r\n\tg_workObj.initBoostY = [];\r\n\t/** 矢印がステップゾーンに到達するまでのフレーム数 */\r\n\tg_workObj.arrivalFrame = [];\r\n\t/** Motionの適用フレーム数 */\r\n\tg_workObj.motionFrame = [];\r\n\r\n\t/**\r\n\t * 矢印・フリーズアローのデータ格納処理\r\n\t * @param {number} _j \r\n\t * @param {number} _k \r\n\t * @param {number[]} _data \r\n\t * @param {number} _startPoint \r\n\t * @param {string} _header \r\n\t * @param {boolean} _frzFlg \r\n\t * @param {number} object.initY\r\n\t * @param {number} object.initBoostY\r\n\t * @param {number} object.arrivalFrame\r\n\t * @param {number} object.motionFrame \r\n\t */\r\n\tconst setNotes = (_j, _k, _data, _startPoint, _header, _frzFlg = false, { initY, initBoostY, arrivalFrame, motionFrame } = {}) => {\r\n\t\tif (_startPoint >= 0) {\r\n\t\t\tconst arrowAttrs = { pos: _j, initY, initBoostY, arrivalFrame, motionFrame };\r\n\t\t\tif (g_workObj[`mk${_header}Arrow`][_startPoint] === undefined) {\r\n\t\t\t\tg_workObj[`mk${_header}Arrow`][_startPoint] = [arrowAttrs];\r\n\t\t\t} else {\r\n\t\t\t\tlet insertFlg = false;\r\n\t\t\t\tfor (let m = 0; m < g_workObj[`mk${_header}Arrow`][_startPoint].length; m++) {\r\n\t\t\t\t\tif (arrowAttrs.arrivalFrame < g_workObj[`mk${_header}Arrow`][_startPoint][m].arrivalFrame) {\r\n\t\t\t\t\t\tg_workObj[`mk${_header}Arrow`][_startPoint].splice(m, 0, arrowAttrs);\r\n\t\t\t\t\t\tinsertFlg = true;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!insertFlg) {\r\n\t\t\t\t\tg_workObj[`mk${_header}Arrow`][_startPoint].push(arrowAttrs);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (_frzFlg) {\r\n\t\t\t\tg_workObj[`mk${_header}Length`][_j][_k] = getFrzLength(_speedOnFrame, _data[_k], _data[_k + 1]);\r\n\t\t\t}\r\n\t\t} else if (_frzFlg && g_workObj[`mk${_header}Length`][_j] !== undefined) {\r\n\t\t\tg_workObj[`mk${_header}Length`][_j] = structuredClone(g_workObj[`mk${_header}Length`][_j].slice(_k + 2));\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * 矢印・フリーズアローの出現位置計算\r\n\t * @param {number} _j \r\n\t * @param {number[]} _data \r\n\t * @param {string} _header \r\n\t * @param {boolean} _frzFlg \r\n\t */\r\n\tconst calcNotes = (_j, _data, _header = ``, _frzFlg = false) => {\r\n\t\tif (_data === undefined) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst calcInitBoostY = _frm => sumData(g_workObj.motionOnFrames.filter((val, j) => j <= g_workObj.motionFrame[_frm]));\r\n\t\tconst camelHeader = toCapitalize(_header);\r\n\t\tconst setcnt = (_frzFlg ? 2 : 1);\r\n\t\tif (_frzFlg && _data.length % 2 !== 0) {\r\n\t\t\t_data.pop();\r\n\t\t}\r\n\r\n\t\tconst startPoint = [];\r\n\t\tlet spdNext = Infinity;\r\n\t\tlet spdk = (_dataObj.speedData?.length ?? 0) - 2;\r\n\t\tlet spdPrev = _dataObj.speedData?.[spdk] ?? 0;\r\n\r\n\t\t// 最後尾のデータから計算して格納\r\n\t\tconst lastk = _data.length - setcnt;\r\n\t\tlet arrowArrivalFrm = _data[lastk];\r\n\t\tlet tmpObj = getArrowStartFrame(arrowArrivalFrm, _speedOnFrame);\r\n\r\n\t\tstartPoint[lastk] = tmpObj.frm;\r\n\t\tlet frmPrev = tmpObj.frm;\r\n\t\tg_workObj.initY[frmPrev] = tmpObj.startY;\r\n\t\tg_workObj.arrivalFrame[frmPrev] = tmpObj.arrivalFrm;\r\n\t\tg_workObj.motionFrame[frmPrev] = tmpObj.motionFrm;\r\n\t\tg_workObj.initBoostY[frmPrev] = calcInitBoostY(frmPrev);\r\n\r\n\t\tif (_frzFlg) {\r\n\t\t\tg_workObj[`mk${camelHeader}Length`][_j] = [];\r\n\t\t}\r\n\t\tsetNotes(_j, lastk, _data, startPoint[lastk], camelHeader, _frzFlg,\r\n\t\t\t{ initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev], arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm });\r\n\r\n\t\t// 矢印は1つずつ、フリーズアローは2つで1セット\r\n\t\tfor (let k = lastk - setcnt; k >= 0; k -= setcnt) {\r\n\t\t\tarrowArrivalFrm = _data[k];\r\n\r\n\t\t\tif (arrowArrivalFrm < _firstArrivalFrame) {\r\n\r\n\t\t\t\t// 出現位置が開始前の場合は除外\r\n\t\t\t\tif (_frzFlg && g_workObj[`mk${camelHeader}Length`][_j] !== undefined) {\r\n\t\t\t\t\tg_workObj[`mk${camelHeader}Length`][_j] = structuredClone(g_workObj[`mk${camelHeader}Length`][_j].slice(k + 2));\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t} else if ((arrowArrivalFrm - g_workObj.arrivalFrame[frmPrev] > spdPrev)\r\n\t\t\t\t&& arrowArrivalFrm < spdNext) {\r\n\r\n\t\t\t\t// 最初から最後まで同じスピードのときは前回のデータを流用\r\n\t\t\t\tconst tmpFrame = arrowArrivalFrm - g_workObj.arrivalFrame[frmPrev];\r\n\t\t\t\tstartPoint[k] = tmpFrame;\r\n\t\t\t\tg_workObj.initY[tmpFrame] = g_workObj.initY[frmPrev];\r\n\t\t\t\tg_workObj.arrivalFrame[tmpFrame] = g_workObj.arrivalFrame[frmPrev];\r\n\t\t\t\tg_workObj.motionFrame[tmpFrame] = g_workObj.motionFrame[frmPrev];\r\n\t\t\t\tg_workObj.initBoostY[tmpFrame] = calcInitBoostY(tmpFrame);\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// 速度変化が間に入るときは再計算\r\n\t\t\t\twhile (arrowArrivalFrm < spdPrev) {\r\n\t\t\t\t\tspdk -= 2;\r\n\t\t\t\t\tspdNext = spdPrev;\r\n\t\t\t\t\tspdPrev = _dataObj.speedData[spdk];\r\n\t\t\t\t}\r\n\t\t\t\ttmpObj = getArrowStartFrame(arrowArrivalFrm, _speedOnFrame);\r\n\r\n\t\t\t\tstartPoint[k] = tmpObj.frm;\r\n\t\t\t\tfrmPrev = tmpObj.frm;\r\n\t\t\t\tg_workObj.initY[frmPrev] = tmpObj.startY;\r\n\t\t\t\tg_workObj.arrivalFrame[frmPrev] = tmpObj.arrivalFrm;\r\n\t\t\t\tg_workObj.motionFrame[frmPrev] = tmpObj.motionFrm;\r\n\t\t\t\tg_workObj.initBoostY[frmPrev] = calcInitBoostY(frmPrev);\r\n\t\t\t}\r\n\r\n\t\t\t// 出現タイミングを保存\r\n\t\t\tsetNotes(_j, k, _data, startPoint[k], camelHeader, _frzFlg,\r\n\t\t\t\t{ initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev], arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm }\r\n\t\t\t);\r\n\t\t}\r\n\t};\r\n\r\n\tfor (let j = 0; j < getKeyInfo().keyNum; j++) {\r\n\r\n\t\t// 矢印の出現フレーム数計算\r\n\t\tcalcNotes(j, _dataObj.arrowData[j]);\r\n\t\tcalcNotes(j, _dataObj.dummyArrowData[j], `dummy`);\r\n\r\n\t\t// フリーズアローの出現フレーム数計算\r\n\t\tcalcNotes(j, _dataObj.frzData[j], `frz`, true);\r\n\t\tcalcNotes(j, _dataObj.dummyFrzData[j], `dummyFrz`, true);\r\n\t}\r\n\r\n\t// 個別加速のタイミング更新\r\n\tconst calcBoostData = _data => {\r\n\t\tif (hasArrayList(_data, 2)) {\r\n\t\t\tlet delIdx = 0;\r\n\t\t\tfor (let k = _data.length - 2; k >= 0; k -= 2) {\r\n\t\t\t\tconst tmpObj = getArrowStartFrame(_data[k], _speedOnFrame);\r\n\t\t\t\tif (tmpObj.frm < g_scoreObj.frameNum) {\r\n\t\t\t\t\t_data[k] = g_scoreObj.frameNum;\r\n\t\t\t\t\tdelIdx = k;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t_data[k] = tmpObj.frm;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfor (let k = 0; k < delIdx; k++) {\r\n\t\t\t\t_data.shift();\r\n\t\t\t}\r\n\t\t\treturn _data;\r\n\t\t}\r\n\t\treturn [];\r\n\t};\r\n\tg_workObj.boostData = calcBoostData(_dataObj.boostData);\r\n\r\n\t/**\r\n\t * 色変化・モーションデータ・スクロール反転データのタイミング更新\r\n\t * - この関数を使用する場合、配列グループの先頭2つが「フレーム数、矢印番号」となっていないと動作しない\r\n\t * @param {string} _type \r\n\t * @param {string} _header \r\n\t * @param {function} _setFunc 後続実行関数\r\n\t * @param {number} object._term 1セット当たりのデータ数 \r\n\t * @param {boolean} object._colorFlg 個別色変化フラグ\r\n\t * @param {boolean} object._calcFrameFlg 逆算を無条件で行うかどうかの可否\r\n\t * @param {string} object._propName 色変化種類 (Arrow, ArrowShadow, FrzNormal, FrzNormalBar, ...)\r\n\t */\r\n\tconst calcDataTiming = (_type, _header, _setFunc = () => true,\r\n\t\t{ _term = 4, _colorFlg = false, _calcFrameFlg = false, _propName = `` } = {}) => {\r\n\r\n\t\tconst camelHeader = _header === `` ? _type : `${_header}${toCapitalize(_type)}`;\r\n\t\tconst baseData = hasVal(_propName) ? _dataObj[`${camelHeader}Data`][_propName] : _dataObj[`${camelHeader}Data`];\r\n\r\n\t\tif (!hasArrayList(baseData, _term)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst frontData = [];\r\n\t\tfor (let k = baseData.length - _term; k >= 0; k -= _term) {\r\n\t\t\tconst calcFrameFlg = (_colorFlg && !baseData[k + 3]) || _calcFrameFlg;\r\n\r\n\t\t\tif (baseData[k] < g_scoreObj.frameNum) {\r\n\t\t\t\t// フェードイン直前にある色変化・モーションデータ・スクロール反転データを取得して格納\r\n\t\t\t\tif (!hasValInArray(baseData[k + 1], frontData)) {\r\n\t\t\t\t\tfrontData.unshift(baseData.slice(k + 1, k + _term));\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (calcFrameFlg) {\r\n\t\t\t\t\tconst tmpObj = getArrowStartFrame(baseData[k], _speedOnFrame);\r\n\t\t\t\t\tif (tmpObj.frm < g_scoreObj.frameNum) {\r\n\t\t\t\t\t\tconst diff = g_scoreObj.frameNum - tmpObj.frm;\r\n\t\t\t\t\t\ttmpObj.frm = g_scoreObj.frameNum;\r\n\t\t\t\t\t\ttmpObj.arrivalFrm -= diff;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tg_workObj.arrivalFrame[tmpObj.frm] = tmpObj.arrivalFrm;\r\n\t\t\t\t\tbaseData[k] = tmpObj.frm;\r\n\t\t\t\t}\r\n\t\t\t\t_setFunc(toCapitalize(_header), ...baseData.slice(k, k + _term));\r\n\t\t\t}\r\n\t\t}\r\n\t\tfrontData.forEach(data => _setFunc(toCapitalize(_header), g_scoreObj.frameNum, ...data));\r\n\t};\r\n\r\n\t/**\r\n\t * 歌詞表示、背景・マスク表示のフェードイン時調整処理\r\n\t * @param {string} _type\r\n\t * @param {object} _data \r\n\t * @returns\r\n\t */\r\n\tconst calcAnimationData = (_type, _data) => {\r\n\r\n\t\tconst startNum = g_scoreObj.frameNum;\r\n\t\tconst cgArrays = [`word`];\r\n\r\n\t\tconst isSameDepth = (_j, _k) =>\r\n\t\t\t_data[startNum][_j] !== undefined &&\r\n\t\t\t_data[startNum][_k] !== undefined &&\r\n\t\t\t(cgArrays.includes(_type) ? _data[startNum][_j][0] === _data[startNum][_k][0] :\r\n\t\t\t\t_data[startNum][_j].depth === _data[startNum][_k].depth);\r\n\r\n\t\tconst isExceptData = {\r\n\t\t\tword: (_exceptList, _j) => listMatching(_data[startNum][_j][1] || ``, _exceptList.word),\r\n\t\t\tback: (_exceptList, _j) => listMatching(_data[startNum][_j].animationName || ``, _exceptList.back),\r\n\t\t\tmask: (_exceptList, _j) => listMatching(_data[startNum][_j].animationName || ``, _exceptList.mask),\r\n\t\t\tstyle: (_exceptList, _j) => listMatching(_data[startNum][_j].depth || ``, _exceptList.style),\r\n\t\t};\r\n\r\n\t\tconst getLength = _list =>\r\n\t\t\t_list === undefined ? 0 :\r\n\t\t\t\t(cgArrays.includes(_type) ? _list.length : Object.keys(_list).length);\r\n\r\n\t\t// フェードイン位置にそれ以前のデータを前追加\r\n\t\tif (startNum > 0 && _data[startNum] === undefined) {\r\n\t\t\t_data[startNum] = [];\r\n\t\t}\r\n\t\tfor (let j = _data.length - 1; j >= 0; j--) {\r\n\t\t\tif (_data[j] !== undefined && j < g_scoreObj.frameNum) {\r\n\t\t\t\t_data[startNum].unshift(..._data[j]);\r\n\t\t\t\t_data[j] = undefined;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 重複する深度をカット（後方優先）\r\n\t\t// ただし、除外リストにあるデータは残す\r\n\t\tfor (let j = getLength(_data[startNum]) - 1; j >= 0; j--) {\r\n\t\t\tif (_data[startNum][j] !== undefined) {\r\n\t\t\t\tfor (let k = j - 1; k >= 0; k--) {\r\n\t\t\t\t\tif (isSameDepth(j, k) && !isExceptData[_type](g_preloadExceptList, k)) {\r\n\t\t\t\t\t\t_data[startNum][k] = undefined;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t// g_stockForceDelList に合致する消去対象データを検索し、削除\r\n\t\tfor (let j = getLength(_data[startNum]) - 1; j >= 0; j--) {\r\n\t\t\tif (_data[startNum][j] !== undefined && isExceptData[_type](g_stockForceDelList, j)) {\r\n\t\t\t\t_data[startNum][j] = undefined;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// カットした箇所をリストから削除\r\n\t\tif (getLength(_data[startNum]) > 0) {\r\n\t\t\t_data[startNum] = _data[startNum].filter(list => getLength(list) > 0);\r\n\t\t}\r\n\r\n\t\treturn _data;\r\n\t};\r\n\r\n\t// 個別・全体色変化、モーションデータ・スクロール反転データのタイミング更新\r\n\t[``, `dummy`].forEach(type => {\r\n\t\tcalcDataTiming(`color`, type, pushColors, { _colorFlg: true });\r\n\t\tif (_dataObj[`ncolor${type}Data`] !== undefined) {\r\n\t\t\tObject.keys(_dataObj[`ncolor${type}Data`]).forEach(pattern =>\r\n\t\t\t\tcalcDataTiming(`ncolor`, type, pushColors, { _term: 5, _colorFlg: true, _propName: pattern }));\r\n\t\t}\r\n\t});\r\n\r\n\tg_typeLists.arrow.forEach(header =>\r\n\t\tcalcDataTiming(`cssMotion`, header, pushCssMotions, { _calcFrameFlg: true }));\r\n\r\n\tcalcDataTiming(`scrollch`, ``, pushScrollchs, { _term: 6, _calcFrameFlg: true });\r\n\r\n\tg_fadeinStockList.forEach(type =>\r\n\t\t_dataObj[`${type}Data`] = calcAnimationData(type, _dataObj[`${type}Data`]));\r\n\r\n\r\n\t// 実際に処理させる途中変速配列を作成\r\n\tg_workObj.speedData = [];\r\n\tg_workObj.speedData.push(g_scoreObj.frameNum);\r\n\tg_workObj.speedData.push(_speedOnFrame[g_scoreObj.frameNum]);\r\n\r\n\tfor (let k = 0; k < _dataObj?.speedData.length; k += 2) {\r\n\t\tif (_dataObj.speedData[k] >= g_scoreObj.frameNum) {\r\n\t\t\tg_workObj.speedData.push(_dataObj.speedData[k]);\r\n\t\t\tg_workObj.speedData.push(_speedOnFrame[_dataObj.speedData[k]]);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * ステップゾーン到達地点から逆算して開始フレームを取得\r\n * @param {number} _frame \r\n * @param {object} _speedOnFrame\r\n * @returns {{ frm: number, startY: number, arrivalFrm: number, motionFrm: number }}\r\n */\r\nconst getArrowStartFrame = (_frame, _speedOnFrame) => {\r\n\r\n\tconst obj = {\r\n\t\tfrm: _frame,\r\n\t\tstartY: 0,\r\n\t\tarrivalFrm: 0,\r\n\t\tmotionFrm: C_MOTION_STD_POS\r\n\t};\r\n\r\n\twhile (g_posObj.distY - obj.startY > 0) {\r\n\t\tobj.startY += _speedOnFrame[obj.frm - 1];\r\n\r\n\t\tif (_speedOnFrame[obj.frm - 1] !== 0) {\r\n\t\t\tobj.motionFrm++;\r\n\t\t}\r\n\t\tobj.frm--;\r\n\t\tobj.arrivalFrm++;\r\n\t}\r\n\r\n\treturn obj;\r\n};\r\n\r\n/**\r\n * 速度を加味したフリーズアローの長さを取得\r\n * @param {object} _speedOnFrame \r\n * @param {number} _startFrame \r\n * @param {number} _endFrame \r\n * @returns {number}\r\n */\r\nconst getFrzLength = (_speedOnFrame, _startFrame, _endFrame) => {\r\n\tlet frzLength = 0;\r\n\r\n\tfor (let frm = _startFrame; frm < _endFrame; frm++) {\r\n\t\tfrzLength += _speedOnFrame[frm];\r\n\t}\r\n\treturn frzLength;\r\n};\r\n\r\n/**\r\n * キーパターン(デフォルト)に対応する矢印番号を格納\r\n * - 色変化、矢印・フリーズアローモーション、スクロール変化で\r\n *   矢印レーンの番号を実際のキーパターンに対応する番号に置き換える際に使用\r\n * - 例: [0, 1, 2, 3, 4] -> [4, 0, 1, 2, 3]\r\n */\r\nconst convertReplaceNums = () => {\r\n\tconst tkObj = getKeyInfo();\r\n\tconst baseCharas = g_keyObj[`chara${g_keyObj.currentKey}_0`];\r\n\tconst convCharas = g_keyObj[`chara${tkObj.keyCtrlPtn}`];\r\n\r\n\tg_workObj.replaceNums = [];\r\n\r\n\tfor (let j = 0; j < tkObj.keyNum; j++) {\r\n\t\tfor (let k = 0; k < tkObj.keyNum; k++) {\r\n\t\t\tif (baseCharas[j] === convCharas[k]) {\r\n\t\t\t\tg_workObj.replaceNums[j] = k;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * 色情報の格納\r\n * @param {string} _header \r\n * @param {number} _frame \r\n * @param {number} _val 色番号\r\n * @param {string} _colorCd カラーコード\r\n * @param {string} _allFlg 全体色変化有無\r\n * @param {string} _pattern 色変化種類 (Arrow, ArrowShadow, FrzNormal, FrzNormalBar, ...)\r\n */\r\nconst pushColors = (_header, _frame, _val, _colorCd, _allFlg, _pattern = ``) => {\r\n\r\n\tconst tkObj = getKeyInfo();\r\n\tconst grdFlg = (g_colorType === `Type0` ? !g_headerObj.defaultColorgrd[0] : g_headerObj.defaultColorgrd[0]);\r\n\tconst colorCd = makeColorGradation(_colorCd, { _defaultColorgrd: [grdFlg, g_headerObj.defaultColorgrd[1]] });\r\n\tconst addAll = Number(_allFlg) * 1000;\r\n\tconst allUseTypes = [];\r\n\r\n\t/**\r\n\t * 全体色変化の有効化（フレーム別）\r\n\t * @param  {...any} _types \r\n\t */\r\n\tconst enabledAll = (..._types) => {\r\n\t\tif (_allFlg) {\r\n\t\t\t_types.forEach(type => g_workObj[`mk${type}ColorChangeAll`][_frame] = true);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * 色変化用配列（フレーム別）へのデータ追加\r\n\t * @param {string} _baseStr \r\n\t * @param {number} _cVal \r\n\t */\r\n\tconst pushColor = (_baseStr, _cVal) => {\r\n\t\tg_workObj[_baseStr][_frame]?.push(_cVal) || (g_workObj[_baseStr][_frame] = [_cVal]);\r\n\t\tg_workObj[`${_baseStr}Cd`][_frame]?.push(colorCd) || (g_workObj[`${_baseStr}Cd`][_frame] = [colorCd]);\r\n\t};\r\n\r\n\t/**\r\n\t * 色変化データ(ncolor_data)の格納処理\r\n\t */\r\n\tconst executePushColors = () => {\r\n\t\tconst baseHeaders = [];\r\n\t\tif (_pattern.startsWith(`Arrow`)) {\r\n\t\t\tbaseHeaders.push(`mk${_header}Color${_pattern.slice('Arrow'.length)}`);\r\n\t\t\tallUseTypes.push(`Arrow`);\r\n\r\n\t\t\t// フリーズアロー色の追随設定がある場合、対象を追加\r\n\t\t\tif (_pattern === `Arrow`) {\r\n\t\t\t\tg_headerObj.frzScopeFromArrowColors.forEach(type =>\r\n\t\t\t\t\tbaseHeaders.push(`mk${_header}FColor${type}`, `mk${_header}FColor${type}Bar`));\r\n\t\t\t\tif (g_headerObj.frzScopeFromArrowColors.length > 0) {\r\n\t\t\t\t\tallUseTypes.push(`Frz`);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tbaseHeaders.push(`mk${_header}FColor${_pattern}`);\r\n\t\t\tallUseTypes.push(`Frz`);\r\n\t\t}\r\n\t\t// 色変化情報の格納\r\n\t\tif (_val.startsWith('g')) {\r\n\t\t\t// g付きの場合は矢印グループから対象の矢印番号を検索\r\n\t\t\tconst groupVal = setIntVal(_val.slice(1));\r\n\t\t\tfor (let j = 0; j < tkObj.keyNum; j++) {\r\n\t\t\t\tif (g_keyObj[`color${tkObj.keyCtrlPtn}`][j] === groupVal) {\r\n\t\t\t\t\tbaseHeaders.forEach(baseHeader => pushColor(baseHeader, j + addAll));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tbaseHeaders.forEach(baseHeader => pushColor(baseHeader, g_workObj.replaceNums[setIntVal(_val)] + addAll));\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * 従来の色変化データ派生(color_data, acolor_data)の格納処理\r\n\t */\r\n\tconst executePushColorsOld = () => {\r\n\r\n\t\tif (_val < 30 || _val >= 1000) {\r\n\t\t\tconst baseHeaders = [`mk${_header}Color`];\r\n\t\t\tallUseTypes.push(`Arrow`);\r\n\r\n\t\t\t// フリーズアロー色の追随設定がある場合、対象を追加\r\n\t\t\tg_headerObj.frzScopeFromArrowColors.forEach(type =>\r\n\t\t\t\tbaseHeaders.push(`mk${_header}FColor${type}`, `mk${_header}FColor${type}Bar`));\r\n\t\t\tif (g_headerObj.frzScopeFromArrowColors.length > 0) {\r\n\t\t\t\tallUseTypes.push(`Frz`);\r\n\t\t\t}\r\n\r\n\t\t\t// 矢印の色変化 (追随指定時はフリーズアローも色変化)\r\n\t\t\tbaseHeaders.forEach(baseHeader => {\r\n\t\t\t\tif (_val < 20 || _val >= 1000) {\r\n\t\t\t\t\tpushColor(baseHeader, g_workObj.replaceNums[_val % 1000] + addAll);\r\n\t\t\t\t} else if (_val >= 20) {\r\n\t\t\t\t\tconst colorNum = _val - 20;\r\n\t\t\t\t\tfor (let j = 0; j < tkObj.keyNum; j++) {\r\n\t\t\t\t\t\tif (g_keyObj[`color${tkObj.keyCtrlPtn}`][j] === colorNum) {\r\n\t\t\t\t\t\t\tpushColor(baseHeader, j + addAll);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t} else {\r\n\t\t\tconst baseHeader = `mk${_header}FColor`;\r\n\t\t\tallUseTypes.push(`Frz`);\r\n\r\n\t\t\t// フリーズアローの色変化\r\n\t\t\tconst tmpVals = [];\r\n\t\t\tif (_val < 50) {\r\n\t\t\t\ttmpVals.push(_val % 30);\r\n\t\t\t} else if (_val < 60) {\r\n\t\t\t\ttmpVals.push((_val % 50) * 2, (_val % 50) * 2 + 1);\r\n\t\t\t} else {\r\n\t\t\t\tif (_val === 60) {\r\n\t\t\t\t\ttmpVals.push(...Array(8).keys());\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttmpVals.push(...[...Array(8).keys()].map(j => j + 10));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\ttmpVals.forEach(targetj => {\r\n\r\n\t\t\t\t// targetj=0,2,4,6,8 ⇒ Arrow, 1,3,5,7,9 ⇒ Bar\r\n\t\t\t\tconst ctype = (targetj >= 10 ? `Hit` : `Normal`) + (targetj % 2 === 0 ? `` : `Bar`);\r\n\t\t\t\tconst colorPos = Math.ceil((targetj % 10 - 1) / 2);\r\n\r\n\t\t\t\tg_keyObj[`color${tkObj.keyCtrlPtn}`].forEach((cpattern, k) => {\r\n\t\t\t\t\tif (colorPos === cpattern) {\r\n\t\t\t\t\t\tpushColor(baseHeader + ctype, k + addAll);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\thasVal(_pattern) ? executePushColors() : executePushColorsOld();\r\n\tenabledAll(...allUseTypes);\r\n};\r\n\r\n/**\r\n * CSSモーション情報の格納\r\n * @param {string} _header \r\n * @param {number} _frame \r\n * @param {number} _val \r\n * @param {string} _styleName\r\n * @param {string} _styleNameRev\r\n */\r\nconst pushCssMotions = (_header, _frame, _val, _styleName, _styleNameRev) => {\r\n\r\n\tconst camelHeader = toCapitalize(_header);\r\n\tconst tkObj = getKeyInfo();\r\n\r\n\t// 矢印のモーション\r\n\tif (g_workObj[`mk${camelHeader}CssMotion`][_frame] === undefined) {\r\n\t\tg_workObj[`mk${camelHeader}CssMotion`][_frame] = [];\r\n\t\tg_workObj[`mk${camelHeader}CssMotionName`][_frame] = [];\r\n\t}\r\n\tif (_val < 20 || _val >= 1000) {\r\n\t\tconst realVal = g_workObj.replaceNums[_val % 1000];\r\n\t\tg_workObj[`mk${camelHeader}CssMotion`][_frame].push(realVal);\r\n\t\tg_workObj[`mk${camelHeader}CssMotionName`][_frame].push(_styleName, _styleNameRev);\r\n\r\n\t} else {\r\n\t\tconst colorNum = _val - 20;\r\n\t\tfor (let j = 0; j < tkObj.keyNum; j++) {\r\n\t\t\tif (g_keyObj[`color${tkObj.keyCtrlPtn}`][j] === colorNum) {\r\n\t\t\t\tg_workObj[`mk${camelHeader}CssMotion`][_frame].push(j);\r\n\t\t\t\tg_workObj[`mk${camelHeader}CssMotionName`][_frame].push(_styleName, _styleNameRev);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * スクロール変化情報の格納\r\n * @param {string} _header \r\n * @param {number} _frameArrow \r\n * @param {number} _val \r\n * @param {number} _frameStep \r\n * @param {number} _scrollDir \r\n * @param {number} _layerGroup\r\n * @param {number} _layerTrans\r\n */\r\nconst pushScrollchs = (_header, _frameArrow, _val, _frameStep, _scrollDir, _layerGroup, _layerTrans) => {\r\n\tconst tkObj = getKeyInfo();\r\n\tg_stateObj.layerNum = Math.max(g_stateObj.layerNum, (_layerGroup + 1) * 2);\r\n\r\n\tconst frameArrow = Math.max(_frameArrow, g_scoreObj.frameNum);\r\n\tconst frameStep = Math.max(_frameStep, g_scoreObj.frameNum);\r\n\tconst pushData = (_pattern, _frame, _val) =>\r\n\t\tg_workObj[`mkScrollch${_pattern}`][_frame]?.push(_val) || (g_workObj[`mkScrollch${_pattern}`][_frame] = [_val]);\r\n\tconst pushScrollData = _j => {\r\n\t\tpushData(`Arrow`, frameArrow, _j);\r\n\t\tpushData(`ArrowDir`, frameArrow, _scrollDir);\r\n\t\tpushData(`ArrowLayerGroup`, frameArrow, _layerGroup);\r\n\t\tpushData(`ArrowLayerTrans`, frameArrow, _layerTrans);\r\n\t\tpushData(`Step`, frameStep, _j);\r\n\t\tpushData(`StepDir`, frameStep, _scrollDir);\r\n\t\tpushData(`StepLayerGroup`, frameStep, _layerGroup);\r\n\t\tpushData(`StepLayerTrans`, frameStep, _layerTrans);\r\n\t};\r\n\r\n\tif (_val < 20 || _val >= 1000) {\r\n\t\tconst realVal = g_workObj.replaceNums[_val % 1000];\r\n\t\tpushScrollData(realVal);\r\n\r\n\t} else {\r\n\t\tconst colorNum = _val - 20;\r\n\t\tfor (let j = 0; j < tkObj.keyNum; j++) {\r\n\t\t\tif (g_keyObj[`color${tkObj.keyCtrlPtn}`][j] === colorNum) {\r\n\t\t\t\tpushScrollData(j);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * メイン画面前の初期化処理\r\n */\r\nconst getArrowSettings = () => {\r\n\r\n\tg_attrObj = {};\r\n\tconst tkObj = getKeyInfo();\r\n\tconst [keyCtrlPtn, keyNum, posMax, divideCnt] =\r\n\t\t[tkObj.keyCtrlPtn, tkObj.keyNum, tkObj.posMax, tkObj.divideCnt];\r\n\r\n\tg_keyCopyLists.simpleDef.forEach(header => updateKeyInfo(header, keyCtrlPtn));\r\n\tg_headerObj.tuning = g_headerObj.creatorNames[g_stateObj.scoreId];\r\n\r\n\tdelete g_workObj.initY;\r\n\tdelete g_workObj.initBoostY;\r\n\tdelete g_workObj.arrivalFrame;\r\n\tdelete g_workObj.motionFrame;\r\n\r\n\tg_workObj.stepX = [];\r\n\tg_workObj.scrollDir = [];\r\n\tg_workObj.scrollDirDefault = [];\r\n\tg_workObj.dividePos = [];\r\n\tg_workObj.stepRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);\r\n\tg_workObj.stepHitRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);\r\n\tg_workObj.arrowRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);\r\n\tg_workObj.keyCtrl = structuredClone(g_keyObj[`keyCtrl${keyCtrlPtn}`]);\r\n\tg_workObj.diffList = [];\r\n\tg_workObj.mainEndTime = 0;\r\n\r\n\tg_workObj.keyGroupMaps = tkObj.keyGroupMaps;\r\n\tg_workObj.keyGroupList = tkObj.keyGroupList;\r\n\r\n\tconst keyCtrlLen = g_workObj.keyCtrl.length;\r\n\tg_workObj.keyCtrlN = [...Array(keyCtrlLen)].map(() => []);\r\n\tg_workObj.keyHitFlg = [...Array(keyCtrlLen)].map(() => []);\r\n\tfor (let j = 0; j < g_workObj.keyCtrl.length; j++) {\r\n\t\tfor (let k = 0; k < g_workObj.keyCtrl[j].length; k++) {\r\n\t\t\tg_workObj.keyCtrlN[j][k] = g_kCdN[g_workObj.keyCtrl[j][k]];\r\n\t\t\tg_workObj.keyHitFlg[j][k] = false;\r\n\t\t}\r\n\t}\r\n\r\n\tg_typeLists.arrow.forEach(type => g_workObj[`judg${toCapitalize(type)}Cnt`] = fillArray(keyNum, 1));\r\n\tg_workObj.judgFrzHitCnt = fillArray(keyNum, 1);\r\n\tg_judgObj.lockFlgs = fillArray(keyNum, false);\r\n\r\n\t// 矢印色管理 (個別・全体)\r\n\tconst eachOrAll = [``, `All`];\r\n\teachOrAll.forEach(type => {\r\n\t\t[`arrow`, `dummyArrow`].forEach(arrowType =>\r\n\t\t\tg_typeLists.arrowColor.forEach(objType => g_workObj[`${arrowType}${objType}Colors${type}`] = []));\r\n\r\n\t\t[`frz`, `dummyFrz`].forEach(arrowType =>\r\n\t\t\tg_typeLists.frzColor.forEach(frzType => g_workObj[`${arrowType}${frzType}Colors${type}`] = []));\r\n\t});\r\n\r\n\t// モーション管理\r\n\tg_typeLists.arrow.forEach(type => g_workObj[`${type}CssMotions`] = fillArray(keyNum, ``));\r\n\tg_workObj.frzArrowCssMotions = fillArray(keyNum, ``);\r\n\tg_workObj.dummyFrzArrowCssMotions = fillArray(keyNum, ``);\r\n\r\n\tconst scrollDirOptions = g_keyObj[`scrollDir${keyCtrlPtn}`]?.[g_stateObj.scroll] ?? fillArray(keyNum, 1);\r\n\r\n\tg_stateObj.autoAll = boolToSwitch(g_stateObj.autoPlay === C_FLG_ALL);\r\n\tg_workObj.hitPosition = (g_stateObj.autoAll === C_FLG_ON ? 0 : g_stateObj.hitPosition);\r\n\tchangeSetColor();\r\n\r\n\tfor (let j = 0; j < keyNum; j++) {\r\n\r\n\t\tconst posj = g_keyObj[`pos${keyCtrlPtn}`][j];\r\n\t\tconst colorj = g_keyObj[`color${keyCtrlPtn}`][j];\r\n\t\tconst stdPos = posj - ((posj > divideCnt ? posMax : 0) + divideCnt) / 2;\r\n\r\n\t\tg_workObj.stepX[j] = g_keyObj.blank * stdPos + (g_headerObj.playingWidth - C_ARW_WIDTH) / 2;\r\n\t\tconst baseLayer = g_keyObj[`layerGroup${keyCtrlPtn}`]?.[j] || 0;\r\n\t\tg_workObj.dividePos[j] = baseLayer * 2 + ((posj <= divideCnt ? 0 : 1) + (scrollDirOptions[j] === 1 ? 0 : 1) + (g_stateObj.reverse === C_FLG_OFF ? 0 : 1)) % 2;\r\n\t\tg_workObj.scrollDir[j] = (posj <= divideCnt ? 1 : -1) * scrollDirOptions[j] * (g_stateObj.reverse === C_FLG_OFF ? 1 : -1);\r\n\r\n\t\t// 個別色設定\r\n\t\tg_workObj.arrowColors[j] = g_headerObj.setColor[colorj];\r\n\t\tg_workObj.dummyArrowColors[j] = g_headerObj.setDummyColor[colorj];\r\n\t\tg_workObj.arrowShadowColors[j] = g_headerObj.setShadowColor[colorj] || ``;\r\n\t\tg_workObj.dummyArrowShadowColors[j] = g_headerObj.setDummyColor[colorj] || ``;\r\n\r\n\t\tg_typeLists.frzColor.forEach((frzType, k) => {\r\n\t\t\tg_workObj[`frz${frzType}Colors`][j] = g_headerObj.frzColor[colorj][k] || ``;\r\n\t\t\tg_workObj[`dummyFrz${frzType}Colors`][j] =\r\n\t\t\t\tfrzType.includes(`Shadow`) ? `` : g_headerObj.setDummyColor[colorj] || ``;\r\n\t\t});\r\n\t\tg_workObj.frzNormalShadowColors[j] = g_headerObj.frzShadowColor[colorj][0] || ``;\r\n\t\tg_workObj.frzHitShadowColors[j] = g_headerObj.frzShadowColor[colorj][1] || ``;\r\n\r\n\t\t// 全体色設定\r\n\t\tg_workObj.arrowColorsAll[j] = ``;\r\n\t\tg_workObj.dummyArrowColorsAll[j] = ``;\r\n\t\tg_workObj.arrowShadowColorsAll[j] = ``;\r\n\t\tg_workObj.dummyArrowShadowColorsAll[j] = ``;\r\n\r\n\t\tg_typeLists.frzColor.forEach((frzType, k) => {\r\n\t\t\tg_workObj[`frz${frzType}ColorsAll`][j] = ``;\r\n\t\t\tg_workObj[`dummyFrz${frzType}ColorsAll`][j] = ``;\r\n\t\t});\r\n\t\tg_workObj.frzNormalShadowColorsAll[j] = ``;\r\n\t\tg_workObj.frzHitShadowColorsAll[j] = ``;\r\n\r\n\t}\r\n\tg_workObj.orgFlatFlg = g_workObj.dividePos.every(v => v % 2 === g_workObj.dividePos[0] % 2);\r\n\tg_stateObj.layerNumDf = Math.max(g_stateObj.layerNumDf, Math.ceil((Math.max(...g_workObj.dividePos) + 1) / 2) * 2);\r\n\r\n\t// StepArea(Default, Halfway以外)によるレイヤー移動\r\n\t// ずらした位置に表示するため、レイヤーを倍化して倍化した先に割り当てる\r\n\tconst assignLayer = _func => {\r\n\t\tfor (let j = 0; j < keyNum; j++) {\r\n\t\t\tg_workObj.dividePos[j] = (_func(j) ? 0 : 1) * g_stateObj.layerNumDf + g_workObj.dividePos[j];\r\n\t\t}\r\n\t}\r\n\tif (g_stateObj.stepArea === `X-Flower` || (g_stateObj.stepArea.includes(`Mismatched`) && g_workObj.orgFlatFlg)) {\r\n\t\tassignLayer(j => g_workObj.stepX[j] < (g_headerObj.playingWidth - C_ARW_WIDTH) / 2);\r\n\t} else if (g_stateObj.stepArea === `Alt-Crossing`) {\r\n\t\tassignLayer(j => Math.round(g_keyObj[`pos${keyCtrlPtn}`][j]) % 2 === 0);\r\n\t}\r\n\tif (g_stateObj.stepArea === `2Step`) {\r\n\t\tfor (let j = 0; j < keyNum; j++) {\r\n\t\t\tif (g_workObj.orgFlatFlg && g_workObj.stepX[j] >= (g_headerObj.playingWidth - C_ARW_WIDTH) / 2) {\r\n\t\t\t\tg_workObj.dividePos[j] = Math.floor(g_workObj.dividePos[j] / 2) * 2 + (g_workObj.dividePos[j] + 1) % 2;\r\n\t\t\t\tg_workObj.scrollDir[j] *= -1;\r\n\t\t\t}\r\n\t\t\tif (g_workObj.dividePos[j] % 2 === (Number(g_stateObj.reverse === C_FLG_ON) + 1) % 2) {\r\n\t\t\t\tg_workObj.dividePos[j] = g_stateObj.layerNumDf + g_workObj.dividePos[j] + Number(g_stateObj.reverse === C_FLG_ON ? 1 : -1);\r\n\t\t\t\tg_workObj.scrollDir[j] *= -1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tg_workObj.scrollDirDefault = g_workObj.scrollDir.concat();\r\n\tg_workObj.dividePosDefault = g_workObj.dividePos.concat();\r\n\tg_stateObj.layerNum = g_stateObj.layerNumDf * (g_settings.stepAreaLayers.includes(g_stateObj.stepArea) ? 2 : 1);\r\n\r\n\t// g_workObjの不要なプロパティを削除\r\n\tif (g_stateObj.dummyId === `` && g_autoPlaysBase.includes(g_stateObj.autoPlay)) {\r\n\t\tObject.keys(g_workObj).filter(key => key.startsWith(`dummy`) || key.startsWith(`mkDummy`))\r\n\t\t\t.forEach(key => delete g_workObj[key]);\r\n\t}\r\n\tconst targetColorKeys = [`mkColor`, `mkColorShadow`];\r\n\tconst usedColorKeys = [];\r\n\ttargetColorKeys.push(...g_typeLists.frzColor.map(type => `mkFColor${type}`));\r\n\ttargetColorKeys.forEach(key => {\r\n\t\tif (g_workObj[key].length === 0) {\r\n\t\t\tdelete g_workObj[key];\r\n\t\t\tdelete g_workObj[`${key}Cd`];\r\n\t\t} else {\r\n\t\t\tusedColorKeys.push(key);\r\n\t\t}\r\n\t});\r\n\t[`Arrow`, `Step`].forEach(type => {\r\n\t\t[``, `Dir`, `LayerGroup`, `LayerTrans`].forEach(type2 => {\r\n\t\t\tif (g_workObj[`mkScrollch${type}${type2}`].length === 0) {\r\n\t\t\t\tdelete g_workObj[`mkScrollch${type}${type2}`];\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n\t[`Arrow`, `Frz`].forEach(type => {\r\n\t\tif (g_workObj[`mk${type}ColorChangeAll`].length === 0) {\r\n\t\t\tdelete g_workObj[`mk${type}ColorChangeAll`];\r\n\t\t}\r\n\t\t[``, `Name`].forEach(type2 => {\r\n\t\t\tif (g_workObj[`mk${type}CssMotion${type2}`].length === 0) {\r\n\t\t\t\tdelete g_workObj[`mk${type}CssMotion${type2}`];\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n\r\n\t// 初期位置、ライフ設定の初期化\r\n\tObject.keys(g_resultObj).forEach(judgeCnt => g_resultObj[judgeCnt] = 0);\r\n\tg_resultObj.spState = ``;\r\n\tg_resultObj.gaugeTransition = [];\r\n\r\n\tg_displays.forEach(_disp => {\r\n\t\tconst lowerDisp = _disp.toLowerCase();\r\n\t\tg_workObj[`${lowerDisp}Disp`] = (g_stateObj[`d_${lowerDisp}`] === C_FLG_OFF ? C_DIS_NONE : C_DIS_INHERIT);\r\n\t});\r\n\r\n\tg_workObj.lifeVal = Math.floor(g_workObj.lifeInit * 100) / 100;\r\n\tg_gameOverFlg = false;\r\n\tg_finishFlg = true;\r\n\tg_workObj.nonDefaultSc = g_headerObj.keyRetry !== C_KEY_RETRY || g_headerObj.keyTitleBack !== C_KEY_TITLEBACK;\r\n\tif (g_headerObj.scAreaWidth === 0 && (g_headerObj.keyRetry !== g_headerObj.keyRetryDef2 || g_headerObj.keyTitleBack !== g_headerObj.keyTitleBackDef2)) {\r\n\t\tg_workObj.nonDefaultSc = false;\r\n\t}\r\n\r\n\tg_workObj.backX = (g_workObj.nonDefaultSc && g_headerObj.playingLayout ? g_headerObj.scAreaWidth : 0);\r\n\tg_workObj.playingX = g_headerObj.playingX + g_workObj.backX;\r\n\r\n\t// Swapping設定に応じたステップゾーンの入れ替え\r\n\tif (g_stateObj.swapping.includes(`Mirror`)) {\r\n\r\n\t\tlet _style = structuredClone(Object.values(g_workObj.shuffleGroupMap));\r\n\t\tif (g_stateObj.swapping === `Mirror`) {\r\n\t\t\t_style.map(_group => _group.reverse());\r\n\r\n\t\t} else if (g_stateObj.swapping === `X-Mirror`) {\r\n\t\t\t// X-Mirrorの場合、グループの内側だけ入れ替える\r\n\t\t\t_style.forEach((group, i) => g_settings.swapPattern.forEach(val => swapGroupNums(_style, group, i, val)));\r\n\t\t}\r\n\r\n\t\t// 入れ替えた結果に合わせてX座標位置を入れ替える\r\n\t\tg_workObj.stepX_df = structuredClone(g_workObj.stepX);\r\n\t\t_style.forEach((_group, _i) => {\r\n\t\t\t_group.forEach((_val, _j) => {\r\n\t\t\t\tg_workObj.stepX[_group[_j]] = g_workObj.stepX_df[g_workObj.shuffleGroupMap[_i][_j]];\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t// FrzReturnの初期化\r\n\tg_workObj.frzReturnFlg = false;\r\n\r\n\t// AutoRetryの初期化\r\n\tg_workObj.autoRetryFlg = false;\r\n\r\n\t// Camoufrageの設定\r\n\tif (!g_stateObj.rotateEnabled) {\r\n\r\n\t\t// 矢印の回転が無効の場合は、設定を変える\r\n\t\tif (g_stateObj.camoufrage === `Arrow`) {\r\n\t\t\tg_stateObj.camoufrage = C_FLG_OFF;\r\n\t\t} else if (g_stateObj.camoufrage === C_FLG_ALL) {\r\n\t\t\tg_stateObj.camoufrage = `Color`;\r\n\t\t}\r\n\t\tg_settings.camoufrageNum = g_settings.camoufrages.findIndex(val => val === g_stateObj.camoufrage);\r\n\t}\r\n\tif (g_stateObj.camoufrage !== C_FLG_OFF) {\r\n\t\tconst eachOrAll = [``, `All`];\r\n\t\tconst keyNum = g_keyObj[`chara${g_keyObj.currentKey}_${g_keyObj.currentPtn}`].length;\r\n\r\n\t\t// 位置変更用の配列を作成\r\n\t\tconst randArray = [...Array(keyNum).keys()].map(_i => _i);\r\n\t\tlet _i = randArray.length;\r\n\t\twhile (_i) {\r\n\t\t\tconst _j = Math.floor(Math.random() * _i--);\r\n\t\t\t[randArray[_i], randArray[_j]] = [randArray[_j], randArray[_i]];\r\n\t\t}\r\n\r\n\t\t// 位置変更用の配列に従い、初期矢印・初期色の位置変更\r\n\t\tconst getSwapArray = (_array) => {\r\n\t\t\tconst _copiedArray = structuredClone(_array);\r\n\t\t\treturn _array.map((_val, _i) => _array[_i] = _copiedArray[randArray[_i]]);\r\n\t\t};\r\n\t\tif (g_stateObj.camoufrage === `Arrow` || g_stateObj.camoufrage === C_FLG_ALL) {\r\n\r\n\t\t\t// 矢印ヒット時に元の矢印がわかるようにするため、あえて g_workObj.stepHitRtn はそのままにする\r\n\t\t\tg_workObj.stepRtn = getSwapArray(g_workObj.stepRtn);\r\n\t\t\tg_workObj.arrowRtn = getSwapArray(g_workObj.arrowRtn);\r\n\t\t}\r\n\t\teachOrAll.forEach(type => {\r\n\t\t\tif (g_stateObj.camoufrage === `Color` || g_stateObj.camoufrage === C_FLG_ALL) {\r\n\r\n\t\t\t\t// ダミー矢印は対象外\r\n\t\t\t\tg_workObj[`arrowColors${type}`] = getSwapArray(g_workObj[`arrowColors${type}`]);\r\n\t\t\t\tg_workObj[`arrowShadowColors${type}`] = getSwapArray(g_workObj[`arrowShadowColors${type}`]);\r\n\r\n\t\t\t\tg_typeLists.frzColor.forEach(frzType => {\r\n\t\t\t\t\tg_workObj[`frz${frzType}Colors${type}`] = getSwapArray(g_workObj[`frz${frzType}Colors${type}`]);\r\n\t\t\t\t});\r\n\t\t\t\tg_workObj[`frzNormalShadowColors${type}`] = getSwapArray(g_workObj[`frzNormalShadowColors${type}`]);\r\n\t\t\t\tg_workObj[`frzHitShadowColors${type}`] = getSwapArray(g_workObj[`frzHitShadowColors${type}`]);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// 位置変更用の配列に従い、個別・全体色変化の位置変更\r\n\t\tif (g_stateObj.camoufrage === `Color` || g_stateObj.camoufrage === C_FLG_ALL) {\r\n\t\t\tconst getSwapList = (_array) => {\r\n\t\t\t\tconst _copiedArray = structuredClone(_array);\r\n\t\t\t\treturn _array.map((_val, _i) => _array[_i] = randArray[_copiedArray[_i]]);\r\n\t\t\t};\r\n\t\t\tusedColorKeys.forEach(type => {\r\n\t\t\t\tif (g_workObj[type] !== undefined) {\r\n\t\t\t\t\tfor (let j = 0; j < g_workObj[type].length; j++) {\r\n\t\t\t\t\t\tif (g_workObj[type][j] === undefined) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tg_workObj[type][j] = getSwapList(g_workObj[type][j]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// Shaking: Drunkでの画面揺れ設定 (X方向、Y方向)\r\n\tg_workObj.drunkXFlg = false;\r\n\tg_workObj.drunkYFlg = false;\r\n\r\n\t// AppearanceFilterの可視範囲設定\r\n\tg_workObj.aprFilterCnt = 0;\r\n\r\n\tif (g_stateObj.dataSaveFlg) {\r\n\t\t// ローカルストレージへAdjustment, HitPosition, Volume設定を保存\r\n\t\t// 変更が確定した時点で表示用のキャッシュを解放\r\n\t\tg_storeSettings.forEach(setting => g_localStorage[setting] = g_stateObj[setting]);\r\n\t\tviewKeyStorage.cache = new Map();\r\n\t\tlocalStorage.setItem(g_localStorageUrl, JSON.stringify(g_localStorage));\r\n\t}\r\n\r\n\t// リバース、キーコンフィグなどをローカルストレージへ保存（Data Save: ON かつ別キーモードで無い場合) \r\n\tif (g_stateObj.dataSaveFlg && !hasVal(g_keyObj[`transKey${keyCtrlPtn}`])) {\r\n\r\n\t\t// 次回キーコンフィグ画面へ戻ったとき、保存済みキーコンフィグ設定が表示されるようにする\r\n\t\tg_keyObj.prevKey = `Dummy`;\r\n\r\n\t\t// ローカルストレージへcolorType設定を保存\r\n\t\tg_localStorage.colorType = g_colorType;\r\n\r\n\t\tlet storageObj = g_localKeyStorage;\r\n\t\tlet addKey = ``;\r\n\r\n\t\t// リバース、キーコンフィグの保存（キー別）\r\n\t\tif (g_stateObj.extraKeyFlg) {\r\n\t\t\tstorageObj = g_localStorage;\r\n\t\t\taddKey = g_keyObj.currentKey;\r\n\t\t}\r\n\t\tif (g_headerObj.reverseUse) {\r\n\t\t\tstorageObj[`reverse${addKey}`] = g_stateObj.reverse;\r\n\t\t}\r\n\t\tstorageObj[`keyCtrl${addKey}`] = setKeyCtrl(g_localKeyStorage, keyNum, keyCtrlPtn);\r\n\t\tif (g_keyObj.currentPtn !== -1) {\r\n\t\t\tstorageObj[`keyCtrlPtn${addKey}`] = g_keyObj.currentPtn;\r\n\t\t\tg_keyObj[`keyCtrl${keyCtrlPtn}`] = structuredClone(g_keyObj[`keyCtrl${keyCtrlPtn}d`]);\r\n\t\t}\r\n\r\n\t\t// カラーセットの保存（キー別）\r\n\t\tif (!g_keycons.colorDefTypes.includes(g_colorType)) {\r\n\r\n\t\t\tresetColorType({ _toObj: storageObj, _to: addKey });\r\n\t\t\tresetColorType({ _from: g_colorType, _to: g_colorType, _fromObj: g_dfColorObj });\r\n\r\n\t\t\tg_colorType = g_keycons.colorSelf;\r\n\t\t\tg_localStorage.colorType = g_keycons.colorSelf;\r\n\t\t\tg_keycons.colorTypes = addValtoArray(g_keycons.colorTypes, g_keycons.colorSelf);\r\n\t\t\tresetColorType({ _to: g_keycons.colorSelf });\r\n\t\t}\r\n\r\n\t\tg_keycons.groups.forEach(type => {\r\n\t\t\tconst groupNum = g_keycons[`${type}GroupNum`];\r\n\t\t\tstorageObj[`${type}${addKey}`] = structuredClone(g_keyObj[`${type}${keyCtrlPtn}_${groupNum}`]);\r\n\t\t\tg_keyObj[`${type}${g_keyObj.currentKey}_-1_${groupNum}`] = structuredClone(g_keyObj[`${type}${keyCtrlPtn}_${groupNum}d`]);\r\n\t\t\tg_keyObj[`${type}${keyCtrlPtn}_${groupNum}`] = structuredClone(g_keyObj[`${type}${keyCtrlPtn}_${groupNum}d`]);\r\n\r\n\t\t\t// 古いキーデータの削除 (互換用)\r\n\t\t\tif (storageObj[`${type}${g_keyObj.currentKey}_-1_-1`] !== undefined) {\r\n\t\t\t\tdelete storageObj[`${type}${g_keyObj.currentKey}_-1_-1`];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (!g_stateObj.extraKeyFlg) {\r\n\t\t\tlocalStorage.setItem(`danonicw-${g_keyObj.currentKey}k`, JSON.stringify(g_localKeyStorage));\r\n\t\t}\r\n\r\n\t\tlocalStorage.setItem(g_localStorageUrl, JSON.stringify(g_localStorage));\r\n\t\tg_canLoadDifInfoFlg = true;\r\n\r\n\t} else {\r\n\t\t// データ未保存 もしくは 別キーモード時はキーコンフィグ設定を初期化しない\r\n\t\tg_keyObj.prevKey = g_keyObj.currentKey;\r\n\t\tg_canLoadDifInfoFlg = false;\r\n\t}\r\n};\r\n\r\n/**\r\n * キーコンフィグ保存処理\r\n * @param {object} _localStorage 保存先のローカルストレージ名\r\n * @param {number} _keyNum \r\n * @param {string} _keyCtrlPtn \r\n * @returns {any[][]}\r\n */\r\nconst setKeyCtrl = (_localStorage, _keyNum, _keyCtrlPtn) => {\r\n\tconst localPtn = `${g_keyObj.currentKey}_-1`;\r\n\tconst keyCtrl = [...Array(_keyNum)].map(() => []);\r\n\tfor (let j = 0; j < _keyNum; j++) {\r\n\t\tfor (let k = 0; k < g_keyObj[`keyCtrl${_keyCtrlPtn}`][j].length; k++) {\r\n\t\t\tkeyCtrl[j][k] = g_keyObj[`keyCtrl${_keyCtrlPtn}`][j][k];\r\n\t\t}\r\n\t\tif (g_keyObj[`keyCtrl${localPtn}`] !== undefined) {\r\n\t\t\tif (g_keyObj[`keyCtrl${_keyCtrlPtn}`][j].length < g_keyObj[`keyCtrl${localPtn}`][j].length) {\r\n\t\t\t\tfor (let k = g_keyObj[`keyCtrl${_keyCtrlPtn}`][j].length; k < g_keyObj[`keyCtrl${localPtn}`][j].length; k++) {\r\n\t\t\t\t\tkeyCtrl[j][k] = undefined;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn keyCtrl;\r\n};\r\n\r\n/*-----------------------------------------------------------*/\r\n/* Scene : MAIN [banana] */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * メイン画面初期化\r\n */\r\nconst mainInit = () => {\r\n\tclearWindow(true, `Main`);\r\n\tconst divRoot = document.getElementById(`divRoot`);\r\n\tdocument.oncontextmenu = () => false;\r\n\tg_currentPage = `main`;\r\n\r\n\tg_currentArrows = 0;\r\n\tconst wordMaxLen = g_scoreObj.wordMaxDepth + 1;\r\n\tg_workObj.fadeInNo = fillArray(wordMaxLen);\r\n\tg_workObj.fadeOutNo = fillArray(wordMaxLen);\r\n\tg_workObj.lastFadeFrame = fillArray(wordMaxLen);\r\n\tg_workObj.wordFadeFrame = fillArray(wordMaxLen);\r\n\tconst mainCommonPos = { w: g_headerObj.playingWidth, h: g_posObj.arrowHeight };\r\n\tconst objOpacity = g_stateObj.opacity / 100;\r\n\r\n\t// 背景スプライトを作成\r\n\tcreateMultipleSprite(`backSprite`, g_scoreObj.backMaxDepth, { x: g_workObj.backX });\r\n\r\n\t// ステップゾーン、矢印のメインスプライトを作成\r\n\tconst mainSprite = createEmptySprite(divRoot, `mainSprite`, mainCommonPos);\r\n\taddTransform(`mainSprite`, `root`, `scale(${g_keyObj.scale})`);\r\n\taddXY(`mainSprite`, `root`, g_workObj.playingX, g_posObj.stepY - C_STEP_Y + g_headerObj.playingY);\r\n\r\n\t// 曲情報・判定カウント用スプライトを作成（メインスプライトより上位）\r\n\tconst infoSprite = createEmptySprite(divRoot, `infoSprite`, mainCommonPos);\r\n\taddXY(`infoSprite`, `root`, g_workObj.playingX, g_headerObj.playingY);\r\n\r\n\t// 判定系スプライトを作成（メインスプライトより上位）\r\n\tconst judgeSprite = createEmptySprite(divRoot, `judgeSprite`, mainCommonPos);\r\n\taddXY(`judgeSprite`, `root`, g_workObj.playingX, g_headerObj.playingY);\r\n\r\n\tconst tkObj = getKeyInfo();\r\n\tconst [keyCtrlPtn, keyNum] = [tkObj.keyCtrlPtn, tkObj.keyNum];\r\n\r\n\t// マスクスプライトを作成 (最上位)\r\n\tcreateMultipleSprite(`maskSprite`, g_scoreObj.maskMaxDepth, { x: g_workObj.backX });\r\n\r\n\t// カラー・モーションを適用するオブジェクトの種類\r\n\tconst objList = (g_stateObj.dummyId === `` && g_autoPlaysBase.includes(g_stateObj.autoPlay)\r\n\t\t? [``] : [`dummy`, ``]);\r\n\r\n\t// 背景・マスクモーション、スキン変更(0フレーム指定)\r\n\tif (g_scoreObj.frameNum === 0) {\r\n\t\tg_animationData.filter(sprite => g_scoreObj[`${sprite}Data`][0] !== undefined).forEach(sprite => {\r\n\t\t\tg_animationFunc.drawMain[sprite](0, sprite);\r\n\t\t\tg_scoreObj[`${sprite}Data`][0] = undefined;\r\n\t\t});\r\n\t}\r\n\r\n\t// 矢印・フリーズアロー・速度変化 移動/判定/変化対象の初期化\r\n\tconst arrowCnts = fillArray(keyNum);\r\n\tconst frzCnts = fillArray(keyNum);\r\n\tconst dummyArrowCnts = fillArray(keyNum);\r\n\tconst dummyFrzCnts = fillArray(keyNum);\r\n\tlet speedCnts = 0;\r\n\tlet boostCnts = 0;\r\n\tlet keychCnts = 0;\r\n\r\n\tg_workObj.flatMode = g_stateObj.d_stepzone === `FlatBar` ||\r\n\t\tg_stateObj.scroll.endsWith(`Flat`) ||\r\n\t\tg_keyObj[`flatMode${keyCtrlPtn}`] ||\r\n\t\t(g_stateObj.stepArea === `Halfway` &&\r\n\t\t\tg_keyObj[`div${keyCtrlPtn}`] < g_keyObj[`${g_keyObj.defaultProp}${keyCtrlPtn}`].length);\r\n\tg_workObj.stepZoneDisp = (g_stateObj.d_stepzone === C_FLG_OFF || g_workObj.flatMode) ? C_DIS_NONE : C_DIS_INHERIT;\r\n\r\n\t// mainSprite配下に層別のスプライトを作成し、ステップゾーン・矢印本体・フリーズアローヒット部分に分ける\r\n\tconst mainSpriteN = [], stepSprite = [], arrowSprite = [], frzHitSprite = [];\r\n\r\n\t// Hidden+, Sudden+用のライン、パーセント表示\r\n\tconst filterCss = g_stateObj.filterLock === C_FLG_OFF ? g_cssObj.life_Failed : g_cssObj.life_Cleared;\r\n\tconst doubleFilterFlg = ![`Default`, `Halfway`].includes(g_stateObj.stepArea);\r\n\r\n\tfor (let j = 0; j < g_stateObj.layerNum; j++) {\r\n\t\tconst mainSpriteJ = createEmptySprite(mainSprite, `mainSprite${j}`, mainCommonPos);\r\n\t\tmainSpriteN.push(mainSpriteJ);\r\n\t\tmainSpriteJ.appendChild(createColorObject2(`filterBar${j}`, g_lblPosObj.filterBar, filterCss));\r\n\t\tif (doubleFilterFlg) {\r\n\t\t\tmainSpriteJ.appendChild(createColorObject2(`filterBar${j % 2 == 0 ? j + 1 : j - 1}_HS`, g_lblPosObj.filterBar, filterCss));\r\n\t\t}\r\n\r\n\t\t// レイヤーごとのTransition設定\r\n\t\t// StepAreaオプションにより、レイヤーが倍化される場合があるため基準レイヤー数ごとに設定\r\n\t\tconst transj = j % g_stateObj.layerNumDf;\r\n\t\taddTransform(`mainSprite${j}`, `mainSprite${j}`,\r\n\t\t\tg_keyObj[`layerTrans${keyCtrlPtn}`]?.[0]?.[Math.floor(transj / 2) * 2 + (transj + Number(g_stateObj.reverse === C_FLG_ON)) % 2]);\r\n\r\n\t\tstepSprite.push(createEmptySprite(mainSpriteJ, `stepSprite${j}`, mainCommonPos));\r\n\t\tarrowSprite.push(createEmptySprite(mainSpriteJ, `arrowSprite${j}`, Object.assign({ y: g_workObj.hitPosition * (j % 2 === 0 ? 1 : -1) }, mainCommonPos)));\r\n\t\tfrzHitSprite.push(createEmptySprite(mainSpriteJ, `frzHitSprite${j}`, mainCommonPos));\r\n\t}\r\n\r\n\tif (g_appearanceRanges.includes(g_stateObj.appearance)) {\r\n\t\tmainSprite.appendChild(createDivCss2Label(`filterView`, ``, g_lblPosObj.filterView));\r\n\t\tif (g_stateObj.d_filterline === C_FLG_ON) {\r\n\t\t\t$id(`filterView`).opacity = objOpacity;\r\n\t\t\tfor (let j = 0; j < g_stateObj.layerNum; j++) {\r\n\t\t\t\t$id(`filterBar${j}`).opacity = objOpacity;\r\n\t\t\t\tif (doubleFilterFlg) {\r\n\t\t\t\t\t$id(`filterBar${j}_HS`).opacity = objOpacity;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// ステップゾーン、フリーズアローヒット部分の生成\r\n\tfor (let j = 0; j < keyNum; j++) {\r\n\t\tmakeStepZone(j, keyCtrlPtn);\r\n\t}\r\n\tif (g_workObj.flatMode && g_stateObj.d_stepzone !== C_FLG_OFF) {\r\n\r\n\t\t// スクロール名に`R-`が含まれていればリバースと見做す\r\n\t\tconst reverseFlg = g_stateObj.reverse === C_FLG_ON || g_stateObj.scroll.startsWith(`R-`);\r\n\r\n\t\t// ステップゾーンの代わり\r\n\t\tconst lineY = [(C_ARW_WIDTH - g_stateObj.flatStepHeight) / 2, (C_ARW_WIDTH + g_stateObj.flatStepHeight) / 2];\r\n\t\tconst reverses = [reverseFlg, reverseFlg];\r\n\t\tif (makeDedupliArray(g_workObj.scrollDir).length > 1) {\r\n\t\t\tlineY.push(lineY[0], lineY[1]);\r\n\t\t\treverses.push(!reverses[0], !reverses[1]);\r\n\t\t}\r\n\t\tfor (let k = 0; k < g_stateObj.layerNum; k += 2) {\r\n\t\t\tlineY.forEach((y, j) => {\r\n\t\t\t\tstepSprite[Number(reverses[j]) + k].appendChild(\r\n\t\t\t\t\tcreateColorObject2(`stepBar${j + k}`, {\r\n\t\t\t\t\t\tx: 0, y: C_STEP_Y + g_posObj.reverseStepY * Number(reverses[j]) + y,\r\n\t\t\t\t\t\tw: g_headerObj.playingWidth - 50, h: 1, styleName: `lifeBar`,\r\n\t\t\t\t\t}, g_cssObj.life_Failed)\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// StepArea処理\r\n\tg_stepAreaFunc.get(g_stateObj.stepArea)();\r\n\r\n\t// mainSpriteのtransform追加処理\r\n\taddTransform(`mainSprite`, `playWindow`, g_playWindowFunc.get(g_stateObj.playWindow)());\r\n\r\n\t// EffectのArrowEffect追加処理\r\n\tg_effectFunc.get(g_stateObj.effect)();\r\n\r\n\t// Appearanceのオプション適用時は一部描画を隠す\r\n\tchangeAppearanceFilter(g_appearanceRanges.includes(g_stateObj.appearance) ?\r\n\t\tg_hidSudObj.filterPos : g_hidSudObj.filterPosDefault[g_stateObj.appearance], true);\r\n\r\n\t// Shaking初期化\r\n\tif (g_stateObj.shaking !== C_FLG_OFF) {\r\n\t\taddXY(`mainSprite`, `shaking`, 0, 0);\r\n\t}\r\n\r\n\t// 現在の矢印・フリーズアローの速度、個別加算速度の初期化 (速度変化時に直す)\r\n\tg_workObj.currentSpeed = 2;\r\n\tg_workObj.boostSpd = 1;\r\n\tg_workObj.boostDir = 1;\r\n\r\n\t// 開始位置、楽曲再生位置の設定\r\n\tconst firstFrame = g_scoreObj.frameNum;\r\n\tconst musicStartFrame = firstFrame + g_headerObj.blankFrame;\r\n\tconst fadeFlgs = { fadein: [`In`, `Out`], fadeout: [`Out`, `In`] };\r\n\tg_audio.volume = (firstFrame === 0 ? g_stateObj.volume / 100 : 0);\r\n\r\n\t// 曲時間制御変数\r\n\tlet thisTime;\r\n\tlet buffTime;\r\n\tlet musicStartTime;\r\n\tlet musicStartFlg = false;\r\n\r\n\tg_inputKeyBuffer = {};\r\n\r\n\t// 終了時間の設定\r\n\tlet duration = g_audio.duration * g_fps;\r\n\tg_scoreObj.fadeOutFrame = Infinity;\r\n\tg_scoreObj.fadeOutTerm = C_FRM_AFTERFADE;\r\n\r\n\t// フェードアウト時間指定の場合、その7秒(=420フレーム)後に終了する\r\n\tlet fadeNo = -1;\r\n\tif (g_headerObj.fadeFrame?.length >= g_stateObj.scoreId + 1) {\r\n\t\tfadeNo = (isNaN(parseInt(g_headerObj.fadeFrame[g_stateObj.scoreId][0])) ? -1 : g_stateObj.scoreId);\r\n\t}\r\n\tif (fadeNo !== -1) {\r\n\t\t// フェードアウト指定の場合、曲長(フェードアウト開始まで)は FadeFrame - (本来のblankFrame)\r\n\t\tduration = parseInt(g_headerObj.fadeFrame[fadeNo][0]) - g_headerObj.blankFrameDef;\r\n\t\tg_scoreObj.fadeOutFrame = Math.ceil(duration / g_headerObj.playbackRate + g_headerObj.blankFrame + g_stateObj.adjustment);\r\n\r\n\t\tif (g_headerObj.fadeFrame[fadeNo].length > 1) {\r\n\t\t\tg_scoreObj.fadeOutTerm = Number(g_headerObj.fadeFrame[fadeNo][1]);\r\n\t\t}\r\n\t}\r\n\r\n\t// 終了時間指定の場合、その値を適用する\r\n\tlet endFrameUseFlg = false;\r\n\tconst tmpEndFrame = g_headerObj.endFrame?.[g_stateObj.scoreId] || g_headerObj.endFrame?.[0];\r\n\tif (!isNaN(parseInt(tmpEndFrame))) {\r\n\t\t// 終了時間指定の場合、曲長は EndFrame - (本来のblankFrame)\r\n\t\tduration = parseInt(tmpEndFrame) - g_headerObj.blankFrameDef;\r\n\t\tendFrameUseFlg = true;\r\n\t}\r\n\r\n\tlet fullFrame = Math.ceil(duration / g_headerObj.playbackRate + g_headerObj.blankFrame + g_stateObj.adjustment);\r\n\tif (g_scoreObj.fadeOutFrame !== Infinity && !endFrameUseFlg) {\r\n\t\tfullFrame += g_scoreObj.fadeOutTerm;\r\n\t}\r\n\tg_scoreObj.fullFrame = fullFrame;\r\n\tconst fullTime = transFrameToTimer(fullFrame - g_stateObj.intAdjustment);\r\n\r\n\t// フレーム数\r\n\tdivRoot.appendChild(createDivCss2Label(`lblframe`, g_scoreObj.baseFrame, Object.assign(g_lblPosObj.lblframe, { display: g_workObj.lifegaugeDisp })));\r\n\r\n\t// ライフ(数字)部作成\r\n\tconst intLifeVal = Math.floor(g_workObj.lifeVal);\r\n\tlet lblInitColor = g_cssObj.life_Failed;\r\n\tif (g_workObj.lifeVal === g_headerObj.maxLifeVal) {\r\n\t\tlblInitColor = g_cssObj.life_Max;\r\n\t} else if (g_workObj.lifeVal >= g_workObj.lifeBorder) {\r\n\t\tlblInitColor = g_cssObj.life_Cleared;\r\n\t}\r\n\r\n\t// 曲名・アーティスト名、譜面名表示\r\n\tconst playbackView = (g_headerObj.playbackRate === 1 ? `` : ` [Rate:${g_headerObj.playbackRate}]`);\r\n\tconst musicTitle = (g_headerObj.musicTitles[g_headerObj.musicNos[g_stateObj.scoreId]] || g_headerObj.musicTitle) + playbackView;\r\n\tconst artistName = g_headerObj.artistNames[g_headerObj.musicNos[g_stateObj.scoreId]] || g_headerObj.artistName;\r\n\tconst assistFlg = (g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `-${getStgDetailName(g_stateObj.autoPlay)}${getStgDetailName('less')}`);\r\n\tconst shuffleName = (g_stateObj.shuffle !== C_FLG_OFF ? `: ${getStgDetailName(g_stateObj.shuffle)}` : ``);\r\n\r\n\t// 曲名・アーティスト名、譜面名のサイズ調整\r\n\tconst checkMusicSiz = (_text, _siz) => getFontSize2(_text, g_headerObj.playingWidth - g_headerObj.customViewWidth - 125, { maxSiz: _siz });\r\n\r\n\tconst makerView = g_headerObj.makerView ? ` (${g_headerObj.creatorNames[g_stateObj.scoreId]})` : ``;\r\n\tconst transKeyName = getTransKeyName();\r\n\tlet difName = `[${getKeyName(g_headerObj.keyLabels[g_stateObj.scoreId])}${transKeyName} / ${g_headerObj.difLabels[g_stateObj.scoreId]}${assistFlg}${shuffleName}${makerView}]`;\r\n\tlet creditName = `${musicTitle} / ${artistName}`;\r\n\tif (checkMusicSiz(creditName, g_limitObj.musicTitleSiz) < 12) {\r\n\t\tcreditName = `${musicTitle}`;\r\n\t\tdifName = `/ ${artistName} ` + difName;\r\n\t}\r\n\r\n\tmultiAppend(infoSprite,\r\n\r\n\t\t// ライフ（数字）\r\n\t\tcreateDivCss2Label(`lblLife`, intLifeVal, {\r\n\t\t\tx: 0, y: 30, w: 70, h: 20, siz: g_limitObj.jdgCntsSiz, display: g_workObj.lifegaugeDisp,\r\n\t\t}, lblInitColor),\r\n\r\n\t\t// ライフ背景\r\n\t\tcreateColorObject2(`lifeBackObj`, {\r\n\t\t\tx: 5, y: 50, w: 15, h: g_headerObj.playingHeight - 100, styleName: `lifeBar`, display: g_workObj.lifegaugeDisp,\r\n\t\t}, g_cssObj.life_Background),\r\n\r\n\t\t// ライフ本体\r\n\t\tcreateColorObject2(`lifeBar`, {\r\n\t\t\tx: 5, y: 50 + (g_headerObj.playingHeight - 100) * (g_headerObj.maxLifeVal - intLifeVal) / g_headerObj.maxLifeVal,\r\n\t\t\tw: 15, h: (g_headerObj.playingHeight - 100) * intLifeVal / g_headerObj.maxLifeVal, styleName: `lifeBar`,\r\n\t\t\tdisplay: g_workObj.lifegaugeDisp,\r\n\t\t}, lblInitColor),\r\n\r\n\t\t// ライフ：ボーダーライン\r\n\t\t// この背景の画像は40x16で作成しているが、`padding-right:5px`があるためサイズを35x16で作成\r\n\t\tcreateColorObject2(`lifeBorderObj`, {\r\n\t\t\tx: 10, y: 42 + (g_headerObj.playingHeight - 100) * (g_headerObj.maxLifeVal - g_workObj.lifeBorder) / g_headerObj.maxLifeVal,\r\n\t\t\tw: 35, h: 16, background: C_CLR_BORDER, styleName: `lifeBorder`,\r\n\t\t\tfontFamily: getBasicFont(), display: g_workObj.lifegaugeDisp,\r\n\t\t}, g_cssObj.life_Border, g_cssObj.life_BorderColor),\r\n\r\n\t\t// 曲名・アーティスト名表示\r\n\t\tcreateDivCss2Label(`lblCredit`, creditName, Object.assign(g_lblPosObj.lblCredit, { siz: checkMusicSiz(creditName, g_limitObj.musicTitleSiz) })),\r\n\r\n\t\t// 譜面名表示\r\n\t\tcreateDivCss2Label(`lblDifName`, difName, Object.assign(g_lblPosObj.lblDifName, { siz: checkMusicSiz(difName, 12) })),\r\n\r\n\t\t// 曲時間表示：現在時間\r\n\t\tcreateDivCss2Label(`lblTime1`, `-:--`, Object.assign(g_lblPosObj.lblTime1, { display: g_workObj.musicinfoDisp })),\r\n\r\n\t\t// 曲時間表示：総時間\r\n\t\tcreateDivCss2Label(`lblTime2`, `/ ${fullTime}`, Object.assign(g_lblPosObj.lblTime2, { display: g_workObj.musicinfoDisp })),\r\n\t);\r\n\r\n\tif (g_workObj.nonDefaultSc) {\r\n\t\tmultiAppend(infoSprite,\r\n\t\t\tcreateDivCss2Label(`lblRetry`, `[${g_lblNameObj.l_retry}]`, Object.assign(g_lblPosObj.lblMainScHeader, { y: g_headerObj.playingHeight - 65 })),\r\n\t\t);\r\n\t\tmultiAppend(infoSprite,\r\n\t\t\tcreateDivCss2Label(`lblRetrySc`, g_kCd[g_headerObj.keyRetry],\r\n\t\t\t\tObject.assign(g_lblPosObj.lblMainScKey, { y: g_headerObj.playingHeight - 50, fontWeight: g_headerObj.keyRetry === C_KEY_RETRY ? `normal` : `bold` })),\r\n\t\t);\r\n\t\tmultiAppend(infoSprite,\r\n\t\t\tcreateDivCss2Label(`lblTitleBack`, `[${g_lblNameObj.l_titleBack}]`, Object.assign(g_lblPosObj.lblMainScHeader, { y: g_headerObj.playingHeight - 35 })),\r\n\t\t);\r\n\t\tmultiAppend(infoSprite,\r\n\t\t\tcreateDivCss2Label(`lblTitleBackSc`, g_isMac ? `Shift+${g_kCd[g_headerObj.keyRetry]}` : g_kCd[g_headerObj.keyTitleBack],\r\n\t\t\t\tObject.assign(g_lblPosObj.lblMainScKey, { y: g_headerObj.playingHeight - 20, fontWeight: g_headerObj.keyTitleBack === C_KEY_TITLEBACK ? `normal` : `bold` })),\r\n\t\t);\r\n\t}\r\n\r\n\t// ボーダーライン表示\r\n\tlifeBorderObj.textContent = g_workObj.lifeBorder;\r\n\tif (g_stateObj.lifeBorder === 0 || g_workObj.lifeVal === g_headerObj.maxLifeVal) {\r\n\t\tlifeBorderObj.style.display = C_DIS_NONE;\r\n\t}\r\n\r\n\t// 歌詞表示\r\n\tconst wordSprite = createEmptySprite(judgeSprite, `wordSprite`, { w: g_headerObj.playingWidth });\r\n\tfor (let j = 0; j <= g_scoreObj.wordMaxDepth; j++) {\r\n\t\tconst wordY = (j % 2 === 0 ? 10 : (g_headerObj.bottomWordSetFlg ? g_posObj.distY + 10 : g_headerObj.playingHeight - 60));\r\n\t\twordSprite.appendChild(createDivCss2Label(`lblword${j}`, ``, Object.assign(g_lblPosObj.lblWord, { y: wordY, fontFamily: getBasicFont() })));\r\n\t}\r\n\r\n\tconst jdgGroups = [`J`, `FJ`];\r\n\tconst jdgX = [g_headerObj.playingWidth / 2 - 220, g_headerObj.playingWidth / 2 - 120];\r\n\tconst jdgY = [(g_headerObj.playingHeight + g_posObj.stepYR) / 2 - 60, (g_headerObj.playingHeight + g_posObj.stepYR) / 2 + 10];\r\n\tif (g_stateObj.d_background === C_FLG_OFF && g_headerObj.jdgPosReset) {\r\n\t} else {\r\n\t\tjdgY[0] += g_diffObj.arrowJdgY;\r\n\t\tjdgY[1] += g_diffObj.frzJdgY;\r\n\t}\r\n\r\n\tjdgGroups.forEach((jdg, j) => {\r\n\t\t// キャラクタ表示\r\n\t\tconst charaJ = createDivCss2Label(`chara${jdg}`, ``, {\r\n\t\t\tx: jdgX[j], y: jdgY[j],\r\n\t\t\tw: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.jdgCharaSiz,\r\n\t\t\topacity: objOpacity, display: g_workObj.judgmentDisp,\r\n\t\t}, g_cssObj.common_ii);\r\n\t\tcharaJ.setAttribute(`cnt`, 0);\r\n\r\n\t\tmultiAppend(judgeSprite,\r\n\r\n\t\t\t// キャラクタ表示\r\n\t\t\tcharaJ,\r\n\r\n\t\t\t// コンボ表示\r\n\t\t\tcreateDivCss2Label(`combo${jdg}`, ``, {\r\n\t\t\t\tx: jdgX[j] + 170, y: jdgY[j],\r\n\t\t\t\tw: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.jdgCharaSiz,\r\n\t\t\t\topacity: objOpacity, display: g_workObj.judgmentDisp,\r\n\t\t\t}, g_cssObj[`common_combo${jdg}`]),\r\n\r\n\t\t\t// Fast/Slow表示\r\n\t\t\tcreateDivCss2Label(`diff${jdg}`, ``, {\r\n\t\t\t\tx: jdgX[j] + 170, y: jdgY[j] + 25,\r\n\t\t\t\tw: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.mainSiz,\r\n\t\t\t\topacity: objOpacity, display: g_workObj.fastslowDisp,\r\n\t\t\t}, g_cssObj.common_combo),\r\n\r\n\t\t);\r\n\t});\r\n\r\n\t// 判定カウンタ表示\r\n\tconst jdgMainScoreObj = {\r\n\t\tIi: [`ii`, 0], Shakin: [`shakin`, 1], Matari: [`matari`, 2], Shobon: [`shobon`, 3], Uwan: [`uwan`, 4],\r\n\t\tMCombo: [`combo`, 5], Kita: [`kita`, 7], Iknai: [`iknai`, 8], FCombo: [`combo`, 9],\r\n\t};\r\n\tObject.keys(jdgMainScoreObj).forEach(jdgScore =>\r\n\t\tinfoSprite.appendChild(makeCounterSymbol(`lbl${jdgScore}`, g_headerObj.playingWidth - 110 + (g_workObj.nonDefaultSc ? g_headerObj.scAreaWidth : 0),\r\n\t\t\tg_cssObj[`common_${jdgMainScoreObj[jdgScore][0]}`], jdgMainScoreObj[jdgScore][1] + 1, 0, g_workObj.scoreDisp)));\r\n\r\n\t// パーフェクト演出\r\n\tjudgeSprite.appendChild(createDivCss2Label(`finishView`, ``, g_lblPosObj.finishView, g_cssObj.common_kita));\r\n\r\n\t// 曲情報OFF\r\n\tif (g_stateObj.d_musicinfo === C_FLG_OFF) {\r\n\t\t[`lblCredit`, `lblDifName`].forEach(labelName => changeStyle(labelName, g_lblPosObj.musicInfoOFF));\r\n\t}\r\n\r\n\t// デバッグ時のみフレーム数を残す\r\n\tif (!g_isDebug) {\r\n\t\tlblframe.style.display = C_DIS_NONE;\r\n\t}\r\n\r\n\t// Ready?表示\r\n\tif (!g_headerObj.customReadyUse) {\r\n\t\tconst readyColor = g_headerObj.readyColor || g_headerObj.setColorOrg[0];\r\n\t\tlet readyDelayFrame = 0;\r\n\t\tif (g_stateObj.fadein === 0 && g_headerObj.readyDelayFrame > 0 &&\r\n\t\t\tg_headerObj.readyDelayFrame + g_stateObj.adjustment > 0) {\r\n\t\t\treadyDelayFrame = g_headerObj.readyDelayFrame + g_stateObj.adjustment;\r\n\t\t}\r\n\t\tconst readyHtml = g_headerObj.readyHtml ||\r\n\t\t\t`<span style='color:${readyColor};font-size:${wUnit(60)};'>R</span>EADY<span style='font-size:${wUnit(50)};'>?</span>`;\r\n\r\n\t\tdivRoot.appendChild(\r\n\t\t\tcreateDivCss2Label(`lblReady`, readyHtml, {\r\n\t\t\t\tx: g_workObj.playingX + (g_headerObj.playingWidth - g_sWidth) / 2,\r\n\t\t\t\ty: g_headerObj.playingY + (g_headerObj.playingHeight + g_posObj.stepYR) / 2 - 75,\r\n\t\t\t\tw: g_sWidth, h: 50, siz: 40,\r\n\t\t\t\tanimationDuration: `${g_headerObj.readyAnimationFrame / g_fps}s`,\r\n\t\t\t\tanimationName: g_headerObj.readyAnimationName,\r\n\t\t\t\tanimationDelay: `${readyDelayFrame / g_fps}s`, opacity: 0,\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\tconst msg = [];\r\n\tif (getMusicUrl(g_stateObj.scoreId) === `nosound.mp3`) {\r\n\t\tmsg.push(g_msgInfoObj.I_0004);\r\n\t}\r\n\tif (g_stateObj.shuffle.indexOf(`Mirror`) !== -1 &&\r\n\t\tg_stateObj.dataSaveFlg && g_stateObj.autoAll === C_FLG_OFF &&\r\n\t\tg_keyObj[`shuffle${keyCtrlPtn}`].filter((shuffleGr, j) => shuffleGr !== g_keyObj[`shuffle${keyCtrlPtn}_0d`][j]).length > 0) {\r\n\t\tmsg.push(g_msgInfoObj.I_0005);\r\n\t}\r\n\tif (msg.length > 0) {\r\n\t\tmakeInfoWindow(msg.join(`<br>`), `leftToRightFade`, { _x: g_workObj.playingX, _y: g_headerObj.playingY });\r\n\t}\r\n\r\n\t// ユーザカスタムイベント(初期)\r\n\tg_customJsObj.main.forEach(func => func());\r\n\r\n\t/**\r\n\t * キーを押したときの処理\r\n\t */\r\n\tconst mainKeyDownActFunc = {\r\n\r\n\t\tOFF: (_code) => {\r\n\t\t\tconst matchKeys = g_workObj.keyCtrlN;\r\n\r\n\t\t\tfor (let j = 0; j < keyNum; j++) {\r\n\t\t\t\tmatchKeys[j].filter((key, k) => _code === key && !g_workObj.keyHitFlg[j][k] && !g_judgObj.lockFlgs[j])\r\n\t\t\t\t\t.forEach(() => {\r\n\t\t\t\t\t\tg_judgObj.lockFlgs[j] = true;\r\n\t\t\t\t\t\tjudgeArrow(j);\r\n\t\t\t\t\t\tg_judgObj.lockFlgs[j] = false;\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tON: (_code) => { },\r\n\t};\r\n\r\n\t// キー操作イベント\r\n\tdocument.onkeydown = evt => {\r\n\t\tevt.preventDefault();\r\n\t\tconst setCode = transCode(evt);\r\n\r\n\t\tif (evt.repeat && !g_mainRepeatObj.key.includes(setCode)) {\r\n\t\t\treturn blockCode(setCode);\r\n\t\t}\r\n\t\tg_inputKeyBuffer[setCode] = true;\r\n\t\tmainKeyDownActFunc[g_stateObj.autoAll](setCode);\r\n\r\n\t\t// 曲中リトライ、タイトルバック\r\n\t\tif (setCode === g_kCdN[g_headerObj.keyRetry]) {\r\n\t\t\tg_audio.pause();\r\n\t\t\tclearTimeout(g_timeoutEvtId);\r\n\r\n\t\t\tif (g_isMac && keyIsShift()) {\r\n\t\t\t\t// Mac OS、IPad OSはDeleteキーが無いためShift+BSで代用\r\n\t\t\t\ttitleInit();\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// その他の環境では単にRetryに対応するキーのみで適用\r\n\t\t\t\tclearWindow();\r\n\t\t\t\tmusicAfterLoaded();\r\n\t\t\t}\r\n\r\n\t\t} else if (setCode === g_kCdN[g_headerObj.keyTitleBack]) {\r\n\t\t\tg_audio.pause();\r\n\t\t\tclearTimeout(g_timeoutEvtId);\r\n\t\t\tif (keyIsShift()) {\r\n\t\t\t\tif (g_currentArrows !== g_fullArrows || g_stateObj.lifeMode === C_LFE_BORDER && g_workObj.lifeVal < g_workObj.lifeBorder) {\r\n\t\t\t\t\tg_gameOverFlg = true;\r\n\t\t\t\t\tg_finishFlg = false;\r\n\t\t\t\t\tg_resultObj.gaugeTransition.push([g_scoreObj.baseFrame, 0]);\r\n\t\t\t\t}\r\n\t\t\t\tresultInit();\r\n\t\t\t} else {\r\n\t\t\t\ttitleInit();\r\n\t\t\t}\r\n\r\n\t\t} else if (g_appearanceRanges.includes(g_stateObj.appearance) && g_stateObj.filterLock === C_FLG_OFF) {\r\n\t\t\tconst MAX_FILTER_POS = 100;\r\n\t\t\tconst MIN_FILTER_POS = 0;\r\n\t\t\tif (setCode === g_hidSudObj.pgDown[g_stateObj.appearance][g_stateObj.reverse]) {\r\n\t\t\t\tchangeAppearanceFilter(Math.min(g_hidSudObj.filterPos + 1, MAX_FILTER_POS));\r\n\t\t\t} else if (setCode === g_hidSudObj.pgUp[g_stateObj.appearance][g_stateObj.reverse]) {\r\n\t\t\t\tchangeAppearanceFilter(Math.max(g_hidSudObj.filterPos - 1, MIN_FILTER_POS));\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn blockCode(setCode);\r\n\t};\r\n\r\n\t/**\r\n\t * キーを離したときの処理\r\n\t */\r\n\tconst mainKeyUpActFunc = {\r\n\r\n\t\tOFF: () => {\r\n\t\t\tfor (let j = 0; j < keyNum; j++) {\r\n\t\t\t\tif (g_workObj.keyCtrlN[j].find(key => keyIsDown(key)) === undefined) {\r\n\t\t\t\t\t$id(`stepDiv${j}`).display = C_DIS_NONE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tON: () => { },\r\n\t};\r\n\r\n\tdocument.onkeyup = evt => {\r\n\t\tg_inputKeyBuffer[transCode(evt)] = false;\r\n\t\tmainKeyUpActFunc[g_stateObj.autoAll]();\r\n\t};\r\n\r\n\t/**\r\n\t * 全体色変化（矢印）\r\n\t * @param {number} _j 矢印位置\r\n\t * @param {number} _k 矢印の表示順\r\n\t * @param {string} _name 通常, ダミー\r\n\t */\r\n\tconst changeArrowColor = (_j, _k, _name) => {\r\n\t\tif (g_workObj[`mk${toCapitalize(_name)}ColorChangeAll`]?.[g_scoreObj.frameNum]) {\r\n\r\n\t\t\t/**\r\n\t\t\t * 全体色の変更処理\r\n\t\t\t * - 次の全体色変化対象の色と比較して一致した場合に色を変更\r\n\t\t\t * @param {string} _type \r\n\t\t\t * @param {element} _baseObj \r\n\t\t\t */\r\n\t\t\tconst changeColor = (_type, _baseObj) => {\r\n\t\t\t\tconst cArrowColor = g_workObj[`${_name}${_type}Colors`][_j];\r\n\t\t\t\tconst cArrowColorAll = g_workObj[`${_name}${_type}ColorsAll`][_j];\r\n\t\t\t\tif (_baseObj.getAttribute(`color`) !== cArrowColor && cArrowColorAll === cArrowColor) {\r\n\t\t\t\t\t_baseObj.style.background = cArrowColorAll;\r\n\t\t\t\t\t_baseObj.setAttribute(`color`, cArrowColorAll);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t// 矢印枠の色変化\r\n\t\t\tconst arrowTop = document.getElementById(`${_name}Top${_j}_${_k}`);\r\n\t\t\tchangeColor(``, arrowTop);\r\n\r\n\t\t\t// 矢印塗りつぶし部分の色変化\r\n\t\t\tif (g_headerObj.setShadowColor[0] !== ``) {\r\n\t\t\t\tconst arrowShadow = document.getElementById(`${_name}Shadow${_j}_${_k}`);\r\n\t\t\t\tchangeColor(`Shadow`, arrowShadow);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * 全体色変化（フリーズアロー）\r\n\t * @param {number} _j 矢印位置\r\n\t * @param {number} _k 矢印の表示順\r\n\t * @param {string} _name 通常, ダミー\r\n\t * @param {string} _state フリーズアローの色変化対象 (Normal: 通常時、Hit: ヒット時)\r\n\t */\r\n\tconst changeFrzColor = (_j, _k, _name, _state) => {\r\n\r\n\t\tif (g_workObj[`mk${toCapitalize(_name)}ColorChangeAll`]?.[g_scoreObj.frameNum]) {\r\n\t\t\tconst frzNo = `${_j}_${_k}`;\r\n\t\t\tconst frzTop = document.getElementById(`${_name}Top${frzNo}`);\r\n\t\t\tconst frzBar = document.getElementById(`${_name}Bar${frzNo}`);\r\n\t\t\tconst frzBtm = document.getElementById(`${_name}Btm${frzNo}`);\r\n\t\t\tconst frzTopShadow = document.getElementById(`${_name}TopShadow${frzNo}`);\r\n\t\t\tconst frzBtmShadow = document.getElementById(`${_name}BtmShadow${frzNo}`);\r\n\r\n\t\t\t/**\r\n\t\t\t * 全体色の変更処理\r\n\t\t\t * @param {string} _type \r\n\t\t\t * @param {element} _baseObj \r\n\t\t\t * @param {element} _baseObj2 \r\n\t\t\t */\r\n\t\t\tconst changeColor = (_type, _baseObj, _baseObj2) => {\r\n\t\t\t\tconst cFrzColor = g_workObj[`${_name}${_state}${_type}Colors`][_j];\r\n\t\t\t\tconst cFrzColorAll = g_workObj[`${_name}${_state}${_type}ColorsAll`][_j];\r\n\t\t\t\tif (_baseObj.getAttribute(`color${_state}`) !== cFrzColor && cFrzColorAll === cFrzColor) {\r\n\t\t\t\t\tif (_baseObj2 && _state === `Normal`) {\r\n\t\t\t\t\t\t_baseObj2.style.background = cFrzColorAll;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_baseObj.style.background = cFrzColorAll;\r\n\t\t\t\t\t_baseObj.setAttribute(`color${_state}`, cFrzColorAll);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t// 矢印部分の色変化\r\n\t\t\tchangeColor(``, frzBtm, frzTop);\r\n\r\n\t\t\t// 帯部分の色変化\r\n\t\t\tchangeColor(`Bar`, frzBar);\r\n\r\n\t\t\t// 矢印塗りつぶし部分の色変化\r\n\t\t\tchangeColor(`Shadow`, frzBtmShadow, frzTopShadow);\r\n\t\t}\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * 全体色変化\r\n\t */\r\n\tconst changeColorFunc = {\r\n\t\tarrow: (_j, _k) => changeArrowColor(_j, _k, `arrow`),\r\n\t\tdummyArrow: (_j, _k) => changeArrowColor(_j, _k, `dummyArrow`),\r\n\t\tfrz: (_j, _k, _state) => changeFrzColor(_j, _k, `frz`, _state),\r\n\t\tdummyFrz: (_j, _k, _state) => changeFrzColor(_j, _k, `dummyFrz`, _state),\r\n\t};\r\n\r\n\t/**\r\n\t * 矢印・フリーズアロー消去\r\n\t * \r\n\t * @param {number} _j 矢印位置\r\n\t * @param {string} _deleteName 削除オブジェクト名\r\n\t */\r\n\tconst judgeObjDelete = {};\r\n\tg_typeLists.arrow.forEach(type =>\r\n\t\tjudgeObjDelete[type] = (_j, _deleteName) => {\r\n\t\t\tg_workObj[`judg${toCapitalize(type)}Cnt`][_j]++;\r\n\t\t\tdocument.getElementById(_deleteName).remove();\r\n\t\t\tdelete g_attrObj[_deleteName];\r\n\t\t});\r\n\r\n\t/**\r\n\t * 自動判定\r\n\t * ※mainInit内部で指定必須（arrowSprite指定）\r\n\t * \r\n\t * @param {number} _j 矢印位置\r\n\t * @param {object} _arrow 矢印(オブジェクト)\r\n\t * \r\n\t * @param {number} _k 矢印の表示順\r\n\t * @param {object} _frzRoot フリーズアロー(オブジェクト)\r\n\t * @param {number} _cnt ステップゾーン到達までのフレーム数\r\n\t * @param {number} _keyUpFrame キーを離したフレーム数\r\n\t */\r\n\tconst judgeMotionFunc = {\r\n\r\n\t\t// 矢印(枠外判定、AutoPlay: OFF)\r\n\t\tarrowOFF: (_j, _arrowName, _cnt) => {\r\n\t\t\tif (_cnt < (-1) * g_judgObj.arrowJ[g_judgPosObj.shobon]) {\r\n\t\t\t\tjudgeUwan(_cnt);\r\n\t\t\t\tjudgeObjDelete.arrow(_j, _arrowName);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// 矢印(オート、AutoPlay: ON)\r\n\t\tarrowON: (_j, _arrowName, _cnt) => {\r\n\t\t\tif (_cnt === 0) {\r\n\t\t\t\tconst stepDivHit = document.getElementById(`stepHit${_j}`);\r\n\r\n\t\t\t\tjudgeIi(_cnt);\r\n\t\t\t\tstepDivHit.style.opacity = 1;\r\n\t\t\t\tstepDivHit.setAttribute(`cnt`, C_FRM_HITMOTION);\r\n\t\t\t\tjudgeObjDelete.arrow(_j, _arrowName);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// ダミー矢印(オート、AutoPlay: OFF)\r\n\t\tdummyArrowOFF: (_j, _arrowName, _cnt) => {\r\n\t\t\tif (_cnt === 0) {\r\n\t\t\t\tconst stepDivHit = document.getElementById(`stepHit${_j}`);\r\n\r\n\t\t\t\tg_customJsObj.dummyArrow.forEach(func => func());\r\n\t\t\t\tstepDivHit.style.top = wUnit(-15);\r\n\t\t\t\tstepDivHit.style.opacity = 1;\r\n\t\t\t\tstepDivHit.classList.value = ``;\r\n\t\t\t\tstepDivHit.classList.add(g_cssObj.main_stepDummy);\r\n\t\t\t\tstepDivHit.setAttribute(`cnt`, C_FRM_HITMOTION);\r\n\t\t\t\tjudgeObjDelete.dummyArrow(_j, _arrowName);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// フリーズアロー(成功時)\r\n\t\tfrzOK: (_j, _k, _frzName, _cnt) => {\r\n\t\t\tjudgeKita(_cnt);\r\n\t\t\t$id(`frzHit${_j}`).opacity = 0;\r\n\t\t\tg_attrObj[_frzName].judgEndFlg = true;\r\n\t\t\tjudgeObjDelete.frz(_j, _frzName);\r\n\t\t},\r\n\r\n\t\t// ダミーフリーズアロー(成功時)\r\n\t\tdummyFrzOK: (_j, _k, _frzName, _cnt) => {\r\n\t\t\tg_customJsObj.dummyFrz.forEach(func => func());\r\n\t\t\t$id(`frzHit${_j}`).opacity = 0;\r\n\t\t\tg_attrObj[_frzName].judgEndFlg = true;\r\n\t\t\tjudgeObjDelete.dummyFrz(_j, _frzName);\r\n\t\t},\r\n\r\n\t\t// フリーズアロー(枠外判定)\r\n\t\tfrzNG: (_j, _k, _frzName, _cnt) => {\r\n\t\t\tif (_cnt < (-1) * g_judgObj.frzJ[g_judgPosObj.iknai]) {\r\n\t\t\t\tjudgeIknai(_cnt);\r\n\t\t\t\tg_attrObj[_frzName].judgEndFlg = true;\r\n\r\n\t\t\t\tchangeFailedFrz(_j, _k);\r\n\t\t\t\tif (g_headerObj.frzStartjdgUse) {\r\n\t\t\t\t\tjudgeUwan(_cnt);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// ダミーフリーズアロー(枠外判定)\r\n\t\tdummyFrzNG: (_j, _k, _frzName, _cnt) => { },\r\n\r\n\t\t// フリーズアロー(キーを離したときの処理)\r\n\t\tfrzKeyUp: (_j, _k, _frzName, _cnt) => {\r\n\t\t\tif (g_attrObj[_frzName].keyUpFrame > g_headerObj.frzAttempt) {\r\n\t\t\t\tjudgeIknai(_cnt);\r\n\t\t\t\tg_attrObj[_frzName].judgEndFlg = true;\r\n\t\t\t\tchangeFailedFrz(_j, _k);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// ダミーフリーズアロー(キーを離したときの処理)\r\n\t\t// ※処理上通ることはないが、統一のために定義\r\n\t\tdummyFrzKeyUp: (_j, _k, _frzName, _cnt) => { },\r\n\r\n\t};\r\n\tjudgeMotionFunc.dummyArrowON = (_j, _arrowName, _cnt) => judgeMotionFunc.dummyArrowOFF(_j, _arrowName, _cnt);\r\n\r\n\t/**\r\n\t * 次矢印・フリーズアローへ判定を移すかチェック\r\n\t * \r\n\t * - 判定対象の矢印／フリーズアローが未判定の状態で、現在の矢印／フリーズアローの判定領域が回復判定内に入った場合、\r\n\t *   自身より前の判定をNG判定とした上で、判定対象の矢印／フリーズアローを強制的に削除\r\n\t * - ただし、判定対象の矢印／フリーズアローがジャスト付近の場合は判定対象を優先する\r\n\t *   (フリーズアローの場合、ヒット中の場合も判定対象が優先される)\r\n\t * \r\n\t * @param {number} _j 矢印の位置\r\n\t * @param {number} _k 矢印の表示順\r\n\t * @param {number} _cnt ステップゾーン到達までのフレーム数\r\n\t */\r\n\tconst judgeNextFunc = {\r\n\r\n\t\tarrowOFF: (_j, _k, _cnt) => {\r\n\r\n\t\t\t// 直前のフリーズアローが未判定で、自身の判定範囲がキター(O.K.)の範囲内のとき判定対象を矢印側へ移す\r\n\t\t\t// 本来はシャキン(Great)の範囲内としたいところだが、実装が複雑になるため上記条件とする\r\n\t\t\tjudgeNextFunc.frzOFF(_j, g_workObj.judgFrzCnt[_j] + 1, _cnt);\r\n\r\n\t\t\tif (g_workObj.judgArrowCnt[_j] === _k - 1 && _cnt <= g_judgObj.arrowJ[g_judgPosObj.shakin]) {\r\n\t\t\t\tconst prevArrowName = `arrow${_j}_${g_workObj.judgArrowCnt[_j]}`;\r\n\t\t\t\tconst prevArrow = g_attrObj[prevArrowName];\r\n\r\n\t\t\t\tif (prevArrow.cnt < (-1) * g_judgObj.arrowJ[g_judgPosObj.ii]) {\r\n\r\n\t\t\t\t\t// 自身より前の矢印が未判定の場合、強制的に枠外判定を行い矢印を削除\r\n\t\t\t\t\tif (prevArrow.cnt >= (-1) * g_judgObj.arrowJ[g_judgPosObj.uwan]) {\r\n\t\t\t\t\t\tjudgeUwan(prevArrow.cnt);\r\n\t\t\t\t\t\tjudgeObjDelete.arrow(_j, prevArrowName);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tarrowON: (_j, _k, _cnt) => true,\r\n\t\tdummyArrowOFF: (_j, _k, _cnt) => true,\r\n\t\tdummyArrowON: (_j, _k, _cnt) => true,\r\n\r\n\t\tfrzOFF: (_j, _k, _cnt) => {\r\n\r\n\t\t\t// 判定対象が自身より前のフリーズアローで、自身の判定範囲がキター(O.K.)の範囲内のとき\r\n\t\t\tif (g_workObj.judgFrzCnt[_j] === _k - 1 && _cnt <= g_judgObj.frzJ[g_judgPosObj.sfsf]) {\r\n\t\t\t\tconst prevFrzName = `frz${_j}_${g_workObj.judgFrzCnt[_j]}`;\r\n\t\t\t\tconst prevFrz = g_attrObj[prevFrzName];\r\n\r\n\t\t\t\t// 自身より前のフリーズアローが移動中かつキター(O.K.)の領域外のとき\r\n\t\t\t\tif (prevFrz && prevFrz.isMoving && prevFrz.cnt < (-1) * g_judgObj.frzJ[g_judgPosObj.kita]) {\r\n\r\n\t\t\t\t\t// 自身より前のフリーズアローが未判定の場合、強制的に枠外判定を行う\r\n\t\t\t\t\tif (prevFrz.cnt >= (-1) * g_judgObj.frzJ[g_judgPosObj.iknai] && !prevFrz.judgEndFlg) {\r\n\t\t\t\t\t\tjudgeIknai(prevFrz.cnt);\r\n\t\t\t\t\t\tif (g_headerObj.frzStartjdgUse) {\r\n\t\t\t\t\t\t\tjudgeUwan(prevFrz.cnt);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// 自身より前のフリーズアローを削除して判定対象を自身に変更 (g_workObj.judgFrzCnt[_j]をカウントアップ)\r\n\t\t\t\t\tjudgeObjDelete.frz(_j, prevFrzName);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tfrzON: (_j, _k, _cnt) => {\r\n\r\n\t\t\tif (_cnt === 0) {\r\n\t\t\t\tchangeHitFrz(_j, _k, `frz`);\r\n\t\t\t\tif (g_headerObj.frzStartjdgUse) {\r\n\t\t\t\t\tjudgeIi(_cnt);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tdummyFrzOFF: (_j, _k, _cnt) => {\r\n\t\t\tif (_cnt === 0) {\r\n\t\t\t\tchangeHitFrz(_j, _k, `dummyFrz`);\r\n\t\t\t}\r\n\t\t},\r\n\t\tdummyFrzON: (_j, _k, _cnt) => {\r\n\t\t\tif (_cnt === 0) {\r\n\t\t\t\tchangeHitFrz(_j, _k, `dummyFrz`);\r\n\t\t\t}\r\n\t\t},\r\n\t};\r\n\r\n\t/**\r\n\t * フリーズアローヒット中に手を離したかどうかをチェック\r\n\t * \r\n\t * @param _j 矢印の位置\r\n\t */\r\n\tconst checkKeyUpFunc = {\r\n\t\tfrzOFF: (_j) => g_workObj.keyHitFlg[_j].find(flg => flg),\r\n\t\tfrzON: (_j) => true,\r\n\t\tdummyFrzOFF: (_j) => true,\r\n\t\tdummyFrzON: (_j) => true,\r\n\t};\r\n\r\n\t/**\r\n\t * 矢印生成\r\n\t * @param {object} _attrs 矢印個別の属性\r\n\t *   (pos: 矢印種類, arrivalFrame: 到達フレーム数, initY: 初期表示位置, \r\n\t *    initBoostY: Motion有効時の初期表示位置加算, motionFrame: アニメーション有効フレーム数)\r\n\t * @param {number} _arrowCnt 現在の判定矢印順\r\n\t * @param {string} _name 矢印名\r\n\t * @param {string} _color 矢印色\r\n\t * @param {string} _shadowColor 矢印塗りつぶし部分の色\r\n\t */\r\n\tconst makeArrow = (_attrs, _arrowCnt, _name, _color, _shadowColor) => {\r\n\t\tconst _j = _attrs.pos;\r\n\t\tconst dividePos = g_workObj.dividePos[_j] % 2;\r\n\t\tconst colorPos = g_keyObj[`color${keyCtrlPtn}`][_j];\r\n\r\n\t\tconst arrowName = `${_name}${_j}_${_arrowCnt}`;\r\n\t\tconst firstPosY = C_STEP_Y + g_posObj.reverseStepY * dividePos +\r\n\t\t\t(_attrs.initY * g_workObj.boostSpd +\r\n\t\t\t\t_attrs.initBoostY * g_workObj.boostDir) * g_workObj.scrollDir[_j];\r\n\r\n\t\tconst stepRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], arrowName, {\r\n\t\t\tx: g_workObj.stepX[_j], y: firstPosY, w: C_ARW_WIDTH, h: C_ARW_WIDTH,\r\n\t\t});\r\n\t\t/**\r\n\t\t * 矢印毎の属性情報\r\n\t\t */\r\n\t\tg_attrObj[arrowName] = {\r\n\t\t\t// 生存フレーム数\r\n\t\t\tcnt: _attrs.arrivalFrame + 1,\r\n\t\t\t// 生存フレーム数 (ストップ分除去、個別加速/Motionオプション用)\r\n\t\t\tboostCnt: _attrs.motionFrame,\r\n\t\t\t// 個別加速量\r\n\t\t\tboostSpd: g_workObj.boostSpd,\r\n\t\t\t// ステップゾーン位置 (0: デフォルト, 1: リバース)\r\n\t\t\tdividePos: dividePos,\r\n\t\t\t// スクロール方向 (1: デフォルト, -1: リバース)\r\n\t\t\tdir: g_workObj.scrollDir[_j],\r\n\t\t\t// 個別加速方向 (1: 順方向加速, -1: 逆方向加速)\r\n\t\t\tboostDir: g_workObj.boostDir,\r\n\t\t\t// 前フレーム時の位置 (判定で使用)\r\n\t\t\tprevY: firstPosY,\r\n\t\t\t// 現フレーム時の位置\r\n\t\t\ty: firstPosY,\r\n\t\t};\r\n\t\t// 矢印色の設定\r\n\t\t// - 枠/塗りつぶし色: g_attrObj[arrowName].Arrow / ArrowShadow\r\n\t\tg_typeLists.arrowColor.forEach(val => g_attrObj[arrowName][`Arrow${val}`] = g_workObj[`${_name}${val}Colors`][_j]);\r\n\t\tarrowSprite[g_workObj.dividePos[_j]].appendChild(stepRoot);\r\n\r\n\t\tif (g_workObj[`${_name}CssMotions`][_j] !== ``) {\r\n\t\t\tstepRoot.classList.add(g_workObj[`${_name}CssMotions`][_j]);\r\n\t\t\tstepRoot.style.animationDuration = `${_attrs.arrivalFrame / g_fps}s`;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * 矢印オブジェクトの生成\r\n\t\t * - 後で生成されたものが手前に表示されるため、塗りつぶし ⇒ 枠の順で作成\r\n\t\t */\r\n\t\t// 矢印の内側を塗りつぶすか否か\r\n\t\tif (g_headerObj.setShadowColor[colorPos] !== ``) {\r\n\t\t\t// 矢印 (塗りつぶし)\r\n\t\t\tconst arrShadow = createColorObject2(`${_name}Shadow${_j}_${_arrowCnt}`, {\r\n\t\t\t\tbackground: _shadowColor === `Default` ? _color : _shadowColor,\r\n\t\t\t\trotate: g_workObj.arrowRtn[_j], styleName: `Shadow`,\r\n\t\t\t});\r\n\t\t\tif (_shadowColor === `Default`) {\r\n\t\t\t\tarrShadow.style.opacity = 0.5;\r\n\t\t\t}\r\n\t\t\tstepRoot.appendChild(arrShadow);\r\n\t\t}\r\n\r\n\t\t// 矢印 (枠)\r\n\t\tstepRoot.appendChild(createColorObject2(`${_name}Top${_j}_${_arrowCnt}`, {\r\n\t\t\tbackground: _color, rotate: g_workObj.arrowRtn[_j],\r\n\t\t}));\r\n\t\tg_customJsObj.makeArrow.forEach(func => func(_attrs, arrowName, _name, _arrowCnt));\r\n\t};\r\n\r\n\t/**\r\n\t * 矢印移動メイン\r\n\t * @param {number} _j \r\n\t * @param {number} _k \r\n\t * @param {string} _name \r\n\t */\r\n\tconst movArrow = (_j, _k, _name) => {\r\n\t\tconst arrowName = `${_name}${_j}_${_k}`;\r\n\t\tconst currentArrow = g_attrObj[arrowName];\r\n\r\n\t\t// 全体色変化 (移動時)\r\n\t\tchangeColorFunc[_name](_j, _k);\r\n\r\n\t\t// 移動\r\n\t\tif (g_workObj.currentSpeed !== 0) {\r\n\t\t\tconst boostCnt = currentArrow.boostCnt;\r\n\t\t\tcurrentArrow.prevY = currentArrow.y;\r\n\t\t\tcurrentArrow.y -= (g_workObj.currentSpeed * currentArrow.boostSpd +\r\n\t\t\t\t(g_workObj.motionOnFrames[boostCnt] || 0) * currentArrow.boostDir) * currentArrow.dir;\r\n\t\t\t$id(arrowName).top = wUnit(currentArrow.y);\r\n\t\t\tcurrentArrow.boostCnt--;\r\n\t\t}\r\n\t\tjudgeMotionFunc[`${_name}${g_stateObj.autoAll}`](_j, arrowName, --currentArrow.cnt);\r\n\t\tjudgeNextFunc[`${_name}${g_stateObj.autoAll}`](_j, _k, currentArrow.cnt);\r\n\t};\r\n\r\n\t/**\r\n\t * フリーズアロー生成\r\n\t * @param {object} _attrs フリーズアロー個別の属性\r\n\t *   (pos: 矢印種類, arrivalFrame: 到達フレーム数, initY: 初期表示位置, \r\n\t *    initBoostY: Motion有効時の初期表示位置加算, motionFrame: アニメーション有効フレーム数)\r\n\t * @param {number} _arrowCnt 現在の判定フリーズアロー順\r\n\t * @param {string} _name フリーズアロー名\r\n\t * @param {string} _normalColor フリーズアロー(矢印)の色\r\n\t * @param {string} _barColor フリーズアロー(帯)の色\r\n\t * @param {string} _shadowColor フリーズアロー(塗りつぶし)の色\r\n\t */\r\n\tconst makeFrzArrow = (_attrs, _arrowCnt, _name, _normalColor, _barColor, _shadowColor) => {\r\n\t\tconst _j = _attrs.pos;\r\n\t\tconst dividePos = g_workObj.dividePos[_j] % 2;\r\n\t\tconst frzNo = `${_j}_${_arrowCnt}`;\r\n\t\tconst frzName = `${_name}${frzNo}`;\r\n\t\tconst firstPosY = C_STEP_Y + g_posObj.reverseStepY * dividePos +\r\n\t\t\t(_attrs.initY * g_workObj.boostSpd +\r\n\t\t\t\t_attrs.initBoostY * g_workObj.boostDir) * g_workObj.scrollDir[_j];\r\n\t\tconst firstBarLength = g_workObj[`mk${toCapitalize(_name)}Length`][_j][(_arrowCnt - 1) * 2] * g_workObj.boostSpd;\r\n\r\n\t\tconst frzRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], frzName, {\r\n\t\t\tx: g_workObj.stepX[_j], y: firstPosY, w: C_ARW_WIDTH, h: C_ARW_WIDTH + firstBarLength,\r\n\t\t});\r\n\t\t/**\r\n\t\t * フリーズアロー毎の属性情報\r\n\t\t */\r\n\t\tg_attrObj[frzName] = {\r\n\t\t\t// 生存フレーム数\r\n\t\t\tcnt: _attrs.arrivalFrame + 1,\r\n\t\t\t// 生存フレーム数 (ストップ分除去、個別加速/Motionオプション用)\r\n\t\t\tboostCnt: _attrs.motionFrame,\r\n\t\t\t// 判定終了フラグ (false: 未判定, true: 判定済)\r\n\t\t\tjudgEndFlg: false,\r\n\t\t\t// 移動中フラグ (false: 押しっぱなしの状態, true: 移動中)\r\n\t\t\tisMoving: true,\r\n\t\t\t// フリーズアローの長さ\r\n\t\t\tfrzBarLength: firstBarLength,\r\n\t\t\t// キーを離していたフレーム数 (基準値超えでNG判定)\r\n\t\t\tkeyUpFrame: 0,\r\n\t\t\t// 個別加速量\r\n\t\t\tboostSpd: g_workObj.boostSpd,\r\n\t\t\t// ステップゾーン位置 (0: デフォルト, 1: リバース)\r\n\t\t\tdividePos: dividePos,\r\n\t\t\t// スクロール方向 (1: デフォルト, -1: リバース)\r\n\t\t\tdir: g_workObj.scrollDir[_j],\r\n\t\t\t// 個別加速方向 (1: 順方向加速, -1: 逆方向加速)\r\n\t\t\tboostDir: g_workObj.boostDir,\r\n\t\t\t// 現フレーム時のフリーズアロー本体の位置\r\n\t\t\ty: firstPosY,\r\n\t\t\t// フリーズアロー(帯)の相対位置\r\n\t\t\tbarY: C_ARW_WIDTH / 2 - firstBarLength * dividePos,\r\n\t\t\t// フリーズアロー(対矢印)の相対位置\r\n\t\t\tbtmY: firstBarLength * g_workObj.scrollDir[_j],\r\n\t\t};\r\n\t\t// フリーズアロー色の設定\r\n\t\t// - 通常時 (矢印枠/矢印塗りつぶし/帯): g_attrObj[frzName].Normal / NormalShadow / NormalBar\r\n\t\t// - ヒット時 (矢印枠/矢印塗りつぶし/帯): g_attrObj[frzName].Hit / HitShadow / HitBar\r\n\t\t// - ヒット時（矢印枠/矢印塗りつぶし/帯別の生成時全体色）: g_attrObj[frzName].HitAll / HitShadowAll / HitBarAll\r\n\t\tg_typeLists.frzColor.forEach(val => {\r\n\t\t\tg_attrObj[frzName][val] = g_workObj[`${_name}${val}Colors`][_j];\r\n\t\t\tif (val.startsWith(`Hit`)) {\r\n\t\t\t\tg_attrObj[frzName][`${val}All`] = g_workObj[`${_name}${val}ColorsAll`][_j];\r\n\t\t\t}\r\n\t\t});\r\n\t\tarrowSprite[g_workObj.dividePos[_j]].appendChild(frzRoot);\r\n\t\tlet shadowColor = _shadowColor === `Default` ? _normalColor : _shadowColor;\r\n\r\n\t\t/**\r\n\t\t * フリーズアローオブジェクトの生成\r\n\t\t * - 後で生成されたものが手前に表示されるため、以下の順で作成\r\n\t\t */\r\n\t\tmultiAppend(frzRoot,\r\n\r\n\t\t\t// フリーズアロー帯(frzBar)\r\n\t\t\tcreateColorObject2(`${_name}Bar${frzNo}`, {\r\n\t\t\t\tx: 5, y: g_attrObj[frzName].barY, w: C_ARW_WIDTH - 10, h: firstBarLength, background: _barColor, styleName: `frzBar`,\r\n\t\t\t\topacity: 0.75,\r\n\t\t\t}),\r\n\t\t);\r\n\t\tconst frzTopRoot = createEmptySprite(frzRoot, `${_name}TopRoot${frzNo}`,\r\n\t\t\t{ x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH });\r\n\t\tconst frzBtmRoot = createEmptySprite(frzRoot, `${_name}BtmRoot${frzNo}`,\r\n\t\t\t{ x: 0, y: g_attrObj[frzName].btmY, w: C_ARW_WIDTH, h: C_ARW_WIDTH });\r\n\r\n\t\tmultiAppend(frzTopRoot,\r\n\r\n\t\t\t// 開始矢印の塗り部分。ヒット時は前面に表示\r\n\t\t\tcreateColorObject2(`${_name}TopShadow${frzNo}`, {\r\n\t\t\t\tbackground: shadowColor, rotate: g_workObj.arrowRtn[_j], styleName: `Shadow`,\r\n\t\t\t}, g_cssObj.main_objShadow),\r\n\r\n\t\t\t// 開始矢印。ヒット時は非表示\r\n\t\t\tcreateColorObject2(`${_name}Top${frzNo}`, {\r\n\t\t\t\tbackground: _normalColor, rotate: g_workObj.arrowRtn[_j],\r\n\t\t\t}),\r\n\t\t);\r\n\r\n\t\tmultiAppend(frzBtmRoot,\r\n\r\n\t\t\t// 後発矢印の塗り部分\r\n\t\t\tcreateColorObject2(`${_name}BtmShadow${frzNo}`, {\r\n\t\t\t\tbackground: shadowColor, rotate: g_workObj.arrowRtn[_j], styleName: `Shadow`,\r\n\t\t\t}, g_cssObj.main_objShadow),\r\n\r\n\t\t\t// 後発矢印\r\n\t\t\tcreateColorObject2(`${_name}Btm${frzNo}`, {\r\n\t\t\t\tbackground: _normalColor, rotate: g_workObj.arrowRtn[_j],\r\n\t\t\t}),\r\n\r\n\t\t);\r\n\t\tif (g_workObj[`${_name}CssMotions`][_j] !== ``) {\r\n\t\t\tfrzRoot.classList.add(g_workObj[`${_name}CssMotions`][_j]);\r\n\t\t\tfrzRoot.style.animationDuration = `${_attrs.arrivalFrame / g_fps}s`;\r\n\t\t}\r\n\t\tif (g_workObj[`${_name}ArrowCssMotions`][_j] !== ``) {\r\n\t\t\t[frzTopRoot, frzBtmRoot].forEach(obj => {\r\n\t\t\t\tobj.classList.add(g_workObj[`${_name}ArrowCssMotions`][_j]);\r\n\t\t\t\tobj.style.animationDuration = `${_attrs.arrivalFrame / g_fps}s`;\r\n\t\t\t});\r\n\t\t}\r\n\t\tg_customJsObj.makeFrzArrow.forEach(func => func(_attrs, frzName, _name, _arrowCnt));\r\n\t};\r\n\r\n\t/**\r\n\t * フリーズアロー処理メイン\r\n\t * @param {number} _j \r\n\t * @param {number} _k \r\n\t * @param {string} _name \r\n\t */\r\n\tconst movFrzArrow = (_j, _k, _name) => {\r\n\t\tconst frzNo = `${_j}_${_k}`;\r\n\t\tconst frzName = `${_name}${frzNo}`;\r\n\t\tconst currentFrz = g_attrObj[frzName];\r\n\t\tconst movY = g_workObj.currentSpeed * currentFrz.boostSpd * currentFrz.dir;\r\n\r\n\t\tif (!currentFrz.judgEndFlg) {\r\n\t\t\tif (currentFrz.isMoving) {\r\n\r\n\t\t\t\t// 全体色変化 (通常時)\r\n\t\t\t\tchangeColorFunc[_name](_j, _k, `Normal`);\r\n\r\n\t\t\t\t// 移動\r\n\t\t\t\tif (g_workObj.currentSpeed !== 0) {\r\n\t\t\t\t\tcurrentFrz.y -= movY + (g_workObj.motionOnFrames[currentFrz.boostCnt] || 0) * currentFrz.dir * currentFrz.boostDir;\r\n\t\t\t\t\t$id(frzName).top = wUnit(currentFrz.y);\r\n\t\t\t\t\tcurrentFrz.boostCnt--;\r\n\t\t\t\t}\r\n\t\t\t\tcurrentFrz.cnt--;\r\n\r\n\t\t\t\t// 次フリーズアローへ判定を移すかチェック\r\n\t\t\t\tjudgeNextFunc[`${_name}${g_stateObj.autoAll}`](_j, _k, currentFrz.cnt);\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// 全体色変化 (ヒット時)\r\n\t\t\t\tchangeColorFunc[_name](_j, _k, `Hit`);\r\n\r\n\t\t\t\t// フリーズアローがヒット中の処理\r\n\t\t\t\tif (currentFrz.frzBarLength > 0) {\r\n\r\n\t\t\t\t\tcurrentFrz.frzBarLength -= movY * currentFrz.dir;\r\n\t\t\t\t\tcurrentFrz.barY -= movY * currentFrz.dividePos;\r\n\t\t\t\t\tcurrentFrz.btmY -= movY;\r\n\r\n\t\t\t\t\t$id(`${_name}Bar${frzNo}`).height = wUnit(currentFrz.frzBarLength);\r\n\t\t\t\t\t$id(`${_name}Bar${frzNo}`).top = wUnit(currentFrz.barY);\r\n\t\t\t\t\t$id(`${_name}BtmRoot${frzNo}`).top = wUnit(currentFrz.btmY);\r\n\r\n\t\t\t\t\tif (!checkKeyUpFunc[`${_name}${g_stateObj.autoAll}`](_j)) {\r\n\t\t\t\t\t\tcurrentFrz.keyUpFrame++;\r\n\t\t\t\t\t\tjudgeMotionFunc[`${_name}KeyUp`](_j, _k, frzName, currentFrz.cnt);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tjudgeMotionFunc[`${_name}OK`](_j, _k, frzName, currentFrz.cnt);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// フリーズアローが枠外に出たときの処理\r\n\t\t\tjudgeMotionFunc[`${_name}NG`](_j, _k, frzName, currentFrz.cnt);\r\n\r\n\t\t} else {\r\n\t\t\tcurrentFrz.frzBarLength -= movY * currentFrz.dir;\r\n\t\t\tif (currentFrz.frzBarLength > 0) {\r\n\t\t\t\tcurrentFrz.y -= movY;\r\n\t\t\t\t$id(frzName).top = wUnit(currentFrz.y);\r\n\t\t\t} else {\r\n\t\t\t\tjudgeObjDelete[_name](_j, frzName);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * フレーム処理(譜面台)\r\n\t */\r\n\tconst flowTimeline = () => {\r\n\r\n\t\tconst currentFrame = g_scoreObj.frameNum;\r\n\t\tlblframe.textContent = g_scoreObj.baseFrame;\r\n\r\n\t\t// キーの押下状態を取得\r\n\t\tfor (let j = 0; j < keyNum; j++) {\r\n\t\t\tfor (let m = 0; m < g_workObj.keyCtrlN[j].length; m++) {\r\n\t\t\t\tg_workObj.keyHitFlg[j][m] = keyIsDown(g_workObj.keyCtrlN[j][m]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (currentFrame === musicStartFrame) {\r\n\t\t\tmusicStartFlg = true;\r\n\r\n\t\t\t// ローカルかつBase64エンコード無し(WebAudioAPI使用不可)のときは従来通り再生\r\n\t\t\tif (!(g_audio instanceof AudioPlayer)) {\r\n\t\t\t\tmusicStartTime = performance.now();\r\n\t\t\t\tg_audio.play();\r\n\t\t\t\tg_audio.dispatchEvent(new CustomEvent(`timeupdate`));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 背景・マスクモーション、スキン変更\r\n\t\tg_animationData.filter(sprite => g_scoreObj[`${sprite}Data`][currentFrame] !== undefined)\r\n\t\t\t.forEach(sprite => g_animationFunc.drawMain[sprite](currentFrame, sprite));\r\n\r\n\t\t// フェードイン・アウト\r\n\t\tconst isFadeOutArea = currentFrame >= g_scoreObj.fadeOutFrame && currentFrame < g_scoreObj.fadeOutFrame + g_scoreObj.fadeOutTerm;\r\n\t\tif (g_audio.volume >= g_stateObj.volume / 100) {\r\n\t\t\tmusicStartFlg = false;\r\n\t\t}\r\n\t\tif (musicStartFlg) {\r\n\t\t\tg_audio.volume = Math.min((g_audio.volume + (3 * g_stateObj.volume / 100) / 1000), 1);\r\n\t\t} else if (isFadeOutArea) {\r\n\t\t\tg_audio.volume = Math.max((g_audio.volume - (3 * g_stateObj.volume / 100 * C_FRM_AFTERFADE / g_scoreObj.fadeOutTerm) / 1000), 0);\r\n\t\t}\r\n\r\n\t\t// 画面揺れの設定\r\n\t\tg_shakingFunc.get(g_stateObj.shaking)();\r\n\r\n\t\t// ユーザカスタムイベント(フレーム毎)\r\n\t\tg_customJsObj.mainEnterFrame.forEach(func => func());\r\n\r\n\t\t// 速度変化 (途中変速, 個別加速)\r\n\t\twhile (currentFrame >= g_workObj.speedData?.[speedCnts]) {\r\n\t\t\tg_workObj.currentSpeed = g_workObj.speedData[speedCnts + 1];\r\n\t\t\tspeedCnts += 2;\r\n\t\t}\r\n\t\twhile (currentFrame >= g_workObj.boostData?.[boostCnts]) {\r\n\t\t\tg_workObj.boostSpd = g_workObj.boostData[boostCnts + 1];\r\n\t\t\tg_workObj.boostDir = (g_workObj.boostSpd > 0 ? 1 : -1);\r\n\t\t\tboostCnts += 2;\r\n\t\t}\r\n\r\n\t\tobjList.forEach(header => {\r\n\t\t\tconst headerU = toCapitalize(header);\r\n\r\n\t\t\t// 個別・全体色変化 (矢印)\r\n\t\t\tg_typeLists.arrowColor.forEach(ctype =>\r\n\t\t\t\tchangeColors(g_workObj[`mk${headerU}Color${ctype}`]?.[currentFrame],\r\n\t\t\t\t\tg_workObj[`mk${headerU}Color${ctype}Cd`]?.[currentFrame], header, `arrow${ctype}`));\r\n\r\n\t\t\t// 個別・全体色変化（フリーズアロー）\r\n\t\t\tg_typeLists.frzColor.forEach(ctype =>\r\n\t\t\t\tchangeColors(g_workObj[`mk${headerU}FColor${ctype}`]?.[currentFrame],\r\n\t\t\t\t\tg_workObj[`mk${headerU}FColor${ctype}Cd`]?.[currentFrame], header, `frz${ctype}`));\r\n\r\n\t\t\t// 矢印モーション\r\n\t\t\tchangeCssMotions(header, `arrow`, currentFrame);\r\n\r\n\t\t\t// フリーズアローモーション\r\n\t\t\tchangeCssMotions(header, `frz`, currentFrame);\r\n\r\n\t\t});\r\n\r\n\t\t// キー変化\r\n\t\twhile (currentFrame >= g_scoreObj.keychFrames[keychCnts]) {\r\n\t\t\tfor (let j = 0; j < keyNum; j++) {\r\n\t\t\t\tappearKeyTypes(j, g_scoreObj.keychTarget[keychCnts], g_scoreObj.keychTargetAlpha[keychCnts]);\r\n\t\t\t}\r\n\t\t\tkeychCnts++;\r\n\t\t}\r\n\r\n\t\t// スクロール変化\r\n\t\tchangeScrollArrowDirs(currentFrame);\r\n\t\tchangeStepY(currentFrame);\r\n\r\n\t\t// ダミー矢印生成（背面に表示するため先に処理）\r\n\t\tg_workObj.mkDummyArrow?.[currentFrame]?.forEach(data =>\r\n\t\t\tmakeArrow(data, ++dummyArrowCnts[data.pos], `dummyArrow`, g_workObj.dummyArrowColors[data.pos], g_workObj.dummyArrowShadowColors[data.pos]));\r\n\r\n\t\t// 矢印生成\r\n\t\tg_workObj.mkArrow[currentFrame]?.forEach(data =>\r\n\t\t\tmakeArrow(data, ++arrowCnts[data.pos], `arrow`, g_workObj.arrowColors[data.pos], g_workObj.arrowShadowColors[data.pos]));\r\n\r\n\t\t// ダミーフリーズアロー生成\r\n\t\tg_workObj.mkDummyFrzArrow?.[currentFrame]?.forEach(data =>\r\n\t\t\tmakeFrzArrow(data, ++dummyFrzCnts[data.pos], `dummyFrz`, g_workObj.dummyFrzNormalColors[data.pos],\r\n\t\t\t\tg_workObj.dummyFrzNormalBarColors[data.pos], g_workObj.dummyFrzNormalShadowColors[data.pos]));\r\n\r\n\t\t// フリーズアロー生成\r\n\t\tg_workObj.mkFrzArrow[currentFrame]?.forEach(data =>\r\n\t\t\tmakeFrzArrow(data, ++frzCnts[data.pos], `frz`, g_workObj.frzNormalColors[data.pos],\r\n\t\t\t\tg_workObj.frzNormalBarColors[data.pos], g_workObj.frzNormalShadowColors[data.pos]));\r\n\r\n\t\t// 矢印・フリーズアロー移動＆消去\r\n\t\tfor (let j = 0; j < keyNum; j++) {\r\n\t\t\tconst stepDivHit = document.getElementById(`stepHit${j}`);\r\n\r\n\t\t\t// ダミー矢印\r\n\t\t\tfor (let k = g_workObj.judgDummyArrowCnt[j]; k <= dummyArrowCnts[j]; k++) {\r\n\t\t\t\tmovArrow(j, k, `dummyArrow`);\r\n\t\t\t}\r\n\r\n\t\t\t// 通常矢印\r\n\t\t\tfor (let k = g_workObj.judgArrowCnt[j]; k <= arrowCnts[j]; k++) {\r\n\t\t\t\tmovArrow(j, k, `arrow`);\r\n\t\t\t}\r\n\r\n\t\t\t// ダミーフリーズアロー移動\r\n\t\t\tfor (let k = g_workObj.judgDummyFrzCnt[j]; k <= dummyFrzCnts[j]; k++) {\r\n\t\t\t\tmovFrzArrow(j, k, `dummyFrz`);\r\n\t\t\t}\r\n\r\n\t\t\t// フリーズアロー移動\r\n\t\t\tfor (let k = g_workObj.judgFrzCnt[j]; k <= frzCnts[j]; k++) {\r\n\t\t\t\tmovFrzArrow(j, k, `frz`);\r\n\t\t\t}\r\n\r\n\t\t\t// ステップゾーンのヒット領域は一定時間で非表示化\r\n\t\t\tlet hitCnt = stepDivHit.getAttribute(`cnt`);\r\n\t\t\tif (hitCnt > 0) {\r\n\t\t\t\tstepDivHit.setAttribute(`cnt`, --hitCnt);\r\n\t\t\t\tif (hitCnt === 0) {\r\n\t\t\t\t\tstepDivHit.style.opacity = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 歌詞表示\r\n\t\tg_scoreObj.wordData[currentFrame]?.forEach(tmpObj => {\r\n\t\t\tg_wordObj.wordDir = tmpObj[0];\r\n\t\t\tg_wordObj.wordDat = tmpObj[1];\r\n\t\t\tg_wordSprite = document.getElementById(`lblword${g_wordObj.wordDir}`);\r\n\r\n\t\t\tconst wordDepth = Number(g_wordObj.wordDir);\r\n\t\t\tif (g_wordObj.wordDat.substring(0, 5) === `[fade`) {\r\n\r\n\t\t\t\t// フェードイン・アウト開始\r\n\t\t\t\tconst fkey = fadeFlgs[Object.keys(fadeFlgs).find(flg => g_wordObj.wordDat === `[${flg}]`)];\r\n\t\t\t\tg_wordObj[`fade${fkey[0]}Flg${wordDepth}`] = true;\r\n\t\t\t\tg_wordObj[`fade${fkey[1]}Flg${wordDepth}`] = false;\r\n\t\t\t\tg_wordSprite.style.animationName =\r\n\t\t\t\t\t`fade${fkey[0]}${(++g_workObj[`fade${fkey[0]}No`][wordDepth] % 2)}`;\r\n\r\n\t\t\t\tg_workObj.lastFadeFrame[wordDepth] = currentFrame;\r\n\t\t\t\tg_workObj.wordFadeFrame[wordDepth] = (tmpObj.length > 2 ?\r\n\t\t\t\t\tsetIntVal(tmpObj[2], C_WOD_FRAME) : C_WOD_FRAME);\r\n\r\n\t\t\t\tg_wordSprite.style.animationDuration = `${g_workObj.wordFadeFrame[wordDepth] / g_fps}s`;\r\n\t\t\t\tg_wordSprite.style.animationTimingFunction = `linear`;\r\n\t\t\t\tg_wordSprite.style.animationFillMode = `forwards`;\r\n\r\n\t\t\t} else if ([`[center]`, `[left]`, `[right]`].includes(g_wordObj.wordDat)) {\r\n\r\n\t\t\t\t// 歌詞位置変更\r\n\t\t\t\tg_wordSprite.style.textAlign = g_wordObj.wordDat.slice(1, -1);\r\n\r\n\t\t\t} else if (/\\[fontSize=\\d+\\]/.test(g_wordObj.wordDat)) {\r\n\r\n\t\t\t\t// フォントサイズ変更\r\n\t\t\t\tconst fontSize = setIntVal(g_wordObj.wordDat.match(/\\d+/)[0], g_limitObj.mainSiz);\r\n\t\t\t\tg_wordSprite.style.fontSize = wUnit(fontSize);\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// フェードイン・アウト処理後、表示する歌詞を表示\r\n\t\t\t\tconst fadingFlg = currentFrame - g_workObj.lastFadeFrame[wordDepth] >= g_workObj.wordFadeFrame[wordDepth];\r\n\t\t\t\t[`Out`, `In`].filter(pattern => g_wordObj[`fade${pattern}Flg${g_wordObj.wordDir}`] && fadingFlg).forEach(pattern => {\r\n\t\t\t\t\tg_wordSprite.style.animationName = `none`;\r\n\t\t\t\t\tg_wordObj[`fade${pattern}Flg${g_wordObj.wordDir}`] = false;\r\n\t\t\t\t});\r\n\t\t\t\tg_workObj[`word${g_wordObj.wordDir}Data`] = g_wordObj.wordDat;\r\n\t\t\t\tg_wordSprite.innerHTML = g_wordObj.wordDat;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// 判定キャラクタ消去\r\n\t\tjdgGroups.forEach(jdg => {\r\n\t\t\tlet charaJCnt = document.getElementById(`chara${jdg}`).getAttribute(`cnt`);\r\n\t\t\tif (charaJCnt > 0) {\r\n\t\t\t\tdocument.getElementById(`chara${jdg}`).setAttribute(`cnt`, --charaJCnt);\r\n\t\t\t\tif (charaJCnt === 0) {\r\n\t\t\t\t\tdocument.getElementById(`chara${jdg}`).textContent = ``;\r\n\t\t\t\t\tdocument.getElementById(`combo${jdg}`).textContent = ``;\r\n\t\t\t\t\tdocument.getElementById(`diff${jdg}`).textContent = ``;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// 曲終了判定\r\n\t\tif (currentFrame >= fullFrame) {\r\n\t\t\tif (g_stateObj.lifeMode === C_LFE_BORDER && g_workObj.lifeVal < g_workObj.lifeBorder) {\r\n\t\t\t\tg_gameOverFlg = true;\r\n\t\t\t}\r\n\t\t\tresetKeyControl();\r\n\t\t\tclearTimeout(g_timeoutEvtId);\r\n\t\t\tg_workObj.mainEndTime = thisTime;\r\n\t\t\tresultInit();\r\n\r\n\t\t} else if (g_workObj.lifeVal === 0 && g_workObj.lifeBorder === 0) {\r\n\r\n\t\t\t// ライフ制＆ライフ０の場合は途中終了\r\n\t\t\tg_audio.pause();\r\n\t\t\tclearTimeout(g_timeoutEvtId);\r\n\t\t\tg_gameOverFlg = true;\r\n\t\t\tg_finishFlg = false;\r\n\t\t\tresultInit();\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// タイマー\r\n\t\t\tif (Math.floor(g_scoreObj.baseFrame % g_fps) === 0) {\r\n\t\t\t\tif (g_scoreObj.baseFrame >= 0) {\r\n\t\t\t\t\tlblTime1.textContent = transFrameToTimer(g_scoreObj.baseFrame);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// 60fpsから遅延するため、その差分を取って次回のタイミングで遅れをリカバリする\r\n\t\t\tthisTime = performance.now();\r\n\t\t\tbuffTime = 0;\r\n\t\t\tif (g_audio instanceof AudioPlayer || currentFrame >= musicStartFrame) {\r\n\t\t\t\tbuffTime = (thisTime - musicStartTime - (currentFrame - musicStartFrame) * 1000 / g_fps);\r\n\t\t\t}\r\n\t\t\tg_scoreObj.frameNum++;\r\n\t\t\tg_scoreObj.baseFrame++;\r\n\t\t\tg_timeoutEvtId = setTimeout(flowTimeline, 1000 / g_fps - buffTime);\r\n\t\t}\r\n\t};\r\n\tg_skinJsObj.main.forEach(func => func());\r\n\r\n\tg_audio.currentTime = firstFrame / g_fps * g_headerObj.playbackRate;\r\n\tg_audio.playbackRate = g_headerObj.playbackRate;\r\n\r\n\t// WebAudioAPIが使用できる場合は小数フレーム分だけ音源位置を調整\r\n\tif (g_audio instanceof AudioPlayer) {\r\n\t\tconst musicStartAdjustment = (g_headerObj.blankFrame - g_stateObj.decimalAdjustment + 1) / g_fps;\r\n\t\tmusicStartTime = performance.now() + (musicStartAdjustment + g_scheduleLead) * 1000;\r\n\t\tg_audio.play(musicStartAdjustment);\r\n\t}\r\n\r\n\tg_timeoutEvtId = setTimeout(flowTimeline, 1000 / g_fps);\r\n};\r\n\r\n/**\r\n * ステップゾーン、フリーズアローヒット部分の生成\r\n * @param {number} _j \r\n * @param {string} _keyCtrlPtn \r\n */\r\nconst makeStepZone = (_j, _keyCtrlPtn) => {\r\n\r\n\tconst colorPos = g_keyObj[`color${_keyCtrlPtn}`][_j];\r\n\tconst stepSpriteJ = document.getElementById(`stepSprite${g_workObj.dividePos[_j]}`);\r\n\tconst frzHitSpriteJ = document.getElementById(`frzHitSprite${g_workObj.dividePos[_j]}`);\r\n\r\n\t// ステップゾーンルート\r\n\tconst stepRoot = createEmptySprite(stepSpriteJ, `stepRoot${_j}`, {\r\n\t\tx: g_workObj.stepX[_j], y: C_STEP_Y + g_posObj.reverseStepY * (g_workObj.dividePos[_j] % 2),\r\n\t\tw: C_ARW_WIDTH, h: C_ARW_WIDTH,\r\n\t});\r\n\r\n\t// 矢印の内側を塗りつぶすか否か\r\n\tif (g_headerObj.setShadowColor[colorPos] !== ``) {\r\n\t\tstepRoot.appendChild(\r\n\t\t\tcreateColorObject2(`stepShadow${_j}`, {\r\n\t\t\t\trotate: g_workObj.stepRtn[_j], styleName: `ShadowStep`,\r\n\t\t\t\topacity: 0.7, display: g_workObj.stepZoneDisp,\r\n\t\t\t}, g_cssObj.main_objStepShadow)\r\n\t\t);\r\n\t}\r\n\r\n\tappearStepZone(_j, C_DIS_NONE);\r\n\r\n\t// ステップゾーン\r\n\tmultiAppend(stepRoot,\r\n\r\n\t\t// 本体\r\n\t\tcreateColorObject2(`step${_j}`, {\r\n\t\t\trotate: g_workObj.stepRtn[_j], styleName: `Step`, display: g_workObj.stepZoneDisp,\r\n\t\t}, g_cssObj.main_stepDefault),\r\n\r\n\t\t// 空押し\r\n\t\tcreateColorObject2(`stepDiv${_j}`, {\r\n\t\t\trotate: g_workObj.stepRtn[_j], styleName: `Step`, display: C_DIS_NONE,\r\n\t\t}, g_cssObj.main_stepKeyDown),\r\n\r\n\t\t// ヒット時モーション\r\n\t\tcreateColorObject2(`stepHit${_j}`, Object.assign(g_lblPosObj.stepHit, {\r\n\t\t\trotate: g_workObj.stepHitRtn[_j], styleName: `StepHit`, opacity: 0,\r\n\t\t}), g_cssObj.main_stepDefault),\r\n\r\n\t);\r\n\r\n\t// フリーズアローヒット部分\r\n\tconst frzHit = createEmptySprite(frzHitSpriteJ, `frzHit${_j}`, {\r\n\t\tx: g_workObj.stepX[_j], y: C_STEP_Y + g_posObj.reverseStepY * (g_workObj.dividePos[_j] % 2),\r\n\t\tw: C_ARW_WIDTH, h: C_ARW_WIDTH, opacity: 0,\r\n\t});\r\n\tif (isNaN(parseFloat(g_workObj.arrowRtn[_j]))) {\r\n\t\tmultiAppend(frzHit,\r\n\t\t\tcreateColorObject2(`frzHitShadow${_j}`, {\r\n\t\t\t\trotate: g_workObj.arrowRtn[_j], styleName: `Shadow`,\r\n\t\t\t}, g_cssObj.main_objShadow),\r\n\t\t\tcreateColorObject2(`frzHitTop${_j}`, {\r\n\t\t\t\tbackground: g_workObj.frzHitColors[_j], rotate: g_workObj.arrowRtn[_j],\r\n\t\t\t})\r\n\t\t);\r\n\t} else {\r\n\t\tfrzHit.appendChild(\r\n\t\t\tcreateColorObject2(`frzHitTop${_j}`, Object.assign(g_lblPosObj.frzHitTop, {\r\n\t\t\t\trotate: g_workObj.arrowRtn[_j], styleName: `Shadow`,\r\n\t\t\t}), g_cssObj.main_frzHitTop)\r\n\t\t);\r\n\t}\r\n};\r\n\r\n/**\r\n * アルファマスクの再描画 (Appearance: Hidden+, Sudden+ 用)\r\n * @param {number} _num \r\n * @param {boolean} _shiftFlg シフトキーを押したかどうかのフラグ\r\n */\r\nconst changeAppearanceFilter = (_num = 10, _shiftFlg = keyIsShift()) => {\r\n\tconst MAX_FILTER_POS = 100;\r\n\tconst topNum = g_hidSudObj[g_stateObj.appearance];\r\n\tconst bottomNum = (g_hidSudObj[g_stateObj.appearance] + 1) % 2;\r\n\tif (g_stateObj.appearance === `Hid&Sud+` && _num > MAX_FILTER_POS / 2) {\r\n\t\t_num = MAX_FILTER_POS / 2;\r\n\t}\r\n\r\n\t// アルファマスクの位置設定\r\n\tconst numPlus = (g_stateObj.appearance === `Hid&Sud+` ? _num : 0);\r\n\tconst topShape = `inset(${_num}% 0% ${numPlus}% 0%)`;\r\n\tconst bottomShape = `inset(${numPlus}% 0% ${_num}% 0%)`;\r\n\r\n\t// フィルターバーの位置設定\r\n\tconst appearPers = [_num, MAX_FILTER_POS - _num];\r\n\tconst topDist = g_posObj.arrowHeight * appearPers[topNum] / MAX_FILTER_POS;\r\n\tconst bottomDist = g_posObj.arrowHeight * appearPers[bottomNum] / MAX_FILTER_POS;\r\n\r\n\tfor (let j = 0; j < g_stateObj.layerNum; j += 2) {\r\n\t\t$id(`arrowSprite${topNum + j}`).clipPath = topShape;\r\n\t\t$id(`arrowSprite${bottomNum + j}`).clipPath = bottomShape;\r\n\r\n\t\t$id(`filterBar${topNum + j}`).top = wUnit(parseFloat($id(`arrowSprite${j}`).top) + topDist);\r\n\t\t$id(`filterBar${bottomNum + j}`).top = wUnit(parseFloat($id(`arrowSprite${j + 1}`).top) + bottomDist);\r\n\r\n\t\tif (![`Default`, `Halfway`].includes(g_stateObj.stepArea)) {\r\n\t\t\t$id(`filterBar${bottomNum + j}_HS`).top = wUnit(parseFloat($id(`arrowSprite${j}`).top) + bottomDist);\r\n\t\t\t$id(`filterBar${topNum + j}_HS`).top = wUnit(parseFloat($id(`arrowSprite${j + 1}`).top) + topDist);\r\n\t\t}\r\n\r\n\t\t// 階層が多い場合はShift+pgUp/pgDownで表示する階層グループを切り替え\r\n\t\tif (_shiftFlg && g_stateObj.d_filterline === C_FLG_ON) {\r\n\t\t\t[`${topNum + j}`, `${bottomNum + j}`].forEach(type => {\r\n\t\t\t\tconst displayState = (j === g_workObj.aprFilterCnt ? C_DIS_INHERIT : C_DIS_NONE);\r\n\t\t\t\t$id(`filterBar${type}`).display = displayState;\r\n\r\n\t\t\t\tif (![`Default`, `Halfway`].includes(g_stateObj.stepArea)) {\r\n\t\t\t\t\t$id(`filterBar${type}_HS`).display = displayState;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tif (_shiftFlg) {\r\n\t\tg_workObj.aprFilterCnt = nextPos(g_workObj.aprFilterCnt, 2, g_stateObj.layerNum);\r\n\t}\r\n\r\n\tif (g_appearanceRanges.includes(g_stateObj.appearance)) {\r\n\t\t$id(`filterView`).top =\r\n\t\t\t$id(`filterBar${(g_hidSudObj.std[g_stateObj.appearance][g_stateObj.reverse]) % 2}`).top;\r\n\t\tfilterView.textContent = `${_num}%`;\r\n\r\n\t\t// スクロールが1種類でHidden+/Sudden+の場合、対面のフィルターバーは不要なため非表示にする\r\n\t\tif (g_stateObj.appearance !== `Hid&Sud+` && g_workObj.dividePos.every(v => v === g_workObj.dividePos[0])) {\r\n\t\t\t$id(`filterBar${(g_hidSudObj.std[g_stateObj.appearance][g_stateObj.reverse] + 1) % 2}`).display = C_DIS_NONE;\r\n\t\t}\r\n\t\tg_hidSudObj.filterPos = _num;\r\n\t}\r\n};\r\n\r\n/**\r\n * 判定カウンタ表示作成\r\n * @param {string} _id \r\n * @param {number} _x\r\n * @param {string} _class \r\n * @param {number} _heightPos \r\n * @param {string|number} _text\r\n * @param {string} [_display='inherit'] 表示有無 (inherit: 表示 / none: 非表示)\r\n * @returns {HTMLDivElement}\r\n */\r\nconst makeCounterSymbol = (_id, _x, _class, _heightPos, _text, _display = C_DIS_INHERIT) => {\r\n\treturn createDivCss2Label(_id, _text, {\r\n\t\tx: _x, y: g_limitObj.jdgCntsHeight * _heightPos,\r\n\t\tw: g_limitObj.jdgCntsWidth, h: g_limitObj.jdgCntsHeight, siz: g_limitObj.jdgCntsSiz, align: C_ALIGN_RIGHT,\r\n\t\tdisplay: _display,\r\n\t}, _class);\r\n};\r\n\r\n/**\r\n * ステップゾーンの表示・非表示切替\r\n * @param {number} _j\r\n * @param {string} _display\r\n * @param {number} [_alpha=1] \r\n */\r\nconst appearStepZone = (_j, _display, _alpha = 1) => {\r\n\t$id(`stepRoot${_j}`).display = _display;\r\n\t$id(`stepRoot${_j}`).opacity = _alpha;\r\n};\r\n\r\n/**\r\n * 部分キーのステップゾーン出現処理\r\n * @param {number} _j \r\n * @param {string[]} _targets\r\n * @param {number[]} [_alphas] ステップゾーン毎の可視状況 (style.opacity の値)\r\n */\r\nconst appearKeyTypes = (_j, _targets, _alphas = fillArray(_targets.length, 1)) => {\r\n\tappearStepZone(_j, C_DIS_NONE);\r\n\t_targets.forEach((target, k) => {\r\n\t\tif (g_workObj.keyGroupMaps[_j].includes(target)) {\r\n\t\t\tappearStepZone(_j, C_DIS_INHERIT, _alphas[k]);\r\n\t\t}\r\n\t});\r\n};\r\n\r\n/**\r\n * FrzReturnの追加処理\r\n * @param {number} _rad 回転角度\r\n * @param {number[]} _axis 回転軸\r\n */\r\nconst changeReturn = (_rad, _axis) => {\r\n\tg_workObj.frzReturnFlg = true;\r\n\tlet _transform = `rotate${_axis[0]}(${_rad}deg)`;\r\n\tif (_axis[1] !== undefined) {\r\n\t\t_transform += ` rotate${_axis[1]}(${_rad}deg)`;\r\n\t}\r\n\tif (document.getElementById(`mainSprite`) !== null) {\r\n\t\taddTransform(`mainSprite`, `frzReturn`, _transform);\r\n\r\n\t\tif (_rad < 360 && g_workObj.frzReturnFlg) {\r\n\t\t\tsetTimeout(() => changeReturn(_rad + 4, _axis), 20);\r\n\t\t} else {\r\n\t\t\taddTransform(`mainSprite`, `frzReturn`, ``);\r\n\t\t\tg_workObj.frzReturnFlg = false;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * AutoRetryの設定\r\n * @param {string} _retryCondition リトライ基準となるAutoRetry名\r\n */\r\nconst quickRetry = (_retryCondition) => {\r\n\tconst retryNum = g_settings.autoRetrys.findIndex(val => val === _retryCondition);\r\n\tif (retryNum < 0) {\r\n\t\treturn;\r\n\t}\r\n\tif (g_settings.autoRetryNum >= retryNum && !g_workObj.autoRetryFlg) {\r\n\t\tg_workObj.autoRetryFlg = true;\r\n\t\tsetTimeout(() => {\r\n\t\t\tg_audio.pause();\r\n\t\t\tclearTimeout(g_timeoutEvtId);\r\n\t\t\tclearWindow();\r\n\t\t\tmusicAfterLoaded();\r\n\t\t}, 16);\r\n\t}\r\n};\r\n\r\n/**\r\n * 個別・全体色変化\r\n * @param {number[]} _mkColor \r\n * @param {string[]} _mkColorCd \r\n * @param {string} _header\r\n * @param {string} _name\r\n */\r\nconst changeColors = (_mkColor, _mkColorCd, _header, _name) => {\r\n\r\n\tif (_mkColor === undefined) {\r\n\t\treturn;\r\n\t}\r\n\tconst camelHeader = _header === `` ? _name : `${_header}${toCapitalize(_name)}`;\r\n\t_mkColor.forEach((tempj, j) => {\r\n\t\tconst targetj = tempj % 1000;\r\n\t\tg_workObj[`${camelHeader}Colors`][targetj] = _mkColorCd[j];\r\n\t\tif (tempj >= 1000) {\r\n\t\t\tg_workObj[`${camelHeader}ColorsAll`][targetj] = _mkColorCd[j];\r\n\t\t\tif (camelHeader.indexOf(`frzHitBar`) !== -1 && isNaN(Number(g_workObj.arrowRtn[targetj]))) {\r\n\t\t\t\t$id(`frzHitTop${targetj}`).background = _mkColorCd[j];\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n};\r\n\r\n/**\r\n * 個別モーション\r\n * @param {string} _header\r\n * @param {string} _name\r\n * @param {number} _frameNum\r\n */\r\nconst changeCssMotions = (_header, _name, _frameNum) => {\r\n\tconst camelHeader = _header === `` ? _name : `${_header}${toCapitalize(_name)}`;\r\n\tg_workObj[`mk${toCapitalize(camelHeader)}CssMotion`]?.[_frameNum]?.forEach((targetj, j) =>\r\n\t\tg_workObj[`${camelHeader}CssMotions`][targetj] =\r\n\t\tg_workObj[`mk${toCapitalize(camelHeader)}CssMotionName`][_frameNum][2 * j + (g_workObj.dividePos[targetj] % 2)]);\r\n};\r\n\r\n/**\r\n * 基準となる階層グループの取得\r\n * @param {number} _layerGroup \r\n * @param {number} _j \r\n * @returns {number}\r\n */\r\nconst getBaseLayerGroup = (_layerGroup, _j) =>\r\n\t_layerGroup === -1\r\n\t\t? Math.floor(g_workObj.dividePosDefault[_j] / 2)\r\n\t\t: _layerGroup + (g_workObj.dividePosDefault[_j] > g_stateObj.layerNumDf ? g_stateObj.layerNumDf / 2 : 0);\r\n\r\n/**\r\n * スクロール方向、レイヤーの変更（矢印・フリーズアロー）\r\n * StepAreaがDefault/Halfway以外の場合はレイヤー数が倍化するため、その設定にも追従する\r\n * @param {number} _frameNum \r\n */\r\nconst changeScrollArrowDirs = (_frameNum) => {\r\n\tif (g_workObj.mkScrollchArrow?.[_frameNum] === undefined) {\r\n\t\treturn;\r\n\t}\r\n\tconst tmpObj = new Map();\r\n\tg_workObj.mkScrollchArrow?.[_frameNum]?.forEach((targetj, j) => {\r\n\t\tg_workObj.scrollDir[targetj] = g_workObj.scrollDirDefault[targetj] * g_workObj.mkScrollchArrowDir[_frameNum][j];\r\n\r\n\t\t// レイヤー変更\r\n\t\tconst baseLayer = getBaseLayerGroup(g_workObj.mkScrollchArrowLayerGroup[_frameNum][j], targetj);\r\n\t\tg_workObj.dividePos[targetj] = baseLayer * 2 + (g_workObj.scrollDir[targetj] === 1 ? 0 : 1);\r\n\r\n\t\t// 対象の矢印が属するレイヤーに対するTransitionを設定\r\n\t\t// ステップゾーンの移動よりも矢印・フリーズアローの方が早く変わるため、この関数のみ適用\r\n\t\tif (g_workObj.mkScrollchArrowLayerTrans[_frameNum][j] !== ``) {\r\n\t\t\ttmpObj.set(g_workObj.dividePos[targetj], g_workObj.mkScrollchArrowLayerTrans[_frameNum][j]);\r\n\t\t}\r\n\t});\r\n\ttmpObj.forEach((val, key, map) => addTransform(`mainSprite${key}`, `scrollch`, val));\r\n};\r\n\r\n/**\r\n * ステップゾーンの位置反転\r\n * @param {number} _frameNum \r\n */\r\nconst changeStepY = (_frameNum) =>\r\n\tg_workObj.mkScrollchStep?.[_frameNum]?.forEach((targetj, j) => {\r\n\t\tconst dividePos = (g_workObj.scrollDirDefault[targetj] * g_workObj.mkScrollchStepDir[_frameNum][j] === 1 ? 0 : 1);\r\n\r\n\t\t// 移動元のステップゾーンの不透明度、表示・非表示を退避\r\n\t\tconst _stepOpacity = $id(`stepRoot${targetj}`).opacity;\r\n\t\tconst _stepDisplay = $id(`stepRoot${targetj}`).display;\r\n\r\n\t\t// 移動元のステップゾーンを消去\r\n\t\tdocument.getElementById(`stepRoot${targetj}`).remove();\r\n\t\tdocument.getElementById(`frzHit${targetj}`).remove();\r\n\r\n\t\t// レイヤーを変更しステップゾーンを再生成。移動元の不透明度、表示・非表示を反映\r\n\t\tconst baseLayer = getBaseLayerGroup(g_workObj.mkScrollchStepLayerGroup[_frameNum][j], targetj);\r\n\t\tg_workObj.dividePos[targetj] = baseLayer * 2 + dividePos;\r\n\t\tmakeStepZone(targetj, `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`);\r\n\t\tappearStepZone(targetj, _stepDisplay, _stepOpacity);\r\n\t});\r\n\r\n/**\r\n * フリーズアローヒット時の描画変更\r\n * @param {number} _j \r\n * @param {number} _k \r\n * @param {string} _name\r\n * @param {number} [_difFrame=0]\r\n */\r\nconst changeHitFrz = (_j, _k, _name, _difFrame = 0) => {\r\n\tconst frzNo = `${_j}_${_k}`;\r\n\tconst frzName = `${_name}${frzNo}`;\r\n\tconst currentFrz = g_attrObj[frzName];\r\n\r\n\tif (currentFrz.keyUpFrame !== 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst styfrzBar = $id(`${_name}Bar${frzNo}`);\r\n\tconst styfrzBtmRoot = $id(`${_name}BtmRoot${frzNo}`);\r\n\tconst styfrzBtm = $id(`${_name}Btm${frzNo}`);\r\n\tconst styfrzTopRoot = $id(`${_name}TopRoot${frzNo}`);\r\n\tconst styfrzBtmShadow = $id(`${_name}BtmShadow${frzNo}`);\r\n\r\n\t// フリーズアロー位置の修正（ステップゾーン上に来るように）\r\n\tconst delFrzLength = parseFloat($id(`stepRoot${_j}`).top) - currentFrz.y;\r\n\t$id(frzName).top = $id(`stepRoot${_j}`).top;\r\n\r\n\t// 早押ししたboostCnt分のフリーズアロー終端位置の修正\r\n\tconst delFrzMotionLength = sumData(g_workObj.motionOnFrames.slice(0, currentFrz.boostCnt + 1));\r\n\r\n\t// 判定位置調整分の補正\r\n\tconst hitPos = g_workObj.hitPosition * g_workObj.scrollDir[_j];\r\n\r\n\tcurrentFrz.frzBarLength -= (delFrzLength + delFrzMotionLength) * currentFrz.dir;\r\n\tcurrentFrz.barY -= (delFrzLength + delFrzMotionLength) * currentFrz.dividePos + hitPos;\r\n\tcurrentFrz.btmY -= delFrzLength + delFrzMotionLength + hitPos;\r\n\tcurrentFrz.y += delFrzLength;\r\n\tcurrentFrz.isMoving = false;\r\n\r\n\t/**\r\n\t * フリーズアロー(ヒット時)の色変更\r\n\t * - 生成時以降で全体色変化がある場合はその値へ置き換える\r\n\t * @param {string} _type \r\n\t * @returns {string}\r\n\t */\r\n\tconst getColor = (_type) => {\r\n\t\tconst cColorAll = g_workObj[`${_name}${_type}ColorsAll`][_j];\r\n\t\treturn currentFrz[_type] !== cColorAll && currentFrz[`${_type}All`] !== cColorAll\r\n\t\t\t? cColorAll : currentFrz[_type];\r\n\t};\r\n\r\n\tconst tmpHitColor = getColor(`Hit`);\r\n\tstyfrzBar.top = wUnit(currentFrz.barY);\r\n\tstyfrzBar.height = wUnit(currentFrz.frzBarLength);\r\n\tstyfrzBar.background = getColor(`HitBar`);\r\n\tstyfrzBtmRoot.top = wUnit(currentFrz.btmY);\r\n\tstyfrzBtm.background = tmpHitColor;\r\n\tstyfrzTopRoot.top = wUnit(- hitPos);\r\n\tif (_name === `frz`) {\r\n\t\tconst tmpShadowColor = getColor(`HitShadow`);\r\n\t\tstyfrzBtmShadow.background = tmpShadowColor === `Default` ? tmpHitColor : tmpShadowColor;\r\n\t\t$id(`frzHit${_j}`).opacity = 0.9;\r\n\t\t$id(`frzTop${frzNo}`).display = C_DIS_NONE;\r\n\t\tif (isNaN(parseFloat(g_workObj.arrowRtn[_j]))) {\r\n\t\t\t$id(`frzHitTop${_j}`).background = tmpHitColor;\r\n\t\t}\r\n\t}\r\n\r\n\t// FrzReturnの設定\r\n\tif (g_stateObj.frzReturn !== C_FLG_OFF) {\r\n\t\tif (!g_workObj.frzReturnFlg) {\r\n\t\t\tchangeReturn(4, g_frzReturnFunc.get(g_stateObj.frzReturn)());\r\n\t\t}\r\n\t}\r\n\tg_customJsObj[`judg_${_name}Hit`].forEach(func => func(_difFrame));\r\n};\r\n\r\n/**\r\n * フリーズアロー失敗時の描画変更\r\n * @param {number} _j \r\n * @param {number} _k \r\n */\r\nconst changeFailedFrz = (_j, _k) => {\r\n\tconst frzNo = `${_j}_${_k}`;\r\n\t$id(`frzHit${_j}`).opacity = 0;\r\n\t$id(`frzTop${frzNo}`).display = C_DIS_INHERIT;\r\n\t$id(`frzTop${frzNo}`).background = `#cccccc`;\r\n\t$id(`frzTopShadow${frzNo}`).background = `#333333`;\r\n\t$id(`frzBtmShadow${frzNo}`).background = `#333333`;\r\n\t$id(`frzBar${frzNo}`).background = `#999999`;\r\n\t$id(`frzBar${frzNo}`).opacity = 1;\r\n\t$id(`frzBtm${frzNo}`).background = `#cccccc`;\r\n\r\n\t// FrzReturnの設定\r\n\tif (g_stateObj.frzReturn !== C_FLG_OFF) {\r\n\t\tif (!g_workObj.frzReturnFlg) {\r\n\t\t\tchangeReturn(4, g_frzReturnFunc.get(g_stateObj.frzReturn)());\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * キーを押したかどうかを判定\r\n * @param {number} _keyCode \r\n * @returns {boolean}\r\n */\r\nconst keyIsDown = _keyCode => g_inputKeyBuffer[_keyCode];\r\n\r\n/**\r\n * 押したキーがシフトキーかどうかを判定\r\n * @returns {boolean}\r\n */\r\nconst keyIsShift = () => keyIsDown(g_kCdNameObj.shiftLKey) || keyIsDown(g_kCdNameObj.shiftRKey);\r\n\r\n/**\r\n * 矢印・フリーズアロー判定\r\n * @param {number} _j 対象矢印・フリーズアロー\r\n */\r\nconst judgeArrow = _j => {\r\n\r\n\tconst currentNo = g_workObj.judgArrowCnt[_j];\r\n\tconst arrowName = `arrow${_j}_${currentNo}`;\r\n\tconst currentArrow = g_attrObj[arrowName];\r\n\tconst existJudgArrow = document.getElementById(arrowName) !== null;\r\n\r\n\tconst fcurrentNo = g_workObj.judgFrzCnt[_j];\r\n\tconst frzName = `frz${_j}_${fcurrentNo}`;\r\n\tconst currentFrz = g_attrObj[frzName];\r\n\tconst existJudgFrz = document.getElementById(frzName) !== null;\r\n\r\n\tconst judgeTargetArrow = _difFrame => {\r\n\t\tconst _difCnt = Math.abs(_difFrame);\r\n\t\tconst stepHitTargetArrow = _resultJdg => {\r\n\t\t\tconst stepDivHit = document.getElementById(`stepHit${_j}`);\r\n\t\t\tstepDivHit.style.top = wUnit(currentArrow.prevY - parseFloat($id(`stepRoot${_j}`).top) - 15 + g_workObj.hitPosition * g_workObj.scrollDir[_j]);\r\n\t\t\tstepDivHit.style.opacity = 0.75;\r\n\t\t\tstepDivHit.classList.value = ``;\r\n\t\t\tstepDivHit.classList.add(g_cssObj[`main_step${_resultJdg}`]);\r\n\t\t\tstepDivHit.setAttribute(`cnt`, C_FRM_HITMOTION);\r\n\t\t}\r\n\r\n\t\tif (g_stateObj.excessive === C_FLG_ON && _difFrame <= g_judgObj.arrowJ[g_judgPosObj.uwan] && _difFrame > g_judgObj.arrowJ[g_judgPosObj.shobon]) {\r\n\t\t\t// 空押し判定（有効かつ早押し時のみ）\r\n\t\t\tdisplayDiff(_difFrame);\r\n\t\t\tstepHitTargetArrow(`Excessive`);\r\n\t\t\treturn true;\r\n\r\n\t\t} else if (_difCnt <= g_judgObj.arrowJ[g_judgPosObj.shobon]) {\r\n\t\t\t// 通常判定\r\n\t\t\tconst [resultFunc, resultJdg] = checkJudgment(_difCnt);\r\n\t\t\tresultFunc(_difFrame);\r\n\t\t\tdisplayDiff(_difFrame);\r\n\t\t\tstepHitTargetArrow(resultJdg);\r\n\t\t\tdocument.getElementById(arrowName).remove();\r\n\t\t\tg_workObj.judgArrowCnt[_j]++;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\r\n\tconst judgeTargetFrzArrow = _difFrame => {\r\n\t\tconst _difCnt = Math.abs(_difFrame);\r\n\t\tif (_difCnt <= g_judgObj.frzJ[g_judgPosObj.iknai] && !currentFrz.judgEndFlg\r\n\t\t\t&& g_workObj.judgFrzHitCnt[_j] <= fcurrentNo) {\r\n\r\n\t\t\tif (g_headerObj.frzStartjdgUse) {\r\n\t\t\t\tconst [resultFunc] = checkJudgment(_difCnt);\r\n\t\t\t\tresultFunc(_difFrame);\r\n\t\t\t\tdisplayDiff(_difFrame);\r\n\t\t\t} else {\r\n\t\t\t\tdisplayDiff(_difFrame, `F`);\r\n\t\t\t}\r\n\r\n\t\t\tif (_difCnt <= g_judgObj.frzJ[g_judgPosObj.sfsf]) {\r\n\t\t\t\tchangeHitFrz(_j, fcurrentNo, `frz`, _difFrame);\r\n\t\t\t} else {\r\n\t\t\t\tchangeFailedFrz(_j, fcurrentNo);\r\n\t\t\t\tif (g_headerObj.frzStartjdgUse) {\r\n\t\t\t\t\tjudgeIknai(_difFrame);\r\n\t\t\t\t\tcurrentFrz.judgEndFlg = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tg_workObj.judgFrzHitCnt[_j] = fcurrentNo + 1;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\r\n\tlet judgeFlg = false;\r\n\tconst difFrame = (existJudgArrow ? currentArrow.cnt : Infinity);\r\n\tconst frzDifFrame = (existJudgFrz ? currentFrz.cnt : Infinity);\r\n\tif (difFrame < frzDifFrame) {\r\n\t\tjudgeFlg = judgeTargetArrow(difFrame);\r\n\t} else if (difFrame > frzDifFrame) {\r\n\t\tjudgeFlg = judgeTargetFrzArrow(frzDifFrame);\r\n\t}\r\n\tif (!judgeFlg) {\r\n\t\t$id(`stepDiv${_j}`).display = C_DIS_INHERIT;\r\n\t}\r\n};\r\n\r\n/**\r\n * タイミングズレを表示\r\n * @param {number} _difFrame \r\n * @param {string} _fjdg フリーズアロー判定有無 (フリーズアローのときは\"F\"が入る)\r\n * @param {number} _justFrames Fast/Slowの表示条件フレーム数\r\n */\r\nconst displayDiff = (_difFrame, _fjdg = ``, _justFrames = g_headerObj.justFrames) => {\r\n\tlet diffJDisp = ``;\r\n\tg_workObj.diffList.push(_difFrame);\r\n\tconst difCnt = Math.abs(_difFrame);\r\n\tif (_difFrame > g_judgObj.arrowJ[g_judgPosObj.shobon]) {\r\n\t\tdiffJDisp = `<span class=\"common_excessive\">Excessive</span>`;\r\n\t\tg_resultObj.excessive++;\r\n\t\tlifeDamage(true);\r\n\t} else if (_difFrame > _justFrames) {\r\n\t\tdiffJDisp = `<span class=\"common_diffFast\">Fast ${difCnt} Frames</span>`;\r\n\t\tg_resultObj.fast++;\r\n\t\tquickRetry(`Fast/Slow`);\r\n\t} else if (_difFrame < _justFrames * (-1)) {\r\n\t\tdiffJDisp = `<span class=\"common_diffSlow\">Slow ${difCnt} Frames</span>`;\r\n\t\tg_resultObj.slow++;\r\n\t\tquickRetry(`Fast/Slow`);\r\n\t}\r\n\tdocument.getElementById(`diff${_fjdg}J`).innerHTML = diffJDisp;\r\n};\r\n\r\n/**\r\n * ライフゲージバーの色、数値を変更\r\n * @param {string} [_state=''] \r\n */\r\nconst changeLifeColor = (_state = ``) => {\r\n\tconst lblLife = document.getElementById(`lblLife`);\r\n\tconst lifeBar = document.getElementById(`lifeBar`);\r\n\tif (_state !== ``) {\r\n\t\tconst lifeCss = g_cssObj[`life_${_state}`];\r\n\t\tlblLife.classList.remove(g_cssObj.life_Max, g_cssObj.life_Cleared, g_cssObj.life_Failed);\r\n\t\tlifeBar.classList.remove(g_cssObj.life_Max, g_cssObj.life_Cleared, g_cssObj.life_Failed);\r\n\t\tlblLife.classList.add(lifeCss);\r\n\t\tlifeBar.classList.add(lifeCss);\r\n\t}\r\n\r\n\tconst intLifeVal = Math.floor(g_workObj.lifeVal);\r\n\tlblLife.textContent = intLifeVal;\r\n\tlifeBar.style.top = wUnit(50 + (g_headerObj.playingHeight - 100) * (g_headerObj.maxLifeVal - intLifeVal) / g_headerObj.maxLifeVal);\r\n\tlifeBar.style.height = wUnit((g_headerObj.playingHeight - 100) * intLifeVal / g_headerObj.maxLifeVal);\r\n};\r\n\r\n/**\r\n * ゲージ回復処理\r\n */\r\nconst lifeRecovery = () => {\r\n\tg_workObj.lifeVal += g_workObj.lifeRcv;\r\n\r\n\tif (g_workObj.lifeVal >= g_headerObj.maxLifeVal) {\r\n\t\tg_workObj.lifeVal = g_headerObj.maxLifeVal;\r\n\t\tchangeLifeColor(`Max`);\r\n\t} else {\r\n\t\tchangeLifeColor(g_workObj.lifeVal >= g_workObj.lifeBorder ? `Cleared` : ``);\r\n\t}\r\n\tg_resultObj.gaugeTransition.push([g_scoreObj.baseFrame, g_workObj.lifeVal]);\r\n};\r\n\r\n/**\r\n * ゲージダメージ処理\r\n * @param {boolean} [_excessive=false] 空押し判定有無\r\n */\r\nconst lifeDamage = (_excessive = false) => {\r\n\tg_workObj.lifeVal -= g_workObj.lifeDmg * (_excessive ? 0.25 : 1);\r\n\tquickRetry(`Miss`);\r\n\r\n\tif (g_workObj.lifeVal <= 0) {\r\n\t\tg_workObj.lifeVal = 0;\r\n\t\tchangeLifeColor();\r\n\t} else {\r\n\t\tchangeLifeColor(g_workObj.lifeVal < g_workObj.lifeBorder ? `Failed` : `Cleared`);\r\n\t}\r\n\tg_resultObj.gaugeTransition.push([g_scoreObj.baseFrame, g_workObj.lifeVal]);\r\n};\r\n\r\n/**\r\n * 判定キャラクタの表示、判定済矢印数・判定数のカウンタ\r\n * @param {string} _name \r\n * @param {string} _character \r\n * @param {string} [_fjdg=''] \r\n */\r\nconst changeJudgeCharacter = (_name, _character, _fjdg = ``) => {\r\n\tg_resultObj[_name]++;\r\n\tg_currentArrows++;\r\n\tdocument.getElementById(`chara${_fjdg}J`).innerHTML = `<span class=\"common_${_name}\">${_character}</span>`;\r\n\tdocument.getElementById(`chara${_fjdg}J`).setAttribute(`cnt`, C_FRM_JDGMOTION);\r\n\tdocument.getElementById(`lbl${toCapitalize(_name)}`).textContent = g_resultObj[_name];\r\n};\r\n\r\n/**\r\n * コンボの更新\r\n */\r\nconst updateCombo = () => {\r\n\tif (++g_resultObj.combo > g_resultObj.maxCombo) {\r\n\t\tg_resultObj.maxCombo = g_resultObj.combo;\r\n\t\tlblMCombo.textContent = g_resultObj.maxCombo;\r\n\t}\r\n\tcomboJ.textContent = `${g_resultObj.combo} Combo!!`;\r\n};\r\n\r\n/**\r\n * 回復判定の共通処理\r\n * @param {string} _name \r\n * @param {number} _difFrame \r\n */\r\nconst judgeRecovery = (_name, _difFrame) => {\r\n\tchangeJudgeCharacter(_name, g_lblNameObj[`j_${_name}`]);\r\n\tupdateCombo();\r\n\tlifeRecovery();\r\n\tfinishViewing();\r\n\r\n\tif (g_stateObj.freezeReturn !== C_FLG_OFF) {\r\n\t\tif ((g_resultObj.ii + g_resultObj.shakin) % 100 === 0 && !g_workObj.frzReturnFlg) {\r\n\t\t\tchangeReturn(1, g_frzReturnFunc.get(g_stateObj.frzReturn)());\r\n\t\t}\r\n\t}\r\n\tif (_name === `shakin`) {\r\n\t\tquickRetry(`Shakin(Great)`);\r\n\t}\r\n\tg_customJsObj[`judg_${_name}`].forEach(func => func(_difFrame));\r\n};\r\n\r\n/**\r\n * ダメージ系共通処理\r\n * @param {string} _name \r\n * @param {number} _difFrame \r\n */\r\nconst judgeDamage = (_name, _difFrame) => {\r\n\tchangeJudgeCharacter(_name, g_lblNameObj[`j_${_name}`]);\r\n\tg_resultObj.combo = 0;\r\n\tcomboJ.textContent = ``;\r\n\tdiffJ.textContent = ``;\r\n\tlifeDamage();\r\n\tg_customJsObj[`judg_${_name}`].forEach(func => func(_difFrame));\r\n};\r\n\r\n/**\r\n * 判定処理：イイ\r\n * @param {number} _difFrame \r\n */\r\nconst judgeIi = _difFrame => judgeRecovery(`ii`, _difFrame);\r\n\r\n/**\r\n * 判定処理：シャキン\r\n * @param {number} _difFrame \r\n */\r\nconst judgeShakin = _difFrame => judgeRecovery(`shakin`, _difFrame);\r\n\r\n/**\r\n * 判定処理：マターリ\r\n * @param {number} _difFrame \r\n */\r\nconst judgeMatari = _difFrame => {\r\n\tchangeJudgeCharacter(`matari`, g_lblNameObj.j_matari);\r\n\tcomboJ.textContent = ``;\r\n\tfinishViewing();\r\n\tquickRetry(`Matari(Good)`);\r\n\r\n\tg_customJsObj.judg_matari.forEach(func => func(_difFrame));\r\n};\r\n\r\n/**\r\n * 判定処理：ショボーン\r\n * @param {number} _difFrame \r\n */\r\nconst judgeShobon = _difFrame => judgeDamage(`shobon`, _difFrame);\r\n\r\n/**\r\n * 判定処理：ウワァン\r\n * @param {number} _difFrame \r\n */\r\nconst judgeUwan = _difFrame => judgeDamage(`uwan`, _difFrame);\r\n\r\n/**\r\n * 判定処理：キター\r\n * @param {number} _difFrame \r\n */\r\nconst judgeKita = _difFrame => {\r\n\tchangeJudgeCharacter(`kita`, g_lblNameObj.j_kita, `F`);\r\n\r\n\tif (++g_resultObj.fCombo > g_resultObj.fmaxCombo) {\r\n\t\tg_resultObj.fmaxCombo = g_resultObj.fCombo;\r\n\t\tlblFCombo.textContent = g_resultObj.fmaxCombo;\r\n\t}\r\n\tcomboFJ.textContent = `${g_resultObj.fCombo} Combo!!`;\r\n\r\n\tlifeRecovery();\r\n\tfinishViewing();\r\n\r\n\tg_customJsObj.judg_kita.forEach(func => func(_difFrame));\r\n};\r\n\r\n/**\r\n * 判定処理：イクナイ\r\n * @param {number} _difFrame \r\n */\r\nconst judgeIknai = _difFrame => {\r\n\tchangeJudgeCharacter(`iknai`, g_lblNameObj.j_iknai, `F`);\r\n\tcomboFJ.textContent = ``;\r\n\tg_resultObj.fCombo = 0;\r\n\r\n\tlifeDamage();\r\n\r\n\tg_customJsObj.judg_iknai.forEach(func => func(_difFrame));\r\n};\r\n\r\nconst jdgList = [`ii`, `shakin`, `matari`, `shobon`].map(jdg => toCapitalize(jdg));\r\nconst jdgFuncList = [judgeIi, judgeShakin, judgeMatari, judgeShobon];\r\nconst checkJudgment = (_difCnt) => {\r\n\tconst idx = g_judgObj.arrowJ.findIndex(jdgCnt => _difCnt <= jdgCnt);\r\n\treturn [jdgFuncList[idx], jdgList[idx]];\r\n};\r\n\r\n/**\r\n * クリア表示\r\n * @param {string} _state \r\n * @returns {string}\r\n */\r\nconst resultViewText = _state => _state === `` ? `` :\r\n\t`<span class=\"result_${toCapitalize(_state)}\">${g_lblNameObj[_state]}</span>`;\r\n\r\n/**\r\n * フルコンボ・パーフェクト演出の作成\r\n * @param {string} _text \r\n */\r\nconst makeFinishView = _text => {\r\n\tfinishView.innerHTML = _text;\r\n\tfinishView.style.opacity = 1;\r\n\t[`charaJ`, `comboJ`, `diffJ`, `charaFJ`, `comboFJ`, `diffFJ`].forEach(label =>\r\n\t\tdocument.getElementById(label).textContent = ``);\r\n};\r\n\r\nconst finishViewing = () => {\r\n\tif (g_currentArrows === g_fullArrows) {\r\n\t\tif (g_resultObj.ii + g_resultObj.kita === g_fullArrows) {\r\n\t\t\tg_resultObj.spState = `allPerfect`;\r\n\t\t} else if (g_resultObj.ii + g_resultObj.shakin + g_resultObj.kita === g_fullArrows) {\r\n\t\t\tg_resultObj.spState = `perfect`;\r\n\t\t} else if (g_resultObj.uwan === 0 && g_resultObj.shobon === 0 && g_resultObj.iknai === 0) {\r\n\t\t\tg_resultObj.spState = `fullCombo`;\r\n\t\t}\r\n\t\tif (g_headerObj.finishView !== C_DIS_NONE && [`allPerfect`, `perfect`, `fullCombo`].includes(g_resultObj.spState)) {\r\n\t\t\tmakeFinishView(resultViewText(g_resultObj.spState));\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/*-----------------------------------------------------------*/\r\n/* Scene : RESULT [grape] */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * リザルト画面初期化\r\n */\r\nconst resultInit = () => {\r\n\r\n\tclearWindow(true);\r\n\tg_currentPage = `result`;\r\n\r\n\t// 結果画面用フレーム初期化\r\n\tg_scoreObj.resultFrameNum = 0;\r\n\r\n\t// リザルトアニメーション用フレーム初期化、ループカウンター設定\r\n\tg_animationData.forEach(sprite => {\r\n\t\tg_scoreObj[`${sprite}ResultFrameNum`] = 0;\r\n\t\tg_scoreObj[`${sprite}ResultLoopCount`] = 0;\r\n\t});\r\n\r\n\tconst divRoot = document.getElementById(`divRoot`);\r\n\r\n\t// 曲時間制御変数\r\n\tlet thisTime;\r\n\tlet buffTime;\r\n\tlet resultStartTime = g_workObj.mainEndTime > 0 ? g_workObj.mainEndTime : performance.now();\r\n\r\n\tif (g_stateObj.d_background === C_FLG_OFF && g_headerObj.resultMotionSet) {\r\n\t} else {\r\n\t\t// ゲームオーバー時は失敗時のリザルトモーションを適用\r\n\t\tif (!g_finishFlg) {\r\n\t\t\tconst scoreIdHeader = setScoreIdHeader(g_stateObj.scoreId, g_stateObj.scoreLockFlg, false);\r\n\r\n\t\t\tg_animationData.forEach(sprite => {\r\n\t\t\t\tconst failedData = g_rootObj[`${sprite}failedS${scoreIdHeader}_data`] ?? g_rootObj[`${sprite}failedS_data`];\r\n\t\t\t\tif (failedData !== undefined) {\r\n\t\t\t\t\t[g_headerObj[`${sprite}ResultData`], g_headerObj[`${sprite}ResultMaxDepth`]] = g_animationFunc.make[sprite](failedData);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else if (g_gameOverFlg) {\r\n\t\t\tg_animationData.forEach(sprite => {\r\n\t\t\t\tg_headerObj[`${sprite}ResultData`] = g_headerObj[`${sprite}FailedData`].concat();\r\n\t\t\t\tg_headerObj[`${sprite}ResultMaxDepth`] = g_headerObj[`${sprite}FailedMaxDepth`];\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// diffListから適正Adjを算出（20個以下の場合は算出しない）\r\n\tconst getSign = _val => (_val > 0 ? `+` : ``);\r\n\tconst getDiffFrame = _val => `${getSign(_val)}${_val}${g_lblNameObj.frame}`;\r\n\tconst diffLength = g_workObj.diffList.length;\r\n\tconst bayesFunc = (_offset, _length) => {\r\n\t\tlet result = 0;\r\n\t\tfor (let j = _offset; j < _length; j++) {\r\n\t\t\tresult += (_length - j) * (j + 1) * g_workObj.diffList[j];\r\n\t\t}\r\n\t\treturn result;\r\n\t};\r\n\tconst bayesExVal = 6 * bayesFunc(0, diffLength) / (diffLength * (diffLength + 1) * (diffLength + 2));\r\n\tconst estimatedAdj = (diffLength <= 20 ? `` : Math.round((g_stateObj.adjustment / g_headerObj.playbackRate - bayesExVal) * 10) / 10);\r\n\r\n\t// 背景スプライトを作成\r\n\tcreateMultipleSprite(`backResultSprite`, g_headerObj.backResultMaxDepth);\r\n\r\n\t// タイトル文字描画\r\n\tdivRoot.appendChild(getTitleDivLabel(`lblTitle`, g_lblNameObj.result, 0, 15, `settings_Title`));\r\n\r\n\tconst playDataWindow = createEmptySprite(divRoot, `playDataWindow`, g_windowObj.playDataWindow, g_cssObj.result_PlayDataWindow);\r\n\tconst resultWindow = createEmptySprite(divRoot, `resultWindow`, g_windowObj.resultWindow);\r\n\r\n\tconst playingArrows = g_resultObj.ii + g_resultObj.shakin +\r\n\t\tg_resultObj.matari + g_resultObj.shobon + g_resultObj.uwan +\r\n\t\tg_resultObj.kita + g_resultObj.iknai;\r\n\r\n\t// スコア計算(一括)\r\n\tconst scoreTmp = Object.keys(g_pointAllocation).reduce(\r\n\t\t(score, name) => score + g_resultObj[name] * g_pointAllocation[name], 0);\r\n\r\n\tconst allScore = g_fullArrows * 10;\r\n\tconst resultScore = Math.round(scoreTmp / allScore * g_maxScore) || 0;\r\n\tg_resultObj.score = resultScore;\r\n\tconst allArrowsPlayed = playingArrows === g_fullArrows;\r\n\r\n\t// ランク計算\r\n\tlet rankMark = g_rankObj.rankMarkX;\r\n\tlet rankColor = g_rankObj.rankColorX;\r\n\tif (g_gameOverFlg) {\r\n\t\trankMark = g_rankObj.rankMarkF;\r\n\t\trankColor = g_rankObj.rankColorF;\r\n\t\tg_resultObj.spState = `failed`;\r\n\t} else if (allArrowsPlayed && g_stateObj.autoAll === C_FLG_OFF && !(g_headerObj.excessiveJdgUse && g_stateObj.excessive === C_FLG_OFF)) {\r\n\t\tif (g_resultObj.spState === ``) {\r\n\t\t\tg_resultObj.spState = `cleared`;\r\n\t\t}\r\n\t\tif (g_resultObj.spState === `perfect` || g_resultObj.spState === `allPerfect`) {\r\n\t\t\trankMark = g_rankObj[`rankMark${toCapitalize(g_resultObj.spState)}`];\r\n\t\t\trankColor = g_rankObj[`rankColor${toCapitalize(g_resultObj.spState)}`];\r\n\t\t} else {\r\n\t\t\tconst rPos = g_rankObj.rankRate.findIndex(rate => resultScore * 100 / g_maxScore >= rate);\r\n\t\t\trankMark = g_rankObj.rankMarks[rPos];\r\n\t\t\trankColor = g_rankObj.rankColor[rPos];\r\n\t\t}\r\n\t}\r\n\r\n\t// 曲名・オプション描画\r\n\tconst playbackView = (g_headerObj.playbackRate === 1 ? `` : ` [Rate:${g_headerObj.playbackRate}]`);\r\n\tconst musicTitle = (g_headerObj.musicTitles[g_headerObj.musicNos[g_stateObj.scoreId]] || g_headerObj.musicTitle) + playbackView;\r\n\r\n\tconst mTitleForView = [g_headerObj.musicTitleForView[0], (g_headerObj.musicTitleForView[1] || ``) + playbackView];\r\n\tif (g_headerObj.musicTitlesForView[g_headerObj.musicNos[g_stateObj.scoreId]] !== undefined) {\r\n\t\tmTitleForView.forEach((mTitle, j) =>\r\n\t\t\tmTitleForView[j] = g_headerObj.musicTitlesForView[g_headerObj.musicNos[g_stateObj.scoreId]][j] + (j === 1 ? playbackView : ``));\r\n\t}\r\n\r\n\tconst keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;\r\n\tconst transKeyName = getTransKeyName();\r\n\tconst orgShuffleFlg = g_keyObj[`shuffle${keyCtrlPtn}`].filter((shuffleGr, j) => shuffleGr !== g_keyObj[`shuffle${keyCtrlPtn}_0d`][j]).length === 0;\r\n\tconst shuffleName = `${getStgDetailName(g_stateObj.shuffle)}${!orgShuffleFlg && !g_stateObj.shuffle.endsWith(`+`) ? getStgDetailName('(S)') : ''}`;\r\n\r\n\t/**\r\n\t * プレイスタイルのカスタム有無\r\n\t * @param {string} _flg \r\n\t * @param {string|boolean} _defaultSet デフォルト値\r\n\t * @param {string} _displayText \r\n\t * @returns {string}\r\n\t */\r\n\tconst withOptions = (_flg, _defaultSet, _displayText = _flg) =>\r\n\t\t(_flg !== _defaultSet ? getStgDetailName(_displayText) : ``);\r\n\r\n\t// 譜面名の組み立て処理 (Ex: 9Akey / Normal-Leftless (maker) [X-Mirror])\r\n\tconst keyUnitName = getStgDetailName(getKeyUnitName(g_keyObj.currentKey));\r\n\tconst difDatas = [\r\n\t\t`${getKeyName(g_headerObj.keyLabels[g_stateObj.scoreId])}${transKeyName} ${keyUnitName} / ${g_headerObj.difLabels[g_stateObj.scoreId]}`,\r\n\t\t`${withOptions(g_autoPlaysBase.includes(g_stateObj.autoPlay), true, `-${getStgDetailName(g_stateObj.autoPlay)}${getStgDetailName('less')}`)}`,\r\n\t\t`${withOptions(g_headerObj.makerView, false, `(${g_headerObj.creatorNames[g_stateObj.scoreId]})`)}`,\r\n\t\t`${withOptions(g_stateObj.shuffle, C_FLG_OFF, `[${shuffleName}]`)}`\r\n\t];\r\n\tlet difData = difDatas.filter(value => value !== ``).join(` `);\r\n\tconst difDataForImage = difDatas.filter((value, j) => value !== `` && j !== 2).join(` `);\r\n\r\n\t// 設定の組み立て処理 (Ex: 4x, Brake, Reverse, Sudden+, NoRecovery)\r\n\tlet playStyleData = [\r\n\t\t`${g_stateObj.speed}${g_lblNameObj.multi}`,\r\n\t\twithOptions(g_stateObj.motion, C_FLG_OFF),\r\n\t\t`${withOptions(g_stateObj.reverse, C_FLG_OFF,\r\n\t\t\tgetStgDetailName(g_stateObj.scroll !== '---' ? 'R-' : 'Reverse'))}${withOptions(g_stateObj.scroll, '---')}`,\r\n\t\twithOptions(g_stateObj.appearance, `Visible`),\r\n\t\twithOptions(g_stateObj.gauge, g_settings.gauges[0]),\r\n\t\twithOptions(g_stateObj.playWindow, `Default`),\r\n\t\twithOptions(g_stateObj.stepArea, `Default`),\r\n\t\twithOptions(g_stateObj.frzReturn, C_FLG_OFF, `FR:${g_stateObj.frzReturn}`),\r\n\t\twithOptions(g_stateObj.shaking, C_FLG_OFF),\r\n\t\twithOptions(g_stateObj.effect, C_FLG_OFF),\r\n\t\twithOptions(g_stateObj.camoufrage, C_FLG_OFF, `Cmf:${g_stateObj.camoufrage}`),\r\n\t\twithOptions(g_stateObj.swapping, C_FLG_OFF, `Swap:${g_stateObj.swapping}`),\r\n\t\twithOptions(g_stateObj.judgRange, `Normal`, `Judg:${g_stateObj.judgRange}`),\r\n\t].filter(value => value !== ``).join(`, `);\r\n\r\n\t// Display設定の組み立て処理 (Ex: Step : FlatBar, Judge, Life : OFF)\r\n\tlet displayData = [\r\n\t\twithOptions(g_stateObj.d_stepzone, C_FLG_ON, g_lblNameObj.rd_StepZone +\r\n\t\t\t`${g_stateObj.d_stepzone === C_FLG_OFF ? `` : ` : ${g_stateObj.d_stepzone}`}`),\r\n\t\twithOptions(g_stateObj.d_judgment, C_FLG_ON, g_lblNameObj.rd_Judgment),\r\n\t\twithOptions(g_stateObj.d_fastslow, C_FLG_ON, g_lblNameObj.rd_FastSlow),\r\n\t\twithOptions(g_stateObj.d_lifegauge, C_FLG_ON, g_lblNameObj.rd_LifeGauge),\r\n\t\twithOptions(g_stateObj.d_score, C_FLG_ON, g_lblNameObj.rd_Score),\r\n\t\twithOptions(g_stateObj.d_musicinfo, C_FLG_ON, g_lblNameObj.rd_MusicInfo),\r\n\t\twithOptions(g_stateObj.d_filterline, C_FLG_ON, g_lblNameObj.rd_FilterLine),\r\n\t].filter(value => value !== ``).join(`, `);\r\n\tif (displayData === ``) {\r\n\t\tdisplayData = `All Visible`;\r\n\t} else {\r\n\t\tif (!displayData.includes(`,`) && g_stateObj.d_stepzone !== C_FLG_OFF) {\r\n\t\t} else {\r\n\t\t\tdisplayData += ` : OFF`;\r\n\t\t}\r\n\t}\r\n\r\n\tlet display2Data = [\r\n\t\twithOptions(g_stateObj.d_speed, C_FLG_ON, g_lblNameObj.rd_Speed),\r\n\t\twithOptions(g_stateObj.d_color, C_FLG_ON, g_lblNameObj.rd_Color),\r\n\t\twithOptions(g_stateObj.d_lyrics, C_FLG_ON, g_lblNameObj.rd_Lyrics),\r\n\t\twithOptions(g_stateObj.d_background, C_FLG_ON, g_lblNameObj.rd_Background),\r\n\t\twithOptions(g_stateObj.d_arroweffect, C_FLG_ON, g_lblNameObj.rd_ArrowEffect),\r\n\t\twithOptions(g_stateObj.d_special, C_FLG_ON, g_lblNameObj.rd_Special),\r\n\t].filter(value => value !== ``).join(`, `);\r\n\tif (display2Data !== ``) {\r\n\t\tdisplay2Data += ` : OFF`;\r\n\t}\r\n\r\n\tconst [lblRX, dataRX] = [20, 60];\r\n\tmultiAppend(playDataWindow,\r\n\t\tmakeCssResultPlayData(`lblMusic`, lblRX, g_cssObj.result_lbl, 0, g_lblNameObj.rt_Music, C_ALIGN_LEFT),\r\n\t\tmakeCssResultPlayData(`lblMusicData`, dataRX, g_cssObj.result_style, 0, mTitleForView[0]),\r\n\t\tmakeCssResultPlayData(`lblMusicData2`, dataRX, g_cssObj.result_style, 1, mTitleForView[1]),\r\n\t\tmakeCssResultPlayData(`lblDifficulty`, lblRX, g_cssObj.result_lbl, 2, g_lblNameObj.rt_Difficulty, C_ALIGN_LEFT),\r\n\t\tmakeCssResultPlayData(`lblDifData`, dataRX, g_cssObj.result_style, 2, difData),\r\n\t\tmakeCssResultPlayData(`lblStyle`, lblRX, g_cssObj.result_lbl, 3, g_lblNameObj.rt_Style, C_ALIGN_LEFT),\r\n\t\tmakeCssResultPlayData(`lblStyleData`, dataRX, g_cssObj.result_style, 3, playStyleData),\r\n\t\tmakeCssResultPlayData(`lblDisplay`, lblRX, g_cssObj.result_lbl, 4, g_lblNameObj.rt_Display, C_ALIGN_LEFT),\r\n\t\tmakeCssResultPlayData(`lblDisplayData`, dataRX, g_cssObj.result_style, 4, displayData),\r\n\t\tmakeCssResultPlayData(`lblDisplay2Data`, dataRX, g_cssObj.result_style, 5, display2Data),\r\n\t);\r\n\r\n\t// 設定項目が多い場合に2行に分解して表示する処理\r\n\tlet playStyleBreakNum = lblStyleData.textContent.length;\r\n\tif (lblStyleData.textContent.length > 60) {\r\n\t\tfor (let j = Math.floor(lblStyleData.textContent.length / 2); j > 0; j--) {\r\n\t\t\tif (lblStyleData.textContent[j] === `,`) {\r\n\t\t\t\tplayStyleBreakNum = j + 2;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tlblStyleData.style.top = `${parseFloat(lblStyleData.style.top) - 3}px`;\r\n\t\tlblStyleData.innerHTML = `${lblStyleData.textContent.slice(0, playStyleBreakNum)}<br>` +\r\n\t\t\t`${lblStyleData.textContent.slice(playStyleBreakNum)}`;\r\n\t\tlblStyleData.style.fontSize = `${getFontSize2(lblStyleData.textContent.slice(0, playStyleBreakNum), 350, { maxSiz: 10 })}px`;\r\n\t} else {\r\n\t\tlblStyleData.style.fontSize = `${getFontSize2(lblStyleData.textContent, 350)}px`;\r\n\t}\r\n\r\n\t/**\r\n\t * キャラクタ、スコア描画のID共通部、色CSS名、スコア変数名\r\n\t * @property {number} pos 表示位置(縦)\r\n\t * @property {string} id 表示用ラベルフッター\r\n\t * @property {string} color CSS用ラベルフッター\r\n\t * @property {string} label 表示名\r\n\t * @property {string} dfColor 表示する文字のカラーコード (リザルト画像で使用)\r\n\t */\r\n\tconst jdgScoreObj = {\r\n\t\tii: { pos: 0, id: `Ii`, color: `ii`, label: g_lblNameObj.j_ii, dfColor: `#66ffff`, },\r\n\t\tshakin: { pos: 1, id: `Shakin`, color: `shakin`, label: g_lblNameObj.j_shakin, dfColor: `#99ff99`, },\r\n\t\tmatari: { pos: 2, id: `Matari`, color: `matari`, label: g_lblNameObj.j_matari, dfColor: `#ff9966`, },\r\n\t\tshobon: { pos: 3, id: `Shobon`, color: `shobon`, label: g_lblNameObj.j_shobon, dfColor: `#ccccff`, },\r\n\t\tuwan: { pos: 4, id: `Uwan`, color: `uwan`, label: g_lblNameObj.j_uwan, dfColor: `#ff9999`, },\r\n\t\tkita: { pos: 5, id: `Kita`, color: `kita`, label: g_lblNameObj.j_kita, dfColor: `#ffff99`, },\r\n\t\tiknai: { pos: 6, id: `Iknai`, color: `iknai`, label: g_lblNameObj.j_iknai, dfColor: `#99ff66`, },\r\n\t\tmaxCombo: { pos: 7, id: `MCombo`, color: `combo`, label: g_lblNameObj.j_maxCombo, dfColor: `#ffffff`, },\r\n\t\tfmaxCombo: { pos: 8, id: `FCombo`, color: `combo`, label: g_lblNameObj.j_fmaxCombo, dfColor: `#ffffff`, },\r\n\t\tscore: { pos: 10, id: `Score`, color: `score`, label: g_lblNameObj.j_score, dfColor: `#ffffff`, },\r\n\t};\r\n\r\n\t// キャラクタ、スコア描画\r\n\tObject.keys(jdgScoreObj).forEach(score =>\r\n\t\tmultiAppend(resultWindow,\r\n\t\t\tmakeCssResultSymbol(`lbl${jdgScoreObj[score].id}`, 0, g_cssObj[`common_${jdgScoreObj[score].color}`], jdgScoreObj[score].pos, jdgScoreObj[score].label),\r\n\t\t\tmakeCssResultSymbol(`lbl${jdgScoreObj[score].id}S`, 50, g_cssObj.common_score, jdgScoreObj[score].pos, g_resultObj[score], C_ALIGN_RIGHT),\r\n\t\t));\r\n\tif (g_stateObj.autoAll === C_FLG_OFF) {\r\n\t\tconst [lblPosX, dataPosX] = [350, 260];\r\n\t\tmultiAppend(resultWindow,\r\n\t\t\tmakeCssResultSymbol(`lblFast`, lblPosX, g_cssObj.common_diffFast, 0, g_lblNameObj.j_fast),\r\n\t\t\tmakeCssResultSymbol(`lblSlow`, lblPosX, g_cssObj.common_diffSlow, 2, g_lblNameObj.j_slow),\r\n\t\t\tmakeCssResultSymbol(`lblFastS`, dataPosX, g_cssObj.score, 1, g_resultObj.fast, C_ALIGN_RIGHT),\r\n\t\t\tmakeCssResultSymbol(`lblSlowS`, dataPosX, g_cssObj.score, 3, g_resultObj.slow, C_ALIGN_RIGHT),\r\n\t\t);\r\n\t\tif (estimatedAdj !== ``) {\r\n\t\t\tmultiAppend(resultWindow,\r\n\t\t\t\tmakeCssResultSymbol(`lblAdj`, lblPosX, g_cssObj.common_estAdj, 4, g_lblNameObj.j_adj),\r\n\t\t\t\tmakeCssResultSymbol(`lblAdjS`, dataPosX, g_cssObj.score, 5, `${getDiffFrame(estimatedAdj)}`, C_ALIGN_RIGHT),\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (g_stateObj.excessive === C_FLG_ON) {\r\n\t\t\tmultiAppend(resultWindow,\r\n\t\t\t\tmakeCssResultSymbol(`lblExcessive`, lblPosX, g_cssObj.common_excessive, 6, g_lblNameObj.j_excessive),\r\n\t\t\t\tmakeCssResultSymbol(`lblExcessiveS`, dataPosX, g_cssObj.score, 7, g_resultObj.excessive, C_ALIGN_RIGHT),\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\t// ランク描画\r\n\tresultWindow.appendChild(\r\n\t\tcreateDivCss2Label(`lblRank`, rankMark, Object.assign(g_lblPosObj.lblRank, {\r\n\t\t\tcolor: rankColor, fontFamily: getBasicFont(`\"Bookman Old Style\"`),\r\n\t\t}))\r\n\t);\r\n\r\n\t// Cleared & Failed表示\r\n\tconst lblResultPre = createDivCss2Label(\r\n\t\t`lblResultPre`,\r\n\t\tresultViewText(g_gameOverFlg ? `failed` : `cleared`),\r\n\t\tObject.assign(g_lblPosObj.lblResultPre, {\r\n\t\t\tanimationDuration: (g_gameOverFlg ? `3s` : `2.5s`),\r\n\t\t\tanimationName: (g_gameOverFlg ? `upToDownFade` : `leftToRightFade`)\r\n\t\t}), g_cssObj.result_Cleared, g_cssObj.result_Window\r\n\t);\r\n\tdivRoot.appendChild(lblResultPre);\r\n\r\n\tdivRoot.appendChild(createDivCss2Label(`lblResultPre2`,\r\n\t\tresultViewText(g_gameOverFlg ? `failed` : (allArrowsPlayed ? g_resultObj.spState : ``)),\r\n\t\tg_lblPosObj.lblResultPre2, g_cssObj.result_Cleared));\r\n\r\n\t// プレイデータは Cleared & Failed に合わせて表示\r\n\tplayDataWindow.style.animationDuration = `3s`;\r\n\tplayDataWindow.style.animationName = `slowlyAppearing`;\r\n\r\n\tif (g_finishFlg && g_headerObj.resultDelayFrame > 0) {\r\n\t\tlblResultPre.style.animationDelay = `${g_headerObj.resultDelayFrame / g_fps}s`;\r\n\t\tplayDataWindow.style.animationDelay = `${g_headerObj.resultDelayFrame / g_fps}s`;\r\n\t}\r\n\r\n\t// ハイスコア差分計算\r\n\tconst assistFlg = (g_autoPlaysBase.includes(g_stateObj.autoPlay) ? `` : `-${g_stateObj.autoPlay}less`);\r\n\tconst mirrorName = (g_stateObj.shuffle.indexOf(`Mirror`) !== -1 ? `-${g_stateObj.shuffle}` : ``);\r\n\tlet scoreName = getStorageKeyName(g_headerObj.keyLabels[g_stateObj.scoreId], transKeyName, assistFlg, mirrorName, g_stateObj.scoreId);\r\n\r\n\tconst highscoreDfObj = {\r\n\t\tii: 0, shakin: 0, matari: 0, shobon: 0, uwan: 0,\r\n\t\tkita: 0, iknai: 0,\r\n\t\tmaxCombo: 0, fmaxCombo: 0, score: 0,\r\n\t};\r\n\r\n\tconst highscoreCondition = (g_stateObj.autoAll === C_FLG_OFF && g_headerObj.playbackRate === 1 &&\r\n\t\t(g_stateObj.shuffle === C_FLG_OFF || (mirrorName !== `` && orgShuffleFlg)));\r\n\tif (highscoreCondition) {\r\n\r\n\t\t// ハイスコア差分描画\r\n\t\tObject.keys(jdgScoreObj).filter(score => score !== `score`).forEach(score =>\r\n\t\t\tmultiAppend(resultWindow,\r\n\t\t\t\tmakeCssResultSymbol(`lbl${jdgScoreObj[score].id}L1`, C_RLT_BRACKET_L, g_cssObj.result_scoreHiBlanket, jdgScoreObj[score].pos, `(+`),\r\n\t\t\t\tmakeCssResultSymbol(`lbl${jdgScoreObj[score].id}LS`, C_RLT_HIDIF_X, g_cssObj.result_scoreHi, jdgScoreObj[score].pos, 0, C_ALIGN_RIGHT),\r\n\t\t\t\tmakeCssResultSymbol(`lbl${jdgScoreObj[score].id}L2`, C_RLT_BRACKET_R, g_cssObj.result_scoreHiBlanket, jdgScoreObj[score].pos, `)`),\r\n\t\t\t));\r\n\r\n\t} else {\r\n\t\tresultWindow.appendChild(makeCssResultSymbol(`lblAutoView`, 215, g_cssObj.result_noRecord, 4, `(No Record)`));\r\n\t\tconst lblAutoView = document.getElementById(`lblAutoView`);\r\n\t\tlblAutoView.style.fontSize = wUnit(20);\r\n\t}\r\n\r\n\t// ゲージ推移グラフの描画\r\n\tconst gaugeTransitionCanvas = document.createElement(`canvas`);\r\n\tgaugeTransitionCanvas.id = `graphGaugeTransition`;\r\n\tgaugeTransitionCanvas.width = g_limitObj.gaugeTransitionWidth;\r\n\tgaugeTransitionCanvas.height = g_limitObj.gaugeTransitionHeight;\r\n\r\n\tcreateEmptySprite(divRoot, `gaugeTransitionWindow`, g_windowObj.gaugeTransition, g_cssObj.result_PlayDataWindow).appendChild(gaugeTransitionCanvas);\r\n\r\n\tmultiAppend(divRoot,\r\n\t\tcreateCss2Button(`btnGaugeTransition`, `i`, () => true, {\r\n\t\t\tx: g_sWidth / 2 - 250, y: 185, w: 30, h: 30, siz: g_limitObj.jdgCharaSiz,\r\n\t\t\tresetFunc: () => changeGaugeTransition(), cxtFunc: () => changeGaugeTransition(),\r\n\t\t}, g_cssObj.button_Mini),\r\n\t);\r\n\tmultiAppend(gaugeTransitionWindow,\r\n\t\tcreateCss2Button(`btnGaugeTrL`, `<`, () => true, {\r\n\t\t\tx: -45, y: 35, w: 20, h: 30, siz: g_limitObj.jdgCharaSiz,\r\n\t\t\tresetFunc: () => moveCursor(keyIsShift() ? -10 : -1),\r\n\t\t}, g_cssObj.button_Setting),\r\n\t\tcreateCss2Button(`btnGaugeTrR`, `>`, () => true, {\r\n\t\t\tx: -25, y: 35, w: 20, h: 30, siz: g_limitObj.jdgCharaSiz,\r\n\t\t\tresetFunc: () => moveCursor(keyIsShift() ? 10 : 1),\r\n\t\t}, g_cssObj.button_Setting),\r\n\t);\r\n\tg_stateObj.gaugeTransitionViewFlg = false;\r\n\r\n\tconst changeGaugeTransition = () => {\r\n\t\tif (g_stateObj.gaugeTransitionViewFlg) {\r\n\t\t\tresultWindow.style.opacity = `1`;\r\n\t\t\tgaugeTransitionWindow.style.visibility = `hidden`;\r\n\t\t\tg_stateObj.gaugeTransitionViewFlg = false;\r\n\t\t} else {\r\n\t\t\tresultWindow.style.opacity = `0.3`;\r\n\t\t\tgaugeTransitionWindow.style.visibility = `visible`;\r\n\t\t\tg_stateObj.gaugeTransitionViewFlg = true;\r\n\t\t}\r\n\t};\r\n\r\n\tconst startFrame = g_detailObj.startFrame[g_stateObj.scoreId];\r\n\tlet playingFrame = g_detailObj.playingFrameWithBlank[g_stateObj.scoreId];\r\n\tif (playingFrame <= 0) {\r\n\t\tplayingFrame = 1;\r\n\t}\r\n\tconst transitionObj = { frame: [0], life: [g_workObj.lifeInit] };\r\n\r\n\tconst frame = transitionObj.frame;\r\n\tconst life = transitionObj.life;\r\n\tconst transitionData = g_resultObj.gaugeTransition;\r\n\r\n\tfor (let i = 0; i < transitionData?.length; i++) {\r\n\t\tframe.push(transitionData[i][0] - startFrame);\r\n\t\tlife.push(transitionData[i][1]);\r\n\t}\r\n\r\n\tframe.push(playingFrame);\r\n\tlife.push(life.at(-1));\r\n\r\n\tconst context = gaugeTransitionCanvas.getContext(`2d`);\r\n\tcontext.lineWidth = 2;\r\n\r\n\tconst drawGaugeGraph = () => {\r\n\t\tcontext.clearRect(0, 0, gaugeTransitionCanvas.width, gaugeTransitionCanvas.height);\r\n\r\n\t\tlet preX, preY;\r\n\t\tconst borderY = g_limitObj.gaugeTransitionHeight - g_workObj.lifeBorder * g_limitObj.gaugeTransitionHeight / g_headerObj.maxLifeVal;\r\n\r\n\t\tfor (let i = 0; i < frame.length; i++) {\r\n\t\t\tconst x = frame[i] * g_limitObj.gaugeTransitionWidth / playingFrame;\r\n\t\t\tconst y = g_limitObj.gaugeTransitionHeight - life[i] * g_limitObj.gaugeTransitionHeight / g_headerObj.maxLifeVal;\r\n\r\n\t\t\tif (i === 0) {\r\n\t\t\t\tcontext.beginPath();\r\n\t\t\t\tcontext.moveTo(x, y);\r\n\t\t\t} else {\r\n\t\t\t\tcontext.moveTo(preX, preY);\r\n\t\t\t\tcontext.lineTo(x, preY);\r\n\r\n\t\t\t\tif (life[i - 1] === 0 && life[i] === 0) {\r\n\t\t\t\t\tcontext.strokeStyle = g_graphColorObj.failed;\r\n\r\n\t\t\t\t} else if (life[i - 1] >= g_workObj.lifeBorder && life[i] >= g_workObj.lifeBorder) {\r\n\t\t\t\t\tcontext.lineTo(x, y);\r\n\t\t\t\t\tcontext.strokeStyle = g_graphColorObj.clear;\r\n\r\n\t\t\t\t} else if (life[i - 1] < g_workObj.lifeBorder && life[i] >= g_workObj.lifeBorder) {\r\n\t\t\t\t\tcontext.lineTo(x, borderY);\r\n\t\t\t\t\tcontext.strokeStyle = g_graphColorObj.failed;\r\n\t\t\t\t\tcontext.stroke();\r\n\t\t\t\t\tcontext.beginPath();\r\n\t\t\t\t\tcontext.moveTo(x, borderY);\r\n\t\t\t\t\tcontext.lineTo(x, y);\r\n\t\t\t\t\tcontext.strokeStyle = g_graphColorObj.clear;\r\n\r\n\t\t\t\t} else if (life[i - 1] >= g_workObj.lifeBorder && life[i] < g_workObj.lifeBorder) {\r\n\t\t\t\t\tcontext.lineTo(x, borderY);\r\n\t\t\t\t\tcontext.strokeStyle = g_graphColorObj.clear;\r\n\t\t\t\t\tcontext.stroke();\r\n\t\t\t\t\tcontext.beginPath();\r\n\t\t\t\t\tcontext.moveTo(x, borderY);\r\n\t\t\t\t\tcontext.lineTo(x, y);\r\n\t\t\t\t\tcontext.strokeStyle = g_graphColorObj.failed;\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcontext.lineTo(x, y);\r\n\t\t\t\t\tcontext.strokeStyle = g_graphColorObj.failed;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcontext.stroke();\r\n\t\t\t\tcontext.beginPath();\r\n\t\t\t}\r\n\t\t\tpreX = x;\r\n\t\t\tpreY = y;\r\n\t\t}\r\n\t}\r\n\tdrawGaugeGraph();\r\n\r\n\tlet cursorFrame = 0;   // 現在のカーソル位置（frame）\r\n\tconst moveCursor = (sec = 1) => {\r\n\t\tcursorFrame = Math.max(0, Math.min(playingFrame, cursorFrame + sec * g_fps));\r\n\t\tdrawOverlay();\r\n\t};\r\n\r\n\tconst frameToX = (_frame) => {\r\n\t\treturn _frame / playingFrame * gaugeTransitionCanvas.width;\r\n\t};\r\n\r\n\t// 既存のグラフを再描画しつつ縦線と時間を重ねる\r\n\tconst drawOverlay = () => {\r\n\t\t// 既存のグラフを再描画\r\n\t\tdrawGaugeGraph();\r\n\r\n\t\tconst ctx = context;\r\n\t\tconst x = frameToX(cursorFrame);\r\n\r\n\t\t// 縦線\r\n\t\tctx.beginPath();\r\n\t\tctx.moveTo(x, 0);\r\n\t\tctx.lineTo(x, gaugeTransitionCanvas.height);\r\n\t\tctx.strokeStyle = \"#009999\";\r\n\t\tctx.lineWidth = 1.5;\r\n\t\tctx.stroke();\r\n\r\n\t\t// 時間表示\r\n\t\tconst timer = transFrameToTimer(cursorFrame + startFrame);\r\n\t\tctx.font = `14px ${getBasicFont()}`;\r\n\t\tctx.fillStyle = \"#009999\";\r\n\t\tctx.textAlign = x > gaugeTransitionCanvas.width * 0.8 ? C_ALIGN_RIGHT : C_ALIGN_LEFT;\r\n\t\tctx.fillText(\r\n\t\t\t`${timer}`,\r\n\t\t\tx > gaugeTransitionCanvas.width * 0.8 ? x - 5 : x + 5,\r\n\t\t\tg_limitObj.gaugeTransitionHeight - 35\r\n\t\t);\r\n\t};\r\n\tdrawOverlay();\r\n\r\n\t// ユーザカスタムイベント(初期)\r\n\tconst currentDateTime = new Date().toLocaleString();\r\n\tg_customJsObj.result.forEach(func => func());\r\n\r\n\tif (highscoreCondition) {\r\n\r\n\t\t// 古いキー定義の情報を検索\r\n\t\tconst relatedKeys = Object.entries(g_keyObj.keyTransPattern)\r\n\t\t\t.filter(([key, value]) => value === g_headerObj.keyLabels[g_stateObj.scoreId])\r\n\t\t\t.map(([key]) => key);\r\n\r\n\t\t// 古いキー定義のスコアデータを現行キー定義に移行\r\n\t\tfor (const legacyKey of relatedKeys) {\r\n\t\t\tlet tmpScoreName = getStorageKeyName(\r\n\t\t\t\tlegacyKey, transKeyName, assistFlg, mirrorName, g_stateObj.scoreId\r\n\t\t\t);\r\n\t\t\tconst src = g_localStorage.highscores?.[tmpScoreName];\r\n\t\t\tif (!hasVal(src)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// 現行キー定義にスコアデータが存在しない場合、移行元のスコアデータをコピー\r\n\t\t\tif (!hasVal(g_localStorage.highscores?.[scoreName])) {\r\n\t\t\t\tg_localStorage.highscores[scoreName] = structuredClone(src);\r\n\t\t\t}\r\n\r\n\t\t\t// 古いキー定義は見つかった最初の1件のみ移行し、以降は削除\r\n\t\t\tdelete g_localStorage.highscores[tmpScoreName];\r\n\t\t}\r\n\r\n\t\tObject.keys(jdgScoreObj).filter(judge => judge !== ``)\r\n\t\t\t.forEach(judge => highscoreDfObj[judge] = g_resultObj[judge] -\r\n\t\t\t\t(scoreName in g_localStorage.highscores ? g_localStorage.highscores[scoreName][judge] : 0));\r\n\r\n\t\tif (g_stateObj.dataSaveFlg) {\r\n\r\n\t\t\tconst setScoreData = () => {\r\n\t\t\t\tg_localStorage.highscores[scoreName].dateTime = currentDateTime;\r\n\t\t\t\tg_localStorage.highscores[scoreName].rankMark = rankMark;\r\n\t\t\t\tg_localStorage.highscores[scoreName].rankColor = rankColor;\r\n\t\t\t\tg_localStorage.highscores[scoreName].playStyle = playStyleData;\r\n\r\n\t\t\t\tg_localStorage.highscores[scoreName].fast = g_resultObj.fast;\r\n\t\t\t\tg_localStorage.highscores[scoreName].slow = g_resultObj.slow;\r\n\t\t\t\tg_localStorage.highscores[scoreName].adj = estimatedAdj;\r\n\t\t\t\tg_localStorage.highscores[scoreName].excessive = g_stateObj.excessive === C_FLG_ON ?\r\n\t\t\t\t\tg_resultObj.excessive : `---`;\r\n\r\n\t\t\t\tif (g_presetObj.resultVals !== undefined) {\r\n\t\t\t\t\tObject.keys(g_presetObj.resultVals).forEach(key =>\r\n\t\t\t\t\t\tg_localStorage.highscores[scoreName][g_presetObj.resultVals[key]] = g_resultObj[g_presetObj.resultVals[key]]);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t// All Perfect時(かつスコアが同一時)はFast+Slowが最小のときに更新処理を行う\r\n\t\t\tif (rankMark === g_rankObj.rankMarkAllPerfect &&\r\n\t\t\t\tg_localStorage.highscores[scoreName]?.score === g_resultObj.score) {\r\n\t\t\t\tif (g_localStorage.highscores[scoreName].fast === undefined ||\r\n\t\t\t\t\tg_localStorage.highscores[scoreName].fast + g_localStorage.highscores[scoreName].slow >\r\n\t\t\t\t\tg_resultObj.fast + g_resultObj.slow) {\r\n\t\t\t\t\tsetScoreData();\r\n\t\t\t\t\tg_localStorage.highscores[scoreName].score = g_resultObj.score;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// ハイスコア更新時処理\r\n\t\t\tif (highscoreDfObj.score > 0) {\r\n\t\t\t\tif (g_localStorage.highscores[scoreName] === undefined) {\r\n\t\t\t\t\tg_localStorage.highscores[scoreName] = {};\r\n\t\t\t\t}\r\n\t\t\t\tObject.keys(jdgScoreObj).filter(judge => judge !== ``)\r\n\t\t\t\t\t.forEach(judge => g_localStorage.highscores[scoreName][judge] = g_resultObj[judge]);\r\n\t\t\t\tsetScoreData();\r\n\t\t\t}\r\n\r\n\t\t\t// クリアランプ点灯処理\r\n\t\t\tif (![``, `failed`, `cleared`].includes(g_resultObj.spState)) {\r\n\t\t\t\tg_localStorage.highscores[scoreName][g_resultObj.spState] = true;\r\n\t\t\t}\r\n\t\t\tconst isGameCompleted = !g_gameOverFlg && g_finishFlg;\r\n\t\t\tconst hasValidAccuracy = g_workObj.requiredAccuracy !== `----`;\r\n\t\t\tif (isGameCompleted && hasValidAccuracy && allArrowsPlayed) {\r\n\t\t\t\tif (g_localStorage.highscores[scoreName].clearLamps === undefined) {\r\n\t\t\t\t\tg_localStorage.highscores[scoreName].clearLamps = [];\r\n\t\t\t\t}\r\n\t\t\t\tg_localStorage.highscores[scoreName].clearLamps =\r\n\t\t\t\t\tmakeDedupliArray(g_localStorage.highscores[scoreName].clearLamps, [g_stateObj.gauge]);\r\n\t\t\t}\r\n\t\t\tlocalStorage.setItem(g_localStorageUrl, JSON.stringify(g_localStorage));\r\n\t\t}\r\n\r\n\t\t// ハイスコア差分値適用、ハイスコア部分作成\r\n\t\tObject.keys(jdgScoreObj).forEach(score => {\r\n\t\t\tconst jdgScore = jdgScoreObj[score];\r\n\t\t\tif (score === `score`) {\r\n\t\t\t\tmultiAppend(resultWindow,\r\n\t\t\t\t\tmakeCssResultSymbol(`lbl${jdgScore.id}L1`, C_RLT_BRACKET_L, `${highscoreDfObj.score > 0 ? g_cssObj.result_scoreHiPlus : g_cssObj.result_scoreHiBlanket}`,\r\n\t\t\t\t\t\tjdgScore.pos, `(${highscoreDfObj[score] >= 0 ? \"+\" : \"－\"}`),\r\n\t\t\t\t\tmakeCssResultSymbol(`lbl${jdgScore.id}LS`, C_RLT_HIDIF_X, `${highscoreDfObj.score > 0 ? g_cssObj.result_scoreHiPlus : g_cssObj.result_scoreHi}`,\r\n\t\t\t\t\t\tjdgScore.pos, Math.abs(highscoreDfObj[score]), C_ALIGN_RIGHT),\r\n\t\t\t\t\tmakeCssResultSymbol(`lbl${jdgScore.id}L2`, C_RLT_BRACKET_R, `${highscoreDfObj.score > 0 ? g_cssObj.result_scoreHiPlus : g_cssObj.result_scoreHiBlanket}`,\r\n\t\t\t\t\t\tjdgScore.pos, `)`),\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\tdocument.getElementById(`lbl${jdgScore.id}L1`).textContent = `(${highscoreDfObj[score] >= 0 ? \"+\" : \"－\"}`;\r\n\t\t\t\tdocument.getElementById(`lbl${jdgScore.id}LS`).textContent = Math.abs(highscoreDfObj[score]);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t}\r\n\r\n\t// X (Twitter)用リザルト\r\n\t// スコアを上塗りする可能性があるため、カスタムイベント後に配置\r\n\tconst hashTag = (hasVal(g_headerObj.hashTag) ? ` ${g_headerObj.hashTag}` : ``);\r\n\tconst keyUnitAbbName = keyUnitName.slice(0, 1) || ``;\r\n\tlet tweetDifData = `${getKeyName(g_headerObj.keyLabels[g_stateObj.scoreId])}${transKeyName}${getStgDetailName(keyUnitAbbName + '-')}${g_headerObj.difLabels[g_stateObj.scoreId]}${assistFlg}`;\r\n\tif (g_stateObj.shuffle !== `OFF`) {\r\n\t\ttweetDifData += `:${shuffleName}`;\r\n\t}\r\n\tconst twiturl = new URL(g_localStorageUrl);\r\n\ttwiturl.searchParams.append(`scoreId`, g_stateObj.scoreId);\r\n\tconst baseTwitUrl = g_isLocal ? `` : `${twiturl.toString()}`.replace(/[\\t\\n]/g, ``);\r\n\r\n\tconst tweetExcessive = (g_stateObj.excessive === C_FLG_ON) ? `(+${g_resultObj.excessive})` : ``;\r\n\r\n\tlet tweetFrzJdg = ``;\r\n\tlet tweetMaxCombo = `${g_resultObj.maxCombo}`;\r\n\tif (g_allFrz > 0) {\r\n\t\ttweetFrzJdg = `${g_resultObj.kita}-${g_resultObj.iknai}`;\r\n\t\ttweetMaxCombo += `-${g_resultObj.fmaxCombo}`;\r\n\t}\r\n\r\n\tconst resultParams = {\r\n\t\ttuning: g_headerObj.tuning,\r\n\t\thighscore: g_resultObj,\r\n\t\thashTag, musicTitle, tweetDifData, playStyleData, rankMark,\r\n\t\ttweetExcessive, tweetFrzJdg, tweetMaxCombo, baseTwitUrl\r\n\t};\r\n\tlet tweetResultTmp = makeResultText(g_headerObj.resultFormat, resultParams);\r\n\tlet resultCommonTmp = makeResultText(g_templateObj.resultFormatDf, resultParams);\r\n\r\n\tif (g_presetObj.resultVals !== undefined) {\r\n\t\tObject.keys(g_presetObj.resultVals).forEach(key =>\r\n\t\t\ttweetResultTmp = tweetResultTmp.split(`[${key}]`).join(g_resultObj[g_presetObj.resultVals[key]]));\r\n\t}\r\n\tconst resultText = `${unEscapeHtml(tweetResultTmp)}`;\r\n\tconst tweetResult = `${g_linkObj.x}?text=${encodeURIComponent(resultText)}`;\r\n\r\n\t/**\r\n\t * リザルト画像をCanvasで作成しクリップボードへコピー\r\n\t * @param {string} _msg \r\n\t */\r\n\tconst copyResultImageData = _msg => {\r\n\t\tconst tmpDiv = createEmptySprite(divRoot, `tmpDiv`, { x: 0, y: 0, w: g_sWidth, h: g_sHeight, pointerEvents: C_DIS_AUTO });\r\n\t\ttmpDiv.style.background = `#000000cc`;\r\n\t\tconst canvas = document.createElement(`canvas`);\r\n\t\tconst artistName = g_headerObj.artistNames[g_headerObj.musicNos[g_stateObj.scoreId]] || g_headerObj.artistName;\r\n\r\n\t\tcanvas.id = `resultImage`;\r\n\t\tcanvas.width = 400;\r\n\t\tcanvas.height = g_sHeight - 90;\r\n\t\tcanvas.style.left = wUnit((g_sWidth - canvas.width) / 2);\r\n\t\tcanvas.style.top = wUnit(20);\r\n\t\tcanvas.style.position = `absolute`;\r\n\r\n\t\tconst context = canvas.getContext(`2d`);\r\n\t\tconst drawText = (_text, { x = 30, dy = 0, hy, siz = 15, color = `#cccccc`, align = C_ALIGN_LEFT, font } = {}) => {\r\n\t\t\tcontext.font = `${wUnit(siz)} ${getBasicFont(font)}`;\r\n\t\t\tcontext.fillStyle = color;\r\n\t\t\tcontext.textAlign = align;\r\n\t\t\tcontext.fillText(_text, x, 35 + hy * 18 + dy);\r\n\t\t};\r\n\t\tmakeBgCanvas(context, { h: canvas.height });\r\n\r\n\t\tdrawText(`R`, { dy: -5, hy: 0, siz: 40, color: `#9999ff` });\r\n\t\tdrawText(`ESULT`, { x: 57, dy: -5, hy: 0, siz: 25 });\r\n\t\tdrawText(`${g_lblNameObj.dancing}${g_lblNameObj.star}${g_lblNameObj.onigiri}`,\r\n\t\t\t{ x: 280, dy: -15, hy: 0, siz: 20, color: `#999999`, align: C_ALIGN_CENTER });\r\n\t\tdrawText(unEscapeHtml(mTitleForView[0]), { hy: 1 });\r\n\t\tdrawText(unEscapeHtml(mTitleForView[1]), { hy: 2 });\r\n\t\tdrawText(`${getEmojiForCanvas(g_emojiObj.memo)} ${unEscapeHtml(g_headerObj.tuning)} / ${getEmojiForCanvas(g_emojiObj.musical)} ${unEscapeHtml(artistName)}`,\r\n\t\t\t{ hy: mTitleForView[1] !== `` ? 3 : 2, siz: 12 });\r\n\t\tdrawText(unEscapeHtml(difDataForImage), { hy: 4 });\r\n\r\n\t\tif (playStyleData.length > 60) {\r\n\t\t\tdrawText(playStyleData.slice(0, playStyleBreakNum), { hy: 5, siz: getFontSize2(playStyleData.slice(0, playStyleBreakNum), 370) });\r\n\t\t\tdrawText(playStyleData.slice(playStyleBreakNum), { hy: 6, siz: getFontSize2(playStyleData.slice(playStyleBreakNum), 370) });\r\n\t\t} else {\r\n\t\t\tdrawText(playStyleData, { hy: 5, siz: getFontSize2(lblStyleData.textContent, 370, { maxSiz: 15 }) });\r\n\t\t}\r\n\t\tObject.keys(jdgScoreObj).forEach(score => {\r\n\t\t\tdrawText(g_lblNameObj[`j_${score}`], { hy: 7 + jdgScoreObj[score].pos, color: jdgScoreObj[score].dfColor });\r\n\t\t\tdrawText(g_resultObj[score], { x: 200, hy: 7 + jdgScoreObj[score].pos, align: C_ALIGN_RIGHT });\r\n\t\t});\r\n\r\n\t\tif (highscoreCondition) {\r\n\t\t\tdrawText(`(${highscoreDfObj.score >= 0 ? '+' : '-'} ${Math.abs(highscoreDfObj.score)})`,\r\n\t\t\t\t{ x: 206, hy: 18, color: highscoreDfObj.score > 0 ? `#ffff99` : `#cccccc`, align: C_ALIGN_RIGHT });\r\n\t\t}\r\n\r\n\t\tif (g_stateObj.autoAll === C_FLG_OFF) {\r\n\t\t\tdrawText(g_lblNameObj.j_fast, { x: 240, hy: 7, color: `#ff9966` });\r\n\t\t\tdrawText(g_resultObj.fast, { x: 360, hy: 7, align: C_ALIGN_RIGHT });\r\n\t\t\tdrawText(g_lblNameObj.j_slow, { x: 240, hy: 8, color: `#ccccff` });\r\n\t\t\tdrawText(g_resultObj.slow, { x: 360, hy: 8, align: C_ALIGN_RIGHT });\r\n\t\t\tif (estimatedAdj !== ``) {\r\n\t\t\t\tdrawText(g_lblNameObj.j_adj, { x: 240, hy: 9, color: `#99ff99` });\r\n\t\t\t\tdrawText(getDiffFrame(estimatedAdj), { x: 360, hy: 9, align: C_ALIGN_RIGHT });\r\n\t\t\t}\r\n\t\t\tif (g_stateObj.excessive === C_FLG_ON) {\r\n\t\t\t\tdrawText(g_lblNameObj.j_excessive, { x: 240, hy: 10, color: `#ffff99` });\r\n\t\t\t\tdrawText(g_resultObj.excessive, { x: 360, hy: 10, align: C_ALIGN_RIGHT });\r\n\t\t\t}\r\n\t\t\tg_headerObj.resultValsView\r\n\t\t\t\t.filter(key => hasVal(g_resultObj[g_presetObj.resultVals[key]]))\r\n\t\t\t\t.forEach((key, j) => {\r\n\t\t\t\t\tdrawText(g_presetObj.resultVals[key], { x: 240, hy: j + 12, color: `#ffffff` });\r\n\t\t\t\t\tdrawText(g_resultObj[g_presetObj.resultVals[key]], { x: 360, hy: j + 12, align: C_ALIGN_RIGHT });\r\n\t\t\t\t});\r\n\t\t}\r\n\t\tdrawText(rankMark, { x: 240, hy: 18, siz: 50, color: rankColor, font: `\"Bookman Old Style\"` });\r\n\t\tdrawText(baseTwitUrl, { hy: 19, siz: 8 });\r\n\t\tdrawText(currentDateTime, { hy: 20 });\r\n\r\n\t\ttmpDiv.appendChild(canvas);\r\n\r\n\t\tconst viewResultImage = () => {\r\n\t\t\tif (document.getElementById(`tmpClose`) === null) {\r\n\t\t\t\tdivRoot.oncontextmenu = () => true;\r\n\t\t\t\tmakeLinkButton(tmpDiv, `Tmp`);\r\n\t\t\t\ttmpDiv.appendChild(createCss2Button(`tmpClose`, g_lblNameObj.b_close, () => true,\r\n\t\t\t\t\tObject.assign(g_lblPosObj.btnRsCopyClose, {\r\n\t\t\t\t\t\tresetFunc: () => {\r\n\t\t\t\t\t\t\ttmpDiv.removeChild(canvas);\r\n\t\t\t\t\t\t\tdivRoot.removeChild(tmpDiv);\r\n\t\t\t\t\t\t\tdivRoot.oncontextmenu = () => false;\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t}), g_cssObj.button_Back));\r\n\t\t\t\ttmpDiv.appendChild(createDescDiv(`resultImageDesc`, g_lblNameObj.resultImageDesc));\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\ttry {\r\n\t\t\tif (ClipboardItem === undefined) {\r\n\t\t\t\tthrow new Error(`error`);\r\n\t\t\t}\r\n\t\t\tif (keyIsShift()) {\r\n\t\t\t\tviewResultImage();\r\n\t\t\t} else {\r\n\t\t\t\t// Canvas の内容を PNG 画像として取得\r\n\t\t\t\tcanvas.toBlob(async blob => {\r\n\t\t\t\t\tawait navigator.clipboard.write([\r\n\t\t\t\t\t\tnew ClipboardItem({\r\n\t\t\t\t\t\t\t'image/png': blob\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t]);\r\n\t\t\t\t});\r\n\t\t\t\ttmpDiv.removeChild(canvas);\r\n\t\t\t\tdivRoot.removeChild(tmpDiv);\r\n\t\t\t\tmakeInfoWindow(_msg, `leftToRightFade`);\r\n\t\t\t}\r\n\r\n\t\t} catch (err) {\r\n\t\t\t// 画像をクリップボードへコピーできないときは代替で画像保存可能な画面を表示\r\n\t\t\tviewResultImage();\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * 音源、ループ処理の停止\r\n\t * @param {string} _id \r\n\t * @param {string} _name \r\n\t * @param {object} _posObj \r\n\t * @param {function} _func \r\n\t * @param {...any} _cssClass \r\n\t * @returns {HTMLDivElement}\r\n\t */\r\n\tconst resetCommonBtn = (_id, _name, _posObj, _func, _cssClass) =>\r\n\t\tcreateCss2Button(_id, _name, () => {\r\n\t\t\tif (g_finishFlg) {\r\n\t\t\t\tg_audio.pause();\r\n\t\t\t}\r\n\t\t\tclearTimeout(g_timeoutEvtId);\r\n\t\t\tclearTimeout(g_timeoutEvtResultId);\r\n\t\t}, Object.assign(_posObj, { resetFunc: () => _func() }), _cssClass);\r\n\r\n\t/**\r\n\t * 外部リンクボタンを作成\r\n\t * @param {object} _div \r\n\t * @param {string} _param \r\n\t */\r\n\tconst makeLinkButton = (_div = divRoot, _param = ``) => {\r\n\t\tmultiAppend(_div,\r\n\t\t\t// リザルトデータをX (Twitter)へ転送\r\n\t\t\tcreateCss2Button(`btnTweet${_param}`, g_lblNameObj.b_tweet, () => true, Object.assign(g_lblPosObj.btnRsTweet, {\r\n\t\t\t\tresetFunc: () => openLink(tweetResult),\r\n\t\t\t}), g_cssObj.button_Tweet),\r\n\r\n\t\t\t// Discordへのリンク\r\n\t\t\tcreateCss2Button(`btnGitter${_param}`, g_lblNameObj.b_gitter, () => true, Object.assign(g_lblPosObj.btnRsGitter, {\r\n\t\t\t\tresetFunc: () => openLink(g_linkObj.discord),\r\n\t\t\t}), g_cssObj.button_Discord),\r\n\t\t);\r\n\t}\r\n\r\n\t// ボタン描画\r\n\tmultiAppend(divRoot,\r\n\r\n\t\t// タイトル画面へ戻る\r\n\t\tresetCommonBtn(`btnBack`, g_lblNameObj.b_back, g_lblPosObj.btnRsBack, titleInit, g_cssObj.button_Back),\r\n\r\n\t\t// リザルトデータをクリップボードへコピー\r\n\t\tcreateCss2Button(`btnCopy`, g_lblNameObj.b_copy, () =>\r\n\t\t\tcopyTextToClipboard(keyIsShift() ?\r\n\t\t\t\tunEscapeHtml(resultCommonTmp) : resultText, g_msgInfoObj.I_0001),\r\n\t\t\tg_lblPosObj.btnRsCopy, g_cssObj.button_Setting),\r\n\t);\r\n\tmakeLinkButton();\r\n\tmultiAppend(divRoot,\r\n\t\t// リトライ\r\n\t\tresetCommonBtn(`btnRetry`, g_lblNameObj.b_retry, g_lblPosObj.btnRsRetry, loadMusic, g_cssObj.button_Reset),\r\n\r\n\t\tcreateCss2Button(`btnCopyImage`, g_emojiObj.camera, () => true,\r\n\t\t\tObject.assign(g_lblPosObj.btnRsCopyImage, {\r\n\t\t\t\tresetFunc: () => copyResultImageData(g_msgInfoObj.I_0001),\r\n\t\t\t}), g_cssObj.button_Default_NoColor),\r\n\t);\r\n\r\n\t// マスクスプライトを作成\r\n\tconst makeResultSprite = createMultipleSprite(`maskResultSprite`, g_headerObj.maskResultMaxDepth);\r\n\tmakeResultSprite.style.pointerEvents = g_headerObj.maskresultButton ? C_DIS_AUTO : C_DIS_NONE;\r\n\r\n\t// リザルトモーションの0フレーム対応\r\n\tg_animationData.filter(sprite => g_scoreObj[`${sprite}ResultFrameNum`] === 0 && g_headerObj[`${sprite}ResultData`][0] !== undefined)\r\n\t\t.forEach(sprite => {\r\n\t\t\tg_scoreObj[`${sprite}ResultFrameNum`] = g_animationFunc.draw[sprite](0, `result`, sprite);\r\n\t\t\tg_headerObj[`${sprite}ResultData`][0] = undefined;\r\n\t\t});\r\n\r\n\t/**\r\n\t * タイトルのモーション設定\r\n\t */\r\n\tconst flowResultTimeline = () => {\r\n\r\n\t\t// ユーザカスタムイベント(フレーム毎)\r\n\t\tg_customJsObj.resultEnterFrame.forEach(func => func());\r\n\r\n\t\t// 背景・マスクモーション、スキン変更\r\n\t\tdrawTitleResultMotion(g_currentPage);\r\n\r\n\t\t// リザルト画面移行後のフェードアウト処理\r\n\t\tif (g_scoreObj.fadeOutFrame >= g_scoreObj.frameNum) {\r\n\t\t\tif (g_scoreObj.frameNum >= g_scoreObj.fullFrame) {\r\n\t\t\t\tclearTimeout(g_timeoutEvtId);\r\n\t\t\t}\r\n\t\t\tg_scoreObj.frameNum++;\r\n\t\t} else {\r\n\t\t\tconst tmpVolume = (g_audio.volume - (3 * g_stateObj.volume / 100 * C_FRM_AFTERFADE / g_scoreObj.fadeOutTerm) / 1000);\r\n\t\t\tif (tmpVolume < 0) {\r\n\t\t\t\tg_audio.volume = 0;\r\n\t\t\t\tclearTimeout(g_timeoutEvtId);\r\n\t\t\t} else {\r\n\t\t\t\tg_audio.volume = tmpVolume;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthisTime = performance.now();\r\n\t\tbuffTime = thisTime - resultStartTime - g_scoreObj.resultFrameNum * 1000 / g_fps;\r\n\r\n\t\tg_scoreObj.resultFrameNum++;\r\n\t\tg_animationData.forEach(sprite => g_scoreObj[`${sprite}ResultFrameNum`]++);\r\n\t\tg_timeoutEvtResultId = setTimeout(flowResultTimeline, 1000 / g_fps - buffTime);\r\n\t};\r\n\tflowResultTimeline();\r\n\r\n\t// キー操作イベント（デフォルト）\r\n\tsetShortcutEvent(g_currentPage, () => true, { dfEvtFlg: true });\r\n\tdocument.oncontextmenu = () => true;\r\n\r\n\tg_skinJsObj.result.forEach(func => func());\r\n};\r\n\r\n/**\r\n * リザルトフォーマットの整形処理\r\n * @param {string} _format \r\n * @param {object} object フォーマット置き換え変数群\r\n * @param {string} object.hashTag ハッシュタグ\r\n * @param {string} object.musicTitle 曲名\r\n * @param {string} object.tweetDifData 譜面名\r\n * @param {string} object.tuning 製作者名\r\n * @param {string} object.rankMark ランク\r\n * @param {string} object.playStyleData プレイ設定\r\n * @param {object} object.highscore ハイスコア（判定別）\r\n * @param {string} object.tweetExcessive 空押し判定状況\r\n * @param {string} object.tweetFrzJdg フリーズアロー判定状況\r\n * @param {string} object.tweetMaxCombo コンボ数状況\r\n * @param {string} object.baseTwitUrl X投稿用URL\r\n * @returns {string}\r\n */\r\nconst makeResultText = (_format, {\r\n\thashTag, musicTitle, tweetDifData, tuning, rankMark, playStyleData,\r\n\thighscore, tweetExcessive, tweetFrzJdg, tweetMaxCombo, baseTwitUrl } = {}) =>\r\n\treplaceStr(_format, [\r\n\t\t[`[hashTag]`, hashTag],\r\n\t\t[`[musicTitle]`, musicTitle],\r\n\t\t[`[keyLabel]`, tweetDifData],\r\n\t\t[`[maker]`, tuning],\r\n\t\t[`[rank]`, rankMark],\r\n\t\t[`[score]`, highscore?.score],\r\n\t\t[`[playStyle]`, playStyleData],\r\n\t\t[`[arrowJdg]`, `${highscore?.ii}-${highscore?.shakin}-${highscore?.matari}-${highscore?.shobon}-${highscore?.uwan}${tweetExcessive}`],\r\n\t\t[`[frzJdg]`, tweetFrzJdg],\r\n\t\t[`[maxCombo]`, tweetMaxCombo],\r\n\t\t[`[url]`, baseTwitUrl]\r\n\t]);\r\n\r\n/**\r\n * 結果表示作成（曲名、オプション）\r\n * @param {string} _id \r\n * @param {number} _x\r\n * @param {string} _class \r\n * @param {number} _heightPos \r\n * @param {string} _text\r\n * @param {string} _align\r\n * @param {number} [object.w=400]\r\n * @param {number} [object.siz=g_limitObj.mainSiz]\r\n * @returns {HTMLDivElement}\r\n */\r\nconst makeCssResultPlayData = (_id, _x, _class, _heightPos, _text, _align = C_ALIGN_CENTER, { w = 400, siz = g_limitObj.mainSiz } = {}) =>\r\n\tcreateDivCss2Label(_id, _text, {\r\n\t\tx: _x, y: g_limitObj.setMiniSiz * _heightPos, w, h: g_limitObj.setMiniSiz, siz, align: _align,\r\n\t}, _class);\r\n\r\n/**\r\n * 結果表示作成（キャラクタ）\r\n * @param {string} _id \r\n * @param {number} _x\r\n * @param {string} _class\r\n * @param {number} _heightPos \r\n * @param {string} _text\r\n * @param {string} _align\r\n * @returns {HTMLDivElement}\r\n */\r\nconst makeCssResultSymbol = (_id, _x, _class, _heightPos, _text, _align = C_ALIGN_LEFT) =>\r\n\tmakeCssResultPlayData(_id, _x, _class, _heightPos, _text, _align, { w: 150, siz: g_limitObj.jdgCntsSiz });\r\n\r\n// ライセンス原文、以下は削除しないでください\r\n/*-----------------------------------------------------------*/\r\n/*\r\n\r\nMIT License\r\n\r\nCopyright (c) 2018 tickle\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n\r\n */\r\n/*-----------------------------------------------------------*/"]}