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

📄 sorceress.d2l

📁 转载其他网站的资料与大家分享
💻 D2L
📖 第 1 页 / 共 3 页
字号:
		else 
			DebugWrite("Attack returned false");
		
		DebugWrite("CheckSelf during countess attack");
		CheckSelf();		
		DebugWrite("CheckSelf during countess attack done");
		
		if (layout) { // top left
			if (countess.y >= 11084) { // left
				if (me.y < 11084)
					Teleport(bpl[0].x, bpl[0].y, 5, 5);
				else
					CheckEnemyBPDist(countess, bpl, true);
			}
			else if (countess.y <= 11055) { // right
				if (me.y > 11055)
					Teleport(bpr[0].x, bpr[0].y, 5, 5);
				else
					CheckEnemyBPDist(countess, bpr, true);
			}
			else { // center
				if (me.y > 11084 || me.y < 11055)
					Teleport(bpc[0].x, bpc[0].y, 5, 5);
				else
					CheckEnemyBPDist(countess, bpc, true);
			}
		}
		else { // top right
			if (countess.x <= 12548) { // left
				if (me.x > 12548)
					Teleport(bpl[0].x, bpl[0].y, 5, 5);
				else
					CheckEnemyBPDist(countess, bpl, true);
			}
			else if (countess.x >= 12581) { // right
				if (me.x < 12581)
					Teleport(bpr[0].x, bpr[0].y, 5, 5);
				else
					CheckEnemyBPDist(countess, bpr, true);
			}
			else { // center
				if (me.x > 12581 || me.x < 12548)
					Teleport(bpc[0].x, bpc[0].y, 5, 5);
				else
					CheckEnemyBPDist(countess, bpc, true, poly);
			}
		}
		
		delay(50);
	}
	
	DebugWrite("Countess attack done");
	return true;
}


function CharKillBaal(baal)
{
	if (!baal) {
		Error("Baal not detected");
		DebugWrite(" * ERROR: Baal not detected");
		return false;
	}
	
	if (!ChooseSkills(baal)) {
		Error("Failed to choose skills for baal");
		return false;
	}
	
	DebugWrite("Baal attack started");
	
	var bp1 = new Array();
	bp1[0] = new coord(15136,5897);
	bp1[1] = new coord(15136,5936);
	var bp2 = new Array();
	bp2[0] = new coord(15152,5946);
	bp2[1] = new coord(15134,5967);
	bp2[2] = new coord(15108,5943);
	
	Teleport(15166, 5900, 5);
	Teleport(15137, 5897, 5);
	
	var life = baal.hp;
	var d = new Date();
	var timer = d.getTime();
	CheckEnemyBPDist(baal, bp1);
	while(baal && baal.hp > 0) {		
		if (Attack(baal)) {
			DebugWrite("Attack successfull");
			if (baal.hp >= life) {
				d = new Date();
				if ((d.getTime() - timer) >= 5000)
					Teleport(baal.x, baal.y, 5, 2);
			}
		}
		
		if (!CheckSelf()) {// townheal
			delay(50);
			if (!CheckSelf()) {
				DebugWrite("Going to town to heal");
				// go to town to heal
				var spot = null;
				if (baal.y < 5936)
					spot = CalcSafestSpot(bp2);
				else
					spot = CalcSafestSpot(bp1);
					
				if (!spot) {
					BebugWrite("No safe spot calculated");
					return false;
				}
				Teleport(spot.x, spot.y, 5, 3);
				while(me.mode == 10 || me.mode == 19)
					delay(50);
				
				delay(500);
				Sc_TownHeal(true, true);	
				DebugWrite("Townheal done");
				
				baal = getUnit(1, Lang.NPC.Baal);
				if (!baal) {
					DebugWrite("Failed to detect baal after heal");
					Teleport(15135, 5939, 5, 5);
					delay(250);
					baal = getUnit(1, Lang.NPC.Baal);
					if (!baal) {
						DebugWrite("Failed to detect baal after heal and teleport");
						return false;
					}
				}
			}
		}
			
		if (baal.y < 5936)
			CheckEnemyBPDist(baal, bp1, true);
		else
			CheckEnemyBPDist(baal, bp2, true);
		
		delay(50);
	}
	
	DebugWrite("Baal killed");
	
	return true;
}

