/// <reference path="./runtime.d.ts" />
function main() {
  //------------------------ 用户修改内容 ------------------------//

  this.version = "2.10.3"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。

  this.useCompress = false; // 是否使用压缩文件
  // 当你即将发布你的塔时,请使用“JS代码压缩工具”将所有js代码进行压缩,然后将这里的useCompress改为true。
  // 请注意,只有useCompress是false时才会读取floors目录下的文件,为true时会直接读取libs目录下的floors.min.js文件。
  // 如果要进行剧本的修改请务必将其改成false。

  this.bgmRemote = false; // 是否采用远程BGM
  this.bgmRemoteRoot = "https://h5mota.com/music/"; // 远程BGM的根目录

  this.isCompetition = false; // 是否是比赛模式
  this.enableSplitChunks = true; // 允许拆分压缩包
  this.savePages = 1000; // 存档页数,每页可存5个;默认为1000页5000个存档
  this.criticalUseLoop = 1; // 循环临界的分界

  //------------------------ 用户修改内容 END ------------------------//

  this.dom = {
    body: document.body,
    gameGroup: document.getElementById("gameGroup"),
    mainTips: document.getElementById("mainTips"),
    musicBtn: document.getElementById("musicBtn"),
    enlargeBtn: document.createElement("img"),
    startPanel: document.getElementById("startPanel"),
    startTop: document.getElementById("startTop"),
    startTopProgressBar: document.getElementById("startTopProgressBar"),
    startTopProgress: document.getElementById("startTopProgress"),
    startTopLoadTips: document.getElementById("startTopLoadTips"),
    startBackground: document.getElementById("startBackground"),
    startLogo: document.getElementById("startLogo"),
    startButtonGroup: document.getElementById("startButtonGroup"),
    floorMsgGroup: document.getElementById("floorMsgGroup"),
    logoLabel: document.getElementById("logoLabel"),
    versionLabel: document.getElementById("versionLabel"),
    floorNameLabel: document.getElementById("floorNameLabel"),
    statusBar: document.getElementById("statusBar"),
    status: document.getElementsByClassName("status"),
    toolBar: document.getElementById("toolBar"),
    tools: document.getElementsByClassName("tools"),
    gameCanvas: document.getElementsByClassName("gameCanvas"),
    gif: document.getElementById("gif"),
    gif2: document.getElementById("gif2"),
    gameDraw: document.getElementById("gameDraw"),
    startButtons: document.getElementById("startButtons"),
    playGame: document.getElementById("playGame"),
    loadGame: document.getElementById("loadGame"),
    CGMode: document.getElementById("CGMode"),
    musicMode: document.getElementById("musicMode"),
    replayGame: document.getElementById("replayGame"),
    levelChooseButtons: document.getElementById("levelChooseButtons"),
    data: document.getElementById("data"),
    statusLabels: document.getElementsByClassName("statusLabel"),
    statusTexts: document.getElementsByClassName("statusText"),
    floorCol: document.getElementById("floorCol"),
    nameCol: document.getElementById("nameCol"),
    lvCol: document.getElementById("lvCol"),
    hpmaxCol: document.getElementById("hpmaxCol"),
    hpCol: document.getElementById("hpCol"),
    manaCol: document.getElementById("manaCol"),
    atkCol: document.getElementById("atkCol"),
    defCol: document.getElementById("defCol"),
    mdefCol: document.getElementById("mdefCol"),
    moneyCol: document.getElementById("moneyCol"),
    expCol: document.getElementById("expCol"),
    upCol: document.getElementById("upCol"),
    keyCol: document.getElementById("keyCol"),
    pzfCol: document.getElementById("pzfCol"),
    debuffCol: document.getElementById("debuffCol"),
    skillCol: document.getElementById("skillCol"),
    hard: document.getElementById("hard"),
    statusCanvas: document.getElementById("statusCanvas"),
    statusCanvasCtx: document.getElementById("statusCanvas").getContext("2d"),
    inputDiv: document.getElementById("inputDiv"),
    inputMessage: document.getElementById("inputMessage"),
    inputBox: document.getElementById("inputBox"),
    inputYes: document.getElementById("inputYes"),
    inputNo: document.getElementById("inputNo"),
    next: document.getElementById("next"),
  };
  this.mode = "play";
  this.loadList = [
    "loader",
    "control",
    "utils",
    "items",
    "icons",
    "maps",
    "enemys",
    "events",
    "actions",
    "data",
    "ui",
    "extensions",
    "core",
  ];
  this.pureData = [
    "data",
    "enemys",
    "icons",
    "maps",
    "items",
    "functions",
    "events",
    "plugins",
  ];
  this.materials = [
    "animates",
    "enemys",
    "items",
    "npcs",
    "terrains",
    "enemy48",
    "npc48",
    "icons",
  ];

  this.statusBar = {
    image: {
      floor: document.getElementById("img-floor"),
      name: document.getElementById("img-name"),
      lv: document.getElementById("img-lv"),
      hpmax: document.getElementById("img-hpmax"),
      hp: document.getElementById("img-hp"),
      mana: document.getElementById("img-mana"),
      atk: document.getElementById("img-atk"),
      def: document.getElementById("img-def"),
      mdef: document.getElementById("img-mdef"),
      money: document.getElementById("img-money"),
      exp: document.getElementById("img-exp"),
      up: document.getElementById("img-up"),
      skill: document.getElementById("img-skill"),
      book: document.getElementById("img-book"),
      fly: document.getElementById("img-fly"),
      toolbox: document.getElementById("img-toolbox"),
      keyboard: document.getElementById("img-keyboard"),
      shop: document.getElementById("img-shop"),
      save: document.getElementById("img-save"),
      load: document.getElementById("img-load"),
      settings: document.getElementById("img-settings"),
      btn1: document.getElementById("img-btn1"),
      btn2: document.getElementById("img-btn2"),
      btn3: document.getElementById("img-btn3"),
      btn4: document.getElementById("img-btn4"),
      btn5: document.getElementById("img-btn5"),
      btn6: document.getElementById("img-btn6"),
      btn7: document.getElementById("img-btn7"),
      btn8: document.getElementById("img-btn8"),
    },
    icons: {
      floor: 0,
      name: null,
      lv: 1,
      hpmax: 2,
      hp: 3,
      atk: 4,
      def: 5,
      mdef: 6,
      money: 7,
      exp: 8,
      up: 9,
      book: 10,
      fly: 11,
      toolbox: 12,
      keyboard: 13,
      shop: 14,
      save: 15,
      load: 16,
      settings: 17,
      play: 18,
      pause: 19,
      stop: 20,
      speedDown: 21,
      speedUp: 22,
      rewind: 23,
      equipbox: 24,
      mana: 25,
      skill: 26,
      btn1: 27,
      btn2: 28,
      btn3: 29,
      btn4: 30,
      btn5: 31,
      btn6: 32,
      btn7: 33,
      btn8: 34,
    },
    floor: document.getElementById("floor"),
    name: document.getElementById("name"),
    lv: document.getElementById("lv"),
    hpmax: document.getElementById("hpmax"),
    hp: document.getElementById("hp"),
    mana: document.getElementById("mana"),
    atk: document.getElementById("atk"),
    def: document.getElementById("def"),
    mdef: document.getElementById("mdef"),
    money: document.getElementById("money"),
    exp: document.getElementById("exp"),
    up: document.getElementById("up"),
    skill: document.getElementById("skill"),
    yellowKey: document.getElementById("yellowKey"),
    blueKey: document.getElementById("blueKey"),
    redKey: document.getElementById("redKey"),
    greenKey: document.getElementById("greenKey"),
    poison: document.getElementById("poison"),
    weak: document.getElementById("weak"),
    curse: document.getElementById("curse"),
    pickaxe: document.getElementById("pickaxe"),
    bomb: document.getElementById("bomb"),
    fly: document.getElementById("fly"),
    hard: document.getElementById("hard"),
  };
  this.floors = {};
  this.canvas = {};

  this.__VERSION__ = "2.10.3";
  this.__VERSION_CODE__ = 512;
}

