⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sorceress.d2l

📁 转载其他网站的资料与大家分享
💻 D2L
📖 第 1 页 / 共 3 页
字号:
/*******************************************************************************
*                                                                              *
*                                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 + -