From eaa8644df67be5d6e59a7c80445133c60ee453d4 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Wed, 11 Jan 2023 09:45:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=90=84=E7=A7=8Dui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/libs/control.js | 18 +-- public/libs/core.js | 18 ++- public/libs/enemys.js | 138 ++++------------- public/libs/maps.js | 23 ++- public/libs/ui.js | 4 +- public/main.js | 9 ++ public/project/floors/MT35.js | 6 +- public/project/floors/MT36.js | 120 +++++++++++---- public/project/functions.js | 208 +++++++++----------------- public/project/icons.js | 3 +- public/project/maps.js | 18 ++- public/project/materials/terrains.png | Bin 54565 -> 55652 bytes public/project/plugins.js | 1 - public/styles.css | 4 + src/data/settings.json | 14 +- src/plugin/settings.ts | 17 +++ src/plugin/ui/fixed.ts | 4 +- src/source/cls.d.ts | 14 ++ src/source/maps.d.ts | 28 ++++ src/ui/fixed.vue | 2 +- src/ui/fly.vue | 9 ++ src/ui/settings.vue | 13 +- 22 files changed, 359 insertions(+), 312 deletions(-) diff --git a/public/libs/control.js b/public/libs/control.js index aaf6793..d139dd1 100644 --- a/public/libs/control.js +++ b/public/libs/control.js @@ -1030,7 +1030,10 @@ control.prototype.tryMoveDirectly = function (destX, destY) { if (dir && !core.inArray(canMoveArray[dx][dy], dir)) continue; if (canMoveDirectlyArray[i] < 0) continue; if (core.control.moveDirectly(dx, dy, canMoveDirectlyArray[i])) { - if (dir) core.moveHero(dir, function () {}); + if (dir) { + console.log(dir); + core.moveHero(dir, function () {}); + } return true; } } @@ -4288,19 +4291,12 @@ control.prototype._resize_canvas = function (obj) { // resize bigmap core.bigmap.canvas.forEach(function (cn) { var ratio = core.canvas[cn].canvas.hasAttribute('isHD') - ? core.domStyle.ratio + ? core.domStyle.scale * devicePixelRatio : 1; core.canvas[cn].canvas.style.width = - (core.canvas[cn].canvas.width / - devicePixelRatio / - core.domStyle.ratio) * - core.domStyle.scale + - 'px'; + (core.canvas[cn].canvas.width / ratio) * core.domStyle.scale + 'px'; core.canvas[cn].canvas.style.height = - (core.canvas[cn].canvas.height / - devicePixelRatio / - core.domStyle.ratio) * - core.domStyle.scale + + (core.canvas[cn].canvas.height / ratio) * core.domStyle.scale + 'px'; }); // resize dynamic canvas diff --git a/public/libs/core.js b/public/libs/core.js index b88388c..6713c0a 100644 --- a/public/libs/core.js +++ b/public/libs/core.js @@ -108,7 +108,8 @@ function core() { availableScale: [], isVertical: false, showStatusBar: true, - toolbarBtn: false + toolbarBtn: false, + hdCanvas: ['damage', 'ui', 'data'] }; this.bigmap = { canvas: ['bg', 'event', 'event2', 'fg', 'damage'], @@ -294,11 +295,16 @@ core.prototype.init = function (coreData, callback) { var b = main.mode == 'editor'; // 初始化画布 for (var name in core.canvas) { - core.maps._setHDCanvasSize( - core.canvas[name], - b ? core.__PIXELS__ : core._PX_, - b ? core.__PIXELS__ : core._PY_ - ); + if (core.domStyle.hdCanvas.includes(name)) + core.maps._setHDCanvasSize( + core.canvas[name], + b ? core.__PIXELS__ : core._PX_, + b ? core.__PIXELS__ : core._PY_ + ); + else { + core.canvas[name].canvas.width = b ? core.__PIXELS__ : core._PX_; + core.canvas[name].canvas.height = b ? core.__PIXELS__ : core._PY_; + } } core.loader._load(function () { diff --git a/public/libs/enemys.js b/public/libs/enemys.js index 24737c9..5f543ef 100644 --- a/public/libs/enemys.js +++ b/public/libs/enemys.js @@ -208,9 +208,9 @@ enemys.prototype.canBattle = function (enemy, x, y, floorId) { return damage != null && damage < core.status.hero.hp; }; -enemys.prototype.getDamageString = function (enemy, x, y, floorId) { +enemys.prototype.getDamageString = function (enemy, x, y, floorId, hero) { if (typeof enemy == 'string') enemy = core.material.enemys[enemy]; - var damage = this.getDamage(enemy, x, y, floorId); + var damage = this.getDamage(enemy, x, y, floorId, hero); var color = '#000000'; @@ -234,7 +234,7 @@ enemys.prototype.getDamageString = function (enemy, x, y, floorId) { }; ////// 接下来N个临界值和临界减伤计算 ////// -enemys.prototype.nextCriticals = function (enemy, number, x, y, floorId) { +enemys.prototype.nextCriticals = function (enemy, number, x, y, floorId, hero) { if (typeof enemy == 'string') enemy = core.material.enemys[enemy]; number = number || 1; @@ -246,7 +246,7 @@ enemys.prototype.nextCriticals = function (enemy, number, x, y, floorId) { floorId ); if (specialCriticals != null) return specialCriticals; - var info = this.getDamageInfo(enemy, null, x, y, floorId); + var info = this.getDamageInfo(enemy, hero, x, y, floorId); if (info == null) { // 如果未破防... var overAtk = this._nextCriticals_overAtk(enemy, x, y, floorId); @@ -268,12 +268,19 @@ enemys.prototype.nextCriticals = function (enemy, number, x, y, floorId) { number, x, y, - floorId + floorId, + hero ); }; /// 未破防临界采用二分计算 -enemys.prototype._nextCriticals_overAtk = function (enemy, x, y, floorId) { +enemys.prototype._nextCriticals_overAtk = function ( + enemy, + x, + y, + floorId, + hero +) { var calNext = function (currAtk, maxAtk) { var start = currAtk, end = maxAtk; @@ -284,7 +291,7 @@ enemys.prototype._nextCriticals_overAtk = function (enemy, x, y, floorId) { if (mid - start > end - mid) mid--; var nextInfo = core.enemys.getDamageInfo( enemy, - { atk: mid }, + { atk: mid, x: hero?.x, y: hero?.y }, x, y, floorId @@ -294,17 +301,17 @@ enemys.prototype._nextCriticals_overAtk = function (enemy, x, y, floorId) { } var nextInfo = core.enemys.getDamageInfo( enemy, - { atk: start }, + { atk: start, x: hero?.x, y: hero?.y }, x, y, floorId ); return nextInfo == null ? null - : [start - core.getStatus('atk'), nextInfo]; + : [start - core.getStatusOrDefault(hero, 'atk'), nextInfo]; }; return calNext( - core.getStatus('atk') + 1, + core.getStatusOrDefault(hero, 'atk') + 1, core.getEnemyValue(enemy, 'hp', x, y, floorId) + core.getEnemyValue(enemy, 'def', x, y, floorId) ); @@ -322,48 +329,17 @@ enemys.prototype._nextCriticals_special = function ( return null; }; -enemys.prototype._nextCriticals_useLoop = function ( - enemy, - info, - number, - x, - y, - floorId -) { - var mon_hp = info.mon_hp, - hero_atk = core.getStatus('atk'), - mon_def = info.mon_def, - pre = info.damage; - var list = []; - var start_atk = hero_atk; - if (info.__over__) { - start_atk += info.__overAtk__; - list.push([info.__overAtk__, -info.damage]); - } - for (var atk = start_atk + 1; atk <= mon_hp + mon_def; atk++) { - var nextInfo = this.getDamageInfo(enemy, { atk: atk }, x, y, floorId); - if (nextInfo == null || typeof nextInfo == 'number') break; - if (pre > nextInfo.damage) { - pre = nextInfo.damage; - list.push([atk - hero_atk, info.damage - nextInfo.damage]); - if (nextInfo.damage <= 0 && !core.flags.enableNegativeDamage) break; - if (list.length >= number) break; - } - } - if (list.length == 0) list.push([0, 0]); - return list; -}; - enemys.prototype._nextCriticals_useBinarySearch = function ( enemy, info, number, x, y, - floorId + floorId, + hero ) { var mon_hp = info.mon_hp, - hero_atk = core.getStatus('atk'), + hero_atk = core.getStatusOrDefault(hero, 'atk'), mon_def = info.mon_def, pre = info.damage; var list = []; @@ -382,7 +358,7 @@ enemys.prototype._nextCriticals_useBinarySearch = function ( if (mid - start > end - mid) mid--; var nextInfo = core.enemys.getDamageInfo( enemy, - { atk: mid }, + { atk: mid, x: hero?.x, y: hero?.y }, x, y, floorId @@ -393,7 +369,7 @@ enemys.prototype._nextCriticals_useBinarySearch = function ( } var nextInfo = core.enemys.getDamageInfo( enemy, - { atk: start }, + { atk: start, x: hero?.x, y: hero?.y }, x, y, floorId @@ -418,73 +394,14 @@ enemys.prototype._nextCriticals_useBinarySearch = function ( return list; }; -enemys.prototype._nextCriticals_useTurn = function ( - enemy, - info, - number, - x, - y, - floorId -) { - var mon_hp = info.mon_hp, - hero_atk = core.getStatus('atk'), - mon_def = info.mon_def, - turn = info.turn; - // ------ 超大回合数强制使用二分算临界 - // 以避免1攻10e回合,2攻5e回合导致下述循环卡死问题 - if (turn >= 1e6) { - // 100w回合以上强制二分计算临界 - return this._nextCriticals_useBinarySearch( - enemy, - info, - number, - x, - y, - floorId - ); - } - var list = [], - pre = null; - var start_atk = hero_atk; - if (info.__over__) { - start_atk += info.__overAtk__; - list.push([info.__overAtk__, -info.damage]); - } - for (var t = turn - 1; t >= 1; t--) { - var nextAtk = Math.ceil(mon_hp / t) + mon_def; - // 装备提升比例的计算临界 - nextAtk = Math.ceil(nextAtk / core.getBuff('atk')); - if (nextAtk <= start_atk) break; - if (nextAtk != pre) { - var nextInfo = this.getDamageInfo( - enemy, - { atk: nextAtk }, - x, - y, - floorId - ); - if (nextInfo == null || typeof nextInfo == 'number') break; - list.push([ - nextAtk - hero_atk, - Math.floor(info.damage - nextInfo.damage) - ]); - if (nextInfo.damage <= 0 && !core.flags.enableNegativeDamage) break; - pre = nextAtk; - } - if (list.length >= number) break; - } - if (list.length == 0) list.push([0, 0]); - return list; -}; - ////// N防减伤计算 ////// -enemys.prototype.getDefDamage = function (enemy, k, x, y, floorId) { +enemys.prototype.getDefDamage = function (enemy, k, x, y, floorId, hero) { if (typeof enemy == 'string') enemy = core.material.enemys[enemy]; k = k || 1; - var nowDamage = this._getDamage(enemy, null, x, y, floorId); + var nowDamage = this._getDamage(enemy, hero, x, y, floorId); var nextDamage = this._getDamage( enemy, - { def: core.getStatus('def') + k }, + Object.assign({}, hero ?? {}, { def: core.getStatus('def') + k }), x, y, floorId @@ -508,8 +425,8 @@ enemys.prototype.getDamageInfo = function (enemy, hero, x, y, floorId) { }; ////// 获得在某个勇士属性下怪物伤害 ////// -enemys.prototype.getDamage = function (enemy, x, y, floorId) { - return this._getDamage(enemy, null, x, y, floorId); +enemys.prototype.getDamage = function (enemy, x, y, floorId, hero) { + return this._getDamage(enemy, hero, x, y, floorId); }; enemys.prototype._getDamage = function (enemy, hero, x, y, floorId) { @@ -517,7 +434,6 @@ enemys.prototype._getDamage = function (enemy, hero, x, y, floorId) { if (typeof enemy == 'string') enemy = core.material.enemys[enemy]; if (enemy == null) return null; - if (x === 9 && y === 3) debugger; var info = this.getDamageInfo(enemy, hero, x, y, floorId); if (info == null) return null; if (typeof info == 'number') return info; diff --git a/public/libs/maps.js b/public/libs/maps.js index d51f369..6e1e8a8 100644 --- a/public/libs/maps.js +++ b/public/libs/maps.js @@ -634,7 +634,12 @@ maps.prototype.resizeMap = function (floorId) { var height = core.bigmap.v2 ? core._PY_ + 64 : core.bigmap.height * 32; core.bigmap.canvas.forEach(function (cn) { - core.maps._setHDCanvasSize(core.canvas[cn], width, height); + if (core.domStyle.hdCanvas.includes(cn)) + core.maps._setHDCanvasSize(core.canvas[cn], width, height); + else { + core.canvas[cn].canvas.width = width; + core.canvas[cn].canvas.height = height; + } core.canvas[cn].canvas.style.width = width * core.domStyle.scale + 'px'; core.canvas[cn].canvas.style.height = @@ -2581,7 +2586,7 @@ maps.prototype._drawThumbnail_drawTempCanvas = function ( tempCanvas.canvas.height = height * 32; tempCanvas.canvas.removeAttribute('isHD'); } else { - core.resizeCanvas(tempCanvas, width * 32, height * 32, false, true); + core.maps._setHDCanvasSize(tempCanvas, width * 32, height * 32); } } else if (width * height > core.bigmap.threshold) { options.v2 = true; @@ -2589,7 +2594,7 @@ maps.prototype._drawThumbnail_drawTempCanvas = function ( tempCanvas.canvas.width = core._PX_; tempCanvas.canvas.height = core._PY_; tempCanvas.canvas.removeAttribute('isHD'); - } else core.resizeCanvas(tempCanvas, core._PX_, core._PY_); + } else core.maps._setHDCanvasSize(tempCanvas, width * 32, height * 32); var centerX = options.centerX, centerY = options.centerY; if (centerX == null) centerX = Math.floor(width / 2); @@ -2611,8 +2616,7 @@ maps.prototype._drawThumbnail_drawTempCanvas = function ( tempCanvas.canvas.width = width * 32; tempCanvas.canvas.height = height * 32; tempCanvas.canvas.removeAttribute('isHD'); - } else - core.resizeCanvas(tempCanvas, width * 32, height * 32, false, true); + } else core.maps._setHDCanvasSize(tempCanvas, width * 32, height * 32); } options.ctx = tempCanvas; @@ -2695,6 +2699,10 @@ maps.prototype._drawThumbnail_drawToTarget = function (floorId, options) { if (centerY == null) centerY = Math.floor(height / 2); var tempCanvas = core.bigmap.tempCanvas; + if (!core.getLocalStorage('antiAliasing')) { + ctx.imageSmoothingEnabled = false; + } + if (options.inFlyMap) { ctx.drawImage( tempCanvas.canvas, @@ -2707,6 +2715,7 @@ maps.prototype._drawThumbnail_drawToTarget = function (floorId, options) { options.w, options.h ); + ctx.imageSmoothingEnabled = true; return; } @@ -2752,6 +2761,7 @@ maps.prototype._drawThumbnail_drawToTarget = function (floorId, options) { realHeight ); } + ctx.imageSmoothingEnabled = true; } else { // 只绘制可见窗口 var pw = core._PX_, @@ -2793,6 +2803,7 @@ maps.prototype._drawThumbnail_drawToTarget = function (floorId, options) { h ); } + ctx.imageSmoothingEnabled = true; } else { var offsetX = core.clamp(centerX - hw, 0, width - W), offsetY = core.clamp(centerY - hh, 0, height - H); @@ -2809,6 +2820,7 @@ maps.prototype._drawThumbnail_drawToTarget = function (floorId, options) { w, h ); + ctx.imageSmoothingEnabled = true; return; } core.drawImage( @@ -2823,6 +2835,7 @@ maps.prototype._drawThumbnail_drawToTarget = function (floorId, options) { w, h ); + ctx.imageSmoothingEnabled = true; } } }; diff --git a/public/libs/ui.js b/public/libs/ui.js index 3c071a4..4f3b72a 100644 --- a/public/libs/ui.js +++ b/public/libs/ui.js @@ -4203,12 +4203,12 @@ ui.prototype.resizeCanvas = function ( var ctx = core.getContextByName(name); if (!ctx) return null; if (width != null) { - if (!styleOnly) + if (!styleOnly && ctx.canvas.hasAttribute('isHD')) core.maps._setHDCanvasSize(ctx, width, null, isTempCanvas); ctx.canvas.style.width = width * core.domStyle.scale + 'px'; } if (height != null) { - if (!styleOnly) + if (!styleOnly && ctx.canvas.hasAttribute('isHD')) core.maps._setHDCanvasSize(ctx, null, height, isTempCanvas); ctx.canvas.style.height = height * core.domStyle.scale + 'px'; } diff --git a/public/main.js b/public/main.js index f46cc84..dc54216 100644 --- a/public/main.js +++ b/public/main.js @@ -220,6 +220,15 @@ function main() { } main.prototype.init = function (mode, callback) { + try { + var a = {}; + var b = {}; + new Proxy(a, b); + } catch (e) { + alert('浏览器版本过低,无法游玩本塔!'); + return; + } + for (var i = 0; i < main.dom.gameCanvas.length; i++) { main.canvas[main.dom.gameCanvas[i].id] = main.dom.gameCanvas[i].getContext('2d'); diff --git a/public/project/floors/MT35.js b/public/project/floors/MT35.js index 5c675a3..e1423af 100644 --- a/public/project/floors/MT35.js +++ b/public/project/floors/MT35.js @@ -34,7 +34,7 @@ main.floors.MT35= "你来这干什么", { "type": "if", - "condition": "core.getBlock(10,1)", + "condition": "(core.getBlockId(10,1)!=='none')", "true": [ "把怪踢到这了,想打?", "没门!", @@ -60,7 +60,7 @@ main.floors.MT35= "你来这干什么", { "type": "if", - "condition": "core.getBlock(4,1)", + "condition": "(core.getBlockId(4,1)!=='none')", "true": [ "把怪踢到这了,想打?", "没门!", @@ -82,7 +82,7 @@ main.floors.MT35= "7,0": [ { "type": "if", - "condition": "flag:inWinter2===true", + "condition": "(flag:inWinter2===true)", "true": [ { "type": "changeFloor", diff --git a/public/project/floors/MT36.js b/public/project/floors/MT36.js index 7476eaf..3a42368 100644 --- a/public/project/floors/MT36.js +++ b/public/project/floors/MT36.js @@ -1,37 +1,85 @@ main.floors.MT36= { -"floorId": "MT36", -"title": "冰封雪原", -"name": "冰封雪原", -"width": 15, -"height": 15, -"canFlyTo": true, -"canFlyFrom": true, -"canUseQuickShop": true, -"cannotViewMap": false, -"images": [], -"ratio": 8, -"defaultGround": "T580", -"bgm": "winter.mp3", -"firstArrive": [], -"eachArrive": [], -"parallelDo": "", -"events": {}, -"changeFloor": {}, -"beforeBattle": {}, -"afterBattle": {}, -"afterGetItem": {}, -"afterOpenDoor": {}, -"autoEvent": {}, -"cannotMove": {}, -"cannotMoveIn": {}, -"map": [ + "floorId": "MT36", + "title": "冰封雪原", + "name": "冰封雪原", + "width": 15, + "height": 15, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "cannotViewMap": false, + "images": [], + "ratio": 8, + "defaultGround": "T580", + "bgm": "winter.mp3", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": { + "7,14": [ + { + "type": "changeFloor", + "floorId": "MT35", + "loc": [ + 7, + 0 + ] + } + ], + "6,14": [ + "在本地图的右方,会看到一个棕色的线,这是由于抗锯齿出现的像素错误。这里关闭抗锯齿即可解决(默认是关闭的)。" + ] + }, + "changeFloor": {}, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [ 0, 0, 0,604,604,604,604,604,604, 91,604, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,604, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,70176,70177,70177,70177,70177], + [604, 0, 0, 0, 0, 0, 0, 0, 0, 0,70184,70185,70185,70185, 94], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,70208,70209,70209,70209,70209], + [604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [584,584,584,584,584,584,584,584,584,584,584, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [70056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [585,585,585,585,585,585,129, 0,585,585,585,585,585,585,585] +], + "bgmap": [ + [70073,70073,70073,70056, 0, 0, 0, 0, 0, 0,70058,70086,70086,70086,70086], + [70073,70073,70073,70056, 0, 0, 0, 0, 0, 0,70058,70094,70094,70094,70094], + [70081,70081,70081,70056, 0, 0, 0, 0, 0, 0,70058,70102,70102,70102,70102], + [ 0, 0, 0,70056, 0, 0, 0, 0, 0, 0, 0,70110,70110,70110,70110], + [ 0, 0, 0,70056, 0, 0, 0, 0, 0, 0,70058,70118,70118,70118,70118], + [ 0, 0, 0,70056, 0, 0, 0, 0, 0, 0,70058,70067,70067,70067,70067], + [70049,70049,70049,70051, 0, 0, 0, 0, 0, 0,70058,70067,70067,70067,70067], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,70052,70067,70067,70067,70067], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,70058], + [70065,70065,70065,70065,70065,70065,70065,70065,70065,70065,70065,70059, 0, 0,70058], + [70070,70070,70070,70070,70070,70070,70070,70070,70070,70070,70070,70056, 0, 0,70058], + [70081,70081,70081,70081,70081,70081,70081,70081,70081,70081,70081,70056, 0, 0,70058], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,70051, 0, 0,70058], + [70056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,70058], + [70056, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0,70058] +], + "fgmap": [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,70200,70201,70201,70201,70201], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], @@ -42,4 +90,24 @@ main.floors.MT36= [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], + "bg2map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,70184,70185,70185,70185,70185], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,70192,70193,70193,70193,70193], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,70049,70049,70049,70050], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [70048,70049,70049,70049,70049,70049,70049,70049,70049,70049,70049, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "fg2map": [ + +] } \ No newline at end of file diff --git a/public/project/functions.js b/public/project/functions.js index 3f07167..91004e5 100644 --- a/public/project/functions.js +++ b/public/project/functions.js @@ -336,8 +336,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { var equipId = core.getEquip(0); if (equipId && (core.material.items[equipId].equip || {}).animate) animate = core.material.items[equipId].equip.animate; - // 你也可以在这里根据自己的需要,比如enemyId或special或flag来修改播放的动画效果 - // if (enemyId == '...') animate = '...'; // 检查该动画是否存在SE,如果不存在则使用默认音效 if (!(core.material.animates[animate] || {}).se) @@ -348,11 +346,16 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { else core.drawHeroAnimate(animate); // 获得战斗伤害信息 - var damageInfo = core.getDamageInfo(enemyId, null, x, y) || {}; + // 注意这里勇士坐标要传入当前勇士坐标,不然会默认取伤害最低的地方打怪 + const damageInfo = + core.getDamageInfo( + enemyId, + { x: core.status.hero.loc.x, y: core.status.hero.loc.y }, + x, + y + ) ?? {}; // 战斗伤害 - var damage = damageInfo.damage; - // 当前战斗回合数,可用于战后所需的判定 - var turn = damageInfo.turn; + const damage = damageInfo.damage; // 判定是否致死 if (damage == null || damage >= core.status.hero.hp) { core.status.hero.hp = 0; @@ -367,7 +370,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { core.status.hero.statistics.battle++; // 智慧之源 - if (core.hasSpecial(special, 14) && flags.hard == 2) { + if (core.hasSpecial(special, 14) && flags.hard === 2) { core.addFlag( 'inte_' + floorId, Math.ceil((core.status.hero.mdef / 10) * 0.3) * 10 @@ -390,32 +393,18 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { core.declineStudiedSkill(); } - // 计算当前怪物的支援怪物 - var guards = []; - if (x != null && y != null) { - guards = core.getFlag('__guards__' + x + '_' + y, []); - core.removeFlag('__guards__' + x + '_' + y); - } - // 获得金币 - var money = guards.reduce(function (curr, g) { - return curr + core.material.enemys[g[2]].money; - }, enemy.money); + const money = enemy.money; core.status.hero.money += money; core.status.hero.statistics.money += money; // 获得经验 - var exp = guards.reduce(function (curr, g) { - return curr + core.material.enemys[g[2]].exp; - }, enemy.exp); + const exp = enemy.exp; core.status.hero.exp += exp; core.status.hero.statistics.exp += exp; - var hint = '打败 ' + enemy.name; - if (core.flags.statusBarItems.indexOf('enableMoney') >= 0) - hint += ',金币+' + money; - if (core.flags.statusBarItems.indexOf('enableExp') >= 0) - hint += ',经验+' + exp; + const hint = + '打败 ' + enemy.name + ',金币+' + money + ',经验+' + exp; core.drawTip(hint, enemy.id); if (core.getFlag('bladeOn') && core.getFlag('blade')) { @@ -940,6 +929,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { x !== void 0 && y !== null && y !== void 0 && + (hero?.x === null || hero?.x === void 0) && + (hero?.y === null || hero?.y === void 0) && floorId !== null && floorId !== void 0 && flags.autoLocate && @@ -950,7 +941,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { for (const [dir, { x: dx, y: dy }] of Object.entries( core.utils.scan )) { - // 只有攻击和防御和特殊光环需要注意,其他的一般都不会随楼层与坐标变化 + // 只有攻击和防御和特殊光环需要注意,其他的都不会随楼层与坐标变化 const nx = x + dx; const ny = y + dy; if ( @@ -971,8 +962,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { const status = core.getHeroStatusOf( hero, toGet, - x, - y, + nx, + ny, floorId ); if ( @@ -982,20 +973,28 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { ) { continue; } - toMap.push([dir, Object.assign({}, status, { x, y })]); + toMap.push([ + dir, + Object.assign({}, status, { x: nx, y: ny }) + ]); } } else { - toMap = [['none', core.getHeroStatusOf(hero, ['atk', 'def'])]]; + // 指定了勇士坐标或者没有怪物坐标时 + toMap = [ + [ + 'none', + core.getHeroStatusOf( + hero, + ['atk', 'def'], + hero?.x, + hero?.y + ) + ] + ]; } function getDamage(h) { - const enemyInfo = core.enemys.getEnemyInfo( - enemy, - hero, - x, - y, - floorId - ); + const enemyInfo = core.getEnemyInfo(enemy, hero, x, y, floorId); let { hp: mon_hp, @@ -1033,12 +1032,15 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { // 每回合怪物对勇士造成的战斗伤害 var per_damage = mon_atk - hero_def; + // 魔攻:战斗伤害就是怪物攻击力 if ( core.hasSpecial(mon_special, 2) || core.hasSpecial(mon_special, 13) - ) + ) { per_damage = mon_atk; + } + // 战斗伤害不能为负值 if (per_damage < 0) per_damage = 0; @@ -1121,20 +1123,21 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { ]; function autoSkillOf(h) { + damageInfo = getDamage(h); + damage = damageInfo?.damage ?? Infinity; if (flags.autoSkill) { for (const [unlock, condition] of skills) { - if (flags[unlock]) { - flags[condition] = true; - const info = getDamage(h); - const d = info?.damage; - if (d !== null && d !== void 0) { - if (d < damage) { - damage = d; - damageInfo = info; - } + if (!flags[unlock]) continue; + flags[condition] = true; + const info = getDamage(h); + const d = info?.damage; + if (d !== null && d !== void 0) { + if (d < damage) { + damage = d; + damageInfo = info; } - flags[condition] = false; } + flags[condition] = false; } } else { damageInfo = getDamage(h); @@ -1142,6 +1145,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { } } + let dirDamageInfo = null; + let dirMinDamage = Infinity; let damageInfo = null; let damage = Infinity; @@ -1150,18 +1155,29 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { return damageInfo; } - if (toMap.length === 1) { + if (toMap.length <= 1) { // 单个与多个分开计算,有助于提高性能表现 - const h = toMap[0][1]; + const h = + toMap[0]?.[1] ?? core.getHeroStatusOf(hero, ['atk', 'def']); autoSkillOf(h); if (damageInfo) { - return Object.assign(damageInfo, { dir: toMap[0][0] }); + return Object.assign(damageInfo, { + dir: [toMap[0]?.[0] ?? 'none', damage] + }); } else return null; } else { + const dirDamage = []; for (const [dir, h] of toMap) { + damage = Infinity; + damageInfo = null; autoSkillOf(h); - if (damageInfo) { - return Object.assign(damageInfo, { dir }); + dirDamage.push([dir, damage]); + if (damage < dirMinDamage) { + dirMinDamage = damage; + dirDamageInfo = damageInfo; + } + if (dirDamageInfo) { + return Object.assign(dirDamageInfo, { dir: dirDamage }); } else return null; } } @@ -1501,7 +1517,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { repulse = {}, // 每个点的阻击怪信息 mockery = {}, // 电摇嘲讽 halo = {}; // 光环 - var betweenAttackLocs = {}; // 所有可能的夹击点 var needCache = false; var canGoDeadZone = core.flags.canGoDeadZone; var haveHunt = false; @@ -1702,23 +1717,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { } } - // 夹击;在这里提前计算所有可能的夹击点,具体计算逻辑在下面 - // 如果要防止夹击伤害,可以简单的将 flag:no_betweenAttack 设为true - if ( - enemy && - core.enemys.hasSpecial(enemy.special, 16) && - !core.hasFlag('no_betweenAttack') - ) { - for (var dir in core.utils.scan) { - var nx = x + core.utils.scan[dir].x, - ny = y + core.utils.scan[dir].y, - currloc = nx + ',' + ny; - if (nx < 0 || nx >= width || ny < 0 || ny >= height) - continue; - betweenAttackLocs[currloc] = true; - } - } - // 检查地图范围类技能 var specialFlag = core.getSpecialFlag(enemy); if (specialFlag & 1) needCache = true; @@ -1743,74 +1741,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { } } - // 对每个可能的夹击点计算夹击伤害 - for (var loc in betweenAttackLocs) { - var xy = loc.split(','), - x = parseInt(xy[0]), - y = parseInt(xy[1]); - // 夹击怪物的ID - var enemyId1 = null, - enemyId2 = null; - // 检查左右夹击 - var leftBlock = blocks[x - 1 + ',' + y], - rightBlock = blocks[x + 1 + ',' + y]; - if ( - leftBlock && - !leftBlock.disable && - rightBlock && - !rightBlock.disable && - leftBlock.id == rightBlock.id - ) { - if (core.hasSpecial(leftBlock.event.id, 16)) - enemyId1 = leftBlock.event.id; - } - // 检查上下夹击 - var topBlock = blocks[x + ',' + (y - 1)], - bottomBlock = blocks[x + ',' + (y + 1)]; - if ( - topBlock && - !topBlock.disable && - bottomBlock && - !bottomBlock.disable && - topBlock.id == bottomBlock.id - ) { - if (core.hasSpecial(topBlock.event.id, 16)) - enemyId2 = topBlock.event.id; - } - - if (enemyId1 != null || enemyId2 != null) { - var leftHp = core.status.hero.hp - (damage[loc] || 0); - if (leftHp > 1) { - // 夹击伤害值 - var value = Math.floor(leftHp / 2); - // 是否不超过怪物伤害值 - if (core.flags.betweenAttackMax) { - var enemyDamage1 = core.getDamage( - enemyId1, - x, - y, - floorId - ); - if (enemyDamage1 != null && enemyDamage1 < value) - value = enemyDamage1; - var enemyDamage2 = core.getDamage( - enemyId2, - x, - y, - floorId - ); - if (enemyDamage2 != null && enemyDamage2 < value) - value = enemyDamage2; - } - if (value > 0) { - damage[loc] = (damage[loc] || 0) + value; - type[loc] = type[loc] || {}; - type[loc]['夹击伤害'] = true; - } - } - } - } - core.flags.canGoDeadZone = canGoDeadZone; core.status.checkBlock = { damage: damage, diff --git a/public/project/icons.js b/public/project/icons.js index b2eeac3..24bb91b 100644 --- a/public/project/icons.js +++ b/public/project/icons.js @@ -121,7 +121,8 @@ var icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1 = "T585": 61, "T586": 62, "T587": 63, - "T588": 64 + "T588": 64, + "T604": 65 }, "animates": { "star": 0, diff --git a/public/project/maps.js b/public/project/maps.js index 75ed89f..4c7da55 100644 --- a/public/project/maps.js +++ b/public/project/maps.js @@ -531,6 +531,7 @@ var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = "601": {"cls":"enemys","id":"E601"}, "602": {"cls":"enemys","id":"E602"}, "603": {"cls":"enemys","id":"E603"}, + "604": {"cls":"terrains","id":"T604"}, "20037": {"cls":"tileset","id":"X20037","cannotOut":["up","left"],"cannotIn":["up","left"]}, "20038": {"cls":"tileset","id":"X20038","cannotOut":["up"],"cannotIn":["up"]}, "20039": {"cls":"tileset","id":"X20039","cannotOut":["up","right"],"cannotIn":["up","right"]}, @@ -562,11 +563,24 @@ var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = "30121": {"cls":"tileset","id":"X30121","canPass":true}, "30196": {"cls":"tileset","id":"X30196","canPass":true}, "30204": {"cls":"tileset","id":"X30204","canPass":true}, - "70065": {"cls":"tileset","id":"X70065","cannotIn":["down"],"cannotOut":["down"]}, + "70048": {"cls":"tileset","id":"X70048","cannotOut":["up","left"],"cannotIn":["up","left"]}, + "70049": {"cls":"tileset","id":"X70049","cannotOut":["up"],"cannotIn":["up"]}, + "70050": {"cls":"tileset","id":"X70050","cannotOut":["up","right"],"cannotIn":["up","right"]}, + "70056": {"cls":"tileset","id":"X70056","cannotOut":["left"],"cannotIn":["left"]}, + "70058": {"cls":"tileset","id":"X70058","cannotOut":["right"],"cannotIn":["right"]}, + "70064": {"cls":"tileset","id":"X70064","cannotOut":["down","left"],"cannotIn":["down","left"]}, + "70065": {"cls":"tileset","id":"X70065","cannotIn":["up","down","left","right"],"cannotOut":["up","down","left","right"]}, + "70066": {"cls":"tileset","id":"X70066","cannotOut":["down","right"],"cannotIn":["down","right"]}, "70112": {"cls":"tileset","id":"X70112","cannotIn":["down"],"cannotOut":["down"]}, "70114": {"cls":"tileset","id":"X70114","cannotIn":["down"],"cannotOut":["down"]}, "70120": {"cls":"tileset","id":"X70120","cannotIn":["up","down","left","right"]}, "70122": {"cls":"tileset","id":"X70122","cannotIn":["up","down","left","right"]}, "70128": {"cls":"tileset","id":"X70128","cannotIn":["up","down","left","right"]}, - "70130": {"cls":"tileset","id":"X70130","cannotIn":["up","down","left","right"]} + "70130": {"cls":"tileset","id":"X70130","cannotIn":["up","down","left","right"]}, + "70184": {"cls":"tileset","id":"X70184","canPass":true}, + "70185": {"cls":"tileset","id":"X70185","canPass":true}, + "70186": {"cls":"tileset","id":"X70186","canPass":true}, + "70200": {"cls":"tileset","id":"X70200","canPass":true}, + "70201": {"cls":"tileset","id":"X70201","canPass":true}, + "70202": {"cls":"tileset","id":"X70202","canPass":true} } \ No newline at end of file diff --git a/public/project/materials/terrains.png b/public/project/materials/terrains.png index dec89e969c051474d9371f0b6fdd267fbb6c82b2..b00c8f3bfc0ad97a9028fb7c70d92cfecb26ebac 100644 GIT binary patch delta 14784 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 RP0QS8H%Iq?o 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", + "
", + "注:如果出现明显卡顿现象可以考虑关闭本设置或自动切换技能设置。" + ] + }, + "antiAliasing": { + "text": "抗锯齿", + "desc": [ + "是否开启抗锯齿。开启后,画面会变得不那么锐利,观感更加舒适;关闭后,可以更好地展现出像素感。", + "
", + "
", + "此项只对游戏画面起作用,对浏览地图和楼传均不起作用。" ] }, "showStudied": { diff --git a/src/plugin/settings.ts b/src/plugin/settings.ts index 0dba7ec..4e778f8 100644 --- a/src/plugin/settings.ts +++ b/src/plugin/settings.ts @@ -40,6 +40,11 @@ export const useFixed = ref(true); */ export const autoLocate = ref(true); +/** + * 是否开启抗锯齿 + */ +export const antiAliasing = ref(true); + watch(transition, n => { core.plugin.transition.value = n; core.setLocalStorage('transition', n); @@ -78,6 +83,17 @@ watch(autoSkill, n => { core.status.route.push(`set:autoLocate:${n}`); }); +watch(antiAliasing, n => { + core.setLocalStorage('antiAliasing', n); + for (const canvas of core.dom.gameCanvas) { + if (n) { + canvas.classList.remove('no-anti-aliasing'); + } else { + canvas.classList.add('no-anti-aliasing'); + } + } +}); + /** * 重置设置信息,从localStorage读取即可 */ @@ -88,6 +104,7 @@ function reset() { autoScale.value = core.getLocalStorage('autoScale', true); showStudied.value = core.getLocalStorage('showStudied', true); showHalo.value = core.getLocalStorage('showHalo', true); + antiAliasing.value = core.getLocalStorage('antiAliasing', false); } function resetFlag() { diff --git a/src/plugin/ui/fixed.ts b/src/plugin/ui/fixed.ts index 85be6c5..25e4ad7 100644 --- a/src/plugin/ui/fixed.ts +++ b/src/plugin/ui/fixed.ts @@ -75,8 +75,8 @@ export function getDetailedEnemy( } const damageColor = getDamageColor(enemyInfo.damage); const detail: DetailedEnemy = Object.assign(enemyInfo, { - critical: critical[0][0], - criticalDamage: critical[0][1], + critical: critical[0]?.[0] ?? '???', + criticalDamage: critical[0]?.[1] ?? '???', defDamage, specialColor, specialText, diff --git a/src/source/cls.d.ts b/src/source/cls.d.ts index 4624b31..0830efe 100644 --- a/src/source/cls.d.ts +++ b/src/source/cls.d.ts @@ -530,6 +530,7 @@ interface IdToCls { E601: 'enemys'; E602: 'enemys'; E603: 'enemys'; + T604: 'terrains'; X20037: 'tileset'; X20038: 'tileset'; X20039: 'tileset'; @@ -561,11 +562,24 @@ interface IdToCls { X30121: 'tileset'; X30196: 'tileset'; X30204: 'tileset'; + X70048: 'tileset'; + X70049: 'tileset'; + X70050: 'tileset'; + X70056: 'tileset'; + X70058: 'tileset'; + X70064: 'tileset'; X70065: 'tileset'; + X70066: 'tileset'; X70112: 'tileset'; X70114: 'tileset'; X70120: 'tileset'; X70122: 'tileset'; X70128: 'tileset'; X70130: 'tileset'; + X70184: 'tileset'; + X70185: 'tileset'; + X70186: 'tileset'; + X70200: 'tileset'; + X70201: 'tileset'; + X70202: 'tileset'; } \ No newline at end of file diff --git a/src/source/maps.d.ts b/src/source/maps.d.ts index f2a4699..55fde03 100644 --- a/src/source/maps.d.ts +++ b/src/source/maps.d.ts @@ -530,6 +530,7 @@ interface IdToNumber { E601: 601; E602: 602; E603: 603; + T604: 604; X20037: 20037; X20038: 20038; X20039: 20039; @@ -561,13 +562,26 @@ interface IdToNumber { X30121: 30121; X30196: 30196; X30204: 30204; + X70048: 70048; + X70049: 70049; + X70050: 70050; + X70056: 70056; + X70058: 70058; + X70064: 70064; X70065: 70065; + X70066: 70066; X70112: 70112; X70114: 70114; X70120: 70120; X70122: 70122; X70128: 70128; X70130: 70130; + X70184: 70184; + X70185: 70185; + X70186: 70186; + X70200: 70200; + X70201: 70201; + X70202: 70202; } interface NumberToId { 1: 'yellowWall'; @@ -1101,6 +1115,7 @@ interface NumberToId { 601: 'E601'; 602: 'E602'; 603: 'E603'; + 604: 'T604'; 20037: 'X20037'; 20038: 'X20038'; 20039: 'X20039'; @@ -1132,11 +1147,24 @@ interface NumberToId { 30121: 'X30121'; 30196: 'X30196'; 30204: 'X30204'; + 70048: 'X70048'; + 70049: 'X70049'; + 70050: 'X70050'; + 70056: 'X70056'; + 70058: 'X70058'; + 70064: 'X70064'; 70065: 'X70065'; + 70066: 'X70066'; 70112: 'X70112'; 70114: 'X70114'; 70120: 'X70120'; 70122: 'X70122'; 70128: 'X70128'; 70130: 'X70130'; + 70184: 'X70184'; + 70185: 'X70185'; + 70186: 'X70186'; + 70200: 'X70200'; + 70201: 'X70201'; + 70202: 'X70202'; } \ No newline at end of file diff --git a/src/ui/fixed.vue b/src/ui/fixed.vue index 4306fab..6eb2cb7 100644 --- a/src/ui/fixed.vue +++ b/src/ui/fixed.vue @@ -98,7 +98,7 @@ async function calHeight() { function getLabel(attr: keyof DetailedEnemy) { if (attr === 'critical') return '临界'; if (attr === 'criticalDamage') return '临界减伤'; - if (attr === 'defDamage') return `${core.status.thisMap.ratio}防`; + if (attr === 'defDamage') return `${core.status?.thisMap?.ratio ?? 1}防`; return core.getStatusLabel(attr); } diff --git a/src/ui/fly.vue b/src/ui/fly.vue index 8ed384e..5d41f76 100644 --- a/src/ui/fly.vue +++ b/src/ui/fly.vue @@ -546,6 +546,8 @@ onMounted(async () => { thumb = document.getElementById('fly-thumbnail') as HTMLCanvasElement; thumbCtx = thumb.getContext('2d')!; + const antiAliasing = core.getLocalStorage('antiAliasing', true); + const mapStyle = getComputedStyle(map); const thumbStyle = getComputedStyle(thumb); map.width = parseFloat(mapStyle.width) * devicePixelRatio; @@ -553,6 +555,13 @@ onMounted(async () => { thumb.width = parseFloat(thumbStyle.width) * devicePixelRatio; thumb.height = parseFloat(thumbStyle.width) * devicePixelRatio; + if (!antiAliasing) { + requestAnimationFrame(() => { + thumb.classList.add('no-anti-aliasing'); + thumbCtx.imageSmoothingEnabled = false; + }); + } + Array.from(document.getElementsByClassName('fly-settings')).forEach(v => { v.addEventListener('click', e => (v as HTMLElement).blur()); }); diff --git a/src/ui/settings.vue b/src/ui/settings.vue index 19a2ac5..ad893e2 100644 --- a/src/ui/settings.vue +++ b/src/ui/settings.vue @@ -58,6 +58,14 @@ autoLocate ? 'ON' : 'OFF' }} + 抗锯齿:   {{ + antiAliasing ? 'ON' : 'OFF' + }}