feat:追猎

This commit is contained in:
lizhuoyuan 2025-01-04 15:58:17 +08:00
parent 22b99dc49c
commit e358650d95

View File

@ -518,7 +518,10 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
[24, "激光", function (enemy) { return "经过怪物同行或同列时自动减生命" + (enemy.laser || 0) + "点"; }, "#dda0dd"],
[25, "光环", function (enemy) { return (enemy.range != null ? ((enemy.haloSquare ? "该怪物九宫格" : "该怪物十字") + enemy.haloRange + "格范围内") : "同楼层所有") + "怪物生命提升" + (enemy.hpBuff || 0) + "%,攻击提升" + (enemy.atkBuff || 0) + "%,防御提升" + (enemy.defBuff || 0) + "%" + (enemy.haloAdd ? "可叠加" : "不可叠加"); }, "#e6e099", 1],
[26, "支援", "当周围一圈的怪物受到攻击时将上前支援,并组成小队战斗。", "#77c0b6", 1],
[27, "捕捉", function (enemy) { return "当走到怪物周围" + (enemy.zoneSquare ? "九宫格" : "十字") + "时会强制进行战斗。"; }, "#c0ddbb"]
[27, "捕捉", function (enemy) { return "当走到怪物周围" + (enemy.zoneSquare ? "九宫格" : "十字") + "时会强制进行战斗。"; }, "#c0ddbb"],
[28, "追猎", function (enemy) { return ""; }, "#c0ddbb"],
[29, "败移", function (enemy) { return ""; }, "#c0ddbb"],
[30, "吸噬", function (enemy) { return ""; }, "#c0ddbb"],
];
},
"getEnemyInfo": function (enemy, hero, x, y, floorId) {
@ -1258,7 +1261,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
var damage = {}, // 每个点的伤害值
type = {}, // 每个点的伤害类型
repulse = {}, // 每个点的阻击怪信息
ambush = {}; // 每个点的捕捉信息
ambush = {}, // 每个点的捕捉信息
chase = {}; // 每个点的追猎信息
var betweenAttackLocs = {}; // 所有可能的夹击点
var needCache = false;
var canGoDeadZone = core.flags.canGoDeadZone;
@ -1371,6 +1375,114 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
}
}
// 追猎
if (enemy && core.hasSpecial(enemy.special, 41)) {
for (var nx = x; nx >= 0; nx++) {
if (nx == x) continue
if (nx >= core.bigmap.width) break;
if (core.noPass(nx, y)) break
var currloc = nx + "," + y;
if (nx != x) {
var dir;
if (nx < x) {
//if (x - nx == 1) continue;
dir = "left";
} else {
//if (nx - x == 1) continue;
dir = "right";
}
// 检查下一个点是否存在事件(从而判定是否移动)
var rnx = x + core.utils.scan[dir].x;
var rny = y + core.utils.scan[dir].y;
if (rnx >= 0 && rnx < width && rny >= 0 && rny < height &&
(core.getBlock(rnx, rny, floorId) == null || core.getBlockCls(rnx, rny, floorId) == "items")) {
chase[currloc] = (chase[currloc] || []).concat([
[x, y, id, dir]
]);
}
}
}
for (var nx = x; nx < width; nx--) {
if (nx == x) continue
if (nx < 0) break;
if (core.noPass(nx, y)) break
var currloc = nx + "," + y;
if (nx != x) {
var dir;
if (nx < x) {
//if (x - nx == 1) continue;
dir = "left";
} else {
//if (nx - x == 1) continue;
dir = "right";
}
// 检查下一个点是否存在事件(从而判定是否移动)
var rnx = x + core.utils.scan[dir].x;
var rny = y + core.utils.scan[dir].y;
if (rnx >= 0 && rnx < width && rny >= 0 && rny < height &&
(core.getBlock(rnx, rny, floorId) == null || core.getBlockCls(rnx, rny, floorId) == "items")) {
chase[currloc] = (chase[currloc] || []).concat([
[x, y, id, dir]
]);
}
}
}
for (var ny = y; ny >= 0; ny++) {
if (ny == y) continue
if (ny >= core.bigmap.width) break;
if (core.noPass(x, ny)) break
//console.log(x, ny)
var currloc = x + "," + ny;
if (ny != y) {
var dir;
if (ny < y) {
//if (y - ny == 1) continue;
dir = "up";
} else {
//if (ny - y == 1) continue;
dir = "down";
}
//检查下一个点是否存在事件(从而判定是否移动)
var rnx = x + core.utils.scan[dir].x;
var rny = y + core.utils.scan[dir].y;
if (rnx >= 0 && rnx < width && rny >= 0 && rny < height &&
(core.getBlock(rnx, rny, floorId) == null || core.getBlockCls(rnx, rny, floorId) == "items")) {
chase[currloc] = (chase[currloc] || []).concat([
[x, y, id, dir]
]);
}
}
}
for (var ny = y; ny < height; ny--) {
if (ny == y) continue
if (ny < 0) break;
if (core.noPass(x, ny)) break;
//console.log(x, ny)
var currloc = x + "," + ny;
if (ny != y) {
var dir;
if (ny < y) {
//if (y - ny == 1) continue;
dir = "up";
} else {
//if (ny - y == 1) continue;
dir = "down";
}
//检查下一个点是否存在事件(从而判定是否移动)
var rnx = x + core.utils.scan[dir].x;
var rny = y + core.utils.scan[dir].y;
if (rnx >= 0 && rnx < width && rny >= 0 && rny < height &&
(core.getBlock(rnx, rny, floorId) == null || core.getBlockCls(rnx, rny, floorId) == "items")) {
chase[currloc] = (chase[currloc] || []).concat([
[x, y, id, dir]
]);
}
}
}
}
// 夹击;在这里提前计算所有可能的夹击点,具体计算逻辑在下面
// 如果要防止夹击伤害,可以简单的将 flag:no_betweenAttack 设为true
if (enemy && core.enemys.hasSpecial(enemy.special, 16) && !core.hasFlag('no_betweenAttack')) {