Arret d'execution du code

Vous voulez de l'aide ? Postez ici :)
Post Reply
lazysolver
Posts: 3
Joined: 27 Apr 2017, 17:02

Arret d'execution du code

Post by lazysolver »

Bonsoir,
ça fait des semaines que j'arrive pas à résoudre un problème qui m’empèche d'exploiter actiona.
Dans mon scripte, je n'ai qu'une seule commande "Code" que je programme en javascript, toutes les action y sont programmées.
Je met le code à votre disposition en bas.
Mon problème, c'est que l’exécution du code s’interrompe à un endroit aléatoire.
Le code s'agit d'un certain nombre d'actions qui s’exécutent en boucle un certain nombre de fois.
Des fois, l’exécution se termine sans problèmes, alors que des fois ça s’arrente sans afficher d'erreur.
Durant l’exécution normale, le processus consomme entre 6 et 15% CPU, ce qui est tout à fait normal. Par contre, quand ça s’interrompe, la consommation baisse à 0 (aucune boucle n'est en cours d’exécution).
Quelqu'un saurai d’où viens ce problème?

Merci d'avance!

Code :

Code: Select all


//Resources
var preci = new Image("C:/Program Files (x86)/Actiona/Resources/Images/preci.png");
var dd_capture = new Image("C:/Program Files (x86)/Actiona/Resources/Images/DD_capture.png");
var filter_button = new Image("C:/Program Files (x86)/Actiona/Resources/Images/green_filter.png");
var battle_field = new Image("C:/Program Files (x86)/Actiona/Resources/Images/battle_field.png");
var first_certif = new Image("C:/Program Files (x86)/Actiona/Resources/Images/first_certif.png");
var valid_button = new Image("C:/Program Files (x86)/Actiona/Resources/Images/valid_button.png");
var destination = new Image("C:/Program Files (x86)/Actiona/Resources/Images/destination.png");
var enclos_door = new Image("C:/Program Files (x86)/Actiona/Resources/Images/enclosdoor.png");
var zaapi_menu = new Image("C:/Program Files (x86)/Actiona/Resources/Images/zaapi_menu.png");
var hdv_button = new Image("C:/Program Files (x86)/Actiona/Resources/Images/hdv_button.png");
var battle_end = new Image("C:/Program Files (x86)/Actiona/Resources/Images/battle_end.png");
var leave_spot = new Image("C:/Program Files (x86)/Actiona/Resources/Images/leave_spot.png");
var hdv_annim = new Image("C:/Program Files (x86)/Actiona/Resources/Images/hdv_annim.png");
var abra_head = new Image("C:/Program Files (x86)/Actiona/Resources/Images/abra_head.png");
var zaap_brak = new Image("C:/Program Files (x86)/Actiona/Resources/Images/zaap_brak.png");
var montable = new Image("C:/Program Files (x86)/Actiona/Resources/Images/montable.png");
var celeste = new Image("C:/Program Files (x86)/Actiona/Resources/Images/celeste.png");
var redbull = new Image("C:/Program Files (x86)/Actiona/Resources/Images/redbull.png");
var certif = new Image("C:/Program Files (x86)/Actiona/Resources/Images/certif.png");
var divine = new Image("C:/Program Files (x86)/Actiona/Resources/Images/divine.png");
var enclos = new Image("C:/Program Files (x86)/Actiona/Resources/Images/enclos.png");
var equipe = new Image("C:/Program Files (x86)/Actiona/Resources/Images/equipe.png");
var abra1 = new Image("C:/Program Files (x86)/Actiona/Resources/Images/abra1.png");
var abra2 = new Image("C:/Program Files (x86)/Actiona/Resources/Images/abra2.png");
var abra3 = new Image("C:/Program Files (x86)/Actiona/Resources/Images/abra3.png");
var abra4 = new Image("C:/Program Files (x86)/Actiona/Resources/Images/abra4.png");
var abra5 = new Image("C:/Program Files (x86)/Actiona/Resources/Images/abra5.png");
var abra6 = new Image("C:/Program Files (x86)/Actiona/Resources/Images/abra6.png");
var abra7 = new Image("C:/Program Files (x86)/Actiona/Resources/Images/abra7.png");
var ready = new Image("C:/Program Files (x86)/Actiona/Resources/Images/ready.png");
var close = new Image("C:/Program Files (x86)/Actiona/Resources/Images/close.png");
var zaapi = new Image("C:/Program Files (x86)/Actiona/Resources/Images/zaapi.png");
var amour = new Image("C:/Program Files (x86)/Actiona/Resources/Images/amour.png");
var endur = new Image("C:/Program Files (x86)/Actiona/Resources/Images/endur.png");
var mount = new Image("C:/Program Files (x86)/Actiona/Resources/Images/mount.png");
var bread = new Image("C:/Program Files (x86)/Actiona/Resources/Images/bread.png");
var power = new Image("C:/Program Files (x86)/Actiona/Resources/Images/power.png");
var level = new Image("C:/Program Files (x86)/Actiona/Resources/Images/level.png");
var sort = new Image("C:/Program Files (x86)/Actiona/Resources/Images/sort.png");
var turn = new Image("C:/Program Files (x86)/Actiona/Resources/Images/turn.png");
var lost = new Image("C:/Program Files (x86)/Actiona/Resources/Images/lost.png");
var no = new Image("C:/Program Files (x86)/Actiona/Resources/Images/no.png");

//Pixel coordinates
var pos_initial = new Point(900,800);
var pos_battle = new Point();
var pos_abra = new Point();
var pos_turn = new Point();
var pos = new Point();

//Variables
var i = 0;
var battle_lost = false;
var count = 200;

//Main loop
while(count > 0)
{
	if(count > 1)
		Console.print(count + " battle remaining...");
	else
		Console.print("last battle...");

	count--;
	var stop = false;
	
	//Get the DD
	if(!battle_lost)
	{
		Console.print("Getting the DD...");
		Click_image(no,500);
		Click_image(zaapi);
		Click_image(hdv_button);
		Click_image(hdv_annim);
		Click_image(valid_button);
		Click_image(enclos_door);
		Console.print("Shed access.");
		Click_image(certif);
		Console.print("Opened the certificats tab.");
		Click_image(filter_button);
		Console.print("Engaged the filter.");
		Click_image(montable);
		Console.print("Selected \"Montable\".");
		Click_image(sort);
		Console.print("Sorting...");
		Click_image(level,0,90);
		Console.print("Sorted by level.");
		Custom_drag(first_certif,equipe);
		Click_image(close);
		Console.print("Got the DD!");
	}
	
	//Battle preparation
	Console.print("preparing for the battle...");
	Click_image(redbull,0,0,6);
	Click_image(bread,0,0,10);
	Click_image(destination,0,0,2);
	Console.print("Prepared");

	//battle search
	Console.print("Searching for a battle...");
	var attempt = 0;
	while(!Image_search(battle_field))
	{
		Console.print("Attempt " + (++attempt));
		if(!Click_image(abra1,200,90,2))
		{
			Console.print("Abra 1");
			if(!Click_image(abra2,200,90,2))
			{
				Console.print("Abra 2");
				if(!Click_image(abra3,200,90,2))
				{
					Console.print("Abra 3");
					Click_image(abra4,200,90,2);
					Console.print("Abra 4");
				}
			}
		}
		Console.print("End of Attempt " + attempt);
		Wait_for(battle_field,1000);
	}

	Console.print("Battle found!");
	
	//Positionning
	Console.print("Positionning...");
	pos_initial = new Point(900,800);
	Click(1, pos_initial);
	pos_abra_head = Wait_for(abra_head,10000, 500).position;
	pos_ready = Wait_for(ready,1000, 500).position;
	pos_turn = pos_ready;
	Click_image(mount,0,0,2);
	Console.print("Abra found at : " + pos_abra_head.toString());
	
	//Determine battle position
	if(pos_abra_head.x == 962 || pos_abra_head.y == 600)
		pos = new Point(1000,700);
	else if(pos_abra_head.x == 1062 && pos_abra_head.y == 650)
		pos = new Point(1000,700);
	else
		pos = new Point(1050,725);
	
	//Battle start
	pos_initial = new Point(1200,750);
	Click(1, pos_initial);
	Console.print("Battle starts!");
	Click_image(ready);
	Keep_waiting(turn);
	Spell(power,pos_initial,1);
	Spell(preci,pos_initial,1);
	Click(1, pos);
	Delay(1000);
	Spell(divine,pos,1);
	Spell(celeste,pos,1);
	Spell(dd_capture,pos,1);
	Click_image(turn);
	
	var looping = true;
	do
	{
		if(Wait_for(battle_end, 200, 200))
		{
			if(Wait_for(lost,100))
			{
				battle_lost = true;
				Console.print("Defeat!")
			}
			else
			{
				Console.print("Victory!")
				battle_lost = false;
			}
			looping = false;
		}
		else
		{
			if(Wait_for(turn,200, 200))
			{
				Console.print("Turn start.");
				Spell(divine,pos,1);
				Spell(celeste,pos,2);
				Spell(divine,pos,1);
				Click_image(turn,200);
				Console.print("Turn end.");
			}
		}
	}while(looping);
	Console.print("Battle ends!");
	
	Click_image(close);
	Delay(100);
	Click_image(close,50);
	if(!battle_lost)
		Click_image(leave_spot);
	Keep_waiting(zaap_brak);
	Console.print("Next round..");
}

Console.print("End of code");

function Spell(p,d,c)
{
	for(var i = 0; i < c; i++)
	{
		Click_image(p,100);
		Click(1,d);
		Delay(100);
	}
}


// ------------------------- Utilities ------------------------- //

function Drag(p1, p2, Delay)
{
	//Default values
	if(!Delay)
		Delay = 1000;

	//Content
	var m = new Mouse();
	m.move(p1);
	Delay(80,0);
	m.press();
	Slide(p1, p2, Delay);
	m.release();
}

function Slide(p1, p2, delay)
{
	//Default values
	if(!delay)
		delay = 1000;

	//Content
	var absolute_start = Get_time();
	var m = new Mouse();
	var steps_count = Math.ceil(delay/5);
	m.move(p1);
	var error_coorection = 0;
	for(var i = 1; i < steps_count; i++)
	{
		var start_time = Get_time();
		m.move(new Point(i*(p2.x-p1.x)/steps_count + p1.x, i*(p2.y-p1.y)/steps_count + p1.y));
		Delay(Math.max(0,5 - (Get_time() - start_time) - error_coorection),0);
		error_coorection = (Get_time() - absolute_start)%5;
	}
	m.move(p2);
}

function Delay(t, incertainty)
{
	//Defalut values
	if(!incertainty)
		incertainty = 0;

	//Content
	Execution.pause(Get_random(t-incertainty, t+incertainty));
}

function Get_random(limit_inf, limit_sup)
{
	var result = Math.floor(Math.random()*(limit_sup-limit_inf)) + limit_inf;
	return result;
}

function Get_time()
{
	d = new Date();
	return d.valueOf();
}

function Wait_disapear(image, loopDelay)
{
	//Defaut values
	if(!loopDelay)
		loopDelay = 200;
	var stop = false;

	//Content
	while(!stop)
	{
		var start_time = Get_time();
		if(Image_search(image))
			stop = true;
		Delay(loopDelay - Get_time() - start_time);
	}
}

function Wait_for(image,  t, loopDelay, confidence)
{
	//Default values
	if(!t || t == 0)
		t = 2000;
	if(!loopDelay|| loopDelay == 0)
		loopDelay = 200;
	if(!confidence || confidence == 0)
		confidence = 95;

	//Content
	var loopCount = t/loopDelay;
	for(var i = 0; i < loopCount; i++)
	{
		var start_time = Get_time();
		var result = Image_search(image,confidence);
		if(result)
		{
			return result;	
		}
		Delay(loopDelay - Get_time() + start_time);
	}
	return null;
}

function Click(n,p,interDelay,incertainty)
{
	//Default values
	if(!interDelay)
	{
		interDelay = 100;
		incertainty = 50;
	}
	else
		if(!incertainty)
			incertainty = Math.min(100, interDelay/100);

	//Content
	var m = new Mouse();
	m.move(p);
	for(var i = 0; i < n; i++)
	{	
		m.click();
		Delay(interDelay, incertainty);
	}
}

function Click_image(image, t, confidence, times)
{
	if(!confidence || confidence == 0)
		confidence = 95;
	if(!t || t == 0)
		t = 10000;
	if(!times)
		times = 1;
	var r = Wait_for(image,t,200,confidence);
	if (r)
	{
		Click(times , r.position, 20);
		Delay(50);
		return true;
	}
	return false;
}

function Wait_for_map_change(check_frequecy, confidence)
{
	//Default values
	if(!check_frequecy)
		check_frequecy = 200;
	if(!confidence)
		confidence = 70;

	//Content
	var current = Image.takeScreenshot();
	var start_time = Get_time();
	while(Image_search(current, confidence))
	{
		Delay(Math.max(0,check_frequecy - Get_time() + start_time));
		start_time = Get_time();
	}
}

function Image_search(image, confidence, pyramids)
{
	//Default values
	if(!confidence)
		confidence = 95;
	if(!pyramids)
		pyramids = 2;

	//Content
	var r = Image.takeScreenshot().findSubImage(image,
	{
		confidenceMinimum: confidence,
		downPyramidCount: pyramids,
	});
	return(r);
}

function Custom_drag(p1,p2)
{
	var m = new Mouse();
	var tmp = Wait_for(p1,1000, 500);
	if(tmp)
	{
		var p = tmp.position;
		m.move(p);
		m.press();
		Slide(p,new Point(p.x+50,p.y),100);
		tmp = Wait_for(p2,5000, 500);
		if(tmp)
		{
			m.move(tmp.position);
			Delay(50);
			m.release();
			Delay(100);
		}
	}
}

function Keep_waiting(image, limit, loopDelay)
{
	//Default values
	if(!limit)
		limit = 10000;
	if(!loopDelay)
		loopDelay = 200;

	//Content
	var loopCount = limit/loopDelay;
	for(var i = 0; i < loopCount; i++)
	{
		var start_time = Get_time();
		var result = Image_search(image);
		if(result)
		{
			return true;	
		}
		Delay(loopDelay - Get_time() + start_time);
	}
	return false;
}
francois
Posts: 456
Joined: 18 Oct 2010, 10:33
Location: France

Re: Arret d'execution du code

Post by francois »

Un peu empirique comme réponse.

J'ai regardé le code, pourriez vous essayer de "//" les Console.print.

Francois
francois
Posts: 456
Joined: 18 Oct 2010, 10:33
Location: France

Re: Arret d'execution du code

Post by francois »

Si la piste est bonne,

Une solution serait, non pas d'enlever le Console.print ( cela peut éventuellement être gênant)
Mais de faire un Console.clear() périodiquement.

Francois
lazysolver
Posts: 3
Joined: 27 Apr 2017, 17:02

Re: Arret d'execution du code

Post by lazysolver »

Je vous remercie pour votre retour ^^.
J'ai appliqué votre conseil, mais cela n'a pas résolu le problème. Le code fige encore à un endroit aleatoire. J'eau beau debuggé, je n'ai trouvé aucun probleme de syntax ou un soucis qui peu déclencher une exception non gérée.
francois
Posts: 456
Joined: 18 Oct 2010, 10:33
Location: France

Re: Arret d'execution du code

Post by francois »

A moins que le problème n'intervienne dans un cas logique très particulier, j'ai l'impression qu'il
est plus physique que logique. Genre non libération de la mémoire et bug après quelques(sss) boucles.

D'où la proposition que j'avais faite de commenter les Console.print.

Une suggestion.
Var m = new Mouse() figure dans plusieurs fonctions.
Donc la ressource Mouse est récréée des milliers de fois.
(Avec vraisemblablement création de buffers liés à Mouse)

Tel qu'est écrit le script, cela ne poserait pas de problème de mettre une seule fois cette ligne en début de script.

Cela reste empirique.
lazysolver
Posts: 3
Joined: 27 Apr 2017, 17:02

Re: Arret d'execution du code

Post by lazysolver »

Effectivement, la déclaration unique de la variable m est moins coûteuse, mais ça m’étonnerai que ça soit la source du problème, vu que j'ai 64 Go de RAM, à moins qu'Actiona lui même ne sois capable de gérer un grand nombre d'adresses mémoire. Par contre, la déclaration [var m = new Mouse();] est propre à chaque fonction, ainsi, la variable doit être supprimée à chaque fois (y compris le buffer lié). Encore une fois, cela entraine trop d'allocations et de libération non nécessaires. J'essayerai d'optimiser le code en minimisant au maximum les déclarations, et je retente encore.
Merci infiniment !
Post Reply