📄 sorceress.d2l
字号:
/*******************************************************************************
* *
* The Multi MF *
* v1.25a *
* *
* ---------------------------------------------------------------------------- *
* Copyright (C) 2003 Jan Onno Tuinenga (Scavenger) - tha_scavenger@hotmail.com *
* ---------------------------------------------------------------------------- *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
********************************************************************************/
/////////////////////////////////////////////////////////////////////
// //
// WARNING! //
// //
// ONLY CHANGE THIS FILE IF YOU KNOW WHAT YOU ARE DOING //
// //
/////////////////////////////////////////////////////////////////////
include("vec_coord.d2l");
var character = new Object;
character["protect_skills"] = null;
character["protect_timer"] = 0;
character["min_attack_dist"] = 5;
character["max_attack_dist"] = 15;
character["primary_skill"] = "";
character["primary_skill_time"] = 0
character["primary_skill_delay"] = 0;
character["secondary_skill"] = "";
character["static_field"] = false;
character["recharging"] = false;
character["dodged_missile"] = 0;
character["dodged_missile_timer"] = 0;
var safe_spots = new Object();
safe_spots["pindle"] = new coord(10068,13306);
safe_spots["zombies"] = new coord(10058,13213);
safe_spots["shenk"] = new coord(3838,5117);
/*
var enchantmentTypes = {
"Extra Strong": 5,
"Extra Fast": 6,
"Cursed": 7,
"Magic Resistant": 8,
"Fire Enchanted": 9,
"Champion": 16,
"Lightning Enchanted": 17,
"Cold Enchanted": 18,
"Thief": 24,
"Mana Burn": 25,
"Teleportation": 26,
"Spectral Hit": 27,
"Stone Skin": 28,
"Multiple Shots": 29,
"Ghostly": 36,
"Fanatic": 37,
"Possessed": 38,
"Berserker": 39
};
var auraTypes = {
"Conviction": 28,
"Might": 33,
"Holy Fire": 35,
"Blessed Aim": 40,
"Holy Freeze": 43,
"Holy Shock": 46,
"Fanaticism": 49
};
var immunityTypes = {
"Physical": 36,
"Magic": 37,
"Fire": 39,
"Lightning": 41,
"Cold": 43,
"Poison": 45
}
*/
function CharIsSupported(quest)
{
switch(quest) {
case "countess":
return true;
case "andy":
return true;
case "meph":
return true;
case "pindle":
return true;
case "zombies":
return true;
case "shenk":
return true;
case "baal":
return true;
default:
return false;
}
}
function CheckChar()
{
if (character["recharging"])
return;
if (settings["recharge_mana"] && ((me.mp*100) / globals["mpmax"]) < settings["recharge_mana_percent"]) {
if (safe_spots[globals["quest"]]) {
CharManaRecharge(safe_spots[globals["quest"]]);
}
}
}
function CharManaRecharge(spot)
{
if (!spot) {
DebugWrite(" * ERROR: No spot for recharging mana");
return;
}
Teleport(spot.x, spot.y, 5);
character["recharging"] = true;
while(me.mp < (globals["mpmax"] * 0.75)) {
me.overhead("Waiting till mana is recharged");
CheckSelf();
CharDefend();
delay(100);
}
character["recharging"] = false;
me.overhead("recharge done");
}
function CharPrecast()
{
while(me.mode == 10) {
delay(50);
}
if (me.getSkill("Frozen Armor")) {
while(me.mode == 10)
delay(50);
Sc_SetSkill("Frozen Armor", right_hand);
me.useSkill(right_hand);
delay(50);
}
else if (me.getSkill("Shiver Armor")) {
while(me.mode == 10)
delay(50);
Sc_SetSkill("Shiver Armor", right_hand);
me.useSkill(right_hand);
delay(50);
}
else if (me.getSkill("Chilling Armor")) {
while(me.mode == 10)
delay(50);
Sc_SetSkill("Chilling Armor", right_hand);
me.useSkill(right_hand);
delay(50);
}
if (me.getSkill("Energy Shield")) {
while(me.mode == 10)
delay(50);
Sc_SetSkill("Energy Shield", right_hand);
me.useSkill(right_hand);
delay(50);
}
if (me.getSkill("Thunder Storm")) {
while(me.mode == 10)
delay(50);
Sc_SetSkill("Thunder Storm", right_hand);
me.useSkill(right_hand);
delay(50);
}
if (me.getSkill("Enchant")) {
var merc = GetMerc();
if (merc)
{
while(me.mode == 10)
delay(50);
Sc_SetSkill("Enchant", right_hand);
merc.useSkill(right_hand);
delay(50);
}
}
}
function CharPindleAttack(pindle)
{
if (!pindle) {
DebugWrite(" * ERROR: No pindleskin");
Abort();
}
if (!ChooseSkills(pindle)) {
DebugWrite(" * ERROR: ChooseSkills for Pindleskin failed");
Abort();
}
while(pindle.hp > 0) {
CheckSelf();
CheckPindleDist(pindle);
Attack(pindle);
delay(50);
}
}
function CheckPindleDist(pindle)
{
if (!pindle) {
DebugWrite(" * ERROR: CheckPindleDist: No Pindleskin");
Abort();
}
var pos = new coord(pindle);
var dist = pos.dist(me);
if (dist > character["max_attack_dist"] || dist < character["min_attack_dist"]) {
var spot1 = new coord(10059, 13236);
var spot2 = new coord(10059, 13214);
var spot = spot1;
if (pos.dist(spot1) > pos.dist(spot2)) {
var dir = pos.dir(spot1);
pos.move(dir, character["max_attack_dist"]);
Teleport(pos.x, pos.y, 5, 5);
}
else {
var dir = pos.dir(spot2);
pos.move(dir, character["max_attack_dist"]);
Teleport(pos.x, pos.y, 5, 5);
}
}
}
function CharAttack(e, aggressive)
{
if (!e) {
DebugWrite("CharAttack: No enemy");
return false;
}
if (!ChooseSkills(e)) {
DebugWrite("ChooseSkills failed");
return false;
}
var life = e.hp;
var d = new Date();
var timer = d.getTime();
CheckEnemyDist(e, aggressive);
while(e && e.hp > 0) {
if (Attack(e)) {
if (e.hp >= life) {
d = new Date();
if ((d.getTime() - timer) >= 5000) {
Teleport(e.x, e.y, 5, 2);
}
}
}
CheckEnemyDist(e, aggressive);
delay(50);
CheckSelf();
}
return true;
}
function CharShenkAttack(e)
{
while(1) {
CheckSelf();
// find and kill enemies
var e = FindShenkEnemy();
if (e) {
CharAttack(e);
}
else {
e = getUnit(1, Lang.NPC.Shenk);
if (!e) {
DebugWrite(" * ERROR: Shenk not detected");
return false;
}
if (e.hp > 0) {
CharAttack(e);
}
if (e.hp > 0) {
DebugWrite(" * ERROR: Couldn't kill shenk");
Abort();
}
break;
}
delay(50);
}
return true;
}
function CharZombieAttack()
{
Teleport(10063,13266, 5);
while(1) {
CheckSelf();
var e = FindEnemy("Prowling Dead");
if (!e)
break;
if (!ChooseSkills(e)) {
DebugWrite("ChooseSkills failed");
return false;
}
character["min_attack_dist"] = 0;
character["max_attack_dist"] = 7;
var life = e.hp;
var d = new Date();
var timer = d.getTime();
while(e && e.hp > 0) {
CheckEnemyDist(e, 2);
if (Attack(e)) {
if (e.hp >= life) {
d = new Date();
if ((d.getTime() - timer) >= 5000) {
Teleport(e.x, e.y, 5, 1);
}
}
}
delay(50);
CheckSelf();
} delay(50);
}
}
function CharClearThroneRoom()
{
var bp = new Array();
bp[0] = new coord(15094,5066);
bp[1] = new coord(15080,5057);
bp[2] = new coord(15080,5042);
bp[3] = new coord(15080,5028);
bp[4] = new coord(15110,5026);
bp[5] = new coord(15110,5041);
bp[6] = new coord(15110,5056);
/*
var bp = new Array();
bp[0] = new coord(15094, 5058);
bp[1] = new coord(15080, 5027);
bp[2] = new coord(15108, 5027);
*/
while(1) {
if (!CharThroneAttack(bp))
return false;
Teleport(15095, 5030, 5, 5);
PickItOn();
Teleport(15095, 5045, 5, 5);
PickItOn();
Teleport(15095, 5060, 5, 5);
PickItOn();
if (rnd(0,3) >= 2)
Teleport(15117, 5071, 3);
else
Teleport(15074, 5071, 3);
CheckInvForPots();
while((me.hp < globals["heal_hp"] && GetHealthPot()) || ((me.mp/globals["mpmax"]) * 100 < 70)) {
me.overhead("Healing/recovering mana");
CharDefend();
if (!CheckSelf()) {
delay(500);
Sc_TownHeal(true, true);
}
delay(250);
}
while(!FindThroneEnemy() && getUnit(1, Lang.NPC.Baal)) {
me.overhead("Waiting for enemies");
CharDefend();
if (!CheckSelf()) {
delay(500);
Sc_TownHeal(true, true);
}
delay(250);
}
if (!getUnit(1, Lang.NPC.Baal)) {
me.overhead("Baal is leaving. Going after him");
if (!CheckSelf()) {
delay(500);
Sc_TownHeal(true, true);
}
break;
}
// check enchants
var e = getUnit(1);
do {
if (e && e.hp > 0 && e.mode != 12 && ValidEnemy(e)) {
var p = e.getParent();
if (!p || p.name != me.name) {
CheckEnchants(e);
}
}
}while(e && e.getNext());
CharPrecast();
}
return true;
}
function CharCountessAttack(countess, layout)
{
if (!countess) {
Error("Countess not detected");
DebugWrite(" * ERROR: Countess not detected");
}
if (!ChooseSkills(countess)) {
Error("Failed to choose skills for countess");
return false;
}
DebugWrite("Countess attack started, enemy: " + countess.name);
var bpc = new Array();
var bpl = new Array();
var bpr = new Array();
var poly = new Array();
var left = new coord();
var right = new coord();
if (layout) { // top left
bpc[0] = new coord(12546,11081);
bpc[1] = new coord(12546,11058);
bpc[2] = new coord(12519,11058);
bpc[3] = new coord(12519,11081);
bpl[0] = new coord(12540,11101);
bpr[0] = new coord(12538,11033);
poly[0] = new coord(12546,11081);
poly[1] = new coord(12546,11058);
poly[2] = new coord(12519,11058);
poly[3] = new coord(12519,11081);
//poly[4] = new coord(12546,11081);
left.set(12540,11101);
right.set(12538,11033);
DebugWrite("Top Left layout deteected");
}
else { // top right
bpc[0] = new coord(12555,11014);
bpc[1] = new coord(12575,11014);
bpc[2] = new coord(12575,11040);
bpc[3] = new coord(12555,11040);
bpl[0] = new coord(12531,11032);
bpr[0] = new coord(12600,11034);
poly[0] = new coord(12555,11040);
poly[1] = new coord(12555,11014);
poly[2] = new coord(12575,11014);
poly[3] = new coord(12575,11040);
//poly[4] = new coord(12555,11040);
left.set(12531,11032);
right.set(12600,11034);
DebugWrite("Top Right layout deteected");
}
var life = countess.hp;
var d = new Date();
var timer = d.getTime();
CheckEnemyBPDist(countess, bpc);
while(countess && countess.hp > 0) {
if (Attack(countess)) {
DebugWrite("Attack successfull");
if (countess.hp >= life) {
d = new Date();
if ((d.getTime() - timer) >= 5000)
Teleport(countess.x, countess.y, 5, 2);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -