HWHHideButtonsExt

Extension for HeroWarsHelper script

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name             HWHHideButtonsExt
// @name:en          HWHHideButtonsExt
// @name:ru          HWHHideButtonsExt
// @namespace        HWHHideButtonsExt
// @version          1.8
// @description      Extension for HeroWarsHelper script
// @description:en   Extension for HeroWarsHelper script
// @description:ru   Расширение для скрипта HeroWarsHelper
// @author           Green
// @license          Copyright Green
// @icon             https://i.ibb.co/xtmhK7zS/icon.png
// @match            https://www.hero-wars.com/*
// @match            https://apps-1701433570146040.apps.fbsbx.com/*
// @run-at           document-start
// ==/UserScript==

(async function () {
	if (!this.HWHClasses) {
		console.log('%cObject for extension not found', 'color: red');
		return;
	}

    console.log('%cStart Extension ' + GM_info.script.name + ', v' + GM_info.script.version + ' by ' + GM_info.script.author, 'color: red');
    const { addExtentionName } = HWHFuncs;

    addExtentionName(GM_info.script.name, GM_info.script.version, GM_info.script.author);



    const { buttons, othersPopupButtons, i18nLangData, extintionsList} = HWHData;

    const { popup, confShow, setSaveVal, getSaveVal, I18N, getCheckBoxes } = HWHFuncs;

    const i18nLangDataEn = {
        HIDE_BUTTONS: 'Hide buttons',
        HIDE_BUTTONS_TITLE: 'Button settings in the "Others" section',
        HB_SELECT_BUTTONS:
          `Choose the buttons you want to hide <br>
          <span style="color: DeepSkyBlue;">The game will restart automatically to apply the changes</span>`,
        HB_APPLY: 'Apply',
        HB_OTHERS_SETTINGS:
          `<span style="color: White;">
			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" style="width: 22px;height: 22px;"><path d="M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z"></path></svg>
          </span>`,
        HB_GRAPHICS_SWITCH_ON_TITLE: 'Turn on game graphics',
        HB_GRAPHICS_SWITCH_OFF_TITLE: 'Turn off game graphics',
        HB_GRAPHICS_SWITCH_OFF:
          `<span style="color: Lime;">
			<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="22px" height="22px" viewBox="0 0 512 512" fill="currentColor" xml:space="preserve">
					<path d="M237.545,255.816c9.899,0,18.468-3.609,25.696-10.848c7.23-7.229,10.854-15.799,10.854-25.694V36.547
						c0-9.9-3.62-18.464-10.854-25.693C256.014,3.617,247.444,0,237.545,0c-9.9,0-18.464,3.621-25.697,10.854
						c-7.233,7.229-10.85,15.797-10.85,25.693v182.728c0,9.895,3.617,18.464,10.85,25.694
						C219.081,252.207,227.648,255.816,237.545,255.816z"/>
					<path d="M433.836,157.887c-15.325-30.642-36.878-56.339-64.666-77.084c-7.994-6.09-17.035-8.47-27.123-7.139
						c-10.089,1.333-18.083,6.091-23.983,14.273c-6.091,7.993-8.418,16.986-6.994,26.979c1.423,9.998,6.139,18.037,14.133,24.128
						c18.645,14.084,33.072,31.312,43.25,51.678c10.184,20.364,15.27,42.065,15.27,65.091c0,19.801-3.854,38.688-11.561,56.678
						c-7.706,17.987-18.13,33.544-31.265,46.679c-13.135,13.131-28.688,23.551-46.678,31.261c-17.987,7.71-36.878,11.57-56.673,11.57
						c-19.792,0-38.684-3.86-56.671-11.57c-17.989-7.71-33.547-18.13-46.682-31.261c-13.129-13.135-23.551-28.691-31.261-46.679
						c-7.708-17.99-11.563-36.877-11.563-56.678c0-23.026,5.092-44.724,15.274-65.091c10.183-20.364,24.601-37.591,43.253-51.678
						c7.994-6.095,12.703-14.133,14.133-24.128c1.427-9.989-0.903-18.986-6.995-26.979c-5.901-8.182-13.844-12.941-23.839-14.273
						c-9.994-1.332-19.085,1.049-27.268,7.139c-27.792,20.745-49.344,46.442-64.669,77.084c-15.324,30.646-22.983,63.288-22.983,97.927
						c0,29.697,5.806,58.054,17.415,85.082c11.613,27.028,27.218,50.34,46.826,69.948c19.602,19.603,42.919,35.215,69.949,46.815
						c27.028,11.615,55.388,17.426,85.08,17.426c29.693,0,58.052-5.811,85.081-17.426c27.031-11.604,50.347-27.213,69.952-46.815
						c19.602-19.602,35.207-42.92,46.818-69.948s17.412-55.392,17.412-85.082C456.809,221.174,449.16,188.532,433.836,157.887z"/>
			</svg>
          </span>`,
        HB_GRAPHICS_SWITCH_ON:
          `<span style="color: Silver;">
			<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="22px" height="22px" viewBox="0 0 512 512" fill="currentColor" xml:space="preserve">
					<path d="M237.545,255.816c9.899,0,18.468-3.609,25.696-10.848c7.23-7.229,10.854-15.799,10.854-25.694V36.547
						c0-9.9-3.62-18.464-10.854-25.693C256.014,3.617,247.444,0,237.545,0c-9.9,0-18.464,3.621-25.697,10.854
						c-7.233,7.229-10.85,15.797-10.85,25.693v182.728c0,9.895,3.617,18.464,10.85,25.694
						C219.081,252.207,227.648,255.816,237.545,255.816z"/>
					<path d="M433.836,157.887c-15.325-30.642-36.878-56.339-64.666-77.084c-7.994-6.09-17.035-8.47-27.123-7.139
						c-10.089,1.333-18.083,6.091-23.983,14.273c-6.091,7.993-8.418,16.986-6.994,26.979c1.423,9.998,6.139,18.037,14.133,24.128
						c18.645,14.084,33.072,31.312,43.25,51.678c10.184,20.364,15.27,42.065,15.27,65.091c0,19.801-3.854,38.688-11.561,56.678
						c-7.706,17.987-18.13,33.544-31.265,46.679c-13.135,13.131-28.688,23.551-46.678,31.261c-17.987,7.71-36.878,11.57-56.673,11.57
						c-19.792,0-38.684-3.86-56.671-11.57c-17.989-7.71-33.547-18.13-46.682-31.261c-13.129-13.135-23.551-28.691-31.261-46.679
						c-7.708-17.99-11.563-36.877-11.563-56.678c0-23.026,5.092-44.724,15.274-65.091c10.183-20.364,24.601-37.591,43.253-51.678
						c7.994-6.095,12.703-14.133,14.133-24.128c1.427-9.989-0.903-18.986-6.995-26.979c-5.901-8.182-13.844-12.941-23.839-14.273
						c-9.994-1.332-19.085,1.049-27.268,7.139c-27.792,20.745-49.344,46.442-64.669,77.084c-15.324,30.646-22.983,63.288-22.983,97.927
						c0,29.697,5.806,58.054,17.415,85.082c11.613,27.028,27.218,50.34,46.826,69.948c19.602,19.603,42.919,35.215,69.949,46.815
						c27.028,11.615,55.388,17.426,85.08,17.426c29.693,0,58.052-5.811,85.081-17.426c27.031-11.604,50.347-27.213,69.952-46.815
						c19.602-19.602,35.207-42.92,46.818-69.948s17.412-55.392,17.412-85.082C456.809,221.174,449.16,188.532,433.836,157.887z"/>
			</svg>
          </span>`,
        HB_GRAPHICS_SWITCH_OFF_MESSEAGE:
          `You are going to <span style="color: Lime;"> turn of </span> game graphics
          <br><span style="color: DeepSkyBlue;">The game will restart automatically to apply the changes</span>
          <br> <br> This mode disables the game's graphics and keeps only the essential script buttons active.
          This significantly lowers the strain on your computer, which is perfect for running multiple accounts during long tasks like titanite mining.
          <br>Click the same button again to <span style="color: Lime;">restore the graphics</span>
          <br><br>`,
        HB_GRAPHICS_SWITCH_ON_MESSEAGE:
          `You are going to <span style="color: Lime;"> turn on </span> game graphics
          <br><span style="color: DeepSkyBlue;">The game will restart automatically to apply the changes</span>
          <br><br>`,
        HB_DO_NOT_SHOW_AGAIN: 'Don\'t show this window again',
    };

    i18nLangData['en'] = Object.assign(i18nLangData['en'], i18nLangDataEn);

    const i18nLangDataRu = {
        BATTLE_RECALCULATION: 'Предрасчет боя',
        HIDE_BUTTONS: 'Скрыть кнопки',
        HIDE_BUTTONS_TITLE: 'Настройки кнопок',
        HB_SELECT_BUTTONS:
          `Выберите кнопки, которые нужно скрыть <br>
          <span style="color: DeepSkyBlue;"> Для применения настроек игра будет перезагружена автоматически </span>`,
        HB_APPLY: 'Применить',
        HB_OTHERS_SETTINGS:
        `<span style="color: White;">
			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" style="width: 22px;height: 22px;"><path d="M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z"></path></svg>
        </span>`,
        HB_GRAPHICS_SWITCH_ON_TITLE: 'Включить графику игры',
        HB_GRAPHICS_SWITCH_OFF_TITLE: 'Выключить графику игры',
        HB_GRAPHICS_SWITCH_OFF:
        `<span style="color: Lime;">
			<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="22px" height="22px" viewBox="0 0 512 512" fill="currentColor" xml:space="preserve">
					<path d="M237.545,255.816c9.899,0,18.468-3.609,25.696-10.848c7.23-7.229,10.854-15.799,10.854-25.694V36.547
						c0-9.9-3.62-18.464-10.854-25.693C256.014,3.617,247.444,0,237.545,0c-9.9,0-18.464,3.621-25.697,10.854
						c-7.233,7.229-10.85,15.797-10.85,25.693v182.728c0,9.895,3.617,18.464,10.85,25.694
						C219.081,252.207,227.648,255.816,237.545,255.816z"/>
					<path d="M433.836,157.887c-15.325-30.642-36.878-56.339-64.666-77.084c-7.994-6.09-17.035-8.47-27.123-7.139
						c-10.089,1.333-18.083,6.091-23.983,14.273c-6.091,7.993-8.418,16.986-6.994,26.979c1.423,9.998,6.139,18.037,14.133,24.128
						c18.645,14.084,33.072,31.312,43.25,51.678c10.184,20.364,15.27,42.065,15.27,65.091c0,19.801-3.854,38.688-11.561,56.678
						c-7.706,17.987-18.13,33.544-31.265,46.679c-13.135,13.131-28.688,23.551-46.678,31.261c-17.987,7.71-36.878,11.57-56.673,11.57
						c-19.792,0-38.684-3.86-56.671-11.57c-17.989-7.71-33.547-18.13-46.682-31.261c-13.129-13.135-23.551-28.691-31.261-46.679
						c-7.708-17.99-11.563-36.877-11.563-56.678c0-23.026,5.092-44.724,15.274-65.091c10.183-20.364,24.601-37.591,43.253-51.678
						c7.994-6.095,12.703-14.133,14.133-24.128c1.427-9.989-0.903-18.986-6.995-26.979c-5.901-8.182-13.844-12.941-23.839-14.273
						c-9.994-1.332-19.085,1.049-27.268,7.139c-27.792,20.745-49.344,46.442-64.669,77.084c-15.324,30.646-22.983,63.288-22.983,97.927
						c0,29.697,5.806,58.054,17.415,85.082c11.613,27.028,27.218,50.34,46.826,69.948c19.602,19.603,42.919,35.215,69.949,46.815
						c27.028,11.615,55.388,17.426,85.08,17.426c29.693,0,58.052-5.811,85.081-17.426c27.031-11.604,50.347-27.213,69.952-46.815
						c19.602-19.602,35.207-42.92,46.818-69.948s17.412-55.392,17.412-85.082C456.809,221.174,449.16,188.532,433.836,157.887z"/>
			</svg>
        </span>`,
        HB_GRAPHICS_SWITCH_ON:
        `<span style="color: Silver;">
			<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="22px" height="22px" viewBox="0 0 512 512" fill="currentColor" xml:space="preserve">
					<path d="M237.545,255.816c9.899,0,18.468-3.609,25.696-10.848c7.23-7.229,10.854-15.799,10.854-25.694V36.547
						c0-9.9-3.62-18.464-10.854-25.693C256.014,3.617,247.444,0,237.545,0c-9.9,0-18.464,3.621-25.697,10.854
						c-7.233,7.229-10.85,15.797-10.85,25.693v182.728c0,9.895,3.617,18.464,10.85,25.694
						C219.081,252.207,227.648,255.816,237.545,255.816z"/>
					<path d="M433.836,157.887c-15.325-30.642-36.878-56.339-64.666-77.084c-7.994-6.09-17.035-8.47-27.123-7.139
						c-10.089,1.333-18.083,6.091-23.983,14.273c-6.091,7.993-8.418,16.986-6.994,26.979c1.423,9.998,6.139,18.037,14.133,24.128
						c18.645,14.084,33.072,31.312,43.25,51.678c10.184,20.364,15.27,42.065,15.27,65.091c0,19.801-3.854,38.688-11.561,56.678
						c-7.706,17.987-18.13,33.544-31.265,46.679c-13.135,13.131-28.688,23.551-46.678,31.261c-17.987,7.71-36.878,11.57-56.673,11.57
						c-19.792,0-38.684-3.86-56.671-11.57c-17.989-7.71-33.547-18.13-46.682-31.261c-13.129-13.135-23.551-28.691-31.261-46.679
						c-7.708-17.99-11.563-36.877-11.563-56.678c0-23.026,5.092-44.724,15.274-65.091c10.183-20.364,24.601-37.591,43.253-51.678
						c7.994-6.095,12.703-14.133,14.133-24.128c1.427-9.989-0.903-18.986-6.995-26.979c-5.901-8.182-13.844-12.941-23.839-14.273
						c-9.994-1.332-19.085,1.049-27.268,7.139c-27.792,20.745-49.344,46.442-64.669,77.084c-15.324,30.646-22.983,63.288-22.983,97.927
						c0,29.697,5.806,58.054,17.415,85.082c11.613,27.028,27.218,50.34,46.826,69.948c19.602,19.603,42.919,35.215,69.949,46.815
						c27.028,11.615,55.388,17.426,85.08,17.426c29.693,0,58.052-5.811,85.081-17.426c27.031-11.604,50.347-27.213,69.952-46.815
						c19.602-19.602,35.207-42.92,46.818-69.948s17.412-55.392,17.412-85.082C456.809,221.174,449.16,188.532,433.836,157.887z"/>
			</svg>
        </span>`,
        HB_GRAPHICS_SWITCH_OFF_MESSEAGE:
        `Вы собираетесь <span style="color: Lime;">отключить</span> графику игры
        <br><span style="color: DeepSkyBlue;"> Для применения изменений игра будет перезагружена автоматически </span>
        <br> <br> Отключается визуальная часть игры, остаются активными только кнопки скрипта.
        Это значительно снижает нагрузку на компьютер, что особенно полезно при копании титанита несколькими аккаунтами одновременно.
        <br>Чтобы <span style="color: Lime;">включить графику </span> обратно, просто нажмите на эту же кнопку.
        <br><br>`,
        HB_GRAPHICS_SWITCH_ON_MESSEAGE:
        `Вы собираетесь <span style="color: Lime;">включить</span> графику игры
        <br><span style="color: DeepSkyBlue;"> Для применения изменений игра будет перезагружена автоматически </span>
        <br><br>`,
        HB_DO_NOT_SHOW_AGAIN: `Больше не показывать это сообщение`,
    };

    i18nLangData['ru'] = Object.assign(i18nLangData['ru'], i18nLangDataRu);

    document.addEventListener('DOMContentLoaded', () => {
        const style = document.createElement('style');
        style.innerText = `.scriptMenu_otherButton {width: 114px;}`;
        document.head.appendChild(style);
    });

    //Для включения / отключения графики
    let buttonState = null;
    let graphicsEnabled = true;
    let doNotShowAgain = false;
    const buttonStateString = localStorage.getItem('buttonState');
    if (buttonStateString) {
        buttonState = JSON.parse(buttonStateString);
        graphicsEnabled = buttonState.graphicsEnabled;
        doNotShowAgain = buttonState.doNotShowAgain;
    }

    //Выключить графику при старте игры
    if (!graphicsEnabled) {
        turnOffGraphics();
    }

    //Список расширений
    let versionHWHBestDungeonExt = '0.0.23';
    if (extintionsList) {
        for (let ext of extintionsList) {
            if (ext.name == 'HWHBestDungeonExt') {
                versionHWHBestDungeonExt = ext.ver;
            }
        }
    }

    //Замена кнопки "Разное"
    buttons['doOthers'] = {
        isCombine: true,
        combineList: [
            {
                get name() {
                    return I18N('OTHERS');
                },
                get title() {
                    return I18N('OTHERS_TITLE');
                },
                onClick: async function () {
                    await makeListOfButtons();
                },
                classes: ['scriptMenu_otherButton']
            },
            /*{
                get name() {
                    if (scriptInfo.version >= 2.402){
                        return I18N('HB_OTHERS_SETTINGS');
                    }
                    return '<span style="color: White; font-size: 28px;">⚙</span>';
                },
                get title() {
                    return I18N('HIDE_BUTTONS_TITLE');
                },
                onClick: async function () {
                    await selectButtons();
                },
            },*/
            {
                get name() {
                    if (graphicsEnabled) {
                        if (compareVersions(scriptInfo.version, '2.400') >= 0 && compareVersions(versionHWHBestDungeonExt, '0.0.23') >= 0) {
                            return I18N('HB_GRAPHICS_SWITCH_OFF');
                        }
                        return '<span style="color: Lime; font-size: 25px;">⏻</span>';
                    }
                    if (compareVersions(scriptInfo.version, '2.400') >= 0 && compareVersions(versionHWHBestDungeonExt, '0.0.23') >= 0) {
                        return I18N('HB_GRAPHICS_SWITCH_ON');
                    }
                    return '<span style="color: Silver; font-size: 25px;">⏻</span>';
                },
                get title() {
                    if (graphicsEnabled) {
                        return I18N('HB_GRAPHICS_SWITCH_OFF_TITLE');
                    }
                    return I18N('HB_GRAPHICS_SWITCH_ON_TITLE');
                },
                onClick: async function () {
                    await onClicGraphicsSwitchButton();
                }
            },
        ],
    };
    //Добавить кнопку в Разное
    othersPopupButtons.unshift({
        get msg() {
            if (compareVersions(scriptInfo.version, '2.400') >= 0) {
                return I18N('HB_OTHERS_SETTINGS');
            }
            return '<span style="color: White; font-size: 28px;">⚙</span>';
        },
        get title() {
            return I18N('HIDE_BUTTONS_TITLE');
        },
        result:async function () {
            await selectButtons();
        },
        color: 'green',
    });

    async function makeListOfButtons() {
        let { othersPopupButtons } = HWHData;

        let hideSelectedButtons = null;
        const hideSelectedButtonsString = localStorage.getItem('hideSelectedButtons');
        if (hideSelectedButtonsString) {
            hideSelectedButtons = JSON.parse(hideSelectedButtonsString);
        }

        let buttonLanguage = null;
        const buttonLanguageString = localStorage.getItem('buttonLanguage');
        if (buttonLanguageString) {
            buttonLanguage = JSON.parse(buttonLanguageString);
        }

        let changedGameLanguage = false;
        if (buttonLanguage != I18N('HIDE_BUTTONS')) {
            changedGameLanguage = true;
        }

        let newOthersPopupButtons = othersPopupButtons;
        if (hideSelectedButtons && !changedGameLanguage) {
            for (let button of hideSelectedButtons) {
                if (button.checked == true) {
                    newOthersPopupButtons = newOthersPopupButtons.filter((e) => e.msg != button.name);
                }
            }
        }

        newOthersPopupButtons.push({ result: false, isClose: true });

        const answer = await popup.confirm(`${I18N('CHOOSE_ACTION')}:`, newOthersPopupButtons);
        if (typeof answer === 'function') {
            answer();
        }
    }

    async function selectButtons() {

        let hideSelectedButtons = null;
        const hideSelectedButtonsString = localStorage.getItem('hideSelectedButtons');
        if (hideSelectedButtonsString) {
            hideSelectedButtons = JSON.parse(hideSelectedButtonsString)
        }

        let buttonLanguage = null;
        const buttonLanguageString = localStorage.getItem('buttonLanguage');
        if (buttonLanguageString) {
            buttonLanguage = JSON.parse(buttonLanguageString)
        }

        let changedGameLanguage = false;
        if (buttonLanguage != I18N('HIDE_BUTTONS')) {
            changedGameLanguage = true;
        }

        //Пересобираем список чекбоксов
        if (hideSelectedButtons && !changedGameLanguage){
            let newSelectedButtons = [];
            for (let button of othersPopupButtons) {
                if (!button.result || button.title == I18N('HIDE_BUTTONS_TITLE')) {
                    continue;
                }
                let newButton = true;
                for (let b of hideSelectedButtons) {
                    if (button.msg == b.name) {
                        newSelectedButtons.push({
                            name:button.msg,
                            label: button.msg,
                            title: button.title,
                            checked: b.checked,
                        });
                        newButton = false;
                        break;
                    }
                }
                if (newButton) {
                    newSelectedButtons.push({
                        name:button.msg,
                        label: button.msg,
                        title: button.title,
                        checked: false,
                    });
                }
            }
            hideSelectedButtons = newSelectedButtons;
        }

        //Впервые собираем или пересобираем все чекбоксы если изменен язык игры
        if (!hideSelectedButtons || changedGameLanguage){
            hideSelectedButtons = [];
            for (let button of othersPopupButtons) {
                if (!button.result || button.title == I18N('HIDE_BUTTONS_TITLE')) {
                    continue;
                }
                hideSelectedButtons.push({
                    name:button.msg,
                    label: button.msg,
                    title: button.title,
                    checked: false,
                });
            }
        }

        let answer = await popup.confirm(
            I18N('HB_SELECT_BUTTONS'),
            [
                { msg: I18N('HB_APPLY'), result: true, color: 'green' },
                { msg: I18N('BTN_CANCEL'), result: false, isCancel: true, color: 'red' },
            ],
            hideSelectedButtons
        );
        if (!answer) {
            return;
        }
        const taskList = popup.getCheckBoxes();
        for (let button of taskList) {
            hideSelectedButtons[taskList.indexOf(button)].checked = button.checked;
        }

        localStorage.setItem('hideSelectedButtons', JSON.stringify(hideSelectedButtons));
        localStorage.setItem('buttonLanguage', JSON.stringify(I18N('HIDE_BUTTONS')));
        //Перезагрузить игру
        location.reload();
    }

    async function onClicGraphicsSwitchButton() {
        //Если галочка "не показывать это" не выбрана
        if (!doNotShowAgain) {
            //Показать предупреждающее окно
            let result = await showWarningWindow();
            if(!result) {
                return;
            }
        }
        //Если графика включена, то выключаем
        if (graphicsEnabled) {
            graphicsEnabled = false;
            //Если выключена, то включаем
        } else {
            graphicsEnabled = true;
        }
        buttonState = {graphicsEnabled :graphicsEnabled, doNotShowAgain: doNotShowAgain};
        localStorage.setItem('buttonState', JSON.stringify(buttonState));
        //Перезагрузить игру
        location.reload();
    }


    async function showWarningWindow() {
        let checkboxDoNotShowAgain = [];
        checkboxDoNotShowAgain.push({
            name: I18N('HB_DO_NOT_SHOW_AGAIN'),
            label: I18N('HB_DO_NOT_SHOW_AGAIN'),
            checked: false,
        });
        let massege = '';
        if(graphicsEnabled)
        {
            massege = I18N('HB_GRAPHICS_SWITCH_OFF_MESSEAGE')
        } else {
            massege =  I18N('HB_GRAPHICS_SWITCH_ON_MESSEAGE')
        }
        let answer = await popup.confirm(
            massege,
            [
                { msg: I18N('HB_APPLY'), result: true, color: 'green' },
                { msg: I18N('BTN_CANCEL'), result: false, isCancel: true, color: 'red' },
            ],
            checkboxDoNotShowAgain
        );
        if (!answer) {
            return false;
        }
        const taskList = popup.getCheckBoxes();
        for (let button of taskList) {
            if(button.checked) {
                doNotShowAgain = true;
            }
        }
        return true;
    }

    function turnOffGraphics(){
        // Контроль FPS
        const oldRequestAnimationFrame = this.requestAnimationFrame;
        this.requestAnimationFrame = async function (e) {
            const delay = 100000000;
            await new Promise((e) => setTimeout(e, delay));
        };
    }

    function compareVersions(version1, version2) {
        const v1 = version1.split('.').map(Number);
        const v2 = version2.split('.').map(Number);

        const maxLength = Math.max(v1.length, v2.length);

        for (let i = 0; i < maxLength; i++) {
            const num1 = v1[i] || 0;
            const num2 = v2[i] || 0;

            if (num1 > num2) return 1;
            if (num1 < num2) return -1;
        }

        return 0;
    }
})();