main.prototype.init = function (mode, callback) {
  for (var i = 0; i < main.dom.gameCanvas.length; i++) {
    main.canvas[main.dom.gameCanvas[i].id] =
      main.dom.gameCanvas[i].getContext("2d");
  }
  main.mode = mode;

  main.loadJs("project", main.pureData, function () {
    var mainData = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.main;
    for (var ii in mainData) main[ii] = mainData[ii];

    main.dom.startLogo.style = main.styles.startLogoStyle;
    main.dom.startButtonGroup.style = main.styles.startButtonsStyle;
    main.levelChoose = main.levelChoose || [];
    main.levelChoose.forEach(function (value) {
      var span = document.createElement("span");
      span.setAttribute("class", "startButton");
      span.innerText = value.title || "";
      (function (span, str_) {
        span.onclick = function () {
          core.events.startGame(str_);
        };
      })(span, value.name || "");
      main.dom.levelChooseButtons.appendChild(span);
    });
    main.createOnChoiceAnimation();
    main.importFonts(main.fonts);

    main.loadJs("libs", main.loadList, function () {
      main.core = core;

      for (i = 0; i < main.loadList.length; i++) {
        var name = main.loadList[i];
        if (name === "core") continue;
        main.core[name] = new window[name]();
      }

      main.loadFloors(function () {
        var coreData = {};
        [
          "dom",
          "statusBar",
          "canvas",
          "images",
          "tilesets",
          "materials",
          "animates",
          "bgms",
          "sounds",
          "floorIds",
          "floors",
          "floorPartitions",
        ].forEach(function (t) {
          coreData[t] = main[t];
        });
        main.core.init(coreData, callback);
        core.resize();
        // 自动放缩最大化
        if (!main.replayChecking) {
          if (core.getLocalStorage("autoScale") == null) {
            core.setLocalStorage("autoScale", true);
          }
          if (core.getLocalStorage("autoScale") && !core.domStyle.isVertical) {
            try {
              if (main.core) {
                var index = main.core.domStyle.availableScale.indexOf(
                  core.domStyle.scale
                );
                main.core.control.setDisplayScale(
                  main.core.domStyle.availableScale.length - 1 - index
                );
                if (!main.core.isPlaying() && main.core.flags.enableHDCanvas) {
                  main.core.domStyle.ratio = Math.max(
                    window.devicePixelRatio || 1,
                    main.core.domStyle.scale
                  );
                  main.core.resize();
                }
                requestAnimationFrame(function () {
                  var style = getComputedStyle(main.dom.gameGroup);
                  var height = parseFloat(style.height);
                  if (height > window.innerHeight * 0.95) {
                    main.core.control.setDisplayScale(-1);
                    if (
                      !main.core.isPlaying() &&
                      main.core.flags.enableHDCanvas
                    ) {
                      main.core.domStyle.ratio = Math.max(
                        window.devicePixelRatio || 1,
                        main.core.domStyle.scale
                      );
                      main.core.resize();
                    }
                  }
                });
              }
            } catch (e) {
              console.error(e);
            }
          }
        }
      });
    });
  });
};

