/******************************************************\ || Programa: Santa Attack || || Autor: Wakroo || || Grupo: Emerald Works || || Terminado: 30/12/2003 || || NOTAS: Programado para participar en el concurso || || navideño de DIVnet || \******************************************************/ Program Santa_Attack; // Declaración de constantes Const grav=2; // Gravedad // Control de la velocidad de las casas cantCasas=5; // Velocidad de giro de los regalos al hacer // el arco hasta bajar en vertical ang_regalo=5000; // Número de regalos que hay que superar para ganar puntos_victoria=40; // Velocidad de las casas en las se pierde velCasas_victoria=5; // Fuerza de los propulsores prop_fuerte=10; prop_media=5; Global velCasas=2; // Velocidad de las casas numCasas=0; // Número de casas puntos=0; // Número de aciertos fuente; // Variable para cargar la fuente de los textos // Sonidos buiu; hit; motor; fallo; victoria; Begin // Inicialización del modo gráfico a 640x480, 16 bits Graph_mode = mode_16bits; set_mode(m640x480); // Carga de los recursos load_fpg("juego.fpg"); fuente=load_fnt("fuente.fnt"); buiu=load_wav("buiu.wav"); hit=load_wav("hit.wav"); motor=load_wav("motor.wav"); fallo=load_wav("fallo.wav"); victoria=load_wav("victoria.wav"); // Llamada al proceso intro() intro(); End /*****************************************\ | Proceso: intro() | | Función: Pone las pantallas iniciales | | Parámetros: | \*****************************************/ Process intro(); Begin // Posición y gráfico en pantalla x=320; y=240; graph=101; // Esperar durante 50 frames From z=0 To 49; Frame; End // Fundido lento a negro (apagar) fade(0,0,0,2); // Esperar durante el fundido While (fading) Frame; End // Cambiar el gráfico graph=102; // Encender fade_on(); // Esperar 50 frames From z=0 To 49; Frame; End // Fundido lento a negro (apagar) fade(0,0,0,2); // Esperar durante el fundido While(fading) Frame; End // Cambiar la resolución a 800x600 set_mode(m800x600); // Poner puntos aleatorios en el fondo (estrellas) From z=0 To 9999; put_pixel(rand(1,799),rand(1,599),rand(65300,65535)); End // Llamada al proceso juego() juego(); // Encender la pantalla fade_on(); End /**************************************************\ | Proceso: juego() | | Función: Arranca el juego y controla la salida | | Parámetros: | \**************************************************/ Process juego(); Begin // Llamadas a los procesos santa(x,y,graph), // luna(x,y,graph), crea_casas() santa(320,240,1); luna(150,150,21); crea_casas(); // Se escriben los puntos que tiene el jugador // con la fuente del sistema write(0,10,10,0,"Puntos"); write_int(0,60,10,0,&puntos); Loop // Se comprueba si se ha ganado If (puntos>puntos_victoria) play_wav(victoria,0); write(fuente,400,300,4,"¡Has repartido todos los regalos!"); From z=0 To 100; Frame; End Break; // Se sale del loop Else // Se comprueba si se ha perdido If (velCasas>velCasas_victoria) play_wav(fallo,0); write(fuente,400,300,4,"Has fallado"); From z=0 To 100; Frame; End Break; // Se sale del loop End End // Si se pulsa escape sale del loop If (key(_esc)) Break; End; Frame; End // Mata a todos los procesos menos éste let_me_alone(); // Sale del programa exit("",0); End /***********************************\ | Proceso: santa(x,y,graph) | | Función: Protagonista del juego | | Parámetros: | | x: posición horizontal | | y: posición vertical | | graph: gráfico | \***********************************/ Process santa(x,y,graph); Private velx = 0; // Velocidad horizontal vely = -grav; // Velocidad vertical Begin regalo(); Loop // Se aumentan x,y con velx,vely / 10 // (para tener más precisión) // NOTA: también se podría haber usado RESOLUTION x+=velx/10; y+=vely/10; vely+=grav; // Se tiene en cuenta la gravedad // Se rota la nave If (key(_left)) angle+=7500; End If (key(_right)) angle-=7500; End // Se ajusta el ángulo para que el valor esté siempre // entre 0 y 359999 (en milésimas de grado) If (angle>359999) angle-=360000; End If (angle<0) angle+=360000; End // Propulsores inferiores a toda potencia If (key(_space)) // Se modifican las velocidades horizontal y vertical // según el ángulo de la nave velx+=get_distx(angle+90000,prop_fuerte); vely+=get_disty(angle+90000,prop_fuerte); // Se llama al proceso fuego(x,y,angle,graph) fuego(x,y,angle,4); Else // Propulsores inferiores a media potencia If (key(_up)) velx+=get_distx(angle+90000,prop_media); vely+=get_disty(angle+90000,prop_media); fuego(x,y,angle,3); End End // Propulsor trasero If (key(_alt)) velx+=get_distx(angle,prop_media); vely+=get_disty(angle,prop_media); retro(x,y,angle); End // Que la nave no pueda salir de la pantalla If (y<0) y=0; vely=0; End If (y>600) y=600; vely=0; End If (x<0) x=0; velx=0; End If (x>800) x=800; velx=0; End Frame; End End /**********************************\ | Proceso: fuego(x,y,angle,graph) | | Función: Propulsores inferiores | | Parámetros: | | x: posición horizontal | | y: posición vertical | | angle: ángulo | | graph: gráfico | \**********************************/ Process fuego(x,y,angle,graph); Begin // Reproduce un sonido play_wav(motor,0); // Se pone por debajo del padre z = father.z + 2; // Se coloca en posición xadvance(father.angle-90000,18); xadvance(father.angle,1); // Se usa el gráfico anterior graph--; Frame; // Se pone por debajo del padre // pero por encima de otros fuegos z--; // Se usa el gráfico original graph++; // Se pone en posición angle=father.angle; x=father.x; y=father.y; xadvance(father.angle-90000,18); xadvance(father.angle,1); Frame; // Se usa el gráfico anterior graph--; // Se pone por debajo del padre // y otros fuegos z++; // Se pone en posición angle=father.angle; x=father.x; y=father.y; xadvance(father.angle-90000,18); xadvance(father.angle,1); Frame; End /******************************\ | Proceso: retro(x,y,angle) | | Función: Propulsor trasero | | Parámetros: | | x: posición horizontal | | y: posición vertical | | angle: ángulo | \******************************/ Process retro(x,y,angle); Begin play_wav(motor,0); z = father.z + 2; xadvance(father.angle+90000,5); advance(-42); graph=5; Frame; z--; graph++; angle=father.angle; x=father.x; y=father.y; xadvance(father.angle+90000,5); advance(-42); Frame; graph--; z++; angle=father.angle; x=father.x; y=father.y; xadvance(father.angle+90000,5); advance(-42); Frame; End /*********************************************\ | Proceso: regalo() | | Función: Regalos con los que "bombardear" | | Parámetros: | \*********************************************/ Process regalo(); Private id2; aux; Begin Loop // Gráfico aleatorio graph=rand(11,15); aux=0; // Bucle para que el regalo se ponga en posición Loop // Se pone el regalo en las coordenadas y el ángulo // de la nave (father = ID del que lo ha llamado) x=father.x; y=father.y; angle=father.angle; // z un punto mayor que el padre para que esté por debajo z=father.z+1; // Se pone en su sitio (la tobera) advance(-20); angle+=210000; advance(aux); // Se aumenta aux para la siguiente vuelta aux+=2; // Cuando está en su sitio se sale del loop If (aux==24) Break; End Frame; End // Bucle para que el regalo espere en posición Loop x=father.x; y=father.y; angle=father.angle; z=father.z+1; advance(-20); angle+=210000; advance(24); // Se "dispara" el regalo If (key(_control)) Break; End Frame; End z=75; // Se ajusta el ángulo If (angle>359999) angle-=360000; End // Bucle para que el regalo baje en vertical Loop advance(10); // Se corrige el ángulo hasta llegar a la vertical // dependiendo de la dirección If (angle>90000 AND angle<270000) angle+=ang_regalo; Else If ((angle+90000)>ang_regalo) angle-=ang_regalo; Else angle=-90000; End End // Comprueba si ha chocado con la chimenea If (id2=collision(Type chimenea)) // Comprueba si ha entrado en la chimenea If (x>id2.x-9 AND x610 OR collision(Type casa)) play_wav(hit,0); From graph=26 To 29; Frame; End Break; End End Frame; End End End /***************************************\ | Proceso: crea_casas() | | Función: Proceso que crea las casas | | Parámetros: | \***************************************/ Process crea_casas(); Begin // Crea 3 casas iniciales casa(960,rand(495,605)); casa(rand(1260,1360),rand(495,605)); casa(rand(1660,1760),rand(495,605)); Loop // Determina la velocidad de las casas dependiendo // del número de casas que han pasado velCasas=(numCasas/cantCasas)+1; Frame; End End /****************************\ | Proceso: casa(x,y) | | Función: Casa | | Parámetros: | | x: posición horizontal | | y: posición vertical | \****************************/ Process casa(x,y); Begin graph=51; z=100; // Crea su chimenea chimenea(rand(-130,130),-100); // Se pone por encima de cualquier casa // con la que colisione If (collision(Type casa)) z++; End Loop // Se mueve la casa según la velocidad actual x-=velCasas; // Crea una nueva casa y termina el proceso If (x<-160) casa(rand(960,1060),rand(495,605)); Break; End Frame; End // Aumenta el número de casas que han pasado numCasas++; End /****************************************\ | Proceso: chimenea(desplx,desply) | | Función: Chimenea | | Parámetros: | | desplx: posición horizontal con | | respecto al centro de la casa | | desply: posición vertical | | respecto al centro de la casa | \****************************************/ Process chimenea(desplx,desply); Begin graph=71; z=father.z-50; Loop // Se asignan las coordenadas del padre // más el desplazamiento x=father.x+desplx; y=father.y+desply; // Si no está el padre, adiós a la chimenea If (NOT father) Break; End Frame; End End /****************************\ | Proceso: luna(x,y,graph) | | Función: Luna del fondo | | Parámetros: | | x: posición horizontal | | y: posición vertical | | graph: gráfico | \****************************/ Process luna(x,y,graph); Begin z=500; Loop Frame; End End