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

📄 sorceress.d2l

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