////// 动态加载所有核心JS文件 //////
main.prototype.loadJs = function (dir, loadList, callback) {
  // 加载js
  main.setMainTipsText("正在加载核心js文件...");

  if (this.useCompress) {
    main.loadMod(dir, dir, function () {
      callback();
    });
  } else {
    var instanceNum = 0;
    for (var i = 0; i < loadList.length; i++) {
      main.loadMod(dir, loadList[i], function (modName) {
        main.setMainTipsText(modName + ".js 加载完毕");
        instanceNum++;
        if (instanceNum === loadList.length) {
          callback();
        }
      });
    }
  }
};

////// 加载某一个JS文件 //////
main.prototype.loadMod = function (dir, modName, callback, onerror) {
  var script = document.createElement("script");
  var name = modName;
  script.src =
    dir +
    "/" +
    modName +
    (this.useCompress ? ".min" : "") +
    ".js?v=" +
    this.version;
  script.onload = function () {
    callback(name);
  };
  main.dom.body.appendChild(script);
};

////// 动态加载所有楼层(剧本) //////
main.prototype.loadFloors = function (callback) {
  // 加载js
  main.setMainTipsText("正在加载楼层文件...");
  if (this.useCompress) {
    // 读取压缩文件
    var script = document.createElement("script");
    script.src = "project/floors.min.js?v=" + this.version;
    main.dom.body.appendChild(script);
    script.onload = function () {
      main.dom.mainTips.style.display = "none";
      callback();
    };
    return;
  }

  // 高层塔优化
  var script = document.createElement("script");
  script.src =
    "__all_floors__.js?v=" + this.version + "&id=" + main.floorIds.join(",");
  script.onload = function () {
    main.dom.mainTips.style.display = "none";
    main.supportBunch = true;
    callback();
  };
  script.onerror =
    script.onabort =
    script.ontimeout =
      function (e) {
        // console.clear();
        for (var i = 0; i < main.floorIds.length; i++) {
          main.loadFloor(main.floorIds[i], function (modName) {
            main.setMainTipsText("楼层 " + modName + ".js 加载完毕");
            if (Object.keys(main.floors).length === main.floorIds.length) {
              main.dom.mainTips.style.display = "none";
              callback();
            }
          });
        }
      };
  main.dom.body.appendChild(script);
};

