📄 sorceress.d2l
字号:
if (!ps || ps < (meteor - fire_penalty) || (character["primary_skill"] == "Blizzard" && ps < meteor + 5)) {
ps = meteor;
character["primary_skill"] = "Meteor";
}
}
else {
if (hydra && (!ps || ps < (hydra - fire_penalty)) || (character["primary_skill"] == "Blizzard" && ps < hydra + 5)) {
ps = hydra;
character["primary_skill"] = "Hydra";
}
}
}
if (!light_immune) {
if (!ps) { // no primary skill
if (nova && nova >= 20) {
ps = nova;
character["primary_skill"] = "Nova";
}
else if (charged_bolt >= 20) {
ps = charged_bolt;
character["primary_skill"] = "Charged Bolt";
}
}
else {
if (nova >= 20) {
ss = nova;
character["secondary_skill"] = "Nova";
}
else if (charged_bolt >= 20) {
ss = charged_bolt;
character["secondary_skill"] = "Charged Bolt";
}
}
}
else
character["static_field"] = false;
if (no_secondary) {
character["secondary_skill"] = "";
ss = 0;
}
if (character["primary_skill"] == "Nova") {
character["min_attack_dist"] = 4;
character["max_attack_dist"] = 9;
}
else if (character["secondary_skill"] == "Nova") {
character["min_attack_dist"] = 5;
character["max_attack_dist"] = 11;
}
else {
character["min_attack_dist"] = 8;
character["max_attack_dist"] = 16;
}
if (!ps && !ss) {
immune = "";
if (cold_immune) immune += "cold ";
if (light_immune) immune += "light ";
if (fire_immune) immune += "fire ";
DebugWrite(" * WARNING: No good primary and secondary attack skill found: Enemy " + e.name + " is immune to " + immune);
print(color_red + "No good primary and secondary attack skill found.");
return false;
}
character["primary_skill_delay"] = GetCastDelay(character["primary_skill"]);
return true;
}
function CheckEnemyDist(e, aggressive)
{
var pos = new coord(e);
var dist = pos.dist(me);
if (dist > character["max_attack_dist"]) {
var dir = pos.dir(me);
if (aggressive == 2)
pos.move(dir, character["max_attack_dist"] - 5)
else
pos.move(dir, character["max_attack_dist"] - 2)
if (!Teleport(pos.x, pos.y, 5, 3)) {
dir.rotate();
dir.rotate(rnd(150, 210));
pos.set(e);
pos.move(dir, character["max_attack_dist"] - 3);
Teleport(pos.x, pos.y, 5, 3);
}
}
else if (dist < character["min_attack_dist"] && aggressive != 2) {
var dir = pos.dir(me);
pos.move(dir, character["max_attack_dist"] - 3);
if (!Teleport(pos.x, pos.y, 3, 2)) {
dir.rotate(rnd(150, 210));
pos.set(e);
pos.move(dir, character["max_attack_dist"] - 3);
Teleport(pos.x, pos.y, 3, 2);
}
}
else {
if (aggressive) {
return;
}
e = FindClosestEnemy();
if (!e)
return;
pos.set(e);
if (dist < character["min_attack_dist"]) {
var dir = pos.dir(me);
pos.move(dir, character["max_attack_dist"] - 3);
if (!Teleport(pos.x, pos.y, 3, 2)) {
dir.rotate(180);
pos.set(e);
pos.move(dir, character["max_attack_dist"] - 3);
Teleport(pos.x, pos.y, 3, 2);
}
}
}
}
function CharMephAttack(meph)
{
if (!meph) {
DebugWrite(" * ERROR: CharMephAttack: No mephisto");
return false;
}
if (!ChooseSkills(meph)) {
DebugWrite(" * ERROR: CharMephAttack: No skill to kill mephisto");
return false;
}
/*
var bp = new Array();
bp[0] = new coord(17534,8050);
bp[1] = new coord(17535,8058);
bp[2] = new coord(17536,8068);
bp[3] = new coord(17536,8077);
bp[4] = new coord(17549,8079);
bp[5] = new coord(17547,8069);
bp[6] = new coord(17547,8059);
bp[7] = new coord(17551,8050);
bp[8] = new coord(17562,8057);
bp[9] = new coord(17562,8070);
bp[10] = new coord(17563,8080);
bp[11] = new coord(17574,8075);
bp[12] = new coord(17573,8059);
*/
/*
var bp = new Array();
bp[0] = new coord(17570, 8078);
bp[1] = new coord(17571, 8057);
bp[2] = new coord(17536, 8064);
*/
/*
var bp = new Array();
bp[0] = new coord(17550, 8047);
bp[1] = new coord(17550, 8081);
bp[2] = new coord(1563, 8068);
*/
var bp = new Array();
bp.push(new coord(17549, 8049));
bp.push(new coord(17573, 8070));
bp.push(new coord(17549, 8082));
bp.push(new coord(17565, 8079));
bp.push(new coord(17565, 8059));
var m = new Array();
m[0] = 276;
m[1] = 367;
while(meph && meph.hp > 0) {
if (!CheckMissiles(m, meph, bp))
CheckEnemyBPDist(meph, bp);
Attack(meph);
delay(50);
if (!CheckSelf()) {
delay(500);
Sc_TownHeal(true, true);
}
}
return true;
}
function CharAndyAttack(andy)
{
if (!andy) {
DebugWrite(" * ERROR: CharAndyAttack: No Andariel");
return false;
}
if (!ChooseSkills(andy, true)) {
DebugWrite(" * ERROR: CharAndyAttack: No skill to kill Andariel");
return false;
}
var bp = new Array();
bp[0] = new coord(22546,9515);
bp[1] = new coord(22554,9524);
bp[2] = new coord(22539,9523);
bp[3] = new coord(22548,9531);
bp[4] = new coord(22556,9538);
bp[5] = new coord(22541,9538);
bp[6] = new coord(22549,9546);
bp[7] = new coord(22557,9555);
bp[8] = new coord(22541,9553);
bp[9] = new coord(22548,9561);
bp[10] = new coord(22556,9568);
bp[11] = new coord(22542,9567);
bp[12] = new coord(22547,9576);
var m = new Array();
m[0] = 32;
m[1] = 203;
while(andy && andy.hp > 0) {
//if (!CheckMissiles(m, andy, bp))
CheckUniDist(andy, bp);
Attack(andy);
delay(40);
CheckSelf();
}
return true;
}
function CheckUniDist(e, bp)
{
var pos = new coord(me);
var dist = pos.dist(e);
if (bp) {
if (dist > character["max_attack_dist"] || dist < character["min_attack_dist"]) {
var point = GetBestBattlePoint(e, bp);
if (!point.x && !point.y) {
return;
}
pos.set(e);
var dir = pos.dir(point);
pos.move(dir, character["max_attack_dist"] - 2);
Teleport(pos.x, pos.y, 5, 2);
return;
}
}
else {
if (dist > character["max_attack_dist"]) {
var dir = pos.dir(e);
pos.move(dir, character["max_attack_dist"] + dist - 3);
if (!Teleport(pos.x, pos.y, 5, 2)) {
dir.rotate(180);
pos.set(e);
pos.move(dir, character["max_attack_dist"] - 3);
Teleport(pos.x, pos.y, 5, 2);
return;
}
}
else if (dist < character["min_attack_dist"]) {
var dir = pos.dir(e);
pos.move(dir, character["max_attack_dist"] + dist - 3);
if (!Teleport(pos.x, pos.y, 5, 2)) {
dir.rotate(180);
pos.set(e);
pos.move(dir, character["max_attack_dist"] - 3);
Teleport(pos.x, pos.y, 5, 2);
return;
}
}
}
if (GetEnemyCountNear(me, 8)) {
point = GetBestBattlePoint(e, bp);
if (!point.x && !point.y) {
return;
}
Teleport(point.x, point.y, 5, 2);
}
}
function GetBestBattlePoint(e, bp)
{
var best = null;
var best_dist = 32767;
var enemycount = 32767;
for (var i = 0; i < bp.length; i++) {
if (!best) {
best = bp[i];
}
else {
dist = bp[i].dist(e);
if (dist > character["min_attack_dist"] && dist < character["max_attack_dist"]) {
count = GetEnemyCountNear(bp[i], 5);
if (dist >= best_dist && count <= enemycount) {
best = bp[i];
best_dist = bp[i].dist(me);
enemycount = count;
}
}
}
}
return new coord(best);
}
function GetBestDodgePoint(e, bp, min_angle, max_angle)
{
var pos = new coord(e);
var dir = pos.dir(me);
var best = null;
var best_dist = 0;
var enemycount = 32767;
if (e.name == "Andariel") {
for (var i = 0; i < bp.length; i++) {
var dir2 = pos.dir(bp[i]);
var angle = dir.angle(dir2);
if (angle > min_angle && angle < max_angle) {
if (!best) {
var best = bp[i];
var best_dist = best.dist(e);
var enemycount = GetEnemyCountNear(bp[i], 5);
}
else {
var dist = bp[i].dist(e);
if (dist > character["min_attack_dist"] && dist < character["max_attack_dist"]) {
var count = GetEnemyCountNear(bp[i], 5);
if (count < enemycount) {
best = bp[i];
best_dist = best.dist(e);
enemycount = count;
}
else if(dist > best_dist) {
best = bp[i];
best_dist = best.dist(e);
enemycount = count;
}
}
}
}
}
}
else {
for (var i = 0; i < bp.length; i++) {
var dir2 = pos.dir(bp[i]);
var angle = dir.angle(dir2);
if (angle > min_angle && angle < max_angle) {
if (!best) {
best = bp[i];
best_dist = best.dist(e);
}
else {
dist = bp[i].dist(e);
if (dist >= character["min_attack_dist"] && dist <= character["max_attack_dist"]) {
best = bp[i];
best_dist = best.dist(e);
break;
}
}
}
}
}
var c = new coord(e);
var dir = c.dir(best);
c.move(dir, character["max_attack_dist"] - 2);
return c;
}
function CheckMissiles(m, e, bp)
{
var d = new Date();
var time = d.getTime();
if ((time - character["dodged_missile_timer"]) < 2000)
return;
var pos = new coord(e);
var dir = pos.dir(me);
var missile = getUnit(8);
do {
if (missile && missile.id != character["dodged_missile"]) {
for (var i = 0; i < m.length; i++) {
if (missile.classid == m[i]) {
character["dodged_missile"] = missile.id;
character["dodged_missile_timer"] = time;
DodgeMissile(m[i], e, bp);
return true;
}
}
}
}while(missile && missile.getNext());
return false;
}
function DodgeMissile(type, e, bp)
{
switch(type) {
case 32:
case 203:
if (me.mode != 10) {
point = GetBestDodgePoint(e, bp, 90, 180);
Teleport(point.x, point.y, 5, 5);
}
////else {
//DodgeMove();
//}
return;
case 276:
case 367:
// mephisto:
print(color_yellow + "Meph missile")
// if (me.mode != 10) {
point = GetBestDodgePoint(e, bp, 20, 180);
Teleport(point.x, point.y, 5, 5);
/* }
// else {
point = new coord(me);
dir = point.dir(e);
dir.rotate(110);
point.move(dir, 5);
DodgeMove(point);
// }*/
return;
}
}
function DodgeMove(target)
{
var pos = new coord(me);
me.move(target.x, target.y);
delay(100);
while(me.mode == 2)
delay(100);
return true;
}
function IsImmuneTo(e, type)
{
if (!e) {
DebugWrite(" * ERROR: IsImmuneTo: No enemy");
return false;
}
switch(type) {
case "fire":
if (e.getStat(39) > 99) return true;
break;
case "light":
if (e.getStat(41) > 99) return true;
break;
case "cold":
if (e.getStat(43) > 99) return true;
break;
case "none":
return true;
break;
}
return false;
}
function GetSkillDamageType(skill)
{
switch (skill)
{
case "Fire Bolt" :
case "Inferno" :
case "Blaze" :
case "Fire Ball" :
case "Fire Wall" :
case "Enchant" :
case "Hydra" :
case "Meteor" :
return "fire";
case "Chain Lightning" :
case "Lightning" :
case "Thunder Storm" :
case "Nova" :
case "Telekinesis" :
case "Static Field" :
case "Charged Bolt" :
return "light";
case "Frozen Orb" :
case "Blizzard" :
case "Frost Nova" :
case "Ice Blast" :
case "Glacial Spike" :
case "Ice Bolt" :
case "Chilling Armor" :
case "Shiver Armor" :
case "Frozen Armor" :
return "cold";
default:
DebugWrite(" * ERROR: GetSkillDamageType: " + skill + " is no damage skill");
return "none";
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -