/// function main() { //------------------------ 用户修改内容 ------------------------// this.version = '1.0.0'; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。 this.useCompress = false; // 是否使用压缩文件 this.pluginUseCompress = 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.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'), 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'), 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.0'; this.__VERSION_CODE__ = 510; this.timestamp = 0; // 远程资源地址,在线游戏中,塔本体不包含任何资源,只包含源码,从而可以降低游戏本体的体积并平均分担资源包体积 // 从而可以优化加载并避免网站发布的大小限制 this.USE_RESOURCE = false; this.RESOURCE_URL = ''; this.RESOURCE_SYMBOL = ''; this.RESOURCE_INDEX = {}; } // >>>> body end main.prototype.loadScript = function (src, module) { const script = document.createElement('script'); script.src = src; if (module) script.type = 'module'; document.body.appendChild(script); return new Promise((res, rej) => { script.addEventListener('load', res); script.addEventListener('error', rej); }); }; main.prototype.init = async function (mode, callback) { try { const a = {}; const b = {}; new Proxy(a, b); new Promise(res => res()); eval('`${123}`'); } catch { alert('浏览器版本过低,无法游玩本塔!'); alert('建议使用Edge浏览器或Chrome浏览器游玩!'); return; } if (main.replayChecking) { main.loadSync(mode, callback); } else { main.loadAsync(mode, callback); } }; main.prototype.loadSync = function (mode, callback) { main.mode = mode; if (main.useCompress) { main.loadMod('project', 'project', () => 0); } else { main.pureData.forEach(v => { main.loadMod('project', v, () => 0); }); } const mainData = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.main; Object.assign(main, mainData); if (main.useCompress) { main.loadMod('libs', 'libs', () => 0); } else { main.loadList.forEach(v => { main.loadMod('libs', v, () => 0); }); } for (const name of main.loadList) { if (name === 'core') continue; core[name] = new window[name](); } main.loadFloors(() => 0); const coreData = {}; [ 'dom', 'statusBar', 'canvas', 'images', 'tilesets', 'materials', 'animates', 'bgms', 'sounds', 'floorIds', 'floors', 'floorPartitions' ].forEach(function (t) { coreData[t] = main[t]; }); core.initSync(coreData, callback); core.resize(); main.core = core; core.completeAchievement = () => 0; }; main.prototype.loadAsync = async 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; // 加载全塔属性代码 if (main.useCompress) { await main.loadScript(`project/project.min.js?v=${main.version}`); } else { await Promise.all( main.pureData.map(v => main.loadScript(`project/${v}.js?v=${main.version}`) ) ); } const mainData = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.main; Object.assign(main, mainData); main.importFonts(main.fonts); // 加载核心js代码 if (main.useCompress) { await main.loadScript(`libs/libs.min.js?v=${main.version}`); } else { await Promise.all( main.loadList.map(v => main.loadScript(`libs/${v}.js?v=${main.version}`) ) ); } for (const name of main.loadList) { if (name === 'core') continue; core[name] = new window[name](); } // 加载楼层 main.setMainTipsText('正在加载楼层文件...'); if (main.useCompress) { await main.loadScript(`project/floors.min.js?v=${main.version}`); main.dom.mainTips.style.display = 'none'; } else { await new Promise(res => { main.loadScript( `/all/__all_floors__.js?v=${ main.version }&id=${main.floorIds.join(',')}` ).then( () => { main.dom.mainTips.style.display = 'none'; main.supportBunch = true; res(); }, async () => { await Promise.all( mainData.floorIds.map(v => main.loadScript(`project/floors/${v}.js`) ) ); main.dom.mainTips.style.display = 'none'; res(); } ); }); } // 初始化core const coreData = {}; [ 'dom', 'statusBar', 'canvas', 'images', 'tilesets', 'materials', 'animates', 'bgms', 'sounds', 'floorIds', 'floors', 'floorPartitions' ].forEach(function (t) { coreData[t] = main[t]; }); await core.init(coreData, callback); core.resize(); main.core = core; // 自动放缩最大化 let auto = core.getLocalStorage('autoScale'); if (auto == null) { core.setLocalStorage('autoScale', true); auto = true; } if (auto && !core.domStyle.isVertical) { try { core.plugin.utils.maxGameScale(); requestAnimationFrame(() => { var style = getComputedStyle(main.dom.gameGroup); var height = parseFloat(style.height); if (height > window.innerHeight * 0.95) { core.control.setDisplayScale(-1); if (!core.isPlaying() && core.flags.enableHDCanvas) { core.domStyle.ratio = Math.max( window.devicePixelRatio || 1, core.domStyle.scale ); core.resize(); } } }); } catch {} } }; ////// 加载过程提示 ////// main.prototype.setMainTipsText = function (text) { main.dom.mainTips.innerHTML = text; }; 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.importFonts = function (fonts) { if (!(fonts instanceof Array) || fonts.length == 0) return; var style = document.createElement('style'); style.type = 'text/css'; var html = ''; fonts.forEach(function (font) { html += '@font-face { font-family: "' + font + '"; src: url("project/fonts/' + font + (main.pluginUseCompress ? '-' + main.timestamp : '') + '.ttf") format("truetype"); }'; }); style.innerHTML = html; document.body.appendChild(style); }; main.prototype.listen = function () { ////// 窗口大小变化时 ////// window.onresize = function () { try { core.resize(); } catch (ee) { console.error(ee); } }; ////// 在界面上按下某按键时 ////// main.dom.body.onkeydown = function (e) { if (main.editorOpened) return; try { if (e.keyCode === 27) e.preventDefault(); if (main.dom.inputDiv.style.display == 'block') return; if (core && (core.isPlaying() || core.status.lockControl)) 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 core.showStartAnimate(true); e.preventDefault(); } 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 ( core && core.isPlaying && core.status && (core.isPlaying() || core.status.lockControl) ) core.onkeyUp(e); } catch (ee) { console.error(ee); } }; ////// 开始选择时 ////// main.dom.body.onselectstart = function () { return false; }; ////// 鼠标按下时 ////// main.dom.data.onmousedown = function (e) { try { e.stopPropagation(); var loc = core.actions._getClickLoc(e.clientX, e.clientY); if (loc == null) return; core.ondown(loc); } catch (ee) { console.error(ee); } }; ////// 鼠标移动时 ////// main.dom.data.onmousemove = function (e) { try { var loc = core.actions._getClickLoc(e.clientX, e.clientY); if (loc == null) return; core.onmove(loc); } catch (ee) { console.error(ee); } }; ////// 鼠标放开时 ////// main.dom.data.onmouseup = function (e) { try { var loc = core.actions._getClickLoc(e.clientX, e.clientY); if (loc == null) return; core.onup(loc); } catch (ee) { console.error(ee); } }; ////// 鼠标滑轮滚动时 ////// main.dom.data.onmousewheel = function (e) { try { if (e.wheelDelta) core.onmousewheel(Math.sign(e.wheelDelta)); else if (e.detail) core.onmousewheel(Math.sign(e.detail)); } catch (ee) { console.error(ee); } }; ////// 手指在触摸屏开始触摸时 ////// main.dom.data.ontouchstart = function (e) { try { e.preventDefault(); var loc = core.actions._getClickLoc( e.targetTouches[0].clientX, e.targetTouches[0].clientY ); if (loc == null) return; main.lastTouchLoc = loc; core.ondown(loc); } catch (ee) { console.error(ee); } }; ////// 手指在触摸屏上移动时 ////// main.dom.data.ontouchmove = function (e) { try { e.preventDefault(); var loc = core.actions._getClickLoc( e.targetTouches[0].clientX, e.targetTouches[0].clientY ); if (loc == null) return; main.lastTouchLoc = loc; 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; core.onup(loc); } catch (e) { console.error(e); } }; ////// 点击状态栏中的怪物手册时 ////// main.statusBar.image.book.onclick = function (e) { e.stopPropagation(); if (core.isReplaying()) { core.triggerReplay(); return; } if (core.isPlaying()) core.openBook(true); }; ////// 点击状态栏中的楼层传送器/装备栏时 ////// main.statusBar.image.fly.onclick = function (e) { e.stopPropagation(); // 播放录像时 if (core.isReplaying()) { core.stopReplay(); return; } if (core.isPlaying()) { if (!core.flags.equipboxButton) { core.useFly(true); } else { core.openEquipbox(true); } } }; ////// 点击状态栏中的工具箱时 ////// main.statusBar.image.toolbox.onclick = function (e) { e.stopPropagation(); if (core.isReplaying()) { core.rewindReplay(); return; } if (core.isPlaying()) { core.openToolbox(core.status.event.id != 'equipbox'); } }; ////// 双击状态栏中的工具箱时 ////// main.statusBar.image.toolbox.ondblclick = function (e) { e.stopPropagation(); if (core.isReplaying()) { return; } if (core.isPlaying()) core.openEquipbox(true); }; ////// 点击状态栏中的虚拟键盘时 ////// main.statusBar.image.keyboard.onclick = function (e) { e.stopPropagation(); if (core.isReplaying()) { core.control._replay_book(); return; } if (core.isPlaying()) core.openKeyBoard(true); }; ////// 点击状态栏中的快捷商店时 ////// main.statusBar.image.shop.onclick = function (e) { e.stopPropagation(); if (core.isReplaying()) { core.control._replay_viewMap(); return; } if (core.isPlaying()) core.openQuickShop(true); }; ////// 点击金币时也可以开启快捷商店 ////// main.statusBar.image.money.onclick = function (e) { e.stopPropagation(); if (core.isPlaying()) core.openQuickShop(true); }; ////// 点击楼梯图标也可以浏览地图 ////// main.statusBar.image.floor.onclick = function (e) { e.stopPropagation(); if ( core && 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 (core.isPlaying()) core.save(true); }; ////// 点击状态栏中的读档按钮时 ////// main.statusBar.image.load.onclick = function (e) { e.stopPropagation(); if (core.isReplaying()) { core.speedUpReplay(); return; } if (core.isPlaying()) core.load(true); }; ////// 点击状态栏中的系统菜单时 ////// main.statusBar.image.settings.onclick = function (e) { e.stopPropagation(); if (core.isReplaying()) { core.control._replay_SL(); return; } if (core.isPlaying()) core.openSettings(true); }; ////// 点击工具栏时 ////// main.dom.hard.onclick = function () { core.control.setToolbarButton(!core.domStyle.toolbarBtn); }; ////// 手机端的按钮1-7 ////// main.statusBar.image.btn1.onclick = function (e) { e.stopPropagation(); core.onkeyUp({ keyCode: 49, altKey: core.getLocalStorage('altKey') }); }; main.statusBar.image.btn2.onclick = function (e) { e.stopPropagation(); core.onkeyUp({ keyCode: 50, altKey: core.getLocalStorage('altKey') }); }; main.statusBar.image.btn3.onclick = function (e) { e.stopPropagation(); core.onkeyUp({ keyCode: 51, altKey: core.getLocalStorage('altKey') }); }; main.statusBar.image.btn4.onclick = function (e) { e.stopPropagation(); core.onkeyUp({ keyCode: 52, altKey: core.getLocalStorage('altKey') }); }; main.statusBar.image.btn5.onclick = function (e) { e.stopPropagation(); core.onkeyUp({ keyCode: 53, altKey: core.getLocalStorage('altKey') }); }; main.statusBar.image.btn6.onclick = function (e) { e.stopPropagation(); core.onkeyUp({ keyCode: 54, altKey: core.getLocalStorage('altKey') }); }; main.statusBar.image.btn7.onclick = function (e) { e.stopPropagation(); 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)'; } }; window.onblur = function () { if (core && core.control) { try { 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();