////// 加载某一个楼层 //////
main.prototype.loadFloor = function (floorId, callback) {
  var script = document.createElement("script");
  script.src = "project/floors/" + floorId + ".js?v=" + this.version;
  main.dom.body.appendChild(script);
  script.onload = function () {
    callback(floorId);
  };
};

////// 加载过程提示 //////
main.prototype.setMainTipsText = function (text) {
  main.dom.mainTips.innerHTML = text;
};

main.prototype.log = function (e, error) {
  if (e) {
    if (error) return console.error(e);
    if (main.core && main.core.platform && !main.core.platform.isPC) {
      console.log(e.stack || e.toString());
    } else {
      console.log(e);
    }
  }
};

main.prototype.createOnChoiceAnimation = function () {
  var borderColor =
    main.dom.startButtonGroup.style.caretColor || "rgb(255, 215, 0)";
  // get rgb value
  var rgb = /^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*\d+\s*)?\)$/.exec(
    borderColor
  );
  if (rgb != null) {
    var value = rgb[1] + ", " + rgb[2] + ", " + rgb[3];
    var style = document.createElement("style");
    style.type = "text/css";
    var keyFrames =
      "onChoice { " +
      "0% { border-color: rgba(" +
      value +
      ", 0.9); } " +
      "50% { border-color: rgba(" +
      value +
      ", 0.3); } " +
      "100% { border-color: rgba(" +
      value +
      ", 0.9); } " +
      "}";
    style.innerHTML =
      "@-webkit-keyframes " + keyFrames + " @keyframes " + keyFrames;
    document.body.appendChild(style);
  }
};

////// 选项 //////
main.prototype.selectButton = function (index) {
  var select = function (children) {
    index = (index + children.length) % children.length;
    for (var i = 0; i < children.length; ++i) {
      children[i].classList.remove("onChoiceAnimate");
    }
    children[index].classList.add("onChoiceAnimate");
    if (main.selectedButton == index) {
      children[index].click();
    } else {
      main.selectedButton = index;
    }
  };

  if (core.dom.startPanel.style.display != "block") return;

  if (main.dom.startButtons.style.display == "block") {
    select(main.dom.startButtons.children);
  } else if (main.dom.levelChooseButtons.style.display == "block") {
    select(main.dom.levelChooseButtons.children);
  }
};

////// 创建字体 //////
main.prototype.importFonts = function (fonts) {
  if (!(fonts instanceof Array) || fonts.length == 0) return;
  var style = document.createElement("style");
  var html = "";
  fonts.forEach(function (font) {
    html +=
      '@font-face { font-family: "' +
      font +
      '"; src: url("project/fonts/' +
      font +
      '.ttf") format("truetype"); }';
  });
  style.innerHTML = html;
  document.body.appendChild(style);
};