function CharThroneAttack(bp)
{
	Teleport(15095, 5045, 5);
	var enemy = FindThroneEnemy();
	while(enemy && enemy.hp > 0 && enemy.mode != 12) {
		if (!BattlePointsAttack(enemy, bp))
			return false;
		delay(50);
		enemy = FindThroneEnemy();
	}

	DebugWrite("Throne attack done");
	return true;
}

function BattlePointsAttack(enemy, bp)
{
	if (!enemy || enemy.hp <= 0 || enemy.mode == 12) {
		DebugWrite("BattlePointsAttack: No enemy or dead enemy");
		return true; // retrurn, continue attack
	}

	if (!ChooseSkills(enemy)) {
		DebugWrite("ChooseSkills failed");
		return false;
	}
	
	DebugWrite("Battlepoints Attack, enemy: " + enemy.name);
	
	var life = enemy.hp;
	var d = new Date();
	var timer = d.getTime();
	var misses = 0; // 43 misses is abort attack and retry
	
	var test;
	var as;		// attack successfull
	
	CheckEnemyBPDist(enemy, bp);
	while(enemy && enemy.hp > 0 && enemy.mode != 12) {
		me.overhead("Attacking " + enemy.name + "("+enemy.hp+")");
		DebugWrite("Launching attack");
		as = Attack(enemy);
		DebugWrite("Attack returned " + as);
		test = CheckEnemyBPDist(enemy, bp);
		
		DebugWrite("Enemy distance checked, returned: " + test);
		if (life <= enemy.hp) {
			DebugWrite("Life higher then start life");
			d = new Date();
			if ((d.getTime() - timer) >= 3000) {
				DebugWrite("Enemy life is higher then previous life for 3 seconds");
				Teleport(enemy.x, enemy.y, 3, 3);
				timer = d.getTime();
				misses++;
			}
			if (misses >= 3) {
				DebugWrite("To many misses");
				return true;
			}
			DebugWrite("Timer check done");
		}
		else {
			DebugWrite("Enemy life is lower");
			life = enemy.hp;
			d = new Date();
			timer = d.getTime();
			misses = 0;
			DebugWrite("Updated timer and life");			
		}
		
		DebugWrite("Going to check self while attacking");
		if (!CheckSelf()) {
			DebugWrite("Going to town to heal");
			// go to town to heal
			var spot = CalcSafestSpot(bp);
			if (!spot) {
				BebugWrite("No safe spot calculated");
				return false;
			}
			Teleport(spot.x, spot.y, 5, 3);
			while(me.mode == 10 || me.mode == 19)
				delay(50);
			delay(500);
			Sc_TownHeal(true, true);	
			DebugWrite("Townheal done");
			return true;
		}
		DebugWrite("Self check done");
		
		delay(50);
	}
	
	DebugWrite("Battlepoints Attack done");
	
	return true;
}

function CheckEnemyBPDist(enemy, bp, ignore_close, poly)
{
	var pos = new coord(enemy);
	var dist = pos.dist(me);

	DebugWrite("Checking enemy distance (" + dist + "): me(" + me.x + "," + me.y + ") enemy(" + enemy.x + "," + enemy.y + ")");

	if (dist > character["max_attack_dist"] || dist < character["min_attack_dist"] || (!ignore_close && FindEnemyNear(me, 5))) {
		var spot = CalcNewSpot(pos, bp, poly);
		if (!spot || !spot.x || !spot.y) {
			Error("No Spot");
			delay(2000);
			DebugWrite("CheckEnemyBPDist() -> No Spot");
			Abort();
		}
		
		DebugWrite("Need to move to " + spot.toString());
		Teleport(spot.x, spot.y, 5);
		DebugWrite("Move done me(" + me.x + "," + me.y + ")");
		return true;
	}
	
	DebugWrite("Distance is ok");
	
	return false;
}

