PiXeL2004
15/12/2004, 23:06
os gustan los juegos sin gráficos ni música ni cosas de esas?
aquí tenéis: NOFPG
pd: compiladlo vosotros mismos!
pd2: ta un poco muy comentado y un poco basurizado pero no importa: funciona igualmente xD
pd3: añadirle un archivo llamado hurry.wav si queréis escuchar música ;)
/*
[PiXeL] se enorgullece de presentar: NOFPGMatamata (matamarcianos sin fpg)
Autor: Pablo Navarro Reyes [PiXeL]
Fecha: 2004
Aburrimiento: 99.9%
Obviedad: demasiada...
Comentado: 120% x-D
Lineas: ~ no muchas
Optimización: 2/5 (se podrían juntar cosas como el proceso de la nave y de los enemigos y también los disparos, pero se deja así para que sea más facil de leer.)
*/
Program nofpgmatamata;
Global
ancho_pantalla; // resolución horizontal de la pantalla
alto_pantalla; // resolución vertical de la pantalla
efepeese; // imagenes por segundo
phrame; // se usa para la velocidad en los frame(phrame)
dificultad=2; // dificultad (de 1 a 5)
puntos; // puntos del personaje principal
escroll=1; // para saber si estamos usando c_scroll o c_screen para jugar
id_nave; // identificador para la nave
id_malo[20]; // identificadores para todos los malos
resolucion=0; // para cambiar la resolución
xrand; // numero aleatorio entre 0 y ancho_pantalla
yrand; // numero aleatorio entre 0 y alto_pantalla
malos; // numero de enemigos vivos
max_malos; // numero maximo de enemigos
Local
id_puntos; // puntos de cada enemigo o del jugador
Begin
max_malos=3; // numero maximo de enemigos, 20 es el límite
efepeese=24; //minimo 24
phrame=(efepeese/24)*100; // se usa para la velocidad en los frame(phrame)
set_fps(efepeese,0); // le decimos las imágenes por segundo que usaremos
// esto estaba en el original, así que lo dejo! el caso es que carga una canción del Final Fantasy X que le pega mucho!
// no se como se llama pero es la que salía en los anuncios y al principio del juego también... creo que si que se llamaba
// Hurry... Final Fantasy X es de lo mejor! xD
If(file_exists("./hurry.wav")) // si existe hurry.ogg
play_song(load_song("./hurry.wav"),-1); // "playamos" hurry.ogg
End
inicia(); // empecemos...
End
/*
Iniciamos el juego! (qué emocionante!)
*/
Process inicia();
Private
malomalo;
Begin
write(0,0,0,0,"Puntos:");
write_int(0,56,0,0,OFFSET puntos);
estrellado();
id_nave=nave(750,750);
id_malo[0]=1;
pantalla();
timer[0]=0;
Loop
malomalo=0;
xrand=rand(0,ancho_pantalla);
yrand=rand(0,alto_pantalla);
/* según la dificultad hay mas gente o menos
dif=5: sale 1 bixo cada 0,5 segundos y en******ado
dif=4: sale 1 bixo cada 3 segundos y en******ado
dif=3: sale 1 bixo cada 3 segundos
dif=2: sale 1 bixo cada 7 segundos
dif=1: sale 1 bixo cada 15 segundos
dif=-1: sale 1 bixo cada 0,05 segundos :S
en******ado: van a por ti xD
*/
If(dificultad==5) If(timer[0]>50 AND malos<max_malos) timer[0]=0; While(exists(id_malo[malomalo])=>1) malomalo++; Frame; End
id_malo[malomalo]=malo(xrand,yrand,malomalo); End End
If(dificultad==4) If(timer[0]>300 AND malos<max_malos) timer[0]=0; While(exists(id_malo[malomalo])=>1) malomalo++; Frame; End
id_malo[malomalo]=malo(xrand,yrand,malomalo); End End
If(dificultad==3) If(timer[0]>300 AND malos<max_malos) timer[0]=0; While(exists(id_malo[malomalo])=>1) malomalo++; Frame; End
id_malo[malomalo]=malo(xrand,yrand,malomalo); End End
If(dificultad==2) If(timer[0]>700 AND malos<max_malos) timer[0]=0; While(exists(id_malo[malomalo])=>1) malomalo++; Frame; End
id_malo[malomalo]=malo(xrand,yrand,malomalo); End End
If(dificultad==1) If(timer[0]>1500 AND malos<max_malos) timer[0]=0; While(exists(id_malo[malomalo])=>1) malomalo++; Frame; End
id_malo[malomalo]=malo(xrand,yrand,malomalo); End End
If(dificultad==-1) If(timer[0]>5 AND malos<max_malos) timer[0]=0; While(exists(id_malo[malomalo])=>1) malomalo++; Frame; End
id_malo[malomalo]=malo(xrand,yrand,malomalo); End End
If(rand(0,100)==3) item(xrand,yrand); End // 3 de cada 100 veces aparece un item...
If(key(_alt) AND key(_x)) exit(0,"¡Gracias por jugar!"); End // todos somos libres...
If(exists(id_nave)==0) id_nave=nave((ancho_pantalla/5)*2,alto_pantalla/2); End // si no existe la nave del jugador, pos la inventamos!
Frame(phrame);
End
End
/*
Para dibujar gráficos estáticos en pantalla
*/
Process grafico(graph,x,y);
Begin
If(escroll==1) ctype=c_scroll; Else ctype=c_screen; End // esto sale muxo, si es escroll lo pone en c_scroll sino en c_screen
Loop
Frame(phrame);
End
End
/*
¡¡¡¡La nave!!!! q bonita es xD
*/
Process nave(x,y);
Private
inercia; //sip, inercia...
inerciangle; //inercia angular!!!
repetidor; // espacio de tiempo en el que no te puedes teletransportar
t_invencible; // tiempo durante el que eres invencible
t_repetidor=15; // tiempo que tardas en volver a disparar
id_colision; // para saber contra que chocas
id_item; // para saber con que item chocas
avance; // lo que avanzas
Begin
If(escroll==1) ctype=c_scroll; Else ctype=c_screen; End
// hacemos unos circulitos q decrecen para avisarnos donde aparecemos!
graph=new_map(39,39,8);
drawing_color (20);
drawing_map(0,graph);
draw_circle(19,19,19);
drawing_color (20);
draw_circle(19,19,9);
size=200; //el doble de grande
While(size>150) size-=5; Frame(phrame); End
// creamos nuevo mapa pa dibujar la navecica y pintamos!
size=100;
graph=new_map(16,12,8);
drawing_color (20);
drawing_map(0,graph);
draw_line (0,0,0,15);
draw_line (0,11,15,5);
draw_line (15,5,0,0);
drawing_color (21);
draw_line (15,5,0,1);
drawing_color (22);
draw_line (15,5,0,2);
drawing_color (23);
draw_line (15,5,0,3);
drawing_color (24);
draw_line (15,5,0,4);
drawing_color (70);
draw_line (15,5,0,5);
draw_line (15,5,0,6);
drawing_color (24);
draw_line (15,5,0,11);
drawing_color (23);
draw_line (15,5,0,10);
drawing_color (22);
draw_line (15,5,0,9);
drawing_color (21);
draw_line (15,5,0,8);
flags=4; //transparente durante un poco
size=200; //2x tamaño
While(size!=100)
size-=10;
Frame(phrame);
End
Loop
If(escroll==1) ctype=c_scroll; punto(21,x,y); Else ctype=c_screen; End // nos dibuja en el radar si lo hay
// si usamos el teletransportador tendremos que esperar un poco hasta que podamos volver a utilizarlo...
If(key(_space) AND repetidor>15)
repetidor=0;
x=rand(0,ancho_pantalla);
y=rand(0,alto_pantalla);
angle=rand(0,360)*1000;
While(key(_space)) Frame; End
End
If(t_invencible<96) flags=4; Else flags=0; End // somos invencibles? si: transparente, no: opaco
// si nos salimos de la pantalla apareceremos en el extremo opuesto!!
If(x>ancho_pantalla) x=0; End
If(y>alto_pantalla) y=0; End
If(x<0) x=ancho_pantalla; End
If(y<0) y=alto_pantalla; End
// izquierda, derecha, disparo (con retardo entre disparo y disparo) y bloqueo de mandos si se intenta girar hacia ambos lados (furro xD)
If(key(_left)) inerciangle++; End
If(key(_right)) inerciangle--; End
If(key(_alt) AND repetidor>t_repetidor) repetidor=0; disparo(x,y,angle,inercia); End
If(!key(_left) AND !key(_right))
If(inerciangle>0) inerciangle--; End If(inerciangle<0) inerciangle++; End
End
// velocidad de avance
If(key(_control)) inercia++; Else inercia-=1; End
If(inercia>50) inercia=50; End // maximo!
If(inercia<0) inercia=0; End // minimo!
// velocidad de giro
If(inerciangle>20) inerciangle=20; End //maximo y
If(inerciangle<-20) inerciangle=-20; End //minimo, etc...
// si chocamos contra un item, pos miramos su tamaño y nos lo activamos!
If(id_item=collision(Type item))
If(id_item.size==29) t_repetidor--; End
If(id_item.size==31) t_invencible=0; End
signal(id_item,s_kill);
Frame;
End
// el movimiento del proceso finalmente!
angle+=500*inerciangle*100/phrame; // giramos
avance=inercia/5*100/phrame; // cuanto avanzamos?
advance(avance); // pos eso avanzamos!
// estas variables aumentan 1 x cada imagen
repetidor++;
t_invencible++;
If((id_colision=collision(Type disparo_malo)) AND t_invencible>96) Break; End // si te dan, muerex...
Frame;
End
// murió!
puntos--; // 1 minipunto menos pa ti
If(id_colision=collision(Type disparo_malo)) id_colision.father.id_puntos++; End // 1 minipunto más para el q t mató!
signal(id_colision,s_kill); // matamos el disparo que te mató
// animación del circulito doble cuando mueres x-D
graph=new_map(39,39,8);
drawing_color (20);
drawing_map(0,graph);
draw_circle(19,19,19);
drawing_color (20);
draw_circle(19,19,9);
flags=4;
While(size>0) size-=5; Frame(phrame); End
End
/*
Uyyy... el proceso del malo, q miedo! jajajaj (muy parecido al proceso de la nave... c&p? si!)
*/
Process malo(x,y,num_malo);
Private
inercia;
inerciangle;
repetidor;
num;
id_colision;
t_repetidor=15;
t_invencible=97;
id_item;
dist_angle;
dist;
id_texto1;
id_texto2;
String nombre;
Begin
// 1 malo mas acecha...
malos++;
nombre=itoa(num_malo); // su nombre es 1 número
id_texto1=write(0,0,10+10*num_malo,0,"Malo" + nombre + ":"); //
id_texto2=write_int(0,56,10+10*num_malo,0,OFFSET id_puntos); //
If(escroll==1) ctype=c_scroll; Else ctype=c_screen; End // lo de siempre...
angle=rand(0,360)*1000; // para que aparezca mirando hacia un punto aleatorio
num=rand(40,230); // el color también será aleatorio
// pintamos los circulos esos que avisan que aparece
graph=new_map(39,39,8);
drawing_color (num);
drawing_map(0,graph);
draw_circle(19,19,19);
drawing_color (num-20);
draw_circle(19,19,9);
// lo hacemos que decrezca...
size=100;
flags=4;
While(size>25) size-=3; Frame(phrame); End
size=rand(75,125);
flags=0;
// y pintamos la nave
If(rand(0,1)==0) // aquí se decide si el enemigo será redondo o cuadrado
graph=new_map(17,17,8);
drawing_color (num);
drawing_map(0,graph);
DRAW_FCIRCLE (8,8,8);
drawing_color (num-20);
DRAW_FCIRCLE (14,8,2);
Else
graph=new_map(17,17,8);
drawing_color (num);
drawing_map(0,graph);
draw_box (0,5,17,12);
drawing_color (num-20);
DRAW_FCIRCLE (14,8,2);
End
// iniciamos el bucle del malo
Loop
If(escroll==1) ctype=c_scroll; punto(num,x,y); Else ctype=c_screen; End // si existe un radar, nos dibuja en el
If(t_invencible<96) flags=4; Else flags=0; End // mientras t_invencible sea menor q 96, es transparente y no muere
// si alcanza un extremo de la pantalla, aparece en el otro
If(x>ancho_pantalla) x=0; End
If(y>alto_pantalla) y=0; End
If(x<0) x=ancho_pantalla; End
If(y<0) y=alto_pantalla; End
// si la dificultad es menor q 4 pues irá un poco a su bola, pero si es mayor... ira a por la nave!
If(dificultad<4)
If(rand(0,1)==0) inerciangle+=2; End
If(rand(0,1)==0) inerciangle-=2; End
If(rand(0,2)==1 AND repetidor>t_repetidor) repetidor=0; disparo_malo(x,y,angle,inercia,num); End
If(inerciangle>0) inerciangle--; End
If(inerciangle<0) inerciangle++; End
If(rand(0,3)==3) inercia--; Else inercia++; End
Else
// comprobamos si existe la nave para matarla!
If(exists(id_nave)==1) // si existe
dist=fget_dist(x,y,id_nave.x,id_nave.y); // conseguimos su distancia desde el malo
dist_angle=get_angle(id_nave); // y el ángulo desde el malo también
End
If(dist<1000) // si la distancia es menor que 1000 pues a por la nave!
If(angle<dist_angle) inerciangle+=2; // giramos para dirigirnos hacia la nave!
Else
inerciangle-=2;
End
inercia+=2; // aceleramos!
If(repetidor>t_repetidor) repetidor=0; disparo_malo(x,y,angle,inercia,num); End
Else
// si no existe la nave, va a su bola, como en la dificultad menor que 4!
If(rand(0,1)==0) inerciangle+=2; End
If(rand(0,1)==0) inerciangle-=2; End
If(rand(0,2)==1 AND repetidor>t_repetidor) repetidor=0; disparo_malo(x,y,angle,inercia,num); End
If(inerciangle>0) inerciangle--; End
If(inerciangle<0) inerciangle++; End
If(rand(0,3)==3) inercia--; Else inercia++; End
End
End
// limites de las inercias
If(inercia>20) inercia=20; End
If(inercia<0) inercia=0; End
If(inerciangle>5) inerciangle=5; End
If(inerciangle<-5) inerciangle=-5; End
// si choca contra un item lo recoge
If(id_item=collision(Type item))
If(id_item.size==29) t_repetidor--; End
If(id_item.size==31) t_invencible=0; End
signal(id_item,s_kill);
Frame;
End
// finalmente gira, avanza y suma 1 a repetidor y t_invencible!
angle+=500*inerciangle;
advance(inercia/5);
repetidor++;
t_invencible++;
If((id_colision=collision(Type disparo) OR (id_colision=collision(Type disparo_malo))) AND t_invencible>96) Break; End // pa q lo puedas matar!
Frame(phrame); // pintarrr, me gusta pintar! x-D
End
If(collision(Type disparo)) puntos++; End // si le diste tu, pos minipunto pa ti!
If(id_colision=collision(Type disparo_malo)) id_colision.father.id_puntos++; End // si le dio otro malo, pos minipunto pa el!
signal(id_colision,s_kill); // matamos el disparo
delete_text(id_texto1); //borramos textos de este personaje
delete_text(id_texto2); // este tb
// animación de circulitos como cuando nace, pro pa morir!
graph=new_map(39,39,8);
drawing_color (num);
drawing_map(0,graph);
draw_circle(19,19,19);
drawing_color (num-20);
draw_circle(19,19,9);
flags=4;
While(size>0) size-=5; Frame(phrame); End
malos--; // 1 malo menos!
End
/*
¡El disparo! Simple. Un proceso que pilla un ángulo y avanza hasta que alcanza 1 enemigo o se sale de la pantalla!
*/
Process disparo(x,y,angle,inercia);
Begin
// dibujamos el gráfico del disparo!
graph=new_map(6,2,8);
drawing_color (20);
drawing_map(0,graph);
draw_box(0,0,6,2);
advance(15); // avanza un poco desde la posición del jugador para que no le de a este!
Repeat
If(escroll==1) ctype=c_scroll; Else ctype=c_screen; End // lo de siempre...
advance(1500/phrame); // avanza...
Frame;
Until(x>ancho_pantalla OR y>alto_pantalla OR x<0 OR y<0) //hasta que se salga de la pantalla
End
/*
¡El disparo de los malos! Exactamente lo mismo que el del jugador a excepción que este recibe el color del enemigo que lo dispara.
*/
Process disparo_malo(x,y,angle,inercia,num);
Begin
// se dibuja el gráfico
graph=new_map(6,2,8);
drawing_color (num);
drawing_map(0,graph);
draw_box(0,0,6,2);
advance(15); // avanza un poco desde la posición del enemigo que lo dispara para que no choque contra este!
Repeat
If(escroll==1) ctype=c_scroll; Else ctype=c_screen; End // y mas...
advance(1500/phrame); // avanza...
Frame;
Until(x>ancho_pantalla OR y>alto_pantalla OR x<0 OR y<0) //hasta que se salga por algún lado de la pantalla!
End
/*
Generador de mapas de estrellas o algo así...
Genera los fondos de pantalla o scroll según sea el caso!
*/
Process estrellado();
Private
i; // para controlar cosas como los puntos que vamos a poner en el mapa
randx; //aleatorio x
randy; //aleatorio y
Begin
// fondo
graph=new_map(640,480,8); // nuevo mapa como grafico local de este proceso
drawing_map(0,graph); //pintamos en la graph local de este proceso
While(i<500) // mientras no hayamos pintado 300 puntos
randx=rand(0,1500); //buscamos el punto horizontal
randy=rand(0,1500); // y el vertical
drawing_color (rand(0,255)); // a boleo, un color
draw_fcircle(randx,randy,rand(0,1)); // y pintamos un círculo! (que bien podría ser un punto, pero da lo mismo)
i++; // ya hemos pintado 1 mas!
End //hasta 50
// If(ancho_pantalla<1025) // si el espacio de juego es de hasta 1024x768
// put_screen(0,graph); // ponemos el fondo en la pantalla
// escroll=0; // no hay scroll
// stop_scroll(0); // y si lo hay, lo paramos
// dump_type=0; // unas opciones del fenix 0.84
// restore_type=0; // que aceleran bastante el juego a menos que sea scroll :S
//Else // si el espacio es mayor que 1024x768 pues
escroll=1; // si que hay scroll
dump_type=1; // activamos esto y...
restore_type=1; // esto para que no use los dirty triangles y renderice la pantalla completa
start_scroll(0,0,graph,graph,0,0); // iniciamos el scroll!
scroll.camera=camara(); // y que el scroll siga al proceso camara()
//End
End
/*
la camara. el scroll persigue este proceso, el cual persigue a la nave si está viva!
*/
Process camara();
Begin
While(escroll==1) //si hay scroll
If(exists(id_nave)==1) //y si existe la nave
x=id_nave.x; // se mueve con...
y=id_nave.y; // ella...
End
// sino, simplemente no se mueve...
Frame(phrame); //pinta pinta!
End
End
/*
proceso pantalla! según las opciones que hayamos elegido pues iniciará un modo o otro, con scroll o sin él
*/
Process pantalla();
Private
primeravez=1; // la primera vez no duele por que se rompa... son los nervios!
id_mapa; // identificador del proceso del mapa (es un radar)
Begin
Loop
If(resolucion==0) ancho_pantalla=640; alto_pantalla=480; End //espacio virtual: 1500x1500, resolución: 320x240
// esto es para la primera vez después de iniciar el juego o cambiar las opciones
// se podría juntar con las líneas de abajo, pero se volvería completamente ilegible :S
// esto hace cambiar la resolución, crear el fondo y "regenerar" el radar
If(primeravez==1 AND resolucion==0) primeravez=0; set_mode(320,240); estrellado(); If(exists(id_mapa)==0) id_mapa=mapa(); End Frame; End
Frame(phrame/2); // pinta pinta!
End
End
/*
¡item! simple. un gráfico que aparece en pantalla que si lo alcanzas pues te ayuda, como siempre, y luego desaparece!
*/
Process item(x,y);
Begin
size=rand(29,31); //si el tamaño de este es 29, te hace invencible y si es 31 pues te baja el tiempo de repetición de la ametralladora o lo que sea con lo que dispares!
If(size==29) // si es 29, pos dibujamos el 29
graph=new_map(39,39,8);
drawing_color (120);
drawing_map(0,graph);
DRAW_FCIRCLE(19,19,19);
drawing_color (10);
draw_line (39/2,8,39/2,31);
draw_line (8,39/2,31,39/2);
End
If(size==31) //si es 31, pos dibujamos el 31!
graph=new_map(39,39,8);
drawing_color (200);
drawing_map(0,graph);
DRAW_FCIRCLE(19,19,19);
End
If(size==30) Return; End // si es 30, nada!
Loop
If(escroll==1) ctype=c_scroll; Else ctype=c_screen; End // más de lo mismo... esto ya tendrías que entenderlo x-D
Frame(phrame);
End
End
/*
¡¡¡radar!!! aunque yo le llamo mapa, comúnmente se le llama radar!
*/
Process mapa();
Private
ancho; // cuanto medirá de ancho?
alto; // y de alto? AHHHH! (intriga?)
Begin
flags=4; // es transparente
z=-1; // y está por encima de las naves
ctype=c_screen; // y siempre se pinta en pantalla
While(escroll==1) // mientras haya un scroll...
// según la resolución, tendrá un tamaño o otro y una posición o otra...
If(resolucion==0)
x=225; // posicion
y=210; // .../\
ancho=ancho_pantalla/40; // proporcion del tamaño del espacio
alto=alto_pantalla/40; // a escala 1:40 x-D
graph=new_map(ancho,alto,8); // grafico a pintar
drawing_color(254); // color pa pintar...
drawing_map(0,graph); // mapa en el que pintar...
draw_box(0,0,ancho,alto); // pintamos 1 cuadradito relleno!
End
Frame(phrame); // q arte!
End
End
/*
punto que aparecerá en el radar indicando tu posición o la de los enemigos!
*/
Process punto(color,x,y);
Begin
z=-2; // esta por encima del radar
If(color==21) size=300; End // si el color es el 21 ( el de tu nave) es 3 veces mas grande (pa q te veas xD)
// según la resolución tendrá una colocación o otra, proporcionalmente
If(resolucion==0)
x=(x/40)+(225-(ancho_pantalla/80));
y=(y/40)+(210-(alto_pantalla/80));
End
//pintamos el puntito que nos va a representar y...
graph=new_map(1,1,8);
drawing_map(0,graph);
drawing_color (color);
draw_fcircle(0,0,1);
Frame(phrame); // lo pintamos!!
End
aquí tenéis: NOFPG
pd: compiladlo vosotros mismos!
pd2: ta un poco muy comentado y un poco basurizado pero no importa: funciona igualmente xD
pd3: añadirle un archivo llamado hurry.wav si queréis escuchar música ;)
/*
[PiXeL] se enorgullece de presentar: NOFPGMatamata (matamarcianos sin fpg)
Autor: Pablo Navarro Reyes [PiXeL]
Fecha: 2004
Aburrimiento: 99.9%
Obviedad: demasiada...
Comentado: 120% x-D
Lineas: ~ no muchas
Optimización: 2/5 (se podrían juntar cosas como el proceso de la nave y de los enemigos y también los disparos, pero se deja así para que sea más facil de leer.)
*/
Program nofpgmatamata;
Global
ancho_pantalla; // resolución horizontal de la pantalla
alto_pantalla; // resolución vertical de la pantalla
efepeese; // imagenes por segundo
phrame; // se usa para la velocidad en los frame(phrame)
dificultad=2; // dificultad (de 1 a 5)
puntos; // puntos del personaje principal
escroll=1; // para saber si estamos usando c_scroll o c_screen para jugar
id_nave; // identificador para la nave
id_malo[20]; // identificadores para todos los malos
resolucion=0; // para cambiar la resolución
xrand; // numero aleatorio entre 0 y ancho_pantalla
yrand; // numero aleatorio entre 0 y alto_pantalla
malos; // numero de enemigos vivos
max_malos; // numero maximo de enemigos
Local
id_puntos; // puntos de cada enemigo o del jugador
Begin
max_malos=3; // numero maximo de enemigos, 20 es el límite
efepeese=24; //minimo 24
phrame=(efepeese/24)*100; // se usa para la velocidad en los frame(phrame)
set_fps(efepeese,0); // le decimos las imágenes por segundo que usaremos
// esto estaba en el original, así que lo dejo! el caso es que carga una canción del Final Fantasy X que le pega mucho!
// no se como se llama pero es la que salía en los anuncios y al principio del juego también... creo que si que se llamaba
// Hurry... Final Fantasy X es de lo mejor! xD
If(file_exists("./hurry.wav")) // si existe hurry.ogg
play_song(load_song("./hurry.wav"),-1); // "playamos" hurry.ogg
End
inicia(); // empecemos...
End
/*
Iniciamos el juego! (qué emocionante!)
*/
Process inicia();
Private
malomalo;
Begin
write(0,0,0,0,"Puntos:");
write_int(0,56,0,0,OFFSET puntos);
estrellado();
id_nave=nave(750,750);
id_malo[0]=1;
pantalla();
timer[0]=0;
Loop
malomalo=0;
xrand=rand(0,ancho_pantalla);
yrand=rand(0,alto_pantalla);
/* según la dificultad hay mas gente o menos
dif=5: sale 1 bixo cada 0,5 segundos y en******ado
dif=4: sale 1 bixo cada 3 segundos y en******ado
dif=3: sale 1 bixo cada 3 segundos
dif=2: sale 1 bixo cada 7 segundos
dif=1: sale 1 bixo cada 15 segundos
dif=-1: sale 1 bixo cada 0,05 segundos :S
en******ado: van a por ti xD
*/
If(dificultad==5) If(timer[0]>50 AND malos<max_malos) timer[0]=0; While(exists(id_malo[malomalo])=>1) malomalo++; Frame; End
id_malo[malomalo]=malo(xrand,yrand,malomalo); End End
If(dificultad==4) If(timer[0]>300 AND malos<max_malos) timer[0]=0; While(exists(id_malo[malomalo])=>1) malomalo++; Frame; End
id_malo[malomalo]=malo(xrand,yrand,malomalo); End End
If(dificultad==3) If(timer[0]>300 AND malos<max_malos) timer[0]=0; While(exists(id_malo[malomalo])=>1) malomalo++; Frame; End
id_malo[malomalo]=malo(xrand,yrand,malomalo); End End
If(dificultad==2) If(timer[0]>700 AND malos<max_malos) timer[0]=0; While(exists(id_malo[malomalo])=>1) malomalo++; Frame; End
id_malo[malomalo]=malo(xrand,yrand,malomalo); End End
If(dificultad==1) If(timer[0]>1500 AND malos<max_malos) timer[0]=0; While(exists(id_malo[malomalo])=>1) malomalo++; Frame; End
id_malo[malomalo]=malo(xrand,yrand,malomalo); End End
If(dificultad==-1) If(timer[0]>5 AND malos<max_malos) timer[0]=0; While(exists(id_malo[malomalo])=>1) malomalo++; Frame; End
id_malo[malomalo]=malo(xrand,yrand,malomalo); End End
If(rand(0,100)==3) item(xrand,yrand); End // 3 de cada 100 veces aparece un item...
If(key(_alt) AND key(_x)) exit(0,"¡Gracias por jugar!"); End // todos somos libres...
If(exists(id_nave)==0) id_nave=nave((ancho_pantalla/5)*2,alto_pantalla/2); End // si no existe la nave del jugador, pos la inventamos!
Frame(phrame);
End
End
/*
Para dibujar gráficos estáticos en pantalla
*/
Process grafico(graph,x,y);
Begin
If(escroll==1) ctype=c_scroll; Else ctype=c_screen; End // esto sale muxo, si es escroll lo pone en c_scroll sino en c_screen
Loop
Frame(phrame);
End
End
/*
¡¡¡¡La nave!!!! q bonita es xD
*/
Process nave(x,y);
Private
inercia; //sip, inercia...
inerciangle; //inercia angular!!!
repetidor; // espacio de tiempo en el que no te puedes teletransportar
t_invencible; // tiempo durante el que eres invencible
t_repetidor=15; // tiempo que tardas en volver a disparar
id_colision; // para saber contra que chocas
id_item; // para saber con que item chocas
avance; // lo que avanzas
Begin
If(escroll==1) ctype=c_scroll; Else ctype=c_screen; End
// hacemos unos circulitos q decrecen para avisarnos donde aparecemos!
graph=new_map(39,39,8);
drawing_color (20);
drawing_map(0,graph);
draw_circle(19,19,19);
drawing_color (20);
draw_circle(19,19,9);
size=200; //el doble de grande
While(size>150) size-=5; Frame(phrame); End
// creamos nuevo mapa pa dibujar la navecica y pintamos!
size=100;
graph=new_map(16,12,8);
drawing_color (20);
drawing_map(0,graph);
draw_line (0,0,0,15);
draw_line (0,11,15,5);
draw_line (15,5,0,0);
drawing_color (21);
draw_line (15,5,0,1);
drawing_color (22);
draw_line (15,5,0,2);
drawing_color (23);
draw_line (15,5,0,3);
drawing_color (24);
draw_line (15,5,0,4);
drawing_color (70);
draw_line (15,5,0,5);
draw_line (15,5,0,6);
drawing_color (24);
draw_line (15,5,0,11);
drawing_color (23);
draw_line (15,5,0,10);
drawing_color (22);
draw_line (15,5,0,9);
drawing_color (21);
draw_line (15,5,0,8);
flags=4; //transparente durante un poco
size=200; //2x tamaño
While(size!=100)
size-=10;
Frame(phrame);
End
Loop
If(escroll==1) ctype=c_scroll; punto(21,x,y); Else ctype=c_screen; End // nos dibuja en el radar si lo hay
// si usamos el teletransportador tendremos que esperar un poco hasta que podamos volver a utilizarlo...
If(key(_space) AND repetidor>15)
repetidor=0;
x=rand(0,ancho_pantalla);
y=rand(0,alto_pantalla);
angle=rand(0,360)*1000;
While(key(_space)) Frame; End
End
If(t_invencible<96) flags=4; Else flags=0; End // somos invencibles? si: transparente, no: opaco
// si nos salimos de la pantalla apareceremos en el extremo opuesto!!
If(x>ancho_pantalla) x=0; End
If(y>alto_pantalla) y=0; End
If(x<0) x=ancho_pantalla; End
If(y<0) y=alto_pantalla; End
// izquierda, derecha, disparo (con retardo entre disparo y disparo) y bloqueo de mandos si se intenta girar hacia ambos lados (furro xD)
If(key(_left)) inerciangle++; End
If(key(_right)) inerciangle--; End
If(key(_alt) AND repetidor>t_repetidor) repetidor=0; disparo(x,y,angle,inercia); End
If(!key(_left) AND !key(_right))
If(inerciangle>0) inerciangle--; End If(inerciangle<0) inerciangle++; End
End
// velocidad de avance
If(key(_control)) inercia++; Else inercia-=1; End
If(inercia>50) inercia=50; End // maximo!
If(inercia<0) inercia=0; End // minimo!
// velocidad de giro
If(inerciangle>20) inerciangle=20; End //maximo y
If(inerciangle<-20) inerciangle=-20; End //minimo, etc...
// si chocamos contra un item, pos miramos su tamaño y nos lo activamos!
If(id_item=collision(Type item))
If(id_item.size==29) t_repetidor--; End
If(id_item.size==31) t_invencible=0; End
signal(id_item,s_kill);
Frame;
End
// el movimiento del proceso finalmente!
angle+=500*inerciangle*100/phrame; // giramos
avance=inercia/5*100/phrame; // cuanto avanzamos?
advance(avance); // pos eso avanzamos!
// estas variables aumentan 1 x cada imagen
repetidor++;
t_invencible++;
If((id_colision=collision(Type disparo_malo)) AND t_invencible>96) Break; End // si te dan, muerex...
Frame;
End
// murió!
puntos--; // 1 minipunto menos pa ti
If(id_colision=collision(Type disparo_malo)) id_colision.father.id_puntos++; End // 1 minipunto más para el q t mató!
signal(id_colision,s_kill); // matamos el disparo que te mató
// animación del circulito doble cuando mueres x-D
graph=new_map(39,39,8);
drawing_color (20);
drawing_map(0,graph);
draw_circle(19,19,19);
drawing_color (20);
draw_circle(19,19,9);
flags=4;
While(size>0) size-=5; Frame(phrame); End
End
/*
Uyyy... el proceso del malo, q miedo! jajajaj (muy parecido al proceso de la nave... c&p? si!)
*/
Process malo(x,y,num_malo);
Private
inercia;
inerciangle;
repetidor;
num;
id_colision;
t_repetidor=15;
t_invencible=97;
id_item;
dist_angle;
dist;
id_texto1;
id_texto2;
String nombre;
Begin
// 1 malo mas acecha...
malos++;
nombre=itoa(num_malo); // su nombre es 1 número
id_texto1=write(0,0,10+10*num_malo,0,"Malo" + nombre + ":"); //
id_texto2=write_int(0,56,10+10*num_malo,0,OFFSET id_puntos); //
If(escroll==1) ctype=c_scroll; Else ctype=c_screen; End // lo de siempre...
angle=rand(0,360)*1000; // para que aparezca mirando hacia un punto aleatorio
num=rand(40,230); // el color también será aleatorio
// pintamos los circulos esos que avisan que aparece
graph=new_map(39,39,8);
drawing_color (num);
drawing_map(0,graph);
draw_circle(19,19,19);
drawing_color (num-20);
draw_circle(19,19,9);
// lo hacemos que decrezca...
size=100;
flags=4;
While(size>25) size-=3; Frame(phrame); End
size=rand(75,125);
flags=0;
// y pintamos la nave
If(rand(0,1)==0) // aquí se decide si el enemigo será redondo o cuadrado
graph=new_map(17,17,8);
drawing_color (num);
drawing_map(0,graph);
DRAW_FCIRCLE (8,8,8);
drawing_color (num-20);
DRAW_FCIRCLE (14,8,2);
Else
graph=new_map(17,17,8);
drawing_color (num);
drawing_map(0,graph);
draw_box (0,5,17,12);
drawing_color (num-20);
DRAW_FCIRCLE (14,8,2);
End
// iniciamos el bucle del malo
Loop
If(escroll==1) ctype=c_scroll; punto(num,x,y); Else ctype=c_screen; End // si existe un radar, nos dibuja en el
If(t_invencible<96) flags=4; Else flags=0; End // mientras t_invencible sea menor q 96, es transparente y no muere
// si alcanza un extremo de la pantalla, aparece en el otro
If(x>ancho_pantalla) x=0; End
If(y>alto_pantalla) y=0; End
If(x<0) x=ancho_pantalla; End
If(y<0) y=alto_pantalla; End
// si la dificultad es menor q 4 pues irá un poco a su bola, pero si es mayor... ira a por la nave!
If(dificultad<4)
If(rand(0,1)==0) inerciangle+=2; End
If(rand(0,1)==0) inerciangle-=2; End
If(rand(0,2)==1 AND repetidor>t_repetidor) repetidor=0; disparo_malo(x,y,angle,inercia,num); End
If(inerciangle>0) inerciangle--; End
If(inerciangle<0) inerciangle++; End
If(rand(0,3)==3) inercia--; Else inercia++; End
Else
// comprobamos si existe la nave para matarla!
If(exists(id_nave)==1) // si existe
dist=fget_dist(x,y,id_nave.x,id_nave.y); // conseguimos su distancia desde el malo
dist_angle=get_angle(id_nave); // y el ángulo desde el malo también
End
If(dist<1000) // si la distancia es menor que 1000 pues a por la nave!
If(angle<dist_angle) inerciangle+=2; // giramos para dirigirnos hacia la nave!
Else
inerciangle-=2;
End
inercia+=2; // aceleramos!
If(repetidor>t_repetidor) repetidor=0; disparo_malo(x,y,angle,inercia,num); End
Else
// si no existe la nave, va a su bola, como en la dificultad menor que 4!
If(rand(0,1)==0) inerciangle+=2; End
If(rand(0,1)==0) inerciangle-=2; End
If(rand(0,2)==1 AND repetidor>t_repetidor) repetidor=0; disparo_malo(x,y,angle,inercia,num); End
If(inerciangle>0) inerciangle--; End
If(inerciangle<0) inerciangle++; End
If(rand(0,3)==3) inercia--; Else inercia++; End
End
End
// limites de las inercias
If(inercia>20) inercia=20; End
If(inercia<0) inercia=0; End
If(inerciangle>5) inerciangle=5; End
If(inerciangle<-5) inerciangle=-5; End
// si choca contra un item lo recoge
If(id_item=collision(Type item))
If(id_item.size==29) t_repetidor--; End
If(id_item.size==31) t_invencible=0; End
signal(id_item,s_kill);
Frame;
End
// finalmente gira, avanza y suma 1 a repetidor y t_invencible!
angle+=500*inerciangle;
advance(inercia/5);
repetidor++;
t_invencible++;
If((id_colision=collision(Type disparo) OR (id_colision=collision(Type disparo_malo))) AND t_invencible>96) Break; End // pa q lo puedas matar!
Frame(phrame); // pintarrr, me gusta pintar! x-D
End
If(collision(Type disparo)) puntos++; End // si le diste tu, pos minipunto pa ti!
If(id_colision=collision(Type disparo_malo)) id_colision.father.id_puntos++; End // si le dio otro malo, pos minipunto pa el!
signal(id_colision,s_kill); // matamos el disparo
delete_text(id_texto1); //borramos textos de este personaje
delete_text(id_texto2); // este tb
// animación de circulitos como cuando nace, pro pa morir!
graph=new_map(39,39,8);
drawing_color (num);
drawing_map(0,graph);
draw_circle(19,19,19);
drawing_color (num-20);
draw_circle(19,19,9);
flags=4;
While(size>0) size-=5; Frame(phrame); End
malos--; // 1 malo menos!
End
/*
¡El disparo! Simple. Un proceso que pilla un ángulo y avanza hasta que alcanza 1 enemigo o se sale de la pantalla!
*/
Process disparo(x,y,angle,inercia);
Begin
// dibujamos el gráfico del disparo!
graph=new_map(6,2,8);
drawing_color (20);
drawing_map(0,graph);
draw_box(0,0,6,2);
advance(15); // avanza un poco desde la posición del jugador para que no le de a este!
Repeat
If(escroll==1) ctype=c_scroll; Else ctype=c_screen; End // lo de siempre...
advance(1500/phrame); // avanza...
Frame;
Until(x>ancho_pantalla OR y>alto_pantalla OR x<0 OR y<0) //hasta que se salga de la pantalla
End
/*
¡El disparo de los malos! Exactamente lo mismo que el del jugador a excepción que este recibe el color del enemigo que lo dispara.
*/
Process disparo_malo(x,y,angle,inercia,num);
Begin
// se dibuja el gráfico
graph=new_map(6,2,8);
drawing_color (num);
drawing_map(0,graph);
draw_box(0,0,6,2);
advance(15); // avanza un poco desde la posición del enemigo que lo dispara para que no choque contra este!
Repeat
If(escroll==1) ctype=c_scroll; Else ctype=c_screen; End // y mas...
advance(1500/phrame); // avanza...
Frame;
Until(x>ancho_pantalla OR y>alto_pantalla OR x<0 OR y<0) //hasta que se salga por algún lado de la pantalla!
End
/*
Generador de mapas de estrellas o algo así...
Genera los fondos de pantalla o scroll según sea el caso!
*/
Process estrellado();
Private
i; // para controlar cosas como los puntos que vamos a poner en el mapa
randx; //aleatorio x
randy; //aleatorio y
Begin
// fondo
graph=new_map(640,480,8); // nuevo mapa como grafico local de este proceso
drawing_map(0,graph); //pintamos en la graph local de este proceso
While(i<500) // mientras no hayamos pintado 300 puntos
randx=rand(0,1500); //buscamos el punto horizontal
randy=rand(0,1500); // y el vertical
drawing_color (rand(0,255)); // a boleo, un color
draw_fcircle(randx,randy,rand(0,1)); // y pintamos un círculo! (que bien podría ser un punto, pero da lo mismo)
i++; // ya hemos pintado 1 mas!
End //hasta 50
// If(ancho_pantalla<1025) // si el espacio de juego es de hasta 1024x768
// put_screen(0,graph); // ponemos el fondo en la pantalla
// escroll=0; // no hay scroll
// stop_scroll(0); // y si lo hay, lo paramos
// dump_type=0; // unas opciones del fenix 0.84
// restore_type=0; // que aceleran bastante el juego a menos que sea scroll :S
//Else // si el espacio es mayor que 1024x768 pues
escroll=1; // si que hay scroll
dump_type=1; // activamos esto y...
restore_type=1; // esto para que no use los dirty triangles y renderice la pantalla completa
start_scroll(0,0,graph,graph,0,0); // iniciamos el scroll!
scroll.camera=camara(); // y que el scroll siga al proceso camara()
//End
End
/*
la camara. el scroll persigue este proceso, el cual persigue a la nave si está viva!
*/
Process camara();
Begin
While(escroll==1) //si hay scroll
If(exists(id_nave)==1) //y si existe la nave
x=id_nave.x; // se mueve con...
y=id_nave.y; // ella...
End
// sino, simplemente no se mueve...
Frame(phrame); //pinta pinta!
End
End
/*
proceso pantalla! según las opciones que hayamos elegido pues iniciará un modo o otro, con scroll o sin él
*/
Process pantalla();
Private
primeravez=1; // la primera vez no duele por que se rompa... son los nervios!
id_mapa; // identificador del proceso del mapa (es un radar)
Begin
Loop
If(resolucion==0) ancho_pantalla=640; alto_pantalla=480; End //espacio virtual: 1500x1500, resolución: 320x240
// esto es para la primera vez después de iniciar el juego o cambiar las opciones
// se podría juntar con las líneas de abajo, pero se volvería completamente ilegible :S
// esto hace cambiar la resolución, crear el fondo y "regenerar" el radar
If(primeravez==1 AND resolucion==0) primeravez=0; set_mode(320,240); estrellado(); If(exists(id_mapa)==0) id_mapa=mapa(); End Frame; End
Frame(phrame/2); // pinta pinta!
End
End
/*
¡item! simple. un gráfico que aparece en pantalla que si lo alcanzas pues te ayuda, como siempre, y luego desaparece!
*/
Process item(x,y);
Begin
size=rand(29,31); //si el tamaño de este es 29, te hace invencible y si es 31 pues te baja el tiempo de repetición de la ametralladora o lo que sea con lo que dispares!
If(size==29) // si es 29, pos dibujamos el 29
graph=new_map(39,39,8);
drawing_color (120);
drawing_map(0,graph);
DRAW_FCIRCLE(19,19,19);
drawing_color (10);
draw_line (39/2,8,39/2,31);
draw_line (8,39/2,31,39/2);
End
If(size==31) //si es 31, pos dibujamos el 31!
graph=new_map(39,39,8);
drawing_color (200);
drawing_map(0,graph);
DRAW_FCIRCLE(19,19,19);
End
If(size==30) Return; End // si es 30, nada!
Loop
If(escroll==1) ctype=c_scroll; Else ctype=c_screen; End // más de lo mismo... esto ya tendrías que entenderlo x-D
Frame(phrame);
End
End
/*
¡¡¡radar!!! aunque yo le llamo mapa, comúnmente se le llama radar!
*/
Process mapa();
Private
ancho; // cuanto medirá de ancho?
alto; // y de alto? AHHHH! (intriga?)
Begin
flags=4; // es transparente
z=-1; // y está por encima de las naves
ctype=c_screen; // y siempre se pinta en pantalla
While(escroll==1) // mientras haya un scroll...
// según la resolución, tendrá un tamaño o otro y una posición o otra...
If(resolucion==0)
x=225; // posicion
y=210; // .../\
ancho=ancho_pantalla/40; // proporcion del tamaño del espacio
alto=alto_pantalla/40; // a escala 1:40 x-D
graph=new_map(ancho,alto,8); // grafico a pintar
drawing_color(254); // color pa pintar...
drawing_map(0,graph); // mapa en el que pintar...
draw_box(0,0,ancho,alto); // pintamos 1 cuadradito relleno!
End
Frame(phrame); // q arte!
End
End
/*
punto que aparecerá en el radar indicando tu posición o la de los enemigos!
*/
Process punto(color,x,y);
Begin
z=-2; // esta por encima del radar
If(color==21) size=300; End // si el color es el 21 ( el de tu nave) es 3 veces mas grande (pa q te veas xD)
// según la resolución tendrá una colocación o otra, proporcionalmente
If(resolucion==0)
x=(x/40)+(225-(ancho_pantalla/80));
y=(y/40)+(210-(alto_pantalla/80));
End
//pintamos el puntito que nos va a representar y...
graph=new_map(1,1,8);
drawing_map(0,graph);
drawing_color (color);
draw_fcircle(0,0,1);
Frame(phrame); // lo pintamos!!
End