main.prototype.listen = function () {
  ////// 窗口大小变化时 //////
  window.onresize = function () {
    try {
      main.core.resize();
    } catch (ee) {
      console.error(ee);
    }
  };

  ////// 在界面上按下某按键时 //////
  main.dom.body.onkeydown = function (e) {
    if (main.editorOpened) return;
    try {
      if (main.dom.inputDiv.style.display == "block") return;
      if (main.core && (main.core.isPlaying() || main.core.status.lockControl))
        main.core.onkeyDown(e);
    } catch (ee) {
      console.error(ee);
    }
  };

  ////// 在界面上放开某按键时 //////
  main.dom.body.onkeyup = function (e) {
    if (main.editorOpened) return;
    try {
      if (
        main.dom.startPanel.style.display == "block" &&
        (main.dom.startButtons.style.display == "block" ||
          main.dom.levelChooseButtons.style.display == "block")
      ) {
        if (e.keyCode == 38 || e.keyCode == 33)
          // up/pgup
          main.selectButton((main.selectedButton || 0) - 1);
        else if (e.keyCode == 40 || e.keyCode == 34)
          // down/pgdn
          main.selectButton((main.selectedButton || 0) + 1);
        else if (e.keyCode == 67 || e.keyCode == 13 || e.keyCode == 32)
          // C/Enter/Space
          main.selectButton(main.selectedButton);
        else if (
          e.keyCode == 27 &&
          main.dom.levelChooseButtons.style.display == "block"
        ) {
          // ESC
          main.core.showStartAnimate(true);
        }
        e.stopPropagation();
        return;
      }
      if (main.dom.inputDiv.style.display == "block") {
        if (e.keyCode == 13) {
          setTimeout(function () {
            main.dom.inputYes.click();
          }, 50);
        } else if (e.keyCode == 27) {
          setTimeout(function () {
            main.dom.inputNo.click();
          }, 50);
        }
        return;
      }
      if (
        main.core &&
        main.core.isPlaying &&
        main.core.status &&
        (main.core.isPlaying() || main.core.status.lockControl)
      )
        main.core.onkeyUp(e);
    } catch (ee) {
      console.error(ee);
    }
  };

  [main.dom.startButtons, main.dom.levelChooseButtons].forEach(function (dom) {
    dom.onmousemove = function (e) {
      for (var i = 0; i < dom.children.length; ++i) {
        if (dom.children[i] == e.target && i != (main.selectedButton || 0)) {
          main.selectButton(i);
        }
      }
    };
  });

  ////// 开始选择时 //////
  main.dom.body.onselectstart = function () {
    return false;
  };

  ////// 鼠标按下时 //////
  main.dom.data.onmousedown = function (e) {
    try {
      e.stopPropagation();
      var loc = main.core.actions._getClickLoc(e.clientX, e.clientY);
      if (loc == null) return;
      main.core.ondown(loc);
    } catch (ee) {
      console.error(ee);
    }
  };

  ////// 鼠标移动时 //////
  main.dom.data.onmousemove = function (e) {
    try {
      e.stopPropagation();
      var loc = main.core.actions._getClickLoc(e.clientX, e.clientY);
      if (loc == null) return;
      main.core.onmove(loc);
    } catch (ee) {
      console.error(ee);
    }
  };

  ////// 鼠标放开时 //////
  main.dom.data.onmouseup = function (e) {
    try {
      e.stopPropagation();
      var loc = main.core.actions._getClickLoc(e.clientX, e.clientY);
      if (loc == null) return;
      main.core.onup(loc);
    } catch (ee) {
      console.error(ee);
    }
  };

  ////// 鼠标滑轮滚动时 //////
  main.dom.data.onmousewheel = function (e) {
    try {
      if (e.wheelDelta) main.core.onmousewheel(Math.sign(e.wheelDelta));
      else if (e.detail) main.core.onmousewheel(Math.sign(e.detail));
    } catch (ee) {
      console.error(ee);
    }
  };

  ////// 手指在触摸屏开始触摸时 //////
  main.dom.data.ontouchstart = function (e) {
    try {
      e.preventDefault();
      var loc = main.core.actions._getClickLoc(
        e.targetTouches[0].clientX,
        e.targetTouches[0].clientY
      );
      if (loc == null) return;
      main.lastTouchLoc = loc;
      main.core.ondown(loc);
    } catch (ee) {
      console.error(ee);
    }
  };

  ////// 手指在触摸屏上移动时 //////
  main.dom.data.ontouchmove = function (e) {
    try {
      e.preventDefault();
      var loc = main.core.actions._getClickLoc(
        e.targetTouches[0].clientX,
        e.targetTouches[0].clientY
      );
      if (loc == null) return;
      main.lastTouchLoc = loc;
      main.core.onmove(loc);
    } catch (ee) {
      console.error(ee);
    }
  };

  ////// 手指离开触摸屏时 //////
  main.dom.data.ontouchend = function (e) {
    try {
      e.preventDefault();
      if (main.lastTouchLoc == null) return;
      var loc = main.lastTouchLoc;
      delete main.lastTouchLoc;
      main.core.onup(loc);
    } catch (e) {
      console.error(e);
    }
  };

  main.dom.statusCanvas.onclick = function (e) {
    try {
      e.preventDefault();
      main.core.onStatusBarClick(e);
    } catch (e) {
      console.error(e);
    }
  };

  ////// 点击状态栏中的怪物手册时 //////
  main.statusBar.image.book.onclick = function (e) {
    e.stopPropagation();

    if (core.isReplaying()) {
      core.triggerReplay();
      return;
    }

    if (main.core.isPlaying()) main.core.openBook(true);
  };

  ////// 点击状态栏中的楼层传送器/装备栏时 //////
  main.statusBar.image.fly.onclick = function (e) {
    e.stopPropagation();

    // 播放录像时
    if (core.isReplaying()) {
      core.stopReplay();
      return;
    }

    if (main.core.isPlaying()) {
      if (!main.core.flags.equipboxButton) {
        main.core.useFly(true);
      } else {
        main.core.openEquipbox(true);
      }
    }
  };

  ////// 点击状态栏中的工具箱时 //////
  main.statusBar.image.toolbox.onclick = function (e) {
    e.stopPropagation();

    if (core.isReplaying()) {
      core.rewindReplay();
      return;
    }

    if (main.core.isPlaying()) {
      main.core.openToolbox(core.status.event.id != "equipbox");
    }
  };

  ////// 双击状态栏中的工具箱时 //////
  main.statusBar.image.toolbox.ondblclick = function (e) {
    e.stopPropagation();

    if (core.isReplaying()) {
      return;
    }

    if (main.core.isPlaying()) main.core.openEquipbox(true);
  };

  ////// 点击状态栏中的虚拟键盘时 //////
  main.statusBar.image.keyboard.onclick = function (e) {
    e.stopPropagation();

    if (core.isReplaying()) {
      core.control._replay_book();
      return;
    }

    if (main.core.isPlaying()) main.core.openKeyBoard(true);
  };

  ////// 点击状态栏中的快捷商店时 //////
  main.statusBar.image.shop.onclick = function (e) {
    e.stopPropagation();

    if (core.isReplaying()) {
      core.control._replay_viewMap();
      return;
    }

    if (main.core.isPlaying()) main.core.openQuickShop(true);
  };

  ////// 点击金币时也可以开启快捷商店 //////
  main.statusBar.image.money.onclick = function (e) {
    e.stopPropagation();

    if (main.core.isPlaying()) main.core.openQuickShop(true);
  };

  ////// 点击楼梯图标也可以浏览地图 //////
  main.statusBar.image.floor.onclick = function (e) {
    e.stopPropagation();

    if (
      main.core &&
      main.core.isPlaying() &&
      !core.isMoving() &&
      !core.status.lockControl
    ) {
      core.ui._drawViewMaps();
    }
  };

  ////// 点击状态栏中的存档按钮时 //////
  main.statusBar.image.save.onclick = function (e) {
    e.stopPropagation();

    if (core.isReplaying()) {
      core.speedDownReplay();
      return;
    }

    if (main.core.isPlaying()) main.core.save(true);
  };

  ////// 点击状态栏中的读档按钮时 //////
  main.statusBar.image.load.onclick = function (e) {
    e.stopPropagation();

    if (core.isReplaying()) {
      core.speedUpReplay();
      return;
    }

    if (main.core.isPlaying()) main.core.load(true);
  };

  ////// 点击状态栏中的系统菜单时 //////
  main.statusBar.image.settings.onclick = function (e) {
    e.stopPropagation();

    if (core.isReplaying()) {
      core.control._replay_SL();
      return;
    }

    if (main.core.isPlaying()) main.core.openSettings(true);
  };

  ////// 点击工具栏时 //////
  main.dom.hard.onclick = function () {
    main.core.control.setToolbarButton(!core.domStyle.toolbarBtn);
  };

  ////// 手机端的按钮1-7 //////
  main.statusBar.image.btn1.onclick = function (e) {
    e.stopPropagation();
    main.core.onkeyUp({
      keyCode: 49,
      altKey: core.getLocalStorage("altKey"),
    });
  };

  main.statusBar.image.btn2.onclick = function (e) {
    e.stopPropagation();
    main.core.onkeyUp({
      keyCode: 50,
      altKey: core.getLocalStorage("altKey"),
    });
  };

  main.statusBar.image.btn3.onclick = function (e) {
    e.stopPropagation();
    main.core.onkeyUp({
      keyCode: 51,
      altKey: core.getLocalStorage("altKey"),
    });
  };

  main.statusBar.image.btn4.onclick = function (e) {
    e.stopPropagation();
    main.core.onkeyUp({
      keyCode: 52,
      altKey: core.getLocalStorage("altKey"),
    });
  };

  main.statusBar.image.btn5.onclick = function (e) {
    e.stopPropagation();
    main.core.onkeyUp({
      keyCode: 53,
      altKey: core.getLocalStorage("altKey"),
    });
  };

  main.statusBar.image.btn6.onclick = function (e) {
    e.stopPropagation();
    main.core.onkeyUp({
      keyCode: 54,
      altKey: core.getLocalStorage("altKey"),
    });
  };

  main.statusBar.image.btn7.onclick = function (e) {
    e.stopPropagation();
    main.core.onkeyUp({
      keyCode: 55,
      altKey: core.getLocalStorage("altKey"),
    });
  };

  main.statusBar.image.btn8.onclick = function (e) {
    e.stopPropagation();
    if (core.getLocalStorage("altKey")) {
      core.removeLocalStorage("altKey");
      core.drawTip("Alt模式已关闭。");
      main.statusBar.image.btn8.style.filter = "";
    } else {
      core.setLocalStorage("altKey", true);
      core.drawTip("Alt模式已开启;此模式下1~7按钮视为Alt+1~7。");
      main.statusBar.image.btn8.style.filter = "sepia(1) contrast(1.5)";
    }
  };

  ////// 点击“开始游戏”时 //////
  main.dom.playGame.onclick = function () {
    main.dom.startButtons.style.display = "none";
    main.core.checkBgm();

    if (main.levelChoose.length == 0) {
      core.events.startGame("");
    } else {
      main.dom.levelChooseButtons.style.display = "block";
      main.selectedButton = null;
      main.selectButton(0);
    }
  };

  ////// 点击“载入游戏”时 //////
  main.dom.loadGame.onclick = function () {
    main.core.checkBgm();
    main.core.load();
  };

  ////// 点击“录像回放”时 //////
  main.dom.replayGame.onclick = function () {
    main.core.checkBgm();
    main.core.chooseReplayFile();
  };

  main.dom.musicBtn.onclick = function () {
    try {
      if (main.core) main.core.triggerBgm();
    } catch (ee) {
      console.error(ee);
    }
  };

  window.onblur = function () {
    if (main.core && main.core.control) {
      try {
        main.core.control.checkAutosave();
      } catch (e) {}
    }
  };

  main.dom.inputYes.onclick = function () {
    main.dom.inputDiv.style.display = "none";
    var func = core.platform.successCallback;
    core.platform.successCallback = core.platform.errorCallback = null;
    if (func) func(main.dom.inputBox.value);
  };

  main.dom.inputNo.onclick = function () {
    main.dom.inputDiv.style.display = "none";
    var func = core.platform.errorCallback;
    core.platform.successCallback = core.platform.errorCallback = null;
    if (func) func(null);
  };
}; //listen end

var main = new main();