function CalcNewSpot(pos, bp, poly)
{
	if (!pos) {
		DebugWrite("CalcNewSpot() -> No pos");
		Abort();
	}
	if (!bp || !bp.length) {
		DebugWrite("CalcNewSpot() -> No battlepoints");
		Abort();
	}
	
	DebugWrite("Calculating new spot for pos (" + pos.x + "," + pos.y + ")");
	
	var spots = new Array();
	
	for (var i = 0; i < bp.length; i++) {
		spots[i] = new coord(pos);
		var dir = spots[i].dir(bp[i]);
		spots[i].move(dir, character["max_attack_dist"] - 2);
		var closest_enemy = FindClosestEnemyNear(spots[i]);
		if (closest_enemy && closest_enemy.x && closest_enemy.y)
			spots[i].data = spots[i].dist(closest_enemy);
		else
			spots[i].data = 32767; // no enemy near spot!
		
		if (poly && !PointInPoly(poly, spots[i]))
			spots[i].data = -1; // invalid point
	}		
	
	var best = new coord();
	for (var j = 0; j < spots.length; j++) {
		if (!best.x && !best.y) {
			best.set(spots[j]);
		}
		if (spots[j].data > best.data) {
			best.set(spots[j]);
		}
	}
	
	if (best.data == -1) {
		DebugWrite("Best has data -1, returning (me.x,me.y)");
		return new coord(me.x,me.y);
	}
	
	DebugWrite("New calculated spot: " + best.toString());
	return best;
}

function CalcSafestSpot(bp)
{
	if (!bp || !bp.length) {
		DebugWrite("CalcNewSpot() -> No battlepoints");
		Abort();
	}
	
	DebugWrite("Calculating safest spot: " + bp.length + " points");
	
	var best = null;
	for (var i = 0; i < bp.length; i++) {
		if (!best) {
			best = new coord(bp[i]);
			var closest_enemy = FindClosestEnemyNear(best);
			if (closest_enemy && closest_enemy.x && closest_enemy.y)
				best.data = best.dist(closest_enemy);
			else
				best.data = 32767;
			DebugWrite("No best, best set to: " + best.toString());
		}
		else {
			DebugWrite("Going to check bp["+i+"]");
			var closest_enemy = FindClosestEnemyNear(bp[i]);
			var dist = 32767;
			if (closest_enemy && closest_enemy.x && closest_enemy.y)
				dist = bp[i].dist(closest_enemy);
			if (dist > best.data) {
				best.set(bp[i]);
				best.data = dist;
				DebugWrite("Best changed to: " + best.toString());
			}
		}
	}
	
	return best;
}

function CharDefend()
{
	var e = FindEnemy();
	if (e) {
		var pos = new coord(e);
		if (pos.dist(me) < 10) {
			Attack(e);
		}
	}
}

function Attack(e)
{	
	if (!e) {
		DebugWrite("Warning: Attack: no enemy");
		return false;
	}
		
	var dt = new Date();
	var time = dt.getTime();

	// merc kill
	
	// check static
	if (character["static_field"] && ((e.hp * 100) / e.hpmax) <= 60)
		character["static_field"] = false;
	
	// dont attack when last attack still casting
	var pos = new coord(e);
	
	if (me.mode == 10)
		return false;

	DebugWrite("Attack: " + character["primary_skill"] + " and " + character["secondary_skill"]);
	
	if (character["primary_skill"] && (time - character["primary_skill_time"]) >= character["primary_skill_delay"]) {
		DebugWrite("Primary attack");
		Sc_SetSkill(character["primary_skill"], left_hand);
		e.useSkill(left_hand);
		
		character["primary_skill_time"] = time;
		delay(50);
		if (me.mode != 10)
			return false;
	}
	else if ((character["static_field"] || character["secondary_skill"]) && me.mode != 10)
	{
		DebugWrite("Secondary attack");
		if (character["static_field"]) {
			Sc_SetSkill("Static Field", right_hand);
			e.useSkill(right_hand);
			delay(50);
			if (me.mode != 10)
				return false;
		}
		else if (character["secondary_skill"]) {
			if (character["secondary_skill"] == "Nova" && pos.dist(me) >= character["max_attack_dist"])
				return false;
			Sc_SetSkill(character["secondary_skill"], right_hand);
			e.useSkill(right_hand);
			delay(50);
			if (me.mode != 10)
				return false;
		}
	}
	else
		return false;
	
	return true;
}


