Ok a ver...
La mayoria de los errores que he encontrado son de acceso a un proceso inexistente, eso con la beta actual (la 6.0) no surgen, tambien porque no hay control de este tipo, pero con la nueva, al primer error ya viene señalado y el core es aun mas preciso.
Otros errores no le veo logica (eso luego explicaras tu porque el codigo esta puesto asi).
El primer error que hay es en
process crea_fase(nivel), donde se crean todos los procesos, y por ultimo el proceso prota.
Este ultimo proceso actualiza la variable ID usada para los siguientes procesos:
process gota1
if(collision(protaid))
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
process gusano(cual)
loop
distx=abs(x-protaid.x);
disty=abs(y-protaid.y);
...
if(collision(protaid))
if(y>protaid.y)
if(!sonando)sound(reboteson,300,250);end
protaid.salto=1;
protaid.vy=-10;
frame(150);
else
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
end
end
process araña(cual)
loop
...
if(collision(protaid))
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
end
process fuego(x,y,flags)
if(collision(protaid))
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
end
process disparobarril(x,y,angle)
loop
if(collision(protaid))
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
frame(200);
end
process bola(x,y,flags,file)
loop
if(collision(protaid))
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
frame;
end
process bola2(x,y,flags,file)
loop
if(collision(protaid))
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
frame;
end
process perro(x,y,dis)
loop
distx=x-protaid.x;
disty=y-protaid.y;
...
if(collision(protaid))
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
end
process demonio(x,y)
loop
while(!despierto)
distx=x-protaid.x;
disty=y-protaid.y;
...
process lanza(x,y,file,flags,z)
loop
if(collision(protaid))
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
end
process granoso(x,y)
loop
...
repeat
radio=(x-protaid.x)/2;
process bichobola(x,y,size)
loop
if(collision(protaid))
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
end
distx=abs(x-protaid.x);
disty=abs(y-protaid.y);
process asomado(x,y,flags)
loop
distx=abs(x-protaid.x);
disty=abs(y-protaid.y);
process pelota(x,y)
tempx=protaid.x;
distx=(tempx-x);
disty=((protaid.y-scroll.y0)/(avy*2));
loop
d=protaid.x-x;
...
if(collision(protaid))
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
end
process disp(x,y,angle)
loop
if(collision(protaid))
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
end
process volador()
loop
if(collision(protaid))
if(y>protaid.y)
protaid.salto=1;
protaid.vy=-10;
frame(150);
else
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
end
end
process tapadera();
loop
disty=abs(protaid.y-y);
distx=abs(x-protaid.x);
process cabeza(x,y)
loop
difx=abs(protaid.x-x);
dify=abs(protaid.y-y);
process disparofinal(x,y,adv,graph,angle);
loop
advance(adv);
if((al=collision(protaid)))
xx=protaid.x;
yy=protaid.y;
signal(protaid,s_kill);
mata_prota(xx,yy,muertefpg);
end
process bichoverde(x,y,xmin,xmax)
loop
distx=abs(x-protaid.x);
disty=abs(y-protaid.y);
...
if(collision(type prota))
if(y>protaid.y)
if(!sonando)sound(reboteson,300,250);end
protaid.salto=1;
protaid.vy=-14;
frame(350) ;
else
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
end
end
end
process piraña(cual)
loop
if(collision(type prota))
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
end
process saltarin(num)
loop
distx=abs(x-protaid.x);
disty=abs(y-protaid.y);
...
if(collision(type prota))
if(y>protaid.y)
protaid.salto=1;
protaid.vy=-8;
frame(350);
else
mata_prota(protaid.x,protaid.y,muertefpg);
signal(protaid,s_kill);
end
end
process muelle()
loop
frame;
if((cual=collision(type prota)))
if(protaid.y<(y-10))
from graph=1 to 4;
frame(200);
if(graph==4);
protaid.salto=1;
protaid.vy=-21;
end
end
end
end
En todos hay llamadas del tipo
protaid.x, el cual ya generaria error para acceder a una variable de un proceso que aun no existe (recordemos que prota viene creado por ultimo).
Lo primero que hay que hacer aqui es averiguar si el ID es valido, tal como esta implementado el codigo es un poco dificil hacer el cambio, especialmente porque hay muchas llamadas a signal, etc..., seria necesario reestructurar todo, pero con la nueva beta puedes semplificarlo mantenendo casi el mismo codigo, lo que debes hacer es poner todo entre un codigo:
if(exists(type prota)
...
end
Aunque exista solo una instancia del proceso prota, con la actual 6.0 el rendimiento de TYPE process es bastante lento en las funciones, pero con la nueva beta ha sido optimizado mucho, en el caso especifico al tener solo una instancia o 0, la velocidad de ejecucion es ligeradamente mas lenta que comprobar la variable (no se nota), asi que podrias hacer este cambio.
Otra cosa que he notado es codigo como este:
donde la variable cual solo es usada en esta asignacion, supongo que sea un error de "prisa" o de algun cambio de codigo y ha quedado ahi.
Otro tipo de error comun que he encontrado en muchos procesos es algo asi:
aparte el acceso a x, y de protaid si este no es valido, lo que veo es una llamada "mas" a signal, porque el proceso mata_prota tiene este codigo:
process mata_prota(x,y,file)
begin
...
signal(type bolaverde,s_kill);
signal(protaid,s_kill);
muerto=0;
vidas--;
from graph=1 to 20;
//hacemos un frame mas lento para que se vea bien
frame(150);
end
if(vidas>0)
prota(posiciones_iniciales[0].x1,posiciones_iniciales[0].y1,posiciones_iniciales[0].y1-340);
end
...
end
En el proceso mismo ya se hace la llamada a signal para el prota, quizas han quedado para algun cambio de codigo ?
El ultimo error que he notado es cuando pierdes la ultima vida, salta el error de acceso a un proceso inexistente, aqui:
Algunos consejos:
- Si no hay exigencias particulares para el juego, es mejor que pongas la prioridad del proceso prota menor de todas las otras, de esta forma el proceso sera ejecutado por ultimo.
- poner una variable local "alive", para los procesos enemigos.
- Poner en el proceso prota y en el proceso disparo del prota todas las colisiones con los enemigos, cuando haya colision con el disparo, actualizas la variable "alive" del proceso (el proceso deberia usar esta variable en su bucle como condicion de salida dal mismo).
- Reducir al minimo o eliminar las llamadas a signal
- Reducir a 1 la llamada a mata_prota (estaria bien solo en el proceso juego).
No he conseguido ver en el juego el bug de clonacion del prota (si no recuerdo mal hay este bug), lo unico que se me occurre es que en un dato momento del juego, mas procesos hagan llamadas a mata_prota y creando asi mas instancias del prota (porque es el solo proceso que llama prota aparte de crea_fase).
Si saco otro rato libre veo si encuentro algo mas, de momento hay eso, espero te sea de ayuda.