function ChooseSkills(e, no_secondary)
{
	if (!e) {
		DebugWrite("Warning: No enemy in ChooseSkills");
		return false;
	}
	
	character["primary_skill"] = "";
	character["secondary_skill"] = "";
	
	var fire_immune = (e.getStat(39) > 99) ? true : false;
	var light_immune = (e.getStat(41) > 99) ? true : false;
	var cold_immune = (e.getStat(43) > 99) ? true : false;
	
// check for skills
	var fire_wall = me.getSkill("Fire Wall");
	var meteor = me.getSkill("Meteor");
	var hydra = me.getSkill("Hydra");
	var blizzard = me.getSkill("Blizzard");
	var frozen_orb = me.getSkill("Frozen Orb");
	
// check secondary skills
	var inferno = me.getSkill("Inferno");
	var fire_ball = me.getSkill("Fire Ball");
	var frost_nova = me.getSkill("Frost Nova");
	var ice_blast = me.getSkill("Ice Blast");
	var glacial_spike = me.getSkill("Glacial Spike");
	var charged_bolt = me.getSkill("Charged Bolt");
	var telekinesis = me.getSkill("Telekinesis");
	var lightning = me.getSkill("Lightning");
	var nova = me.getSkill("Nova");
	var chail_lightning = me.getSkill("Chain Lightning");
	
	character["static_field"] = me.getSkill("Static Field");
	
	if (!character["static_field"]) character["static_field"] = false; else character["static_field"] = true;
	if (!fire_wall) fire_wall = 0;
	if (!meteor) meteor = 0;
	if (!hydra) hydra = 0;
	if (!blizzard) blizzard = 0;
	if (!frozen_orb) frozen_orb = 0;

	if (!inferno) inferno = 0;
	if (!fire_ball) fire_ball = 0;
	if (!frost_nova) frost_nova = 0;
	if (!ice_blast) ice_blast = 0;
	if (!glacial_spike) glacial_spike = 0;
	if (!charged_bolt) charged_bolt = 0;
	if (!telekinesis) telekinesis = 0;
	if (!lightning) lightning = 0;
	if (!nova) nova = 0;
	if (!chail_lightning) chail_lightning = 0;

	var ps = 0; // primary skill
	var ss = 0; // secondary skill
	
	var fire_penalty = 0;
	
	if (e.getEnchant(6) || e.getEnchant(9) || e.getEnchant(25)) { // extra fast
		fire_penalty += 3;
	}
	
	// choose primary skill
	if (!cold_immune) {
		if (frozen_orb && frozen_orb >= blizzard) {
			character["primary_skill"] = "Frozen Orb";
			ps = frozen_orb;
		}
		else if (blizzard) {
			character["primary_skill"] = "Blizzard";
			ps = blizzard;			
		}
	}
	
	if (!fire_immune) {
		if (fire_wall && fire_wall >= meteor && fire_wall >= hydra) {
			if (!ps || ps < (fire_wall - fire_penalty) || (character["primary_skill"] == "Blizzard" && ps < (fire_wall+ 5 ))) {
				ps = fire_wall;
				character["primary_skill"] = "Fire Wall";
			}
		}
		else if (meteor && meteor >= fire_wall && meteor >= hydra) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -