From d9c1f8ac59ab8c7ebcc2fc394765504caa5fd0a6 Mon Sep 17 00:00:00 2001 From: MikeDX Date: Fri, 17 Jun 2016 13:23:51 +0100 Subject: [PATCH] Fixed PRG file paths --- examples/games/fost3d/fost3d.prg | 2992 +++++++++--------- examples/games/noid/noid.prg | 1636 +++++----- examples/games/pacoman/pacoman.prg | 0 examples/games/soccer/Soccer.prg | 4657 ---------------------------- 4 files changed, 2314 insertions(+), 6971 deletions(-) mode change 100644 => 100755 examples/games/fost3d/fost3d.prg mode change 100644 => 100755 examples/games/noid/noid.prg mode change 100644 => 100755 examples/games/pacoman/pacoman.prg delete mode 100644 examples/games/soccer/Soccer.prg diff --git a/examples/games/fost3d/fost3d.prg b/examples/games/fost3d/fost3d.prg old mode 100644 new mode 100755 index 9d45c5d..6429b69 --- a/examples/games/fost3d/fost3d.prg +++ b/examples/games/fost3d/fost3d.prg @@ -1,1496 +1,1496 @@ - -//------------------------------------------------------------------------------ -// TITULO: FOSTIATOR -// AUTOR: DANIEL NAVARRO -// FECHA: 15/06/97 -//------------------------------------------------------------------------------ -PROGRAM fostiator; - -CONST - // Distintos estados de los mu¤ecos - _parado=0; - _avanzando=1; - _retrocediendo=2; - _agach ndose=3; - _agachado=4; - _levant ndose=5; - _saltando=6; - _golpe_bajo=7; - _pu¤etazo=8; - _patada_giratoria=9; - _patada_normal=10; - _patada_a‚rea=11; - _tocado=12; - _muerto=13; - - // Distintas posiciones de los mu¤ecos - saltar=0; - agacharse=1; - avanzar=2; - retroceder=3; - golpear=4; - - // Tipo de control del mu¤eco - control_teclado1=1; - control_teclado2=2; - control_ordenador=0; - - default_fps=24; // Numero de im genes por segundo - -GLOBAL - // Secuencia de animacin de cada uno de los estados de los mu¤ecos - anim0[]=1,1,1,14,14,15,15,16,16,17,17,17,16,16,15,15,14,14; - anim1[]=1,2,3,4,5,6,7,8; - anim2[]=1,8,7,6,5,4,3,2; - anim3[]=8,9,10,11,12,13; - anim4[]=13; - anim5[]=13,12,11,10,9,8; - anim6[]=18,19,20,21,21,22,22,22,22,23,23,23,23,24,24,24,24,24,24,24,24; - anim7[]=52,54,54,54,54,53,53,52,51; - anim8[]=25,26,27,28,28,28,28,27,27,26,25; - anim9[]=29,30,31,32,33,33,34,35,36,37,38,39; - anim10[]=29,30,31,32,32,32,31,31,30,30,29; - anim11[]=18,19,20,21,21,22,22,24,40,41,41,41,41,41,41,41,41,41,41,41,41,41; - anim12[]=1,42,42,43,43,42,42; - anim13[]=1,42,42,43,43,44,44,45,45,46,46,47,47,48,48,49,49,50; - - s_golpe1; // Identificadores de sonidos - s_golpe2; - s_golpe3; - s_tocado1; - s_tocado2; - s_tocado3; - s_aire1; - s_aire2; - s_aire3; - s_aire4; - s_aire5; - s_muerto; - - id_luchador1,id_luchador2; // Identificador de ambos combatientes - id_auxiliar; // Identificador auxiliar - - combates1; // Numero de combates que ha ganado el primero - combates2; // Numero de combates que ha ganado el segundo - - estado_juego; // 0-parado, 1-jugando, 2-fin combate - - escenario; // Escenario de lucha 0 / 2 - - luchador1=1; // 0-Ripley, 1-Bishop, 2-Alien, 3-Nostromo - luchador2=2; // 0-Ripley, 1-Bishop, 2-Alien, 3-Nostromo - - nivel=1; // Dificultad del juego (0..2) - modo; // Modo de juego (ver modos[]) - sangre=1; // Nivel de sangre (ver sangres[]) - - // Textos de las opciones de combate - nombres[]="RIPLEY","BISHOP","ALIEN","NOSTROMO"; - escenarios[]="LEVEL 1 : THE STORE ","LEVEL 2 : THE SEA","LEVEL 3: THE COLUMNS"; - niveles[]="EASY MODE","NORMAL MODE","HARD MODE"; - modos[]="COMPUTER vs COMPUTER"," CURSOR KEYS vs COMPUTER", - "QA-RT-X KEYS vs COMPUTER","QA-RT-X KEYS vs CURSOR KEYS"; - sangres[]="BLOOD LEVEL : LOWER","BLOOD LEVEL : NORMAL","BLOOD LEVEL : HIGHER"; - - struct texto[6] // Textos donde se guardan las opciones del combate - x,y; - codigo; - END = 320,480,0, - 320,90,0, - 320,120,0, - 320,150,0, - 100,364,0, - 320,364,0, - 540,364,0; - - opci¢n; // Opci¢n seleccionada del men£ - opci¢n_anterior; - - esc_pulsado; // Indica si se ha abortado con ESC - - grises[255]= // Tabla de conversi¢n de los colores a grises - 0,236,203,220,159,156,155,153,151,150,134,89,90,92,94,94, - 45,46,69,59,103,93,90,134,150,151,155,156,159,220,203,236, - 41,43,46,47,69,59,101,94,40,41,43,43,44,45,46,47, - 40,41,44,45,45,46,47,68,69,58,58,59,58,58,106,101, - 43,45,47,47,47,68,68,68,68,58,59,101,101,101,59,59, - 45,59,101,94,90,90,90,90,90,89,90,90,90,93,94,94, - 69,59,58,106,103,101,101,103,101,101,59,59,94,92,94,93, - 101,94,93,93,94,92,93,89,89,134,134,134,151,150,150,153, - 101,90,89,90,134,134,134,134,134,90,89,134,134,150,150,151, - 103,134,134,134,150,150,150,151,153,153,153,155,156,156,159,159, - 90,89,150,151,153,155,156,219,219,220,223,203,203,203,236,235, - 134,150,150,151,153,153,153,151,155,156,156,159,220,223,236,237, - 134,153,155,156,156,159,219,220,220,201,203,203,201,203,203,236, - 151,155,156,156,219,219,220,159,155,155,159,219,220,219,220,223, - 151,159,153,155,220,220,159,155,223,236,235,235,236,237,238,237, - 155,153,203,223,237,238,247,247,248,247,238,237,235,236,203,220; - - sangre_total; // Part¡culas de sangre que se han quedado en el mapa -  ngulo_texto; // Movimiento del texto en las opciones - - id_camara_modo8; - -LOCAL - estado; // Indicador de la animaci¢n actual - paso; // Paso de la animaci¢n actual - inc_y,inc_x; // Desplazamientos del mu¤eco - enemigo; // Identificador del enemigo - tipo_control; // Dispositivo que controla al mu¤eco - energ¡a; // Energ¡a de mu¤eco - -PRIVATE - codigo_mapa; // Pantalla de fondo cargada en ese momento - codigo_mapa2; - contador0; // Contador de uso general - idtexto; - fileworld; -BEGIN - set_mode(m640x480); // Selecciona modo de v¡deo - max_process_time=1500; // Deja m s tiempo para que se ejecuten los procesos - priority=-10; // Pone muy poca prioridad - - intro(); // Ejecuta la intro del juego - FRAME; // Necesario para parar este proceso - LOOP // Bucle principal - - set_fps(100,0); // Numero de im genes por segundo - codigo_mapa=load_map("fost3D\menu.map"); // Carga la pantalla del men£ - load_pal("fost3D\menu.map"); - put_screen(0,codigo_mapa); // Pone la pantalla del men£ - unload_map(codigo_mapa); // Y la descarga de memoria para as¡ tener mas - - fade_on(); // Enciende la pantalla - - opcion=0; // Inicializa la variable de opciones - - WHILE (opcion==0) // Bucle del men£ de presentaci¢n - IF (key(_1) OR - key (_enter)) opcion=1; END // Juego - IF (key(_2) OR key (_esc)) opcion=2; END // Salir - FRAME; - END - - fade_off(); // Apaga la pantalla - - IF (opcion==2) // Opcion elegida: Salir del juego - cr‚ditos(); // Pone los cr‚ditos - signal(id,s_kill); // Elimina este proceso - FRAME; // Y acaba. - END - - // Carga los gr ficos de la pantalla de opciones - codigo_mapa=load_map("fost3D\opciones.map"); - load_pal("fost3D\\opciones.map"); - put_screen(0,codigo_mapa); // Pone el gr fico de fondo - unload_map(codigo_mapa); // Descarga el gr fico de memoria - - opcion=0; // Inicializa la variable de opciones -  ngulo_texto=0; // Pone a cero el  ngulo de desplazamiento del texto seleccionado - muestra_informaci¢n(); // Imprime todos los textos y gr ficos - fade_on(); // Enciende la pantalla - - LOOP - // Mueve el texto que este seleccionado en ese momento - move_text(texto[opci¢n].codigo,texto[opci¢n].x+get_disty( ngulo_texto,8),texto[opci¢n].y); - opci¢n_anterior=opcion; // Guarda la opci¢n para no cambiar bruscamente - - // Lee las teclas - IF (key(_right) OR key(_down)) - opcion++; - END - IF (key(_left) OR key(_up)) - opci¢n--; - END - - // Se ha cambiado a otra opci¢n - IF (opci¢n<>opci¢n_anterior) - - // Espera a que se pare - WHILE (get_disty( ngulo_texto,8)<>0) -  ngulo_texto+=22500; - move_text(texto[opci¢n_anterior].codigo, - texto[opci¢n_anterior].x+get_disty( ngulo_texto,8), - texto[opci¢n_anterior].y); - FRAME; - END - - // Normaliza las opciones - IF (opcion==7) opcion=0; END - IF (opcion==-1) opcion=6; END - - // Espera a soltar la tecla - WHILE (key(_right) OR key(_down) OR key(_left) OR key(_up)) - FRAME; - END - ELSE -  ngulo_texto+=22500; // Sigue moviendo el texto - END - - // Se ha elegido una opci¢n - IF (key(_enter) OR key(_space) OR key (_control)) - SWITCH(opci¢n) - - // Empieza el juego - CASE 0: BREAK; END - - // Modo de juego (1/2 jugadores) - CASE 1: - modo++; - IF (modo==4) modo=0; END - END - - // Nivel de juego (F cil/Dif¡cil) - CASE 2: - nivel++; - IF (nivel==3) nivel=0; END - END - - // Nivel de aparici¢n de sangre - CASE 3: - sangre++; - IF (sangre==3) sangre=0; END - END - - // Selecciona mu¤eco del jugador 1 - CASE 4: - luchador1++; - IF (luchador1==4) luchador1=0; END - END - - // Selecciona el escenario - CASE 5: - escenario++; - IF (escenario==3) escenario=0; END - END - - // Selecciona mu¤eco del jugador 2 - CASE 6: - luchador2++; - IF (luchador2==4) luchador2=0; END - END - END - muestra_informaci¢n(); // Actualiza la informaci¢n de pantalla - WHILE (key(_enter) OR key(_space) OR key (_control)) // Espera a soltar la tecla - FRAME; - END - END - IF (key(_esc)) // Se ha pulsado 'escape' - esc_pulsado=1;// Pone variable a 1 la variable de escape pulsado - BREAK; // Y sale del bucle - END - FRAME; - END - - IF (esc_pulsado) // Sale del men£ de opciones si se pulso escape - esc_pulsado=0; // Pone a a cero la variable para la proxima vez - fade_off(); // Apaga la pantalla - let_me_alone(); // Deja unicamente el proceso principal(este) - delete_text(all_text);//Borra cualquier texto que hubiera - CONTINUE; // Sale del siguiente bucle - END - // Carga los gr ficos necesarios para el escenario elegido - SWITCH (escenario) - CASE 0: - codigo_mapa=load_map("fost3D\\fondo1.map"); - codigo_mapa2=load_map("fost3D\\paisaje1.map"); - END - CASE 1: - codigo_mapa=load_map("fost3D\\fondo2.map"); - codigo_mapa2=load_map("fost3D\\paisaje2.map"); - END - CASE 2: - codigo_mapa=load_map("fost3D\\fondo3.map"); - codigo_mapa2=load_map("fost3D\\paisaje1.map"); - END - END - - // Carga los gr ficos necesarios para el jugador 1 - SWITCH(luchador1) - CASE 0: load_fpg("fost3D\mujer.fpg"); END - CASE 1: load_fpg("fost3D\hombre1.fpg"); END - CASE 2: load_fpg("fost3D\esquelet.fpg"); END - CASE 3: load_fpg("fost3D\hombre2.fpg"); END - END - - // Carga los gr ficos necesarios para el jugador 2 - SWITCH(luchador2) - CASE 0: load_fpg("fost3D\mujer.fpg"); END - CASE 1: load_fpg("fost3D\hombre1.fpg"); END - CASE 2: load_fpg("fost3D\esquelet.fpg"); END - CASE 3: load_fpg("fost3D\hombre2.fpg"); END - END - fileworld=load_fpg("fost3D\texturas.fpg"); - load_wld("fost3D\zeen.wld",fileworld); - // Si los jugadores son iguales convierte uno de ellos a grises - IF (luchador1==luchador2) - FROM contador0=1 TO 54; - // Cambia los 54 primeros gr ficos del fichero - // a la paleta de grises - convert_palette(2,contador0,&grises); - END - convert_palette(2,100,&grises);// Tambi‚n convierte los gr ficos - convert_palette(2,101,&grises);// peque¤os de las carras - END - - combates1=0; // Inicializa las variables del juego - combates2=0; - sangre_total=0; - - REPEAT // Bucle del juego - - fade_off(); // Apaga la pantalla - - // Borra los textos, procesos o 'scrolles' que hubiera abiertos - let_me_alone(); - delete_text(all_text); -// stop_scroll(0); - stop_mode8(0); - clear_screen(); - - // Selecciona el numero de pantallas por segundo y el tipo de restauraci¢n - set_fps(100,0); - restore_type=complete_restore; - - // Pone la pantalla a blanco - fade(200,200,200,8); - WHILE (fading) FRAME; END //Espera mientras enciende la pantalla - - // Cambia el tipo de restauraci¢n de pantalla para ganar velocidad - restore_type=no_restore; - - estado_juego=0; // Para el juego para poner todo - - // Inicializa el scroll -// start_scroll(0,0,codigo_mapa,codigo_mapa2,0,0); -// start_scroll(0,0,0,0,0,0); -// scroll.x0=160; - - id_camara_modo8=camara_modo8(); - - // Crea los mu¤ecos que se han seleccionado - // y el tipo de control de los mismos - SWITCH(modo) - - // Ordenador contra ordenador - CASE 0: - id_luchador1=mu¤eco(60,400,1,1,control_ordenador,luchador1); - id_luchador2=mu¤eco(560,400,2,0,control_ordenador,luchador2); - END - - // Jugador contra ordenador - CASE 1: - id_luchador1=mu¤eco(60,400,1,1,control_teclado1,luchador1); - id_luchador2=mu¤eco(560,400,2,0,control_ordenador,luchador2); - END - - // Ordenador contra jugador - CASE 2: - id_luchador1=mu¤eco(60,400,1,1,control_teclado2,luchador1); - id_luchador2=mu¤eco(560,400,2,0,control_ordenador,luchador2); - END - - // Jugador contra jugador - CASE 3: - id_luchador1=mu¤eco(60,400,1,1,control_teclado2,luchador1); - id_luchador2=mu¤eco(560,400,2,0,control_teclado1,luchador2); - END - END - - // Inicializa las variables enemigo de los mu¤ecos que son - // identificadores al proceso del enemigo - id_luchador1.enemigo=id_luchador2; - id_luchador2.enemigo=id_luchador1; - - objetos(0,320,49,200,0,0); // Pone los marcadores de energ¡a - objetos(0,194,38,201,0,1); - objetos(0,446,38,202,0,2); - - define_region(1,0,0,640,480); // Define las regiones para el movimiento - define_region(2,0,0,640,480); // de pantalla - - // Escribe el nombre del escenario - write(1,320,0,1,escenarios[escenario]); - - // Pone las fotos y los nombres de los mu¤ecos - objetos(id_luchador1.file,44,52,100+combates2,1,0); - write(1,45,100,1,nombres[luchador1]); - objetos(id_luchador2.file,596,52,100+combates1,0,0); - write(1,596,100,1,nombres[luchador2]); - - // Crea las estrellas que marcan los combates ganados - crea_estrellas(); - - // Pone el mensaje de inicio de combate - SWITCH(combates1+combates2) - CASE 0: - idtexto=write(2,320,200,4,"ROUND 1st"); - END - CASE 1: - idtexto=write(2,320,200,4,"ROUND 2nd"); - END - CASE 2: - idtexto=write(2,320,200,4,"ROUND 3rd"); - END - END - - fade(100,100,100,10); // Muestra la pantalla - WHILE (fading) FRAME; END - - // Dependiendo del nivel el juego va mas o menos r pido - set_fps(default_fps+nivel*2,8); - FRAME(4800); // Hace una peque¤a pausa - - // Borra el texto de inicio de combate - delete_text(idtexto); - - estado_juego=1; // Quita la pausa al juego - - REPEAT // Bucle de cada combate - - // Coloca el scroll dependiendo de las posiciones de los luchadores -// scroll.x0=(id_luchador1.x+id_luchador2.x)/4-80; - SWITCH (escenario) - CASE 0: - id_camara_modo8.x=6700+(((id_luchador1.x+id_luchador2.x)/2)-320); - END - CASE 1: - id_camara_modo8.x=7000+(((id_luchador1.x+id_luchador2.x)/2)-320); - END - CASE 2: - id_camara_modo8.y=7800+(((id_luchador1.x+id_luchador2.x)/2)-320); - END - - END - FRAME; - - // Actualiza los marcadores - define_region(1,296-id_luchador1.energia,28,id_luchador1.energia+1,20); - define_region(2,345,29,id_luchador2.energia+1,20); - - // Comprueba si se ha pulsado 'escape' - IF (key(_esc)) esc_pulsado=1; END - - // Repite hasta que se pulse escape o gane algun luchador - UNTIL (estado_juego==2 OR esc_pulsado) - - // Si no se ha pulsado escape es que alguno ha ganada - IF (NOT esc_pulsado) - IF (id_luchador1.energia==0) // Gana el jugador 2 - combates2++; - ELSE - combates1++; // Gana el jugador 1 - END - crea_estrellas(); // Actualiza las estrellas - FRAME(4800); - END - - // Repite hasta que algun jugador gane dos combates - UNTIL (combates1==2 OR combates2==2 OR esc_pulsado) - - // Si no se ha pulsado 'escape' pon el final de la lucha - IF (NOT esc_pulsado) - - // Pon el numero de im genes por segundo como en el men£ - set_fps(100,0); - - fade(200,200,200,10); // Pone la pantalla a blanco - WHILE (fading) FRAME; END // Espera hasta que se ponga blanca - - // Pone el nombre del que ha ganado - IF (combates1==2) - write(2,320,160,4,nombres[luchador1]); - ELSE - write(2,320,160,4,nombres[luchador2]); - END - - // Y el mensaje de gana - write(2,320,220,4,"WINS"); - - fade(100,100,100,10); // Enciende pantalla - WHILE (fading) FRAME; END // Espera hasta que se encienda - - // Pone el numero de im genes por segundo como en el juego - set_fps(default_fps+nivel*2,8); - - FRAME(9600); // Espera un rato - - ELSE - // Actualiza la variable que guarda la pulsaci¢n de 'escape' - esc_pulsado=0; - END - - fade_off(); // Apaga la pantalla - - // Inicializa todo, borra procesos, textos pendientes, scrolles, etc -// stop_scroll(0); // Para scroll - stop_mode8(0); - unload_fpg(1); // Descarga ficheros de gr ficos - unload_fpg(2); - unload_fpg(fileworld); - unload_map(codigo_mapa); // Descarga mapas gr ficos - unload_map(codigo_mapa2); - let_me_alone(); // Borra procesos - delete_text(all_text); // Borra textos - - // Cambia la forma de restaurar la pantalla - restore_type=complete_restore; - - END -END - -//------------------------------------------------------------------------------ -// Proceso muestra_informacion -// Pone los textos y los gr ficos de la pantalla de opciones -//------------------------------------------------------------------------------ - -PROCESS muestra_informaci¢n() - -BEGIN - // Borra todo para luego imprimirlo actualizado - delete_text(all_text); // Borra cualquier texto pendiente - - signal(id_luchador1,s_kill); // Elimina los procesos de los mu¤ecos - signal(id_luchador2,s_kill); - signal(id_auxiliar,s_kill); - - // Pone los textos no seleccionables - write(2,320,0,1,"OPTIONS"); - write(2,320,156,1," VS "); - - // Pone textos seleccionables - texto[0].codigo=write(2,320,480,7,"START GAME"); - texto[1].codigo=write(1,320,90,1,modos[modo]); - texto[2].codigo=write(1,320,120,1,niveles[nivel]); - texto[3].codigo=write(1,320,150,1,sangres[sangre]); - - // Pone los gr ficos de los mu¤ecos y del escenario elegidos - id_luchador1=objetos(0,100,256,310+luchador1,1,0); - id_luchador2=objetos(0,540,256,310+luchador2,0,0); - id_auxiliar=objetos(0,320,300,300+escenario,0,0); - - // Pone los textos de los mu¤ecos y del escenario elegido - texto[4].codigo=write(1,100,364,1,nombres[luchador1]); - texto[5].codigo=write(1,320,364,1,escenarios[escenario]); - texto[6].codigo=write(1,540,364,1,nombres[luchador2]); - - // Mueve el texto que esta seleccionado - move_text(texto[opci¢n].codigo, - texto[opci¢n].x+get_disty( ngulo_texto,8), - texto[opci¢n].y); -END - -//------------------------------------------------------------------------------ -// Proceso control -// Mueve los mu¤ecos, bien por teclado o controlados por el ordenador -// Entradas: 'acci¢n' : Acci¢n ha comprobar si se hace -//------------------------------------------------------------------------------ - -PROCESS control(acci¢n) - -PRIVATE - dist; // Distancia entre los mu¤ecos - -BEGIN - - // Comprueba que el juego no este en pausa - IF (estado_juego<>1) return(0); END - - // Lee la tecla dependiendo del tipo de control - SWITCH(father.tipo_control) // Mira quien maneja el mu¤eco - - CASE control_teclado1: // Si se controla con el teclado1 - - // Va mirando que acci¢n se quiere hacer - // Y leyendo las teclas que se usan para ello - SWITCH(acci¢n) // Mira que acci¢n se esta comprobando - CASE saltar: - RETURN(key(_up)); // Devuelve TRUE si esta pulsada la tecla - END - CASE agacharse: - RETURN(key(_down)); - END - CASE avanzar: - IF (father.flags) // Dependiendo hacia donde mire - RETURN(key(_right)); // Lee una tecla... - ELSE - RETURN(key(_left)); // O la otra - END - END - CASE retroceder: - IF (father.flags) - RETURN(key(_left)); - ELSE - RETURN(key(_right)); - END - END - CASE golpear: - RETURN(key(_control)); - END - END - END - CASE control_teclado2: // Se esta usando el teclado 2 - SWITCH(acci¢n) // Se comprueba igual que antes. - CASE saltar: - RETURN(key(_q)); - END - CASE agacharse: - RETURN(key(_a)); - END - CASE avanzar: - IF (father.flags) - RETURN(key(_t)); - ELSE - RETURN(key(_r)); - END - END - CASE retroceder: - IF (father.flags) - RETURN(key(_r)); - ELSE - RETURN(key(_t)); - END - END - CASE golpear: - RETURN(key(_x)); - END - END - END - CASE control_ordenador: // Lo maneja el ordenador - dist=abs(id_luchador1.x-id_luchador2.x); // Halla la distancia entre los mu¤ecos - SWITCH(father.estado) // Mira que se quiere comprobar - - // Va mirando que acci¢n se quiere hacer - // Y se comprueba si es conveniente - CASE _parado: - SWITCH(acci¢n) - CASE saltar: - // Si se esta a distancia correcta y... - // da la suerte devuelve TRUE - IF (dist<160 AND rand(0,35)==0) - RETURN(1); - END - END - CASE agacharse: // Igual para las dem s acciones - IF (dist<160 AND rand(0,25)==0) - RETURN(1); - END - END - CASE avanzar: - IF (dist>400) - IF (rand(0,4)==0) - RETURN(1); - END - ELSE - IF (dist>120 AND rand(0,8)==0) - RETURN(1); - END - END - END - CASE retroceder: - IF (dist<180 AND rand(0,25)==0) - RETURN(1); - END - IF (dist<80 AND rand(0,5)==0) - RETURN(1); - END - END - CASE golpear: - IF (dist<180 AND dist>60 AND rand(0,5)==0) - RETURN(1); - END - END - END - END - CASE _avanzando: - SWITCH(acci¢n) - CASE saltar: - IF (dist>180 AND dist<300 AND rand(0,8)==0) - RETURN(1); - END - END - CASE golpear: - IF (dist<140) - RETURN(1); - END - END - END - END - CASE _retrocediendo: - SWITCH(acci¢n) - CASE saltar: - IF (dist<120 AND rand(0,6)==0) - RETURN(1); - END - END - CASE golpear: - IF (dist>70 AND dist<150) - RETURN(1); - END - END - END - END - CASE _agachado: - SWITCH(acci¢n) - CASE agacharse: - IF (rand(0,5)<>0) - RETURN(1); - END - END - CASE golpear: - IF (dist<180 AND rand(0,5)==0) - RETURN(1); - END - END - END - END - CASE _saltando: - SWITCH(acci¢n) - CASE golpear: - IF (rand(0,10)==0) - RETURN(1); - END - END - END - END - END - // Si la acci¢n es correcta se devuelve 1, si no 0 - RETURN(0); // No hace ninguna acci¢n - END - END -END - -//------------------------------------------------------------------------------ -// Proceso mu¤eco -// Maneja todos los tipo de mu¤eco -// Entradas: 'x,y' : Coordenadas iniciales -// 'file' : Fichero donde est n los gr ficos -// 'flags' : Hacia donde mira el mu¤eco (izq./der.) -// 'tipo_control' : Quien maneja al mu¤eco (teclado1/teclado2/cpu) -// 'luchador' : Cual es de los dos luchadores -//------------------------------------------------------------------------------ - -PROCESS mu¤eco(x,y,file,flags,tipo_control,luchador) - -PRIVATE - nuevo_estado; // Variable temporal para el estado del mu¤eco - nuevo_paso; // Variable temporal para la posici¢n de la animaci¢n del mu¤eco - golpe_x,golpe_y; // Variables para guardar los puntos de control de los golpes - // Fuerza de cada uno de los golpes - fuerza_golpe[]=35,35,55,35,35; - contador0; // Contador de uso general - suma_fuerza; // Fuerza variable dependiendo del nivel y del luchador - -BEGIN -// ctype=c_scroll; // Lo introduce dentro del scroll - energia=203; // Inicializa la energ¡a - FRAME; - sombra(); // Crea la sombra del mu¤eco - - IF (tipo_control<>0) // Si el ordenador no lleva este mu¤eco - IF (enemigo.tipo_control==0) // Pero lleva el del enemigo - SWITCH(nivel) // Dependiendo del nivel de juego (dificultad) - CASE 1: suma_fuerza=-10; END // Hace que los golpes quiten menos energia - CASE 2: suma_fuerza=-18; END - END - ELSE - suma_fuerza=10; // Humano vs Humano, iguala las fuerzas - END - END - - SWITCH(luchador) // Dependiendo del tipo de luchador - CASE 0: suma_fuerza-=8; END // Ripley pega menos - CASE 1: suma_fuerza+=6; END // Bishop es el segundo que pega m s - CASE 2: suma_fuerza+=4; END // Alien es el segundo que pega menos - CASE 3: suma_fuerza+=8; END // Nostrodomo pega m s que nadie - END - - // Actualiza la fuerza de los golpes seg£n los jugadores - FROM contador0=0 TO 4; fuerza_golpe[contador0]+=suma_fuerza; END - - LOOP - nuevo_estado=estado; // Actualiza la variable temporal del estado del mu¤eco - SWITCH(estado) // Comprueba el estado del mu¤eco - CASE _parado: - graph=anim0[paso++]; // Anima el gr fico - IF (paso==sizeof(anim0)) // Si no hay mas gr ficos en la animaci¢n - paso=0; // Empieza desde 0 - END - IF (flags) // Hace que los mu¤ecos se miren - IF (enemigo.xx) flags=1; END - END - // Comprueba si se quiere cambiar de estado - IF (control(golpear)) // Comprueba si se quiere golpear - nuevo_estado=_pu¤etazo; // Y golpea... - END - IF (control(saltar)) // Comprueba si se quiere saltar - nuevo_estado=_saltando; // Y salta... - inc_y=-16; inc_x=0; // Inicializa los incrementos para el salto - END - IF (control(agacharse)) // Comprueba si se quiere agachar - nuevo_estado=_agach ndose; // Y se agacha... - END - IF (control(retroceder)) // Comprueba si se quiere retroceder - nuevo_estado=_retrocediendo;// Y retrocede... - END - IF (control(avanzar)) // Comprueba si se quiere avanzar - nuevo_estado=_avanzando;// Y avanza... - END - END - - CASE _avanzando: // Si se esta avanzando - graph=anim1[paso++]; // Anima el gr fico - IF (paso==sizeof(anim1)) // Comprueba que no se ha llegado al final de la animaci¢n - nuevo_estado=_parado; // Y si se ha llegado cambia de estado - END - IF (flags) // Mueve el mu¤eco seg£n donde mire - x+=4; - ELSE - x-=4; - END - // Comprueba si se quieren hacer otras acciones - IF (control(golpear)) // Se quiere golpear - nuevo_estado=_patada_normal; - END - IF (control(saltar)) // Se quiere saltar - nuevo_estado=_saltando; - inc_y=-16; - IF (flags) - inc_x=12; - ELSE - inc_x=-12; - END - END - END - - CASE _retrocediendo: // Mira si se esta retrocediendo - graph=anim2[paso++]; // Anima el gr fico - IF (paso==sizeof(anim2)) // Si se ha llegado al final - nuevo_estado=_parado; // Cambia de estado - END - IF (flags) // Lo mueve seg£n a donde mire - x-=4; - ELSE - x+=4; - END - // Se mira si se quieren hacer otras acciones posibles - IF (control(golpear)) - nuevo_estado=_patada_giratoria; - inc_y=-10; - END - IF (control(saltar)) - nuevo_estado=_saltando; - inc_y=-16; - IF (flags) - inc_x=-8; - ELSE - inc_x=8; - END - END - END - - CASE _agach ndose: // Comprueba si se esta agach ndose - graph=anim3[paso++]; // Haz la animaci¢n - IF (paso==sizeof(anim3)) // Hasta que se llegue al final - nuevo_estado=_agachado; // Y pasa al estado de agachado - END - END - - CASE _agachado: // Comprueba si esta agachado - graph=anim4[0]; // Pone el gr fico necesario - IF (flags) // Pone al gr fico mirando al otro - IF (enemigo.xx) - flags=1; - END - END - // Comprueba si se quiere hacer otras acciones - IF (control(golpear)) // Comprueba si se quiere golpear - nuevo_estado=_golpe_bajo; - END - IF (NOT control(agacharse)) // Si no quiere agacharse - nuevo_estado=_levant ndose; // Se pone levant ndose - END - END - - CASE _levant ndose: // Comprueba si esta levant ndose - graph=anim5[paso++]; // An¡malo - IF (paso==sizeof(anim5)) // Si se acabado - nuevo_estado=_parado; // Cambia de estado a parado - END - END - - CASE _saltando: // Comprueba si se esta saltando - graph=anim6[paso++]; // Anima los gr ficos - IF (paso>4) // Si se ha llegado al punto de la animaci¢n - x+=inc_x; // Mueve al mu¤eco - y+=inc_y*3; - inc_y+=2; // Cambia el incremento para que bote - IF (y>=400) // Comprueba si ha tocado el suelo - y=400; - polvo(x,y); // Crea polvo cuando cae - // Mira si se quiere saltar otra vez - IF (control(saltar)) - nuevo_estado=_parado; - ELSE - nuevo_estado=_agach ndose; - END - END - END - IF (control(golpear)) // Comprueba si se quiere golpear - nuevo_estado=_patada_a‚rea; - nuevo_paso=paso; - END - END - - // Comprueba si se esta se hace el golpe bajo - CASE _golpe_bajo: - graph=anim7[paso++]; // Anima el gr fico - IF (paso==sizeof(anim7)) // Si se acaba la animaci¢n - nuevo_estado=_agachado; // Se pone en otro estado - END - IF (flags) // Comprueba hacia donde mira - x++; // Y se mueve un poco - ELSE - x--; - END - // Si se ha llegado al punto de la animaci¢n correcto - IF (paso==2) - sound(s_aire1,rand(50,75),256); // Realiza sonido - get_real_point(1,&golpe_x,&golpe_y); // Coge los puntos de control del pu¤o - golpe(golpe_x,golpe_y,fuerza_golpe[0]); // Y comprueba si se ha tocado - IF (fuerza_golpe[0]>2) // Reduce la fuerza de golpe - fuerza_golpe[0]--; // para la pr¢xima vez - END - END - END - // Comprueba si se esta haciendo la acci¢n pu¤etazo - CASE _pu¤etazo: - graph=anim8[paso++]; // Anima el gr fico - IF (paso==sizeof(anim8)) // Hasta que se acabe la animaci¢n - nuevo_estado=_parado; // Y cambia a un nuevo estado - END - IF (flags) // Comprueba hacia donde mira - x++; // Y se mueve - ELSE - x--; - END - IF (paso==4) // Si se ha llegado al punto de la animaci¢n - // Realiza el golpe - sound(s_aire2,rand(50,75),256); - get_real_point(1,&golpe_x,&golpe_y); // Halla el punto donde se dara el golpe - golpe(golpe_x,golpe_y,fuerza_golpe[1]); // Comprueba si se da el golpe - IF (fuerza_golpe[1]>2) // Quita fuerza al golpe - fuerza_golpe[1]--; - END - END - END - - CASE _patada_giratoria: // Comprueba la patada giratoria como los anteriores golpes - graph=anim9[paso++]; - IF (paso==sizeof(anim9)) - nuevo_estado=_parado; - END - y+=inc_y; inc_y+=2; - IF (y>400) - y=400; - END - IF (paso==5) - sound(s_aire3,rand(50,75),256); - get_real_point(1,&golpe_x,&golpe_y); - golpe(golpe_x,golpe_y,fuerza_golpe[2]); - IF (fuerza_golpe[2]>2) - fuerza_golpe[2]--; - END - END - END - - CASE _patada_normal: // Comprueba la patada normal - graph=anim10[paso++]; - IF (paso==sizeof(anim10)) - nuevo_estado=_parado; - END - IF (paso==4) - sound(s_aire4,rand(50,75),256); - get_real_point(1,&golpe_x,&golpe_y); - golpe(golpe_x,golpe_y,fuerza_golpe[3]); - IF (fuerza_golpe[3]>2) - fuerza_golpe[3]--; - END - END - END - - CASE _patada_a‚rea: // Comprueba la patada a‚rea - graph=anim11[paso++]; - IF (paso>4) - x+=inc_x; - y+=inc_y*3; - inc_y+=2; - IF (y>=400) - y=400; - polvo(x,y); - IF (control(saltar)) - nuevo_estado=_parado; - ELSE - nuevo_estado=_agach ndose; - END - END - END - IF (paso==10 OR paso==19) - sound(s_aire5,rand(50,75),256); - get_real_point(1,&golpe_x,&golpe_y); - golpe(golpe_x,golpe_y,fuerza_golpe[4]); - IF (fuerza_golpe[4]>2) - fuerza_golpe[4]--; - END - END - END - - CASE _tocado: // Comprueba si el mu¤eco ha sido tocado - graph=anim12[paso++]; // anima el gr fico - IF (paso==sizeof(anim12)) // Hasta que acabe - // Haz un sonido al azar de los que tiene - SWITCH(rand(0,3)) - CASE 0: - sound(s_golpe1,rand(25,50),256); - END - CASE 1: - sound(s_golpe2,rand(25,50),256); - END - CASE 2: - sound(s_golpe3,rand(25,50),256); - END - END - nuevo_estado=_parado; // Cambia de estado - y=400; // Cae al suelo - END - x+=inc_x; // Y mueve el mu¤eco un poco - // Si se movia el mu¤eco, lo frena - IF (inc_x<0) // Si se movia a la izquierda - inc_x++; // Se frena - END - IF (inc_x>0) // Si se movia a la derecha - inc_x--; // Se frena - END - IF (y<400) // Si estaba saltando - y+=8; // Hace que baje - END - IF (y>=400) // Si estaba por debajo del limite inferior - y=400; // Lo coloca - END - END - - CASE _muerto: // Comprueba si el mu¤eco ha muerto - IF (paso==0) - sound(s_muerto,25,256); // Hace el sonido de cuando muere - END - graph=anim13[paso++]; // Anima el gr fico hacia con una secuencia - IF (paso==sizeof(anim13)) // Y la deja parada - paso--; - END - x+=inc_x; // Mueve las coordenadas hasta cuadrarlas - // Como el caso anterior (tocado) frena el mu¤eco - IF (inc_x<0) - inc_x++; - END - IF (inc_x>0) - inc_x--; - END - IF (y<400) - y+=8; - END - IF (y>=400) - y=400; - END - END - - END - - IF (estado<>nuevo_estado) // Actualiza el estado del mu¤eco - estado=nuevo_estado; - paso=nuevo_paso; // Y el paso dentro de la animaci¢n - nuevo_paso=0; - END - - IF (x<40) // Comprueba que no se ha salido de pantalla - x=60; // Y coloca el gr fico si ha salido - END - IF (x>600) - x=600; - END - - FRAME; - END -END - -//------------------------------------------------------------------------------ -// Proceso sombra -// Maneja la sombra de los mu¤ecos -//------------------------------------------------------------------------------ - -PROCESS sombra() - -BEGIN -// ctype=c_scroll; // Lo pone dentro del scroll - graph=1; // Elige el gr fico - priority=-1; // Le da prioridad baja para que se ejecute despu‚s - z=1; // Lo pone por debajo del gr fico del mu¤eco - y=400; // Inicializa la coordenada vertical - flags=4; // Y hace que sea transparente - LOOP - x=father.x; // Hace que siga al mu¤eco - FRAME; - END -END - -//------------------------------------------------------------------------------ -// Proceso Polvo -// Pone una nube de polvo cuando el mu¤eco cae del salto -// Entradas: Coordenadas donde ira el gr fico -//------------------------------------------------------------------------------ - -PROCESS polvo(x,y) - -BEGIN - FRAME; -// ctype=c_scroll; // Lo pone dentro del scroll - flags=4; // Lo hace transparente - z=-1; // Lo pone por delante del mu¤eco - FROM graph=2 TO 12;// Anima el gr fico - FRAME; - END // Acaba, eliminando este proceso -END - -//------------------------------------------------------------------------------ -// Proceso golpe -// Maneja los golpes que lanzan los mu¤ecos -// Entradas: Coordenadas de donde se da realmente el golpe -// 'da¤o' Energ¡a que quita al enemigo -//------------------------------------------------------------------------------ - -PROCESS golpe(x,y,da¤o) - -PRIVATE - id_mu¤ecos; // Identificador a los mu¤ecos - contador0; // Contador de uso general - -BEGIN -// ctype=c_scroll; // Introduce al proceso dentro del scroll - z=-1; // Lo pone por delante de los mu¤ecos - graph=100; // Elige el gr fico de una bola para abarcar mas - // Comprueba si esta tocando a un mu¤eco - id_mu¤ecos=collision(type mu¤eco); - IF (id_mu¤ecos==father) // Y que no sea ‚l mismo que llamo a este proceso - id_mu¤ecos=collision(type mu¤eco); // Si es el mismo intenta coger el otro identificador - END - - IF (id_mu¤ecos) // Si ha tocado - // Hace un sonido al azar de los disponibles - SWITCH (rand(0,2)) - CASE 0: - sound(s_tocado1,rand(25,75),256); - END - CASE 1: - sound(s_tocado2,rand(25,75),256); - END - CASE 2: - sound(s_tocado3,rand(25,75),256); - END - END - id_mu¤ecos.paso=0; // Actualiza la animaci¢n del que ha sido tocado - id_mu¤ecos.energia-=da¤o/2; // Le quita energ¡a - IF (id_mu¤ecos.energia<=0) // Si no le queda energ¡a - id_mu¤ecos.energia=0; // Es que esta muerto - id_mu¤ecos.estado=_muerto; - estado_juego=2; - ELSE - id_mu¤ecos.estado=_tocado; // Si no, esta simplemente tocado - END - IF (id_mu¤ecos.flags) // Mueve el gr fico un poco para atr s - id_mu¤ecos.inc_x=-8; - ELSE - id_mu¤ecos.inc_x=8; - END - SWITCH(sangre) // Crea la sangre - // Dependiendo del nivel elegido en las opciones - CASE 0: // Golpe sin sangre - golpe_sin_sangre(x,y); - END - CASE 1: // Golpe con sangre - contador0=da¤o/3+1; - WHILE (contador0>0) - particula_sangre(x,y,id_mu¤ecos.inc_x+rand(-2,2),rand(-4,0),rand(10,20)); - contador0--; - END - END - CASE 2: // Golpe con mucha sangre - contador0=da¤o+2; - WHILE (contador0>0) - particula_sangre(x,y,id_mu¤ecos.inc_x*2+rand(-4,4),rand(-8,2),rand(15,30)); - contador0--; - END - END - END - END -END - -//------------------------------------------------------------------------------ -// Proceso particula_sangre -// Maneja la sangre que sale cuando se da un golpe -// Entradas: 'x,y' : Coordenadas desde donde sale la sangre -// 'inc_x,inc_y': Incrementos en el movimiento de la sangre (ca¡da) -// 'cont_tiempo': Contador del tiempo que aparecer  la sangre -//------------------------------------------------------------------------------ - -PROCESS particula_sangre(x,y,inc_x,inc_y,cont_tiempo) - -BEGIN -// ctype=c_scroll; // Lo pone dentro del scroll - // Si esta en el modo de mayor sanguinolencia, espera un poco para que no salga toda junta - IF (sangre==2) - FRAME(rand(0,400)); // Espera un tiempo al azar - END - graph=rand(50,53); // Elige uno de los gr ficos disponibles al azar - flags=4; // La hace transparente - z=-2; // Lo pone por encima de todo - WHILE (cont_tiempo>0) // Mueve la sangre mientras hjaya tiempo - x+=inc_x; // Realiza los incrementos en las coordenadas - y+=inc_y; - inc_y++; // Hace que cada vez caiga m s rapido - IF (inc_x>0) // Pero a horizontalmente se mueva m s lento - inc_x--; - END - IF (inc_x<0) - inc_x++; - END - IF (y>410) // Comprueba si ha tocado el suelo - // Deja sangre pegada al suelo de forma aleatoria - IF (rand(0,80)==0 AND sangre_total<50 AND y<480) - z=256; // La pone detr s - sangre_total++; // Incrementa el contador de sangre - LOOP - FRAME; // La deja en un bucle para que quede en pantalla - END - END - END - cont_tiempo--; // Incrementa el contador de tiempo - FRAME; - END -END - -//------------------------------------------------------------------------------ -// Proceso golpe_sin_sangre -// Pone un gr fico alternativo al de la sangre para los modos sin ella -//------------------------------------------------------------------------------ - -PROCESS golpe_sin_sangre(x,y) - -BEGIN -// ctype=c_scroll; // Lo pone dentro del scroll - z=-2; // Por delante de otros gr ficos - FROM graph=60 TO 66; - FRAME; // Anima el gr fico - END -END - -//------------------------------------------------------------------------------ -// Proceso objetos -// Pone los gr ficos est ticos del marcador y la pantalla de opciones -// Entradas: fichero gr fico, coordenadas, gr fico, bandera (der/izq.), -// zona de la pantalla -//------------------------------------------------------------------------------ - -PROCESS objetos(file,x,y,graph,flags,region) - -BEGIN - z=10; // Lo pone por debajo de otros gr ficos - LOOP - FRAME; - END -END - -//------------------------------------------------------------------------------ -// Proceso crea_estrellas -// Maneja las estrellas que indican los combates ganados -//------------------------------------------------------------------------------ - -PROCESS crea_estrellas() - -BEGIN - // Elimina cualquier estrella que hubiera antes - signal(type estrella,s_kill); - - // Pon las estrellas del jugador 1 - SWITCH(combates1) - // Dependiendo de los combates ganados pone unas estrellas u otras - CASE 0: - estrella(111,84,203); - estrella(143,84,203); - END - CASE 1: - estrella(111,84,204); - estrella(143,84,203); - END - CASE 2: - estrella(111,84,204); - estrella(143,84,204); - END - END - - // Pon las estrellas del jugador 2 - SWITCH(combates2) - CASE 0: - estrella(530,84,203); - estrella(498,84,203); - END - CASE 1: - estrella(530,84,204); - estrella(498,84,203); - END - CASE 2: - estrella(530,84,204); - estrella(498,84,204); - END - END - -END - -//------------------------------------------------------------------------------ -// Proceso estrella -// Imprime los gr ficos de la estrellas -// Entradas: Coordenadas y tipo de gr fico de la estrella -//------------------------------------------------------------------------------ - -PROCESS estrella(x,y,graph) - -BEGIN - LOOP - FRAME; // Lo imprime - END -END - -//------------------------------------------------------------------------------ -// Proceso cr‚ditos -// Pone la pantalla de cr‚ditos -//------------------------------------------------------------------------------ - -PROCESS cr‚ditos() - -PRIVATE - codigo_mapa; // Identificador al fichero de gr ficos - // Textos de los cr‚ditos - textos[]= - "PROGRAMMING","DANIEL NAVARRO","", - "GRAPHICS","JOSE FERNANDEZ","RAFAEL BARRASO","", - "SOUNDS","ANTONIO MARCHAL","", - "PLAYABILITY","LUIS F. FERNANDEZ","", - "THIS VERSION (3D)","ANTONIO MARCHAL"; - -BEGIN - // Carga la pantalla de fondo - codigo_mapa=load_map("fost3D\creditos.map"); - load_pal("fost3D\creditos.map"); - // Y el tipo de letras - load_fnt("fost3D\creditos.fnt"); - put_screen(0,codigo_mapa); // Pone el fondo - FROM y=0 TO 14; // Y escribe los textos - write(3,320,40+y*20,4,textos[y]); - END - fade_on(); // Enciende la pantalla - scan_code=0; - REPEAT // Espera hasta que se pulse una tecla - FRAME; - UNTIL (scan_code<>0) -END - -//------------------------------------------------------------------------------ -// Proceso intro -// Realiza la intro del juego -//------------------------------------------------------------------------------ - -PROCESS intro(); - -PRIVATE - contador0; // Contador de uso general - codigo_mapa; // Identificador para descargar los graficos - s_intro; // Identificador del sonido de la intro -BEGIN - // Para el proceso general para poner este - signal(father,s_sleep); - // Hace que la pantalla cambie rapido - set_fps(100,0); - load_pal("fost3D\intro.map"); // Carga la paleta de colores - codigo_mapa=load_map("fost3D\intro.map"); // Carga la pantalla - s_intro=load_pcm("fost3D\introhit.pcm",0); // Carga el sonido - - fade(200,200,200,8); // Pone la pantalla en blanco - WHILE (fading) FRAME; END // Espera hasta que se encienda la pantalla - sound(s_intro,100,256); // Hace el sonido - put_screen(0,codigo_mapa); // Pone el fondo de pantalla - unload_map(codigo_mapa); // Descarga el grafico - fade_on(); // Hace que se vea la pantalla (la enciende) - WHILE (fading) FRAME; END // Espera hasta que se encienda la pantalla - - // Carga sonidos - s_golpe1=load_pcm("fost3D\uah00.pcm",0); - s_golpe2=load_pcm("fost3D\whimper2.pcm",0); - s_golpe3=load_pcm("fost3D\whimper3.pcm",0); - s_tocado1=load_pcm("fost3D\hit00.pcm",0); - s_tocado2=load_pcm("fost3D\hit01.pcm",0); - s_tocado3=load_pcm("fost3D\hit02.pcm",0); - s_aire1=load_pcm("fost3D\turn06.pcm",0); - s_aire2=load_pcm("fost3D\turn07.pcm",0); - s_aire3=load_pcm("fost3D\turn08.pcm",0); - s_aire4=load_pcm("fost3D\turn05.pcm",0); - s_aire5=load_pcm("fost3D\turn09.pcm",0); - s_muerto=load_pcm("fost3D\aaah01.pcm",0); - - // Carga los graficos y las letras - load_fpg("fost3D\juego.fpg"); - load_fnt("fost3D\enjuego.fnt"); - load_fnt("fost3D\enjuego2.fnt"); - - // Espera a que se pulse una tecla o pase un tiempo - WHILE (NOT key(_esc) AND NOT key (_space) AND contador0<200) - FRAME; - contador0++; - END - // Devuelve el control al proceso principal - signal(father,s_wakeup); -END -PROCESS camara_modo8(); -BEGIN - start_mode8(id,0,0); - ctype=c_m8; - m8.height=64; // Altura de los ojos - m8.angle=0; // Mirar hacia arriba/abajo - - SWITCH (escenario) - CASE 0: - angle=90000; - x=6700; - y=8300; - END - CASE 1: - angle=90000; - x=7000; - y=6000; - END - CASE 2: - angle=180000; - x=3000; - y=7800; - END - - END - z=1100; - - LOOP - FRAME; - END -END + +//------------------------------------------------------------------------------ +// TITULO: FOSTIATOR +// AUTOR: DANIEL NAVARRO +// FECHA: 15/06/97 +//------------------------------------------------------------------------------ +PROGRAM fostiator; + +CONST + // Distintos estados de los mu¤ecos + _parado=0; + _avanzando=1; + _retrocediendo=2; + _agach ndose=3; + _agachado=4; + _levant ndose=5; + _saltando=6; + _golpe_bajo=7; + _pu¤etazo=8; + _patada_giratoria=9; + _patada_normal=10; + _patada_a‚rea=11; + _tocado=12; + _muerto=13; + + // Distintas posiciones de los mu¤ecos + saltar=0; + agacharse=1; + avanzar=2; + retroceder=3; + golpear=4; + + // Tipo de control del mu¤eco + control_teclado1=1; + control_teclado2=2; + control_ordenador=0; + + default_fps=24; // Numero de im genes por segundo + +GLOBAL + // Secuencia de animacin de cada uno de los estados de los mu¤ecos + anim0[]=1,1,1,14,14,15,15,16,16,17,17,17,16,16,15,15,14,14; + anim1[]=1,2,3,4,5,6,7,8; + anim2[]=1,8,7,6,5,4,3,2; + anim3[]=8,9,10,11,12,13; + anim4[]=13; + anim5[]=13,12,11,10,9,8; + anim6[]=18,19,20,21,21,22,22,22,22,23,23,23,23,24,24,24,24,24,24,24,24; + anim7[]=52,54,54,54,54,53,53,52,51; + anim8[]=25,26,27,28,28,28,28,27,27,26,25; + anim9[]=29,30,31,32,33,33,34,35,36,37,38,39; + anim10[]=29,30,31,32,32,32,31,31,30,30,29; + anim11[]=18,19,20,21,21,22,22,24,40,41,41,41,41,41,41,41,41,41,41,41,41,41; + anim12[]=1,42,42,43,43,42,42; + anim13[]=1,42,42,43,43,44,44,45,45,46,46,47,47,48,48,49,49,50; + + s_golpe1; // Identificadores de sonidos + s_golpe2; + s_golpe3; + s_tocado1; + s_tocado2; + s_tocado3; + s_aire1; + s_aire2; + s_aire3; + s_aire4; + s_aire5; + s_muerto; + + id_luchador1,id_luchador2; // Identificador de ambos combatientes + id_auxiliar; // Identificador auxiliar + + combates1; // Numero de combates que ha ganado el primero + combates2; // Numero de combates que ha ganado el segundo + + estado_juego; // 0-parado, 1-jugando, 2-fin combate + + escenario; // Escenario de lucha 0 / 2 + + luchador1=1; // 0-Ripley, 1-Bishop, 2-Alien, 3-Nostromo + luchador2=2; // 0-Ripley, 1-Bishop, 2-Alien, 3-Nostromo + + nivel=1; // Dificultad del juego (0..2) + modo; // Modo de juego (ver modos[]) + sangre=1; // Nivel de sangre (ver sangres[]) + + // Textos de las opciones de combate + nombres[]="RIPLEY","BISHOP","ALIEN","NOSTROMO"; + escenarios[]="LEVEL 1 : THE ARENA ","LEVEL 2 : THE STORE","LEVEL 3: THE COLUMNS"; + niveles[]="EASY MODE","NORMAL MODE","HARD MODE"; + modos[]="COMPUTER vs COMPUTER"," CURSOR KEYS vs COMPUTER", + "QA-RT-X KEYS vs COMPUTER","QA-RT-X KEYS vs CURSOR KEYS"; + sangres[]="BLOOD LEVEL : LOWER","BLOOD LEVEL : NORMAL","BLOOD LEVEL : HIGHER"; + + struct texto[6] // Textos donde se guardan las opciones del combate + x,y; + codigo; + END = 320,480,0, + 320,90,0, + 320,120,0, + 320,150,0, + 100,364,0, + 320,364,0, + 540,364,0; + + opci¢n; // Opci¢n seleccionada del men£ + opci¢n_anterior; + + esc_pulsado; // Indica si se ha abortado con ESC + + grises[255]= // Tabla de conversi¢n de los colores a grises + 0,236,203,220,159,156,155,153,151,150,134,89,90,92,94,94, + 45,46,69,59,103,93,90,134,150,151,155,156,159,220,203,236, + 41,43,46,47,69,59,101,94,40,41,43,43,44,45,46,47, + 40,41,44,45,45,46,47,68,69,58,58,59,58,58,106,101, + 43,45,47,47,47,68,68,68,68,58,59,101,101,101,59,59, + 45,59,101,94,90,90,90,90,90,89,90,90,90,93,94,94, + 69,59,58,106,103,101,101,103,101,101,59,59,94,92,94,93, + 101,94,93,93,94,92,93,89,89,134,134,134,151,150,150,153, + 101,90,89,90,134,134,134,134,134,90,89,134,134,150,150,151, + 103,134,134,134,150,150,150,151,153,153,153,155,156,156,159,159, + 90,89,150,151,153,155,156,219,219,220,223,203,203,203,236,235, + 134,150,150,151,153,153,153,151,155,156,156,159,220,223,236,237, + 134,153,155,156,156,159,219,220,220,201,203,203,201,203,203,236, + 151,155,156,156,219,219,220,159,155,155,159,219,220,219,220,223, + 151,159,153,155,220,220,159,155,223,236,235,235,236,237,238,237, + 155,153,203,223,237,238,247,247,248,247,238,237,235,236,203,220; + + sangre_total; // Part¡culas de sangre que se han quedado en el mapa +  ngulo_texto; // Movimiento del texto en las opciones + + id_camara_modo8; + +LOCAL + estado; // Indicador de la animaci¢n actual + paso; // Paso de la animaci¢n actual + inc_y,inc_x; // Desplazamientos del mu¤eco + enemigo; // Identificador del enemigo + tipo_control; // Dispositivo que controla al mu¤eco + energ¡a; // Energ¡a de mu¤eco + +PRIVATE + codigo_mapa; // Pantalla de fondo cargada en ese momento + codigo_mapa2; + contador0; // Contador de uso general + idtexto; + fileworld; +BEGIN + set_mode(m640x480); // Selecciona modo de v¡deo + max_process_time=1500; // Deja m s tiempo para que se ejecuten los procesos + priority=-10; // Pone muy poca prioridad + + intro(); // Ejecuta la intro del juego + FRAME; // Necesario para parar este proceso + LOOP // Bucle principal + + set_fps(100,0); // Numero de im genes por segundo + codigo_mapa=load_map("fost3D\menu.map"); // Carga la pantalla del men£ + load_pal("fost3D\menu.map"); + put_screen(0,codigo_mapa); // Pone la pantalla del men£ + unload_map(codigo_mapa); // Y la descarga de memoria para as¡ tener mas + + fade_on(); // Enciende la pantalla + + opcion=0; // Inicializa la variable de opciones + + WHILE (opcion==0) // Bucle del men£ de presentaci¢n + IF (key(_1) OR + key (_enter)) opcion=1; END // Juego + IF (key(_2) OR key (_esc)) opcion=2; END // Salir + FRAME; + END + + fade_off(); // Apaga la pantalla + + IF (opcion==2) // Opcion elegida: Salir del juego + cr‚ditos(); // Pone los cr‚ditos + signal(id,s_kill); // Elimina este proceso + FRAME; // Y acaba. + END + + // Carga los gr ficos de la pantalla de opciones + codigo_mapa=load_map("fost3D\opciones.map"); + load_pal("fost3D\\opciones.map"); + put_screen(0,codigo_mapa); // Pone el gr fico de fondo + unload_map(codigo_mapa); // Descarga el gr fico de memoria + + opcion=0; // Inicializa la variable de opciones +  ngulo_texto=0; // Pone a cero el  ngulo de desplazamiento del texto seleccionado + muestra_informaci¢n(); // Imprime todos los textos y gr ficos + fade_on(); // Enciende la pantalla + + LOOP + // Mueve el texto que este seleccionado en ese momento + move_text(texto[opci¢n].codigo,texto[opci¢n].x+get_disty( ngulo_texto,8),texto[opci¢n].y); + opci¢n_anterior=opcion; // Guarda la opci¢n para no cambiar bruscamente + + // Lee las teclas + IF (key(_right) OR key(_down)) + opcion++; + END + IF (key(_left) OR key(_up)) + opci¢n--; + END + + // Se ha cambiado a otra opci¢n + IF (opci¢n<>opci¢n_anterior) + + // Espera a que se pare + WHILE (get_disty( ngulo_texto,8)<>0) +  ngulo_texto+=22500; + move_text(texto[opci¢n_anterior].codigo, + texto[opci¢n_anterior].x+get_disty( ngulo_texto,8), + texto[opci¢n_anterior].y); + FRAME; + END + + // Normaliza las opciones + IF (opcion==7) opcion=0; END + IF (opcion==-1) opcion=6; END + + // Espera a soltar la tecla + WHILE (key(_right) OR key(_down) OR key(_left) OR key(_up)) + FRAME; + END + ELSE +  ngulo_texto+=22500; // Sigue moviendo el texto + END + + // Se ha elegido una opci¢n + IF (key(_enter) OR key(_space) OR key (_control)) + SWITCH(opci¢n) + + // Empieza el juego + CASE 0: BREAK; END + + // Modo de juego (1/2 jugadores) + CASE 1: + modo++; + IF (modo==4) modo=0; END + END + + // Nivel de juego (F cil/Dif¡cil) + CASE 2: + nivel++; + IF (nivel==3) nivel=0; END + END + + // Nivel de aparici¢n de sangre + CASE 3: + sangre++; + IF (sangre==3) sangre=0; END + END + + // Selecciona mu¤eco del jugador 1 + CASE 4: + luchador1++; + IF (luchador1==4) luchador1=0; END + END + + // Selecciona el escenario + CASE 5: + escenario++; + IF (escenario==3) escenario=0; END + END + + // Selecciona mu¤eco del jugador 2 + CASE 6: + luchador2++; + IF (luchador2==4) luchador2=0; END + END + END + muestra_informaci¢n(); // Actualiza la informaci¢n de pantalla + WHILE (key(_enter) OR key(_space) OR key (_control)) // Espera a soltar la tecla + FRAME; + END + END + IF (key(_esc)) // Se ha pulsado 'escape' + esc_pulsado=1;// Pone variable a 1 la variable de escape pulsado + BREAK; // Y sale del bucle + END + FRAME; + END + + IF (esc_pulsado) // Sale del men£ de opciones si se pulso escape + esc_pulsado=0; // Pone a a cero la variable para la proxima vez + fade_off(); // Apaga la pantalla + let_me_alone(); // Deja unicamente el proceso principal(este) + delete_text(all_text);//Borra cualquier texto que hubiera + CONTINUE; // Sale del siguiente bucle + END + // Carga los gr ficos necesarios para el escenario elegido + SWITCH (escenario) + CASE 0: + codigo_mapa=load_map("fost3D\\fondo1.map"); + codigo_mapa2=load_map("fost3D\\paisaje1.map"); + END + CASE 1: + codigo_mapa=load_map("fost3D\\fondo2.map"); + codigo_mapa2=load_map("fost3D\\paisaje2.map"); + END + CASE 2: + codigo_mapa=load_map("fost3D\\fondo3.map"); + codigo_mapa2=load_map("fost3D\\paisaje1.map"); + END + END + + // Carga los gr ficos necesarios para el jugador 1 + SWITCH(luchador1) + CASE 0: load_fpg("fost3D\mujer.fpg"); END + CASE 1: load_fpg("fost3D\hombre1.fpg"); END + CASE 2: load_fpg("fost3D\esquelet.fpg"); END + CASE 3: load_fpg("fost3D\hombre2.fpg"); END + END + + // Carga los gr ficos necesarios para el jugador 2 + SWITCH(luchador2) + CASE 0: load_fpg("fost3D\mujer.fpg"); END + CASE 1: load_fpg("fost3D\hombre1.fpg"); END + CASE 2: load_fpg("fost3D\esquelet.fpg"); END + CASE 3: load_fpg("fost3D\hombre2.fpg"); END + END + fileworld=load_fpg("fost3D\texturas.fpg"); + load_wld("fost3D\zeen.wld",fileworld); + // Si los jugadores son iguales convierte uno de ellos a grises + IF (luchador1==luchador2) + FROM contador0=1 TO 54; + // Cambia los 54 primeros gr ficos del fichero + // a la paleta de grises + convert_palette(2,contador0,&grises); + END + convert_palette(2,100,&grises);// Tambi‚n convierte los gr ficos + convert_palette(2,101,&grises);// peque¤os de las carras + END + + combates1=0; // Inicializa las variables del juego + combates2=0; + sangre_total=0; + + REPEAT // Bucle del juego + + fade_off(); // Apaga la pantalla + + // Borra los textos, procesos o 'scrolles' que hubiera abiertos + let_me_alone(); + delete_text(all_text); +// stop_scroll(0); + stop_mode8(0); + clear_screen(); + + // Selecciona el numero de pantallas por segundo y el tipo de restauraci¢n + set_fps(100,0); + restore_type=complete_restore; + + // Pone la pantalla a blanco + fade(200,200,200,8); + WHILE (fading) FRAME; END //Espera mientras enciende la pantalla + + // Cambia el tipo de restauraci¢n de pantalla para ganar velocidad + restore_type=no_restore; + + estado_juego=0; // Para el juego para poner todo + + // Inicializa el scroll +// start_scroll(0,0,codigo_mapa,codigo_mapa2,0,0); +// start_scroll(0,0,0,0,0,0); +// scroll.x0=160; + + id_camara_modo8=camara_modo8(); + + // Crea los mu¤ecos que se han seleccionado + // y el tipo de control de los mismos + SWITCH(modo) + + // Ordenador contra ordenador + CASE 0: + id_luchador1=mu¤eco(60,400,1,1,control_ordenador,luchador1); + id_luchador2=mu¤eco(560,400,2,0,control_ordenador,luchador2); + END + + // Jugador contra ordenador + CASE 1: + id_luchador1=mu¤eco(60,400,1,1,control_teclado1,luchador1); + id_luchador2=mu¤eco(560,400,2,0,control_ordenador,luchador2); + END + + // Ordenador contra jugador + CASE 2: + id_luchador1=mu¤eco(60,400,1,1,control_teclado2,luchador1); + id_luchador2=mu¤eco(560,400,2,0,control_ordenador,luchador2); + END + + // Jugador contra jugador + CASE 3: + id_luchador1=mu¤eco(60,400,1,1,control_teclado2,luchador1); + id_luchador2=mu¤eco(560,400,2,0,control_teclado1,luchador2); + END + END + + // Inicializa las variables enemigo de los mu¤ecos que son + // identificadores al proceso del enemigo + id_luchador1.enemigo=id_luchador2; + id_luchador2.enemigo=id_luchador1; + + objetos(0,320,49,200,0,0); // Pone los marcadores de energ¡a + objetos(0,194,38,201,0,1); + objetos(0,446,38,202,0,2); + + define_region(1,0,0,640,480); // Define las regiones para el movimiento + define_region(2,0,0,640,480); // de pantalla + + // Escribe el nombre del escenario + write(1,320,0,1,escenarios[escenario]); + + // Pone las fotos y los nombres de los mu¤ecos + objetos(id_luchador1.file,44,52,100+combates2,1,0); + write(1,45,100,1,nombres[luchador1]); + objetos(id_luchador2.file,596,52,100+combates1,0,0); + write(1,596,100,1,nombres[luchador2]); + + // Crea las estrellas que marcan los combates ganados + crea_estrellas(); + + // Pone el mensaje de inicio de combate + SWITCH(combates1+combates2) + CASE 0: + idtexto=write(2,320,200,4,"ROUND 1st"); + END + CASE 1: + idtexto=write(2,320,200,4,"ROUND 2nd"); + END + CASE 2: + idtexto=write(2,320,200,4,"ROUND 3rd"); + END + END + + fade(100,100,100,10); // Muestra la pantalla + WHILE (fading) FRAME; END + + // Dependiendo del nivel el juego va mas o menos r pido + set_fps(default_fps+nivel*2,8); + FRAME(4800); // Hace una peque¤a pausa + + // Borra el texto de inicio de combate + delete_text(idtexto); + + estado_juego=1; // Quita la pausa al juego + + REPEAT // Bucle de cada combate + + // Coloca el scroll dependiendo de las posiciones de los luchadores +// scroll.x0=(id_luchador1.x+id_luchador2.x)/4-80; + SWITCH (escenario) + CASE 0: + id_camara_modo8.x=6700+(((id_luchador1.x+id_luchador2.x)/2)-320); + END + CASE 1: + id_camara_modo8.x=7000+(((id_luchador1.x+id_luchador2.x)/2)-320); + END + CASE 2: + id_camara_modo8.y=7800+(((id_luchador1.x+id_luchador2.x)/2)-320); + END + + END + FRAME; + + // Actualiza los marcadores + define_region(1,296-id_luchador1.energia,28,id_luchador1.energia+1,20); + define_region(2,345,29,id_luchador2.energia+1,20); + + // Comprueba si se ha pulsado 'escape' + IF (key(_esc)) esc_pulsado=1; END + + // Repite hasta que se pulse escape o gane algun luchador + UNTIL (estado_juego==2 OR esc_pulsado) + + // Si no se ha pulsado escape es que alguno ha ganada + IF (NOT esc_pulsado) + IF (id_luchador1.energia==0) // Gana el jugador 2 + combates2++; + ELSE + combates1++; // Gana el jugador 1 + END + crea_estrellas(); // Actualiza las estrellas + FRAME(4800); + END + + // Repite hasta que algun jugador gane dos combates + UNTIL (combates1==2 OR combates2==2 OR esc_pulsado) + + // Si no se ha pulsado 'escape' pon el final de la lucha + IF (NOT esc_pulsado) + + // Pon el numero de im genes por segundo como en el men£ + set_fps(100,0); + + fade(200,200,200,10); // Pone la pantalla a blanco + WHILE (fading) FRAME; END // Espera hasta que se ponga blanca + + // Pone el nombre del que ha ganado + IF (combates1==2) + write(2,320,160,4,nombres[luchador1]); + ELSE + write(2,320,160,4,nombres[luchador2]); + END + + // Y el mensaje de gana + write(2,320,220,4,"WINS"); + + fade(100,100,100,10); // Enciende pantalla + WHILE (fading) FRAME; END // Espera hasta que se encienda + + // Pone el numero de im genes por segundo como en el juego + set_fps(default_fps+nivel*2,8); + + FRAME(9600); // Espera un rato + + ELSE + // Actualiza la variable que guarda la pulsaci¢n de 'escape' + esc_pulsado=0; + END + + fade_off(); // Apaga la pantalla + + // Inicializa todo, borra procesos, textos pendientes, scrolles, etc +// stop_scroll(0); // Para scroll + stop_mode8(0); + unload_fpg(1); // Descarga ficheros de gr ficos + unload_fpg(2); + unload_fpg(fileworld); + unload_map(codigo_mapa); // Descarga mapas gr ficos + unload_map(codigo_mapa2); + let_me_alone(); // Borra procesos + delete_text(all_text); // Borra textos + + // Cambia la forma de restaurar la pantalla + restore_type=complete_restore; + + END +END + +//------------------------------------------------------------------------------ +// Proceso muestra_informacion +// Pone los textos y los gr ficos de la pantalla de opciones +//------------------------------------------------------------------------------ + +PROCESS muestra_informaci¢n() + +BEGIN + // Borra todo para luego imprimirlo actualizado + delete_text(all_text); // Borra cualquier texto pendiente + + signal(id_luchador1,s_kill); // Elimina los procesos de los mu¤ecos + signal(id_luchador2,s_kill); + signal(id_auxiliar,s_kill); + + // Pone los textos no seleccionables + write(2,320,0,1,"OPTIONS"); + write(2,320,156,1," VS "); + + // Pone textos seleccionables + texto[0].codigo=write(2,320,480,7,"START GAME"); + texto[1].codigo=write(1,320,90,1,modos[modo]); + texto[2].codigo=write(1,320,120,1,niveles[nivel]); + texto[3].codigo=write(1,320,150,1,sangres[sangre]); + + // Pone los gr ficos de los mu¤ecos y del escenario elegidos + id_luchador1=objetos(0,100,256,310+luchador1,1,0); + id_luchador2=objetos(0,540,256,310+luchador2,0,0); + id_auxiliar=objetos(0,320,300,300+escenario,0,0); + + // Pone los textos de los mu¤ecos y del escenario elegido + texto[4].codigo=write(1,100,364,1,nombres[luchador1]); + texto[5].codigo=write(1,320,364,1,escenarios[escenario]); + texto[6].codigo=write(1,540,364,1,nombres[luchador2]); + + // Mueve el texto que esta seleccionado + move_text(texto[opci¢n].codigo, + texto[opci¢n].x+get_disty( ngulo_texto,8), + texto[opci¢n].y); +END + +//------------------------------------------------------------------------------ +// Proceso control +// Mueve los mu¤ecos, bien por teclado o controlados por el ordenador +// Entradas: 'acci¢n' : Acci¢n ha comprobar si se hace +//------------------------------------------------------------------------------ + +PROCESS control(acci¢n) + +PRIVATE + dist; // Distancia entre los mu¤ecos + +BEGIN + + // Comprueba que el juego no este en pausa + IF (estado_juego<>1) return(0); END + + // Lee la tecla dependiendo del tipo de control + SWITCH(father.tipo_control) // Mira quien maneja el mu¤eco + + CASE control_teclado1: // Si se controla con el teclado1 + + // Va mirando que acci¢n se quiere hacer + // Y leyendo las teclas que se usan para ello + SWITCH(acci¢n) // Mira que acci¢n se esta comprobando + CASE saltar: + RETURN(key(_up)); // Devuelve TRUE si esta pulsada la tecla + END + CASE agacharse: + RETURN(key(_down)); + END + CASE avanzar: + IF (father.flags) // Dependiendo hacia donde mire + RETURN(key(_right)); // Lee una tecla... + ELSE + RETURN(key(_left)); // O la otra + END + END + CASE retroceder: + IF (father.flags) + RETURN(key(_left)); + ELSE + RETURN(key(_right)); + END + END + CASE golpear: + RETURN(key(_control)); + END + END + END + CASE control_teclado2: // Se esta usando el teclado 2 + SWITCH(acci¢n) // Se comprueba igual que antes. + CASE saltar: + RETURN(key(_q)); + END + CASE agacharse: + RETURN(key(_a)); + END + CASE avanzar: + IF (father.flags) + RETURN(key(_t)); + ELSE + RETURN(key(_r)); + END + END + CASE retroceder: + IF (father.flags) + RETURN(key(_r)); + ELSE + RETURN(key(_t)); + END + END + CASE golpear: + RETURN(key(_x)); + END + END + END + CASE control_ordenador: // Lo maneja el ordenador + dist=abs(id_luchador1.x-id_luchador2.x); // Halla la distancia entre los mu¤ecos + SWITCH(father.estado) // Mira que se quiere comprobar + + // Va mirando que acci¢n se quiere hacer + // Y se comprueba si es conveniente + CASE _parado: + SWITCH(acci¢n) + CASE saltar: + // Si se esta a distancia correcta y... + // da la suerte devuelve TRUE + IF (dist<160 AND rand(0,35)==0) + RETURN(1); + END + END + CASE agacharse: // Igual para las dem s acciones + IF (dist<160 AND rand(0,25)==0) + RETURN(1); + END + END + CASE avanzar: + IF (dist>400) + IF (rand(0,4)==0) + RETURN(1); + END + ELSE + IF (dist>120 AND rand(0,8)==0) + RETURN(1); + END + END + END + CASE retroceder: + IF (dist<180 AND rand(0,25)==0) + RETURN(1); + END + IF (dist<80 AND rand(0,5)==0) + RETURN(1); + END + END + CASE golpear: + IF (dist<180 AND dist>60 AND rand(0,5)==0) + RETURN(1); + END + END + END + END + CASE _avanzando: + SWITCH(acci¢n) + CASE saltar: + IF (dist>180 AND dist<300 AND rand(0,8)==0) + RETURN(1); + END + END + CASE golpear: + IF (dist<140) + RETURN(1); + END + END + END + END + CASE _retrocediendo: + SWITCH(acci¢n) + CASE saltar: + IF (dist<120 AND rand(0,6)==0) + RETURN(1); + END + END + CASE golpear: + IF (dist>70 AND dist<150) + RETURN(1); + END + END + END + END + CASE _agachado: + SWITCH(acci¢n) + CASE agacharse: + IF (rand(0,5)<>0) + RETURN(1); + END + END + CASE golpear: + IF (dist<180 AND rand(0,5)==0) + RETURN(1); + END + END + END + END + CASE _saltando: + SWITCH(acci¢n) + CASE golpear: + IF (rand(0,10)==0) + RETURN(1); + END + END + END + END + END + // Si la acci¢n es correcta se devuelve 1, si no 0 + RETURN(0); // No hace ninguna acci¢n + END + END +END + +//------------------------------------------------------------------------------ +// Proceso mu¤eco +// Maneja todos los tipo de mu¤eco +// Entradas: 'x,y' : Coordenadas iniciales +// 'file' : Fichero donde est n los gr ficos +// 'flags' : Hacia donde mira el mu¤eco (izq./der.) +// 'tipo_control' : Quien maneja al mu¤eco (teclado1/teclado2/cpu) +// 'luchador' : Cual es de los dos luchadores +//------------------------------------------------------------------------------ + +PROCESS mu¤eco(x,y,file,flags,tipo_control,luchador) + +PRIVATE + nuevo_estado; // Variable temporal para el estado del mu¤eco + nuevo_paso; // Variable temporal para la posici¢n de la animaci¢n del mu¤eco + golpe_x,golpe_y; // Variables para guardar los puntos de control de los golpes + // Fuerza de cada uno de los golpes + fuerza_golpe[]=35,35,55,35,35; + contador0; // Contador de uso general + suma_fuerza; // Fuerza variable dependiendo del nivel y del luchador + +BEGIN +// ctype=c_scroll; // Lo introduce dentro del scroll + energia=203; // Inicializa la energ¡a + FRAME; + sombra(); // Crea la sombra del mu¤eco + + IF (tipo_control<>0) // Si el ordenador no lleva este mu¤eco + IF (enemigo.tipo_control==0) // Pero lleva el del enemigo + SWITCH(nivel) // Dependiendo del nivel de juego (dificultad) + CASE 1: suma_fuerza=-10; END // Hace que los golpes quiten menos energia + CASE 2: suma_fuerza=-18; END + END + ELSE + suma_fuerza=10; // Humano vs Humano, iguala las fuerzas + END + END + + SWITCH(luchador) // Dependiendo del tipo de luchador + CASE 0: suma_fuerza-=8; END // Ripley pega menos + CASE 1: suma_fuerza+=6; END // Bishop es el segundo que pega m s + CASE 2: suma_fuerza+=4; END // Alien es el segundo que pega menos + CASE 3: suma_fuerza+=8; END // Nostrodomo pega m s que nadie + END + + // Actualiza la fuerza de los golpes seg£n los jugadores + FROM contador0=0 TO 4; fuerza_golpe[contador0]+=suma_fuerza; END + + LOOP + nuevo_estado=estado; // Actualiza la variable temporal del estado del mu¤eco + SWITCH(estado) // Comprueba el estado del mu¤eco + CASE _parado: + graph=anim0[paso++]; // Anima el gr fico + IF (paso==sizeof(anim0)) // Si no hay mas gr ficos en la animaci¢n + paso=0; // Empieza desde 0 + END + IF (flags) // Hace que los mu¤ecos se miren + IF (enemigo.xx) flags=1; END + END + // Comprueba si se quiere cambiar de estado + IF (control(golpear)) // Comprueba si se quiere golpear + nuevo_estado=_pu¤etazo; // Y golpea... + END + IF (control(saltar)) // Comprueba si se quiere saltar + nuevo_estado=_saltando; // Y salta... + inc_y=-16; inc_x=0; // Inicializa los incrementos para el salto + END + IF (control(agacharse)) // Comprueba si se quiere agachar + nuevo_estado=_agach ndose; // Y se agacha... + END + IF (control(retroceder)) // Comprueba si se quiere retroceder + nuevo_estado=_retrocediendo;// Y retrocede... + END + IF (control(avanzar)) // Comprueba si se quiere avanzar + nuevo_estado=_avanzando;// Y avanza... + END + END + + CASE _avanzando: // Si se esta avanzando + graph=anim1[paso++]; // Anima el gr fico + IF (paso==sizeof(anim1)) // Comprueba que no se ha llegado al final de la animaci¢n + nuevo_estado=_parado; // Y si se ha llegado cambia de estado + END + IF (flags) // Mueve el mu¤eco seg£n donde mire + x+=4; + ELSE + x-=4; + END + // Comprueba si se quieren hacer otras acciones + IF (control(golpear)) // Se quiere golpear + nuevo_estado=_patada_normal; + END + IF (control(saltar)) // Se quiere saltar + nuevo_estado=_saltando; + inc_y=-16; + IF (flags) + inc_x=12; + ELSE + inc_x=-12; + END + END + END + + CASE _retrocediendo: // Mira si se esta retrocediendo + graph=anim2[paso++]; // Anima el gr fico + IF (paso==sizeof(anim2)) // Si se ha llegado al final + nuevo_estado=_parado; // Cambia de estado + END + IF (flags) // Lo mueve seg£n a donde mire + x-=4; + ELSE + x+=4; + END + // Se mira si se quieren hacer otras acciones posibles + IF (control(golpear)) + nuevo_estado=_patada_giratoria; + inc_y=-10; + END + IF (control(saltar)) + nuevo_estado=_saltando; + inc_y=-16; + IF (flags) + inc_x=-8; + ELSE + inc_x=8; + END + END + END + + CASE _agach ndose: // Comprueba si se esta agach ndose + graph=anim3[paso++]; // Haz la animaci¢n + IF (paso==sizeof(anim3)) // Hasta que se llegue al final + nuevo_estado=_agachado; // Y pasa al estado de agachado + END + END + + CASE _agachado: // Comprueba si esta agachado + graph=anim4[0]; // Pone el gr fico necesario + IF (flags) // Pone al gr fico mirando al otro + IF (enemigo.xx) + flags=1; + END + END + // Comprueba si se quiere hacer otras acciones + IF (control(golpear)) // Comprueba si se quiere golpear + nuevo_estado=_golpe_bajo; + END + IF (NOT control(agacharse)) // Si no quiere agacharse + nuevo_estado=_levant ndose; // Se pone levant ndose + END + END + + CASE _levant ndose: // Comprueba si esta levant ndose + graph=anim5[paso++]; // An¡malo + IF (paso==sizeof(anim5)) // Si se acabado + nuevo_estado=_parado; // Cambia de estado a parado + END + END + + CASE _saltando: // Comprueba si se esta saltando + graph=anim6[paso++]; // Anima los gr ficos + IF (paso>4) // Si se ha llegado al punto de la animaci¢n + x+=inc_x; // Mueve al mu¤eco + y+=inc_y*3; + inc_y+=2; // Cambia el incremento para que bote + IF (y>=400) // Comprueba si ha tocado el suelo + y=400; + polvo(x,y); // Crea polvo cuando cae + // Mira si se quiere saltar otra vez + IF (control(saltar)) + nuevo_estado=_parado; + ELSE + nuevo_estado=_agach ndose; + END + END + END + IF (control(golpear)) // Comprueba si se quiere golpear + nuevo_estado=_patada_a‚rea; + nuevo_paso=paso; + END + END + + // Comprueba si se esta se hace el golpe bajo + CASE _golpe_bajo: + graph=anim7[paso++]; // Anima el gr fico + IF (paso==sizeof(anim7)) // Si se acaba la animaci¢n + nuevo_estado=_agachado; // Se pone en otro estado + END + IF (flags) // Comprueba hacia donde mira + x++; // Y se mueve un poco + ELSE + x--; + END + // Si se ha llegado al punto de la animaci¢n correcto + IF (paso==2) + sound(s_aire1,rand(50,75),256); // Realiza sonido + get_real_point(1,&golpe_x,&golpe_y); // Coge los puntos de control del pu¤o + golpe(golpe_x,golpe_y,fuerza_golpe[0]); // Y comprueba si se ha tocado + IF (fuerza_golpe[0]>2) // Reduce la fuerza de golpe + fuerza_golpe[0]--; // para la pr¢xima vez + END + END + END + // Comprueba si se esta haciendo la acci¢n pu¤etazo + CASE _pu¤etazo: + graph=anim8[paso++]; // Anima el gr fico + IF (paso==sizeof(anim8)) // Hasta que se acabe la animaci¢n + nuevo_estado=_parado; // Y cambia a un nuevo estado + END + IF (flags) // Comprueba hacia donde mira + x++; // Y se mueve + ELSE + x--; + END + IF (paso==4) // Si se ha llegado al punto de la animaci¢n + // Realiza el golpe + sound(s_aire2,rand(50,75),256); + get_real_point(1,&golpe_x,&golpe_y); // Halla el punto donde se dara el golpe + golpe(golpe_x,golpe_y,fuerza_golpe[1]); // Comprueba si se da el golpe + IF (fuerza_golpe[1]>2) // Quita fuerza al golpe + fuerza_golpe[1]--; + END + END + END + + CASE _patada_giratoria: // Comprueba la patada giratoria como los anteriores golpes + graph=anim9[paso++]; + IF (paso==sizeof(anim9)) + nuevo_estado=_parado; + END + y+=inc_y; inc_y+=2; + IF (y>400) + y=400; + END + IF (paso==5) + sound(s_aire3,rand(50,75),256); + get_real_point(1,&golpe_x,&golpe_y); + golpe(golpe_x,golpe_y,fuerza_golpe[2]); + IF (fuerza_golpe[2]>2) + fuerza_golpe[2]--; + END + END + END + + CASE _patada_normal: // Comprueba la patada normal + graph=anim10[paso++]; + IF (paso==sizeof(anim10)) + nuevo_estado=_parado; + END + IF (paso==4) + sound(s_aire4,rand(50,75),256); + get_real_point(1,&golpe_x,&golpe_y); + golpe(golpe_x,golpe_y,fuerza_golpe[3]); + IF (fuerza_golpe[3]>2) + fuerza_golpe[3]--; + END + END + END + + CASE _patada_a‚rea: // Comprueba la patada a‚rea + graph=anim11[paso++]; + IF (paso>4) + x+=inc_x; + y+=inc_y*3; + inc_y+=2; + IF (y>=400) + y=400; + polvo(x,y); + IF (control(saltar)) + nuevo_estado=_parado; + ELSE + nuevo_estado=_agach ndose; + END + END + END + IF (paso==10 OR paso==19) + sound(s_aire5,rand(50,75),256); + get_real_point(1,&golpe_x,&golpe_y); + golpe(golpe_x,golpe_y,fuerza_golpe[4]); + IF (fuerza_golpe[4]>2) + fuerza_golpe[4]--; + END + END + END + + CASE _tocado: // Comprueba si el mu¤eco ha sido tocado + graph=anim12[paso++]; // anima el gr fico + IF (paso==sizeof(anim12)) // Hasta que acabe + // Haz un sonido al azar de los que tiene + SWITCH(rand(0,3)) + CASE 0: + sound(s_golpe1,rand(25,50),256); + END + CASE 1: + sound(s_golpe2,rand(25,50),256); + END + CASE 2: + sound(s_golpe3,rand(25,50),256); + END + END + nuevo_estado=_parado; // Cambia de estado + y=400; // Cae al suelo + END + x+=inc_x; // Y mueve el mu¤eco un poco + // Si se movia el mu¤eco, lo frena + IF (inc_x<0) // Si se movia a la izquierda + inc_x++; // Se frena + END + IF (inc_x>0) // Si se movia a la derecha + inc_x--; // Se frena + END + IF (y<400) // Si estaba saltando + y+=8; // Hace que baje + END + IF (y>=400) // Si estaba por debajo del limite inferior + y=400; // Lo coloca + END + END + + CASE _muerto: // Comprueba si el mu¤eco ha muerto + IF (paso==0) + sound(s_muerto,25,256); // Hace el sonido de cuando muere + END + graph=anim13[paso++]; // Anima el gr fico hacia con una secuencia + IF (paso==sizeof(anim13)) // Y la deja parada + paso--; + END + x+=inc_x; // Mueve las coordenadas hasta cuadrarlas + // Como el caso anterior (tocado) frena el mu¤eco + IF (inc_x<0) + inc_x++; + END + IF (inc_x>0) + inc_x--; + END + IF (y<400) + y+=8; + END + IF (y>=400) + y=400; + END + END + + END + + IF (estado<>nuevo_estado) // Actualiza el estado del mu¤eco + estado=nuevo_estado; + paso=nuevo_paso; // Y el paso dentro de la animaci¢n + nuevo_paso=0; + END + + IF (x<40) // Comprueba que no se ha salido de pantalla + x=60; // Y coloca el gr fico si ha salido + END + IF (x>600) + x=600; + END + + FRAME; + END +END + +//------------------------------------------------------------------------------ +// Proceso sombra +// Maneja la sombra de los mu¤ecos +//------------------------------------------------------------------------------ + +PROCESS sombra() + +BEGIN +// ctype=c_scroll; // Lo pone dentro del scroll + graph=1; // Elige el gr fico + priority=-1; // Le da prioridad baja para que se ejecute despu‚s + z=1; // Lo pone por debajo del gr fico del mu¤eco + y=400; // Inicializa la coordenada vertical + flags=4; // Y hace que sea transparente + LOOP + x=father.x; // Hace que siga al mu¤eco + FRAME; + END +END + +//------------------------------------------------------------------------------ +// Proceso Polvo +// Pone una nube de polvo cuando el mu¤eco cae del salto +// Entradas: Coordenadas donde ira el gr fico +//------------------------------------------------------------------------------ + +PROCESS polvo(x,y) + +BEGIN + FRAME; +// ctype=c_scroll; // Lo pone dentro del scroll + flags=4; // Lo hace transparente + z=-1; // Lo pone por delante del mu¤eco + FROM graph=2 TO 12;// Anima el gr fico + FRAME; + END // Acaba, eliminando este proceso +END + +//------------------------------------------------------------------------------ +// Proceso golpe +// Maneja los golpes que lanzan los mu¤ecos +// Entradas: Coordenadas de donde se da realmente el golpe +// 'da¤o' Energ¡a que quita al enemigo +//------------------------------------------------------------------------------ + +PROCESS golpe(x,y,da¤o) + +PRIVATE + id_mu¤ecos; // Identificador a los mu¤ecos + contador0; // Contador de uso general + +BEGIN +// ctype=c_scroll; // Introduce al proceso dentro del scroll + z=-1; // Lo pone por delante de los mu¤ecos + graph=100; // Elige el gr fico de una bola para abarcar mas + // Comprueba si esta tocando a un mu¤eco + id_mu¤ecos=collision(type mu¤eco); + IF (id_mu¤ecos==father) // Y que no sea ‚l mismo que llamo a este proceso + id_mu¤ecos=collision(type mu¤eco); // Si es el mismo intenta coger el otro identificador + END + + IF (id_mu¤ecos) // Si ha tocado + // Hace un sonido al azar de los disponibles + SWITCH (rand(0,2)) + CASE 0: + sound(s_tocado1,rand(25,75),256); + END + CASE 1: + sound(s_tocado2,rand(25,75),256); + END + CASE 2: + sound(s_tocado3,rand(25,75),256); + END + END + id_mu¤ecos.paso=0; // Actualiza la animaci¢n del que ha sido tocado + id_mu¤ecos.energia-=da¤o/2; // Le quita energ¡a + IF (id_mu¤ecos.energia<=0) // Si no le queda energ¡a + id_mu¤ecos.energia=0; // Es que esta muerto + id_mu¤ecos.estado=_muerto; + estado_juego=2; + ELSE + id_mu¤ecos.estado=_tocado; // Si no, esta simplemente tocado + END + IF (id_mu¤ecos.flags) // Mueve el gr fico un poco para atr s + id_mu¤ecos.inc_x=-8; + ELSE + id_mu¤ecos.inc_x=8; + END + SWITCH(sangre) // Crea la sangre + // Dependiendo del nivel elegido en las opciones + CASE 0: // Golpe sin sangre + golpe_sin_sangre(x,y); + END + CASE 1: // Golpe con sangre + contador0=da¤o/3+1; + WHILE (contador0>0) + particula_sangre(x,y,id_mu¤ecos.inc_x+rand(-2,2),rand(-4,0),rand(10,20)); + contador0--; + END + END + CASE 2: // Golpe con mucha sangre + contador0=da¤o+2; + WHILE (contador0>0) + particula_sangre(x,y,id_mu¤ecos.inc_x*2+rand(-4,4),rand(-8,2),rand(15,30)); + contador0--; + END + END + END + END +END + +//------------------------------------------------------------------------------ +// Proceso particula_sangre +// Maneja la sangre que sale cuando se da un golpe +// Entradas: 'x,y' : Coordenadas desde donde sale la sangre +// 'inc_x,inc_y': Incrementos en el movimiento de la sangre (ca¡da) +// 'cont_tiempo': Contador del tiempo que aparecer  la sangre +//------------------------------------------------------------------------------ + +PROCESS particula_sangre(x,y,inc_x,inc_y,cont_tiempo) + +BEGIN +// ctype=c_scroll; // Lo pone dentro del scroll + // Si esta en el modo de mayor sanguinolencia, espera un poco para que no salga toda junta + IF (sangre==2) + FRAME(rand(0,400)); // Espera un tiempo al azar + END + graph=rand(50,53); // Elige uno de los gr ficos disponibles al azar + flags=4; // La hace transparente + z=-2; // Lo pone por encima de todo + WHILE (cont_tiempo>0) // Mueve la sangre mientras hjaya tiempo + x+=inc_x; // Realiza los incrementos en las coordenadas + y+=inc_y; + inc_y++; // Hace que cada vez caiga m s rapido + IF (inc_x>0) // Pero a horizontalmente se mueva m s lento + inc_x--; + END + IF (inc_x<0) + inc_x++; + END + IF (y>410) // Comprueba si ha tocado el suelo + // Deja sangre pegada al suelo de forma aleatoria + IF (rand(0,80)==0 AND sangre_total<50 AND y<480) + z=256; // La pone detr s + sangre_total++; // Incrementa el contador de sangre + LOOP + FRAME; // La deja en un bucle para que quede en pantalla + END + END + END + cont_tiempo--; // Incrementa el contador de tiempo + FRAME; + END +END + +//------------------------------------------------------------------------------ +// Proceso golpe_sin_sangre +// Pone un gr fico alternativo al de la sangre para los modos sin ella +//------------------------------------------------------------------------------ + +PROCESS golpe_sin_sangre(x,y) + +BEGIN +// ctype=c_scroll; // Lo pone dentro del scroll + z=-2; // Por delante de otros gr ficos + FROM graph=60 TO 66; + FRAME; // Anima el gr fico + END +END + +//------------------------------------------------------------------------------ +// Proceso objetos +// Pone los gr ficos est ticos del marcador y la pantalla de opciones +// Entradas: fichero gr fico, coordenadas, gr fico, bandera (der/izq.), +// zona de la pantalla +//------------------------------------------------------------------------------ + +PROCESS objetos(file,x,y,graph,flags,region) + +BEGIN + z=10; // Lo pone por debajo de otros gr ficos + LOOP + FRAME; + END +END + +//------------------------------------------------------------------------------ +// Proceso crea_estrellas +// Maneja las estrellas que indican los combates ganados +//------------------------------------------------------------------------------ + +PROCESS crea_estrellas() + +BEGIN + // Elimina cualquier estrella que hubiera antes + signal(type estrella,s_kill); + + // Pon las estrellas del jugador 1 + SWITCH(combates1) + // Dependiendo de los combates ganados pone unas estrellas u otras + CASE 0: + estrella(111,84,203); + estrella(143,84,203); + END + CASE 1: + estrella(111,84,204); + estrella(143,84,203); + END + CASE 2: + estrella(111,84,204); + estrella(143,84,204); + END + END + + // Pon las estrellas del jugador 2 + SWITCH(combates2) + CASE 0: + estrella(530,84,203); + estrella(498,84,203); + END + CASE 1: + estrella(530,84,204); + estrella(498,84,203); + END + CASE 2: + estrella(530,84,204); + estrella(498,84,204); + END + END + +END + +//------------------------------------------------------------------------------ +// Proceso estrella +// Imprime los gr ficos de la estrellas +// Entradas: Coordenadas y tipo de gr fico de la estrella +//------------------------------------------------------------------------------ + +PROCESS estrella(x,y,graph) + +BEGIN + LOOP + FRAME; // Lo imprime + END +END + +//------------------------------------------------------------------------------ +// Proceso cr‚ditos +// Pone la pantalla de cr‚ditos +//------------------------------------------------------------------------------ + +PROCESS cr‚ditos() + +PRIVATE + codigo_mapa; // Identificador al fichero de gr ficos + // Textos de los cr‚ditos + textos[]= + "PROGRAMMING","DANIEL NAVARRO","", + "GRAPHICS","JOSE FERNANDEZ","RAFAEL BARRASO","", + "SOUNDS","ANTONIO MARCHAL","", + "PLAYABILITY","LUIS F. FERNANDEZ","", + "THIS VERSION (3D)","ANTONIO MARCHAL"; + +BEGIN + // Carga la pantalla de fondo + codigo_mapa=load_map("fost3D\creditos.map"); + load_pal("fost3D\creditos.map"); + // Y el tipo de letras + load_fnt("fost3D\creditos.fnt"); + put_screen(0,codigo_mapa); // Pone el fondo + FROM y=0 TO 14; // Y escribe los textos + write(3,320,40+y*20,4,textos[y]); + END + fade_on(); // Enciende la pantalla + scan_code=0; + REPEAT // Espera hasta que se pulse una tecla + FRAME; + UNTIL (scan_code<>0) +END + +//------------------------------------------------------------------------------ +// Proceso intro +// Realiza la intro del juego +//------------------------------------------------------------------------------ + +PROCESS intro(); + +PRIVATE + contador0; // Contador de uso general + codigo_mapa; // Identificador para descargar los graficos + s_intro; // Identificador del sonido de la intro +BEGIN + // Para el proceso general para poner este + signal(father,s_sleep); + // Hace que la pantalla cambie rapido + set_fps(100,0); + load_pal("fost3D\intro.map"); // Carga la paleta de colores + codigo_mapa=load_map("fost3D\intro.map"); // Carga la pantalla + s_intro=load_pcm("fost3D\introhit.pcm",0); // Carga el sonido + + fade(200,200,200,8); // Pone la pantalla en blanco + WHILE (fading) FRAME; END // Espera hasta que se encienda la pantalla + sound(s_intro,100,256); // Hace el sonido + put_screen(0,codigo_mapa); // Pone el fondo de pantalla + unload_map(codigo_mapa); // Descarga el grafico + fade_on(); // Hace que se vea la pantalla (la enciende) + WHILE (fading) FRAME; END // Espera hasta que se encienda la pantalla + + // Carga sonidos + s_golpe1=load_pcm("fost3D\uah00.pcm",0); + s_golpe2=load_pcm("fost3D\whimper2.pcm",0); + s_golpe3=load_pcm("fost3D\whimper3.pcm",0); + s_tocado1=load_pcm("fost3D\hit00.pcm",0); + s_tocado2=load_pcm("fost3D\hit01.pcm",0); + s_tocado3=load_pcm("fost3D\hit02.pcm",0); + s_aire1=load_pcm("fost3D\turn06.pcm",0); + s_aire2=load_pcm("fost3D\turn07.pcm",0); + s_aire3=load_pcm("fost3D\turn08.pcm",0); + s_aire4=load_pcm("fost3D\turn05.pcm",0); + s_aire5=load_pcm("fost3D\turn09.pcm",0); + s_muerto=load_pcm("fost3D\aaah01.pcm",0); + + // Carga los graficos y las letras + load_fpg("fost3D\juego.fpg"); + load_fnt("fost3D\enjuego.fnt"); + load_fnt("fost3D\enjuego2.fnt"); + + // Espera a que se pulse una tecla o pase un tiempo + WHILE (NOT key(_esc) AND NOT key (_space) AND contador0<200) + FRAME; + contador0++; + END + // Devuelve el control al proceso principal + signal(father,s_wakeup); +END +PROCESS camara_modo8(); +BEGIN + start_mode8(id,0,0); + ctype=c_m8; + m8.height=64; // Altura de los ojos + m8.angle=0; // Mirar hacia arriba/abajo + + SWITCH (escenario) + CASE 0: + angle=90000; + x=6700; + y=8300; + END + CASE 1: + angle=90000; + x=7000; + y=6000; + END + CASE 2: + angle=180000; + x=3000; + y=7800; + END + + END + z=1100; + + LOOP + FRAME; + END +END diff --git a/examples/games/noid/noid.prg b/examples/games/noid/noid.prg old mode 100644 new mode 100755 index 16a5482..0c4a3f3 --- a/examples/games/noid/noid.prg +++ b/examples/games/noid/noid.prg @@ -1,818 +1,818 @@ -compiler_options _extended_conditions; - - -//------------------------------------------------------------------------------ -//TITLE: NOID -//AUTHOR: DANIEL NAVARRO -//DATE: DIV GAMES STUDIO (c) 2000 -//------------------------------------------------------------------------------ - -PROGRAM noid; - -CONST - speed_r=8; - -GLOBAL - small_r[2]; - - s_hit; - s_bonus; - s_fire; - s_metal; - s_bat; - - map[16*14]; - lives; - nballs; - nbricks; - direction; - bounce; - - fin_play; - phase; - score; - demo; - id_ball; - id_text; - - - phases[]= - "dat\noid\screen.1", - "dat\noid\screen.2", - "dat\noid\screen.3", - "dat\noid\screen.4", - "dat\noid\screen.5", - "dat\noid\screen.6", - "dat\noid\screen.7", - "dat\noid\screen.8", - "dat\noid\screen.9", - "dat\noid\screen.10", - "dat\noid\screen.11", - "dat\noid\screen.12"; - -LOCAL - state=0; - - size_bat=4; - unused=0; - speed=0; - -BEGIN - set_fps(30,0); - load_fpg("noid\noid.fpg"); - load_fpg("noid\noid2.fpg"); - - s_hit=load_pcm("noid\caida7.pcm",0); - s_bonus=load_pcm("noid\fx34.pcm",0); - s_fire=load_pcm("noid\disparo5.pcm",0); - s_metal=load_pcm("noid\metal10.pcm",0); - s_bat=load_pcm("noid\tubo.pcm",0); - - load_fnt("noid\noid.fnt"); - - LOOP - scan_code=0; - WHILE (scan_code<>0) - FRAME; - END - - delete_text(all_text); - let_me_alone(); - put_screen(1,1); - load_pal("noid\noid2.fpg"); - fade_on(); - - REPEAT - FRAME; - UNTIL (scan_code<>0) - fade_off(); - load_pal("noid\noid.fpg"); - fin_play=0; - demo=1; - text_demo(); - - write_int(1,310,180,2,&score); - - - fin_play=0; - phase=1; - score=0; - lives=3; - - small_r[0]=small_bat(296,16+11*0); - small_r[1]=small_bat(296,16+11*1); - small_r[2]=small_bat(296,16+11*2); - scan_code=0; - REPEAT - fade_on(); - clear_screen(); - put(0,100+phase%4,0,0); - put(0,900,319,0); - nballs=0; - direction=1; - bounce=1; - id_ball=ball(bat()); - - - load(phases[phase],&map); - nbricks=0; - FROM y=0 TO 13; - FROM x=0 TO 15; - IF (map[y*16+x]<>0) - brick(16+x*16,12+y*8,map[y*16+x]); - - IF ((map[y*16+x]<20) OR (map[y*16+x]>=30)) - nbricks++; - END - END - END - END - write_int(1,310,180,2,&score); - LOOP - IF (key (_esc)) - IF (demo) - credits(); - FRAME; - ELSE - let_me_alone(); - score=0; - demo=1; - fin_play=1; - text_demo(); - END - END - FRAME; - - IF (((nbricks<=0) OR (fin_play)) AND (NOT (get_id(type bonus))) AND (NOT (get_id(type reduce)))) - BREAK; - END - END - - - signal(TYPE ball,s_kill); - signal(TYPE bat,s_kill); - signal(TYPE bonus,s_kill); - signal(TYPE laser,s_kill); - signal(TYPE caido,s_kill); - signal(TYPE reduce,s_kill); - signal(TYPE brick,s_kill); - - phase++; - fade_off(); - UNTIL ((phase>11) OR (fin_play)) - - fin_play=0; - fade_off(); - - delete_text(all_text); - clear_screen(); - signal(type small_bat,s_kill); - END - signal(id,s_kill_tree); -END - -PROCESS bat(); - -PRIVATE - incr_x=0; - incr_y=0; - fire_preunused=1; - id2; - id3; - -BEGIN - graph=3; - x=140; - y=188; - - WHILE(NOT id_ball) FRAME; END - LOOP - - IF (NOT demo) - - IF (direction==1) - - IF (key(_left) AND incr_x>-speed_r) - incr_x-=4; - ELSE - IF (key(_right) AND incr_x0) - incr_x-=2; - END - IF (incr_x<0) - incr_x+=2; - END - END - END - END - IF (direction==-1) - - IF (key(_right) AND incr_x>-speed_r) - incr_x-=4; - ELSE - IF (key(_left) AND incr_x0) - incr_x-=2; - END - IF (incr_x<0) - incr_x+=2; - END - END - END - END - - ELSE - IF ((x>7) AND (x<310)) x=id_ball.x; END - IF (scan_code<>0) - delete_text(all_text); - signal(type text_demo,s_kill); - demo=0; - nbricks=0; - phase=-1; - lives=3; - score=0; - write_int(1,310,180,2,&score); - END - IF (score>200) - nbricks=0; - phase=rand(-1,10); - score=0; - END - END - - - IF ( (key(_space) OR key (_control) OR (demo AND rand(0,10)==0)) AND graph==6) - IF (fire_preunused==1) - laser(x-16,y-8); - laser(x+16,y-8); - IF (NOT demo) fire_preunused=0; END - END - ELSE - fire_preunused=1; - END - - - IF (id2=collision(TYPE bonus)) - IF (id2.size==100) - sound(s_bonus,80,256); - score+=50; - SWITCH (id2.graph); - CASE 200: - IF (size_bat<8) - size_bat+=4; - END - IF (size_bat==4) - graph=3; - ELSE - graph=4; - END - - WHILE (id3=get_id(TYPE ball)) - id3.unused=0; - END - END - CASE 201: - size_bat=4; - graph=5; - END - CASE 202: - size_bat=4; - graph=6; - WHILE (id3=get_id(TYPE ball)) - id3.unused=0; - END - END - CASE 203: - IF (lives<3) - lives++; - small_r[lives-1]=small_bat(296,16+11*(lives-1)); - END; - END - CASE 204: - direction=direction*-1; - END - CASE 205: - IF (size_bat>0) - size_bat-=4; - END - IF (size_bat==0) - graph=2; - ELSE - graph=3; - END - WHILE (id3=get_id(TYPE ball)) - id3.unused=0; - END - END - CASE 206: - - WHILE (id3=get_id(TYPE ball)) - IF (id3.speed>800) - id3.speed-=400; - ELSE - id3.speed=400; - END - END - END - CASE 207: - bounce=bounce XOR 1; - WHILE (id3=get_id(TYPE ball)) - id3.graph=1+(1-bounce)*8; - END - END - CASE 208: - FRAME(0); - - WHILE (id3=get_id(TYPE brick)) - IF ((id3.graph>=20) AND (id3.graph<30)) - brick(id3.x,id3.y,14); - signal(id3,s_kill); - id3.graph=14; - nbricks++; - END - END - END - - CASE 209: - get_id(TYPE ball).state=1; - END - - END - END - id2.state=1; - END - - IF (NOT demo) x+=incr_x; END - - - IF (x<23+size_bat) - x=23+size_bat; - incr_x=0; - END - IF (x>248-size_bat) - x=248-size_bat; - incr_x=0; - END - FRAME; - END -END - - - - - - -PROCESS ball(id_bat); - -PRIVATE - incr_x; - incr_y; - x_resol; - y_resol; - completed_x_resol; - completed_y_resol; -  angle0; - aspeed; - dist_bat; - pos_ball_bat; - id_brick; - -BEGIN - z=-3; - graph=1+(1-bounce)*8; - speed=400; -  angle0=3*pi/8; - - LOOP - - IF (NOT unused) - nballs++; - unused=1; - pos_ball_bat=0; - ELSE - pos_ball_bat=x-id_bat.x; - END - - WHILE (unused) - - x=id_bat.x+pos_ball_bat; - y=id_bat.y-8; - - IF (key(_space) OR key (_control) OR demo) - unused=0; - x_resol=x*100; - y_resol=y*100; - END - FRAME; - END - - REPEAT - - IF (state==1) - nballs+=2; - CLONE -  angle0+=pi/32; - CLONE -  angle0+=pi/32; - END - END - state=0; - END - - aspeed+=speed; - - WHILE (aspeed>100) - - aspeed-=100; - - completed_x_resol=x_resol; - completed_y_resol=y_resol; - - incr_x=get_distx( angle0,100); - x_resol+=incr_x; - incr_y=get_disty( angle0,100); - y_resol+=incr_y; - - - dist_bat=x-id_bat.x; - - - IF (y_resol>=18000 AND y_resol<=18800 AND incr_y>0 AND (dist_bat>-18-id_bat.size_bat AND dist_bat<18+id_bat.size_bat)) - -  angle0=fget_angle(0,0,incr_x,-incr_y)-(dist_bat*pi/60); - - - IF ( angle0pi*7/8) -  angle0=pi*7/8; - END - - IF (id_bat.graph==5) - unused=1; - BREAK; - END - - sound(s_bat,100,256); - END - - - IF (y_resol<=1200 AND incr_y<0) -  angle0=fget_angle(0,0,incr_x,-incr_y); - sound(s_bat,80,500); - END - - - IF ((x_resol<=1200 AND incr_x<0) OR (x_resol>=26000 AND incr_x>0)) -  angle0=fget_angle(0,0,-incr_x,incr_y); - sound(s_bat,80,600); - END - - - x=x_resol/100; - y=y_resol/100; - - - IF (id_brick=collision(TYPE brick)) - score+=5; - speed+=4; - FRAME(0); - y=completed_y_resol/100; - - - IF (id_brick==collision(TYPE brick)) - IF (bounce OR (id_brick.graph>=20 AND id_brick.graph<30)) - sound(s_metal,100,256); - -  angle0=fget_angle(0,0,-incr_x,incr_y)+rand(-4000,4000); - IF (( angle0-pi/8)) -  angle0=fget_angle(0,0,-incr_x,incr_y); - END - IF (( angle0>pi*7/8) AND ( angle0=20 AND id_brick.graph<30)) - sound(s_metal,100,256); - - -  angle0=fget_angle(0,0,incr_x,-incr_y)+rand(-4000,4000); - IF (( angle0-pi/8)) -  angle0=fget_angle(0,0,incr_x,-incr_y); - END - IF (( angle0>pi*7/8) AND ( angle0=20 AND id_brick.graph<30) - id_brick.state=1; - ELSE - - IF (id_brick.graph>=30 AND id_brick.graph<33) - id_brick.graph++; - IF (id_brick.graph==33) - signal(id_brick,s_kill); - nbricks--; - END - ELSE// Aqui se comprueban bricks normales - - IF (rand(0,100)<20) - bonus(id_brick.x,id_brick.y,rand(202,209)); - END - - caido(id_brick.x,id_brick.y,id_brick.graph); - - signal(id_brick,s_kill); - nbricks--; - - END - END - - END - - FRAME(0); - END - x=x_resol/100; - y=y_resol/100; - FRAME; - UNTIL (y>200 OR unused) - - IF (NOT unused) - - speed=400; -  angle0=3*pi/8; - nballs--; - IF (nballs>0) - BREAK; - ELSE - fade_off(); - fade_on(); - direction=1; - bounce=1; - graph=1; - id_bat.graph=3; - IF(lives>0) - signal(small_r[lives-1],s_kill); - END - signal(type bonus,s_kill); - IF (NOT demo) - lives--; - IF (lives<0) - fin_play=1; - BREAK; - END - END - END - END - - END -END - - - - - - -PROCESS brick(x,y,graph); - -PRIVATE - incr_x=1; - -BEGIN - z=-1; - SWITCH (graph); - CASE 15: - LOOP - - IF (x==16) incr_x=1; END - IF (x==256) incr_x=-1; END - x+=incr_x; - - IF (collision(type brick)) - incr_x=-incr_x; - x+=incr_x; - END - FRAME; - END - END - CASE 20: - LOOP - IF (state>0) - SWITCH (state++); - CASE 1: - graph=21; - END - CASE 2: - graph=22; - END - CASE 3: - graph=21; - END - CASE 4: - graph=20; - state=0; - END - END - END - FRAME; - END - END - DEFAULT: - LOOP - FRAME; - END - END - END -END - - - - - - -PROCESS bonus(x,y,graph); - -BEGIN - z=-2; - - WHILE (NOT out_region(id,0) AND state==0) - y+=2; - FRAME; - END - - WHILE (NOT out_region(id,0) AND size>0) - size-=10; - y+=1; - FRAME; - END -END - - - - - - -PROCESS laser(x,y); - -PRIVATE - id_brick; - -BEGIN - graph=8; - sound(s_fire,80,400); - WHILE (y>8) - - IF (id_brick=collision(TYPE brick)) - signal(id,s_kill); - - - IF (id_brick.graph>=20 AND id_brick.graph<30) - - id_brick.state=1; - ELSE - - - IF (id_brick.graph>=30 AND id_brick.graph<40) - - id_brick.graph++; - - IF (id_brick.graph==33) - - nbricks--; - - reduce(id_brick.x,id_brick.y,id_brick.graph); - signal(id_brick,s_kill); - END - ELSE - - IF (rand(0,100)<20) - bonus(id_brick.x,id_brick.y,rand(200,209)); - END - - reduce(id_brick.x,id_brick.y,id_brick.graph); - signal(id_brick,s_kill); - nbricks--; - END - END - END - y-=8; - FRAME; - END -END - - - - - - -PROCESS caido (x,y,graph) - -PRIVATE - iangle; - -BEGIN - - sound(s_hit,200,256); - - iangle=rand(-pi/8,pi/8); - - REPEAT - FRAME; - y+=5; - angle+=iangle; - UNTIL (out_region(id,0)) - -END - - - - - - -PROCESS reduce(x,y,graph) - -BEGIN - REPEAT - FRAME; - size-=6; - UNTIL (size<0) -END - - - - - - -PROCESS small_bat(x,y) - -BEGIN - graph=7; - LOOP - FRAME; - END -END - - - - - - -PROCESS text_demo() - -BEGIN - LOOP - - id_text=write(1,90,100,0,"PRESS A KEY TO PLAY"); - FRAME (2000); - delete_text(id_text); - FRAME (2000); - END -END - - - - - -PROCESS credits() - -PRIVATE - font; - -BEGIN - fade_off(); - delete_text(all_text); - let_me_alone(); - put_screen(1,2); - load_pal("noid\noid2.fpg"); - - font=load_fnt("noid\noid2.fnt"); - - - write(font,160,30,4,"- CREDITS -"); - write(font,160,60,4,"CODER: LUIS SUREDA"); - write(font,160,80,4,"GRAPHICS: JOSE FERNANDEZ"); - write(font,160,100,4,"SOUNDS: CARLOS ILLANA"); - write(font,160,120,4,"COPYRIGHT 1997"); - write(font,160,140,4,"DIV GAMES STUDIO"); - fade_on(); - - - WHILE (scan_code==0) - FRAME; - END - fade_off(); - exit("Thanks for Playing!",0); -END +compiler_options _extended_conditions; + + +//------------------------------------------------------------------------------ +//TITLE: NOID +//AUTHOR: DANIEL NAVARRO +//DATE: DIV GAMES STUDIO (c) 2000 +//------------------------------------------------------------------------------ + +PROGRAM noid; + +CONST + speed_r=8; + +GLOBAL + small_r[2]; + + s_hit; + s_bonus; + s_fire; + s_metal; + s_bat; + + map[16*14]; + lives; + nballs; + nbricks; + direction; + bounce; + + fin_play; + phase; + score; + demo; + id_ball; + id_text; + + + phases[]= + "dat\screen.1", + "dat\screen.2", + "dat\screen.3", + "dat\screen.4", + "dat\screen.5", + "dat\screen.6", + "dat\screen.7", + "dat\screen.8", + "dat\screen.9", + "dat\screen.10", + "dat\screen.11", + "dat\screen.12"; + +LOCAL + state=0; + + size_bat=4; + unused=0; + speed=0; + +BEGIN + set_fps(30,0); + load_fpg("noid\noid.fpg"); + load_fpg("noid\noid2.fpg"); + + s_hit=load_pcm("noid\caida7.pcm",0); + s_bonus=load_pcm("noid\fx34.pcm",0); + s_fire=load_pcm("noid\disparo5.pcm",0); + s_metal=load_pcm("noid\metal10.pcm",0); + s_bat=load_pcm("noid\tubo.pcm",0); + + load_fnt("noid\noid.fnt"); + + LOOP + scan_code=0; + WHILE (scan_code<>0) + FRAME; + END + + delete_text(all_text); + let_me_alone(); + put_screen(1,1); + load_pal("noid\noid2.fpg"); + fade_on(); + + REPEAT + FRAME; + UNTIL (scan_code<>0) + fade_off(); + load_pal("noid\noid.fpg"); + fin_play=0; + demo=1; + text_demo(); + + write_int(1,310,180,2,&score); + + + fin_play=0; + phase=1; + score=0; + lives=3; + + small_r[0]=small_bat(296,16+11*0); + small_r[1]=small_bat(296,16+11*1); + small_r[2]=small_bat(296,16+11*2); + scan_code=0; + REPEAT + fade_on(); + clear_screen(); + put(0,100+phase%4,0,0); + put(0,900,319,0); + nballs=0; + direction=1; + bounce=1; + id_ball=ball(bat()); + + + load(phases[phase],&map); + nbricks=0; + FROM y=0 TO 13; + FROM x=0 TO 15; + IF (map[y*16+x]<>0) + brick(16+x*16,12+y*8,map[y*16+x]); + + IF ((map[y*16+x]<20) OR (map[y*16+x]>=30)) + nbricks++; + END + END + END + END + write_int(1,310,180,2,&score); + LOOP + IF (key (_esc)) + IF (demo) + credits(); + FRAME; + ELSE + let_me_alone(); + score=0; + demo=1; + fin_play=1; + text_demo(); + END + END + FRAME; + + IF (((nbricks<=0) OR (fin_play)) AND (NOT (get_id(type bonus))) AND (NOT (get_id(type reduce)))) + BREAK; + END + END + + + signal(TYPE ball,s_kill); + signal(TYPE bat,s_kill); + signal(TYPE bonus,s_kill); + signal(TYPE laser,s_kill); + signal(TYPE caido,s_kill); + signal(TYPE reduce,s_kill); + signal(TYPE brick,s_kill); + + phase++; + fade_off(); + UNTIL ((phase>11) OR (fin_play)) + + fin_play=0; + fade_off(); + + delete_text(all_text); + clear_screen(); + signal(type small_bat,s_kill); + END + signal(id,s_kill_tree); +END + +PROCESS bat(); + +PRIVATE + incr_x=0; + incr_y=0; + fire_preunused=1; + id2; + id3; + +BEGIN + graph=3; + x=140; + y=188; + + WHILE(NOT id_ball) FRAME; END + LOOP + + IF (NOT demo) + + IF (direction==1) + + IF (key(_left) AND incr_x>-speed_r) + incr_x-=4; + ELSE + IF (key(_right) AND incr_x0) + incr_x-=2; + END + IF (incr_x<0) + incr_x+=2; + END + END + END + END + IF (direction==-1) + + IF (key(_right) AND incr_x>-speed_r) + incr_x-=4; + ELSE + IF (key(_left) AND incr_x0) + incr_x-=2; + END + IF (incr_x<0) + incr_x+=2; + END + END + END + END + + ELSE + IF ((x>7) AND (x<310)) x=id_ball.x; END + IF (scan_code<>0) + delete_text(all_text); + signal(type text_demo,s_kill); + demo=0; + nbricks=0; + phase=-1; + lives=3; + score=0; + write_int(1,310,180,2,&score); + END + IF (score>200) + nbricks=0; + phase=rand(-1,10); + score=0; + END + END + + + IF ( (key(_space) OR key (_control) OR (demo AND rand(0,10)==0)) AND graph==6) + IF (fire_preunused==1) + laser(x-16,y-8); + laser(x+16,y-8); + IF (NOT demo) fire_preunused=0; END + END + ELSE + fire_preunused=1; + END + + + IF (id2=collision(TYPE bonus)) + IF (id2.size==100) + sound(s_bonus,80,256); + score+=50; + SWITCH (id2.graph); + CASE 200: + IF (size_bat<8) + size_bat+=4; + END + IF (size_bat==4) + graph=3; + ELSE + graph=4; + END + + WHILE (id3=get_id(TYPE ball)) + id3.unused=0; + END + END + CASE 201: + size_bat=4; + graph=5; + END + CASE 202: + size_bat=4; + graph=6; + WHILE (id3=get_id(TYPE ball)) + id3.unused=0; + END + END + CASE 203: + IF (lives<3) + lives++; + small_r[lives-1]=small_bat(296,16+11*(lives-1)); + END; + END + CASE 204: + direction=direction*-1; + END + CASE 205: + IF (size_bat>0) + size_bat-=4; + END + IF (size_bat==0) + graph=2; + ELSE + graph=3; + END + WHILE (id3=get_id(TYPE ball)) + id3.unused=0; + END + END + CASE 206: + + WHILE (id3=get_id(TYPE ball)) + IF (id3.speed>800) + id3.speed-=400; + ELSE + id3.speed=400; + END + END + END + CASE 207: + bounce=bounce XOR 1; + WHILE (id3=get_id(TYPE ball)) + id3.graph=1+(1-bounce)*8; + END + END + CASE 208: + FRAME(0); + + WHILE (id3=get_id(TYPE brick)) + IF ((id3.graph>=20) AND (id3.graph<30)) + brick(id3.x,id3.y,14); + signal(id3,s_kill); + id3.graph=14; + nbricks++; + END + END + END + + CASE 209: + get_id(TYPE ball).state=1; + END + + END + END + id2.state=1; + END + + IF (NOT demo) x+=incr_x; END + + + IF (x<23+size_bat) + x=23+size_bat; + incr_x=0; + END + IF (x>248-size_bat) + x=248-size_bat; + incr_x=0; + END + FRAME; + END +END + + + + + + +PROCESS ball(id_bat); + +PRIVATE + incr_x; + incr_y; + x_resol; + y_resol; + completed_x_resol; + completed_y_resol; +  angle0; + aspeed; + dist_bat; + pos_ball_bat; + id_brick; + +BEGIN + z=-3; + graph=1+(1-bounce)*8; + speed=400; +  angle0=3*pi/8; + + LOOP + + IF (NOT unused) + nballs++; + unused=1; + pos_ball_bat=0; + ELSE + pos_ball_bat=x-id_bat.x; + END + + WHILE (unused) + + x=id_bat.x+pos_ball_bat; + y=id_bat.y-8; + + IF (key(_space) OR key (_control) OR demo) + unused=0; + x_resol=x*100; + y_resol=y*100; + END + FRAME; + END + + REPEAT + + IF (state==1) + nballs+=2; + CLONE +  angle0+=pi/32; + CLONE +  angle0+=pi/32; + END + END + state=0; + END + + aspeed+=speed; + + WHILE (aspeed>100) + + aspeed-=100; + + completed_x_resol=x_resol; + completed_y_resol=y_resol; + + incr_x=get_distx( angle0,100); + x_resol+=incr_x; + incr_y=get_disty( angle0,100); + y_resol+=incr_y; + + + dist_bat=x-id_bat.x; + + + IF (y_resol>=18000 AND y_resol<=18800 AND incr_y>0 AND (dist_bat>-18-id_bat.size_bat AND dist_bat<18+id_bat.size_bat)) + +  angle0=fget_angle(0,0,incr_x,-incr_y)-(dist_bat*pi/60); + + + IF ( angle0pi*7/8) +  angle0=pi*7/8; + END + + IF (id_bat.graph==5) + unused=1; + BREAK; + END + + sound(s_bat,100,256); + END + + + IF (y_resol<=1200 AND incr_y<0) +  angle0=fget_angle(0,0,incr_x,-incr_y); + sound(s_bat,80,500); + END + + + IF ((x_resol<=1200 AND incr_x<0) OR (x_resol>=26000 AND incr_x>0)) +  angle0=fget_angle(0,0,-incr_x,incr_y); + sound(s_bat,80,600); + END + + + x=x_resol/100; + y=y_resol/100; + + + IF (id_brick=collision(TYPE brick)) + score+=5; + speed+=4; + FRAME(0); + y=completed_y_resol/100; + + + IF (id_brick==collision(TYPE brick)) + IF (bounce OR (id_brick.graph>=20 AND id_brick.graph<30)) + sound(s_metal,100,256); + +  angle0=fget_angle(0,0,-incr_x,incr_y)+rand(-4000,4000); + IF (( angle0-pi/8)) +  angle0=fget_angle(0,0,-incr_x,incr_y); + END + IF (( angle0>pi*7/8) AND ( angle0=20 AND id_brick.graph<30)) + sound(s_metal,100,256); + + +  angle0=fget_angle(0,0,incr_x,-incr_y)+rand(-4000,4000); + IF (( angle0-pi/8)) +  angle0=fget_angle(0,0,incr_x,-incr_y); + END + IF (( angle0>pi*7/8) AND ( angle0=20 AND id_brick.graph<30) + id_brick.state=1; + ELSE + + IF (id_brick.graph>=30 AND id_brick.graph<33) + id_brick.graph++; + IF (id_brick.graph==33) + signal(id_brick,s_kill); + nbricks--; + END + ELSE// Aqui se comprueban bricks normales + + IF (rand(0,100)<20) + bonus(id_brick.x,id_brick.y,rand(202,209)); + END + + caido(id_brick.x,id_brick.y,id_brick.graph); + + signal(id_brick,s_kill); + nbricks--; + + END + END + + END + + FRAME(0); + END + x=x_resol/100; + y=y_resol/100; + FRAME; + UNTIL (y>200 OR unused) + + IF (NOT unused) + + speed=400; +  angle0=3*pi/8; + nballs--; + IF (nballs>0) + BREAK; + ELSE + fade_off(); + fade_on(); + direction=1; + bounce=1; + graph=1; + id_bat.graph=3; + IF(lives>0) + signal(small_r[lives-1],s_kill); + END + signal(type bonus,s_kill); + IF (NOT demo) + lives--; + IF (lives<0) + fin_play=1; + BREAK; + END + END + END + END + + END +END + + + + + + +PROCESS brick(x,y,graph); + +PRIVATE + incr_x=1; + +BEGIN + z=-1; + SWITCH (graph); + CASE 15: + LOOP + + IF (x==16) incr_x=1; END + IF (x==256) incr_x=-1; END + x+=incr_x; + + IF (collision(type brick)) + incr_x=-incr_x; + x+=incr_x; + END + FRAME; + END + END + CASE 20: + LOOP + IF (state>0) + SWITCH (state++); + CASE 1: + graph=21; + END + CASE 2: + graph=22; + END + CASE 3: + graph=21; + END + CASE 4: + graph=20; + state=0; + END + END + END + FRAME; + END + END + DEFAULT: + LOOP + FRAME; + END + END + END +END + + + + + + +PROCESS bonus(x,y,graph); + +BEGIN + z=-2; + + WHILE (NOT out_region(id,0) AND state==0) + y+=2; + FRAME; + END + + WHILE (NOT out_region(id,0) AND size>0) + size-=10; + y+=1; + FRAME; + END +END + + + + + + +PROCESS laser(x,y); + +PRIVATE + id_brick; + +BEGIN + graph=8; + sound(s_fire,80,400); + WHILE (y>8) + + IF (id_brick=collision(TYPE brick)) + signal(id,s_kill); + + + IF (id_brick.graph>=20 AND id_brick.graph<30) + + id_brick.state=1; + ELSE + + + IF (id_brick.graph>=30 AND id_brick.graph<40) + + id_brick.graph++; + + IF (id_brick.graph==33) + + nbricks--; + + reduce(id_brick.x,id_brick.y,id_brick.graph); + signal(id_brick,s_kill); + END + ELSE + + IF (rand(0,100)<20) + bonus(id_brick.x,id_brick.y,rand(200,209)); + END + + reduce(id_brick.x,id_brick.y,id_brick.graph); + signal(id_brick,s_kill); + nbricks--; + END + END + END + y-=8; + FRAME; + END +END + + + + + + +PROCESS caido (x,y,graph) + +PRIVATE + iangle; + +BEGIN + + sound(s_hit,200,256); + + iangle=rand(-pi/8,pi/8); + + REPEAT + FRAME; + y+=5; + angle+=iangle; + UNTIL (out_region(id,0)) + +END + + + + + + +PROCESS reduce(x,y,graph) + +BEGIN + REPEAT + FRAME; + size-=6; + UNTIL (size<0) +END + + + + + + +PROCESS small_bat(x,y) + +BEGIN + graph=7; + LOOP + FRAME; + END +END + + + + + + +PROCESS text_demo() + +BEGIN + LOOP + + id_text=write(1,90,100,0,"PRESS A KEY TO PLAY"); + FRAME (2000); + delete_text(id_text); + FRAME (2000); + END +END + + + + + +PROCESS credits() + +PRIVATE + font; + +BEGIN + fade_off(); + delete_text(all_text); + let_me_alone(); + put_screen(1,2); + load_pal("noid\noid2.fpg"); + + font=load_fnt("noid\noid2.fnt"); + + + write(font,160,30,4,"- CREDITS -"); + write(font,160,60,4,"CODER: LUIS SUREDA"); + write(font,160,80,4,"GRAPHICS: JOSE FERNANDEZ"); + write(font,160,100,4,"SOUNDS: CARLOS ILLANA"); + write(font,160,120,4,"COPYRIGHT 1997"); + write(font,160,140,4,"DIV GAMES STUDIO"); + fade_on(); + + + WHILE (scan_code==0) + FRAME; + END + fade_off(); + exit("Thanks for Playing!",0); +END diff --git a/examples/games/pacoman/pacoman.prg b/examples/games/pacoman/pacoman.prg old mode 100644 new mode 100755 diff --git a/examples/games/soccer/Soccer.prg b/examples/games/soccer/Soccer.prg deleted file mode 100644 index b333e9e..0000000 --- a/examples/games/soccer/Soccer.prg +++ /dev/null @@ -1,4657 +0,0 @@ - -/*------------------------------------------------------------------- -/ TITLE: SOCCER -/ AUTHOR: Antonio Marchal -/ DATE: DIV GAMES STUDIO (c) 2000 -//-------------------------------------------------------------------*/ - -// -// -// Our appologies for this program being in Spanish. Whilst we have -// translated the other games as best as we could this one proved to -// be just a bit too much. To ensure we were able to meet our -// release date we had no choice but to leave it as is. -// -// It was either this or leave it out altogether which we didn't think -// you would be to happy about. -// -// - - -PROGRAM soccer; - -CONST - - pase=0; - parado=1; - normal=2; - conbalon=3; - atontado=4; - desmarcado=5; - esperandopase=6; - irasaque=7; - saquedebanda=8; - porterotirandose=10; - iracorner=11; - tirandocorner=12; - irarecibecorner=13; - recibecorner=14; - - xicampo=176; - yicampo=182; - xfcampo=754; - yfcampo=1149; - - campoagobio=4000; - - campoagobiojug=2000; - - - zonaquitada=5000; - - zonarecogida=700; - totaltestigo=5; - zonatiro1=20000; - zonatiro2=35000; - vmaxima=300; - vmaximacg=200; - - vmaxima=300; - vmaximacg=200; - - vmaximajug=450; - vmaximacgjug=300; - - - azar=10; - retardoatontado=3; - conbote=2500; - distanciacamara=180; - alturacamara=224; - cambiodesmarcado=100; - incrvelocidadpelota=50; - - -GLOBAL - - idinicio; - elegidosaque=0; - conmarcadores=1; - conintro=0; - idnumerojugador=0; - - letras[]="Q","W","E","R","T","Y","U","I","O","P", - "A","S","D","F","G","H","J","K","L","¥", - "Z","X","C","V","B","N","M"," ","."; - inicioparte=0; - tipotiempo=0; - totaltiempo=0; - tiempojuego; - idtextomensaje; - controljugador=2; - editando=0; - - fichero1; fichero2; fichero3; fichero4; fichero5; fichero6; fichero7; fichero8; fichero9; - - fuente1; fuente2; fuente3; - - idsonido0,idsonido1,idsonido2,idsonido3,idsonido4,idsonido5,idsonido6,idsonido7,idsonido8; - idcanal,idcanal2; - colorini1[3]=3,6,1,0; - colorini2[3]=1,6,3,1; - STRUCT nombres[23]; - letras[9]; - END - STRUCT idnombres[23]; - idletras[9]; - END - realopcionmenu1=-1; - paljugador1[255]; - paljugador2[255]; - goles[1]=0,0; - modovideo=0; - quienmetegol=0; - quienempieza=0; - quiensacadebanda=0; - quiensacacorner=0; - porterosacando=0; - cuenporterosacando=0; - esquinacorner=0; - sacando=0; - sacandoporteria=0; - sacandocorner=0; - estadosaque=0; - ultimotiro=0; - incactual=0; - incbote=0; - testigo1=0; - testigo2=0; - testigo3=0; - pesopelota=3; - estadoataque=50; - idjugadores1[9]; - idjugadores2[9]; - idporteros[1]; - idpelota; - idcamara; - estadoequipo=0; - estadojuego=0; - - - - - STRUCT tactica0[9] - xi0,yi0; - xi1,yi1; - xp0,yp0; - xp1,yp1; - p0,p1; - xc0,yc0; - xc1,yc1; - END = - 70,130, 70,120, 70,130, 40,460,15, 5, 75,465,150, 50, - 140,200,140,190,140,200,150,390,15, 5,225,465,240, 70, - 290,220,290,210,290,220,290,350,15, 5,320,410,320,100, - 450,200,450,190,450,200,460,390,15, 5,440,465,400, 70, - 510,130,510,120,510,130,540,460,15, 5,560,465,490, 50, - 170,340,170,330, 40,420, 50,660,10,10,160,190,170,170, - 290,350,290,340,290,420,290,660,10,10,320,190,320,170, - 450,340,450,330,520,420,550,660,10,10,480,190,460,170, - 290,480,320,410,130,550,150,790, 5,15,240,100,210,420, - 320,480,350,410,450,550,440,790, 5,15,400,100,410,420; - - STRUCT t ctica[9] - xi0,yi0; - xi1,yi1; - xp0,yp0; - xp1,yp1; - p0,p1; - xc0,yc0; - xc1,yc1; - END = - 510,130, 510,120, 530,210, 540,520, 15, 5, 75,465,150, 50, - 290,200, 290,190, 410,120, 420,340, 15, 5,225,465,240, 70, - 140,220, 140,210, 170,120, 120,330, 15, 5,320,410,320,100, - 70,200, 70,190, 80,210, 60,480, 15, 5,440,465,400, 70, - 450,130, 450,120, 470,320, 370,590, 10,10,560,465,490, 50, - 290,340, 290,330, 300,320, 160,590, 10,10,160,190,170,170, - 170,350, 170,340, 100,340, 90,700, 10,10,320,190,320,170, - 450,340, 450,330, 520,460, 460,770, 5,15,480,190,460,170, - 290,485, 320,410, 300,440, 290,820, 5,15,240,100,210,420, - 320,450, 350,410, 40,440, 130,800, 5,15,400,100,410,420; - STRUCT equipototal[1] - ataque; - defensa; - conbalon; - desmarcado; - esperandopase; - saquedebanda; - sacacorner; - distanciaminima; - END - -LOCAL - xi,yi; - xp0,yp0; - xp1,yp1; - p0,p1; - estado; - equipo; - pasa_a; - tirando=0; - contador; - contador2; - cuentaatontado; - angulopelota=0; - velocidadpelota=0; - velocidad; - n£mero; - anguloportero; - x_vieja; - y_vieja; - tirandose=0; - cuentaanima; - -PRIVATE - idfondo; - colorini[3]=3,6,1,0; - idtextosvarios[3]; - salirjuego; - continuajuego=0; - iniciomensaje=0; - -BEGIN - max_process_time=2000; - idinicio=id; - set_mode(m320x200); - - - idsonido8=load_pcm("soccer\musica1.pcm",1); - idcanal2=sound(idsonido8,100,256); - scan_code=0; - - - start_fli("fli\soccer\futbol1.fli",0,0); - WHILE (frame_fli()<>0 AND scan_code==0 AND NOT mouse.left) FRAME; END - end_fli(); - IF (scan_code==0 AND NOT mouse.left) - start_fli("fli\soccer\futbol2.fli",0,0); - WHILE (frame_fli()<>0 AND scan_code==0 AND NOT mouse.left) FRAME; END - end_fli(); - END - IF (scan_code==0 AND NOT mouse.left) - start_fli("fli\soccer\futbol3.fli",0,0); - WHILE (frame_fli()<>0 AND scan_code==0 AND NOT mouse.left) FRAME; END - end_fli(); - END - WHILE (scan_code<>0 OR mouse.left) FRAME; END - LOOP - set_mode(m640x480); - set_fps(20,1); - - idsonido0=load_pcm("soccer\silbato.pcm",0); - idsonido1=load_pcm("soccer\aplauso.pcm",0); - idsonido2=load_pcm("soccer\aplauso2.pcm",0); - idsonido3=load_pcm("soccer\golpe.pcm",0); - idsonido4=load_pcm("soccer\fondo.pcm",1); - idsonido5=load_pcm("soccer\bote.pcm",0); - idsonido6=load_pcm("soccer\barrida.pcm",0); - idsonido7=load_pcm("soccer\saqueban.pcm",0); - - - fuente1=load_fnt("soccer\futbol0.fnt"); - fuente2=load_fnt("soccer\futbol1.fnt"); - fuente3=load_fnt("soccer\futbol3.fnt"); - - - fichero1=load_fpg("soccer\menus.fpg"); - fichero2=load_fpg("soccer\traje.fpg"); - fichero3=load_fpg("soccer\traje.fpg"); - fichero4=load_fpg("soccer\intro.fpg"); - - - load ("dat\soccer\nombres.dat",&nombres); - - - load ("dat\soccer\traje0.dat",&colorini1); - load ("dat\soccer\traje1.dat",&colorini2); - - - FOR (contador=0;contador<256;contador++) - paljugador1[contador]=contador; - paljugador2[contador]=contador; - END - - - FOR (contador2=0;contador2<4;contador2++) - FOR (contador=1;contador<6;contador++) - paljugador1[(colorini[contador2]*5)+contador]=(colorini2[contador2]*5)+contador; - paljugador2[(colorini[contador2]*5)+contador]=(colorini1[contador2]*5)+contador; - END - END - - - FOR (contador=1;contador<5;contador++) - convert_palette(fichero2,contador,&paljugador2); - convert_palette(fichero3,contador,&paljugador1); - END - mouse.x=320; mouse.y=240; mouse.left=0; - IF (conintro==0) - - - idfondo=load_map("soccer\intro.map"); - load_pal("soccer\intro.map"); - - - mouse.file=fichero4; mouse.graph=908; - - - put_screen(0,idfondo); - - - titulosoccer(); - titulofutbol97(); - fade_on(); - - - WHILE (scan_code==0 AND NOT mouse.left AND NOT mouse.right) - scan_code=0; - FRAME; - END - - - IF (key(_esc) OR mouse.right) - cr‚ditos(); - FRAME; - END - fade_off(); - - - signal(TYPE titulosoccer,s_kill_tree); - signal(TYPE titulofutbol97,s_kill_tree); - signal(TYPE textopulsaunatecla,s_kill); - delete_text(all_text); - clear_screen(); - unload_map(idfondo); - END - - mouse.graph=909; mouse.file=fichero1; - - idfondo=load_map("soccer\menu.map"); - load_pal("soccer\menu.map"); - - - put_screen(0,idfondo); - - - pintaopciones1(); - eligeopciones1(); - fade_on(); - - - WHILE (realopcionmenu1==-1) - FRAME; - END - - - signal(TYPE pintaopciones1,s_kill_tree); - signal(TYPE eligeopciones1,s_kill_tree); - conintro=0; - fade_off(); - - - unload_map(idfondo); - - - clear_screen(); - delete_text(all_text); - salirjuego=0; - - - IF (realopcionmenu1==1) - - - save ("dat\soccer\traje0.dat",&colorini1,sizeof(colorini1)); - save ("dat\soccer\traje1.dat",&colorini2,sizeof(colorini2)); - - - idfondo=load_map("soccer\nombres.map"); - load_pal("soccer\nombres.map"); - put_screen(0,idfondo); - realopcionmenu1=-1; - fade_on(); - - - WHILE (realopcionmenu1==-1) - opciones2(); - FRAME; - END - - - save ("dat\soccer\nombres.dat",&nombres,sizeof(nombres)); - fade_off(); - - - IF (editando==1) - editando=0; signal (TYPE introduce_nombre,s_kill_tree); - END - realopcionmenu1=-1; - conintro=1; - mouse.left=0; - WHILE (mouse.left) FRAME; END - END - - - IF (realopcionmenu1==3) - unload_pcm(idsonido8); - - - conmarcadores=1; - goles[0]=0; goles[1]=0; - SWITCH (tipotiempo) - CASE 0: totaltiempo=60;END - CASE 1: totaltiempo=120;END - CASE 2: totaltiempo=240;END - CASE 3: totaltiempo=480;END - END - - - unload_fpg(fichero1); - unload_fpg(fichero2); - unload_fpg(fichero3); - unload_fpg(fichero4); - unload_fnt(fuente1); - unload_fnt(fuente2); - unload_fnt(fuente3); - - - save ("dat\soccer\traje0.dat",&colorini1,sizeof(colorini1)); - save ("dat\soccer\traje1.dat",&colorini2,sizeof(colorini2)); - - - delete_text(all_text); - let_me_alone(); - - - salirjuego=0; - inicioparte=0; - - - WHILE (NOT key(_esc) AND inicioparte<>5 AND salirjuego==0) - - - equipototal[0].ataque=0; - equipototal[0].defensa=0; - equipototal[0].conbalon=0; - equipototal[0].desmarcado=0; - equipototal[0].esperandopase=0; - equipototal[0].saquedebanda=0; - equipototal[0].distanciaminima=0; - equipototal[1].ataque=0; - equipototal[1].defensa=0; - equipototal[1].conbalon=0; - equipototal[1].desmarcado=0; - equipototal[1].esperandopase=0; - equipototal[1].saquedebanda=0; - equipototal[1].distanciaminima=0; - quienmetegol=0; - - - IF (inicioparte==0) - quienempieza=0; - ELSE - quienempieza=1; - END - - - quiensacadebanda=0; - quiensacacorner=0; - porterosacando=0; - cuenporterosacando=0; - esquinacorner=0; - sacando=0; - sacandoporteria=0; - sacandocorner=0; - estadosaque=0; - ultimotiro=0; - incactual=0; - incbote=0; - testigo1=0; - testigo2=0; - testigo3=0; - pesopelota=3; - estadoataque=50; - estadoequipo=0; - estadojuego=0; - let_me_alone(); - FOR (contador=0;contador<10;contador++) - IF (idjugadores1[contador]) - idjugadores1[contador].estado=normal; - END - IF (idjugadores2[contador]) - idjugadores2[contador].estado=normal; - END - END - - - set_mode(m640x480); - - - fichero1=load_fpg("soccer\traje.fpg"); - fichero2=load_fpg("soccer\traje.fpg"); - fichero3=load_fpg("soccer\menus.fpg"); - - - load ("dat\soccer\traje0.dat",&colorini1); - load ("dat\soccer\traje1.dat",&colorini2); - - - FOR (contador=0;contador<256;contador++) - paljugador1[contador]=contador; - paljugador2[contador]=contador; - END - - - FOR (contador2=0;contador2<4;contador2++) - FOR (contador=1;contador<6;contador++) - paljugador1[(colorini[contador2]*5)+contador]=(colorini2[contador2]*5)+contador; - paljugador2[(colorini[contador2]*5)+contador]=(colorini1[contador2]*5)+contador; - END - END - FOR (contador=1;contador<5;contador++) - convert_palette(fichero1,contador,&paljugador2); - convert_palette(fichero2,contador,&paljugador1); - END - - - fuente2=load_fnt("soccer\futbol3.fnt"); - fuente3=load_fnt("soccer\futbol1.fnt"); - - - idfondo=load_map("soccer\presenta.map"); - put_screen(0,idfondo); - - - IF (inicioparte==0) - write(fuente2,320,10,1,"- 1st TIME -"); - ELSE - write(fuente2,320,10,1,"- 2nd TIME -"); - END - - - SWITCH (tipotiempo) - CASE 0: write(fuente2,320,430,4,"TIME 2:00"); END - CASE 1: write(fuente2,320,430,4,"TIME 4:00"); END - CASE 2: write(fuente2,320,430,4,"TIME 8:00"); END - CASE 3: write(fuente2,320,430,4,"TIME 16:00"); END - END - - - iniciomensaje=50; - FROM contador=9 TO 0; - IF (nombres[0].letras[contador]==letras[27]) - iniciomensaje+=9; - ELSE - BREAK; - END - END - escribe_nombre(iniciomensaje,100,0,fuente3,18); - iniciomensaje=410; - FROM contador=9 TO 0; - IF (nombres[12].letras[contador]==letras[27]) - iniciomensaje+=9; - ELSE - BREAK; - END - END - escribe_nombre(iniciomensaje,100,12,fuente3,18); - - - write_int(fuente2,140,340,1,&goles[0]); - write(fuente2,320,340,1,"-"); - write_int(fuente2,500,340,1,&goles[1]); - - - traje2(141,210,1,fichero1); - traje2(140,210,2,fichero1); - traje2(140,270,3,fichero1); - traje2(140,320,4,fichero1); - traje2(501,210,1,fichero2); - traje2(500,210,2,fichero2); - traje2(500,270,3,fichero2); - traje2(500,320,4,fichero2); - - - mouse.graph=909; - mouse.file=fichero3; - - - WHILE(key(_space)) FRAME; END - WHILE(mouse.left) FRAME; END - - - idtextosvarios[3]=0; - continuajuego=0; - - - WHILE (NOT key(_space) AND continuajuego==0) - - - IF (comprueba_raton(550,395,615,455)) - idtextosvarios[3]=write(0,580,390,4,"CONTINUE"); - END - - - bot¢n(580,422,0,comprueba_raton(550,395,615,455),fichero3); - - - IF (comprueba_raton(550,395,615,455)==3) - continuajuego=1; - END - - FRAME; - IF (idtextosvarios[3]<>0) - delete_text(idtextosvarios[3]); - idtextosvarios[3]=0; - END - END - - - fade_off(); - - - mouse.graph=0; - signal(TYPE traje2,s_kill); - - - unload_fpg(fichero1); - unload_fpg(fichero2); - unload_fpg(fichero3); - - - clear_screen(); - delete_text(all_text); - fade_on(); - set_fps(24,0); - set_mode(m640x480); - - fichero1=load_fpg("soccer\futbol.fpg"); - fichero2=load_fpg("soccer\jugador0.fpg"); - fichero3=load_fpg("soccer\jugador0.fpg"); - fichero4=load_fpg("soccer\portero0.fpg"); - fichero5=load_fpg("soccer\portero1.fpg"); - fichero6=load_fpg("soccer\balon.fpg"); - fichero7=load_fpg("soccer\sombras2.fpg"); - fichero8=load_fpg("soccer\sombrap0.fpg"); - fichero9=load_fpg("soccer\sombrap1.fpg"); - - - fuente1=load_fnt("soccer\futbol3.fnt"); - fuente2=load_fnt("soccer\futbol1.fnt"); - fuente3=load_fnt("soccer\futbol2.fnt"); - - - FOR (contador=0;contador<256;contador++) - paljugador1[contador]=contador; - paljugador2[contador]=contador; - END - - - FOR (contador2=0;contador2<4;contador2++) - FOR (contador=1;contador<6;contador++) - paljugador1[(colorini[contador2]*5)+contador]=(colorini2[contador2]*5)+contador; - paljugador2[(colorini[contador2]*5)+contador]=(colorini1[contador2]*5)+contador; - END - END - - - FOR (contador=1;contador<97; contador++) - convert_palette(fichero3,contador,&paljugador2); - convert_palette(fichero2,contador,&paljugador1); - END - - - start_mode7(0,fichero1,100,0,0,0); - - - m7.height=alturacamara; - m7.focus=512; - m7.color=158; - - valla(); - bander¡n (xicampo,yicampo); - bander¡n (xicampo,yfcampo); - bander¡n (xfcampo,yicampo); - bander¡n (xfcampo,yfcampo); - tu_porteria(); - su_porteria(); - idpelota=balon(); - - - idporteros[0]=porteros(0,(yfcampo-50)*100,fichero4); - idporteros[1]=porteros(1,(yicampo+50)*100,fichero5); - - - idcamara=camara(); - m7.camera=idcamara; - - - equipototal[0].defensa=50; - equipototal[0].ataque=50; - equipototal[1].defensa=50; - equipototal[1].ataque=50; - - - FOR (contador=0;contador<10;contador++) - idjugadores1[contador]=ponjugador(contador,0); - idjugadores2[contador]=ponjugador(contador,1); - END - - - controlaequipo(0); - controlaequipo(1); - - - flecha(0); - flecha(1); - - - controlajuego (); - - - tiempojuego=45-(((totaltiempo-(timer[0]/100))*45)/totaltiempo); - - - - IF (conmarcadores==1) - minicampo(); - idtextosvarios[0]=write_int(fuente1,44,480,6,&goles[0]); - idtextosvarios[1]=write_int(fuente1,600,480,8,&goles[1]); - idtextosvarios[2]=write_int(fuente1,320,0,0,&tiempojuego); - ponminicamisas(20,456,65,fichero3,50); - ponminicamisas(620,456,65,fichero2,50); - END - - restore_type=no_restore; - fade_on(); - - sound(idsonido2,50,256); - - idcanal=sound(idsonido4,50,256); - - WHILE (NOT key(_esc) AND inicioparte<>2 AND inicioparte<>5) - - salirjuego=0; - - IF (inicioparte==0 OR inicioparte==3) timer[0]=0; END - - tiempojuego=45-(((totaltiempo-(timer[0]/100))*45)/totaltiempo); - - IF (tiempojuego>45) tiempojuego=45; END - - IF (tiempojuego==45 AND estadojuego==4 AND - idpelota.velocidadpelota==0 AND - equipototal[0].conbalon==0 AND - equipototal[1].conbalon==0 AND incbote==0) - - IF (inicioparte==1) - inicioparte=2; - ponmensajes (6,20); - ELSE - inicioparte=5; - ponmensajes (7,20); - END - - signal(id,s_freeze_tree); - signal(id,s_wakeup); - contador=0; - - WHILE (NOT key (_space) AND contador<50) FRAME; contador++; END - - signal(id,s_wakeup_tree); - END - - delete_text(idtextosvarios[0]); - delete_text(idtextosvarios[1]); - delete_text(idtextosvarios[2]); - - IF (conmarcadores==1) - IF (modovideo==0) - idtextosvarios[0]=write_int(fuente1,44,480,6,&goles[0]); - idtextosvarios[1]=write_int(fuente1,600,480,8,&goles[1]); - idtextosvarios[2]=write_int(fuente1,320,0,0,&tiempojuego); - ELSE - idtextosvarios[0]=write_int(fuente3,22,200,6,&goles[0]); - idtextosvarios[1]=write_int(fuente3,300,200,8,&goles[1]); - idtextosvarios[2]=write_int(fuente3,160,0,0,&tiempojuego); - END - END - - estadoataque=(idpelota.y-((yicampo*100)+20))/(yfcampo-(yicampo+20)); - IF (estadoataque<0) estadoataque=0; END - IF (estadoataque>100) estadoataque=100; END - - change_sound(idcanal,(30*(100-estadoataque))/100,rand(230,280)); - - ponnombrejugador(); - FRAME; - IF (key(_m)) - IF (conmarcadores==1) - conmarcadores=0; - ELSE - conmarcadores=1; - END - WHILE (key(_m)) FRAME; END - END - - testigo1++;IF (testigo1>(totaltestigo-1)) testigo1=0; END - testigo2++;IF (testigo2>(totaltestigo-1)) testigo2=0; END - testigo3++;IF (testigo3>1) testigo3=0; END - END - - IF (key(_esc)) salirjuego=1; END - - IF (inicioparte==2)inicioparte=3;END - fade_off(); - - IF (inicioparte==5) - - let_me_alone(); - - change_sound(idcanal,0,256); - - stop_mode7(0); - - restore_type=complete_restore; - - set_mode(m640x480); - - unload_fpg(fichero1); - unload_fpg(fichero2); - unload_fpg(fichero3); - - unload_fnt(fuente1); - unload_fnt(fuente2); - - fichero1=load_fpg("soccer\traje.fpg"); - fichero2=load_fpg("soccer\traje.fpg"); - fichero3=load_fpg("soccer\menus.fpg"); - - fuente1=load_fnt("soccer\futbol3.fnt"); - fuente2=load_fnt("soccer\futbol1.fnt"); - - FOR (contador=0;contador<256;contador++) - paljugador1[contador]=contador; - paljugador2[contador]=contador; - END - - FOR (contador2=0;contador2<4;contador2++) - FOR (contador=1;contador<6;contador++) - paljugador1[(colorini[contador2]*5)+contador]=(colorini2[contador2]*5)+contador; - paljugador2[(colorini[contador2]*5)+contador]=(colorini1[contador2]*5)+contador; - END - END - - FOR (contador=1;contador<5;contador++) - convert_palette(fichero1,contador,&paljugador2); - convert_palette(fichero2,contador,&paljugador1); - END - - delete_text(all_text); - - unload_map(idfondo); - - idfondo=load_map("soccer\presenta.map"); - put_screen(0,idfondo); - - iniciomensaje=50; - FROM contador=9 TO 0; - IF (nombres[0].letras[contador]==letras[27]) - iniciomensaje+=9; - ELSE - BREAK; - END - END - escribe_nombre(iniciomensaje,100,0,fuente3,18); - iniciomensaje=410; - FROM contador=9 TO 0; - IF (nombres[12].letras[contador]==letras[27]) - iniciomensaje+=9; - ELSE - BREAK; - END - END - escribe_nombre(iniciomensaje,100,12,fuente3,18); - - traje2(141,210,1,fichero1); - traje2(140,210,2,fichero1); - traje2(140,270,3,fichero1); - traje2(140,320,4,fichero1); - traje2(501,210,1,fichero2); - traje2(500,210,2,fichero2); - traje2(500,270,3,fichero2); - traje2(500,320,4,fichero2); - - write(fuente1,320,10,1," FINISH "); - - write_int(fuente1,140,340,1,&goles[0]); - write(fuente1,320,340,1,"-"); - write_int(fuente1,500,340,1,&goles[1]); - - mouse.graph=909;mouse.file=fichero3; - fade_on(); - - mouse.left=0; WHILE(key(_space)) FRAME; END - - WHILE (NOT key(_space) AND NOT mouse.left) - FRAME; - END - fade_off(); - unload_map(idfondo); - END - - restore_type=complete_restore; - - delete_text(all_text); - - unload_fpg(fichero1); - unload_fpg(fichero2); - unload_fpg(fichero3); - unload_fpg(fichero4); - unload_fpg(fichero5); - unload_fpg(fichero6); - unload_fpg(fichero7); - unload_fpg(fichero8); - unload_fpg(fichero9); - - unload_fnt(fuente1); - unload_fnt(fuente2); - unload_fnt(fuente3); - - stop_mode7(0); - fade_on(); - - change_sound(idcanal,0,256); - END - idsonido8=load_pcm("soccer\musica1.pcm",1); - idcanal2=sound(idsonido8,100,256); - conintro=0; - END - - let_me_alone(); - delete_text(all_text); - realopcionmenu1=-1; - fade_on(); - END -END - - -PROCESS pintaopciones1() -BEGIN - - traje(121,210,1,fichero2); - traje(120,210,2,fichero2); - traje(120,270,3,fichero2); - traje(120,320,4,fichero2); - traje(521,210,1,fichero3); - traje(520,210,2,fichero3); - traje(520,270,3,fichero3); - traje(520,320,4,fichero3); - - LOOP - delete_text(all_text); - - escribe_nombre(90,20,0,fuente1,16); - escribe_nombre(390,20,12,fuente1,16); - - IF (comprueba_raton(170,420,415,455)) - write(fuente2,325,430,4," CHANGE TEAM NAMES "); - ELSE - write(fuente1,325,430,4," CHANGE TEAM NAMES "); - END - - bot¢n(52,422,1,comprueba_raton(20,395,85,455),fichero1); - - IF (comprueba_raton(20,395,85,455)) - write(0,50,390,4," BACK "); - END - - bot¢n(580,422,0,comprueba_raton(550,395,615,455),fichero1); - - IF (comprueba_raton(550,395,615,455)) - write(0,580,390,4," START"); - END - - pontiempo(319,197,tipotiempo+1); - - poncontrol(40,40,20+(controljugador*10)); - poncontrol(600,40,40); - FRAME; - END -END - - -PROCESS eligeopciones1() - -PRIVATE - idcollisionmouse=0; - -BEGIN - LOOP - - IF (comprueba_raton(170,420,415,455)==3) - realopcionmenu1=1; - END - - IF (comprueba_raton(20,395,85,455)==3 OR key (_esc)) - realopcionmenu1=2; - END - - IF (comprueba_raton(550,395,615,455)==3) - realopcionmenu1=3; - END - - IF (mouse.x>249 AND mouse.x<391 AND mouse.y>159 AND mouse.y<301 AND mouse.left) - tipotiempo++;IF (tipotiempo>3) tipotiempo=0; END - WHILE (mouse.left) FRAME; END - END - - IF (mouse.x>0 AND mouse.x<291 AND mouse.y>0 AND mouse.y<91 AND mouse.left) - controljugador++;IF (controljugador>2) controljugador=0; END - WHILE (mouse.left) FRAME; END - END - FRAME; - END - -END - - - - - - -PROCESS opciones2 () - -BEGIN - - delete_text(all_text); - - - escribe_nombre(78,17,0,0,10); - escribe_nombre(458,17,12,0,10); - - - escribe_nombre(78,80,1,0,10); - escribe_nombre(458,80,13,0,10); - - - FOR (contador=2;contador<12;contador++) - escribe_nombre(78,72+(21*contador),contador,0,10); - escribe_nombre(458,72+(21*contador),contador+12,0,10); - END - - - bot¢n(52,422,1,comprueba_raton(20,400,80,450),fichero1); - - - IF (comprueba_raton(20,400,80,450)) - write(0,50,390,4," BACK "); - END - - - IF (comprueba_raton(20,400,80,450)==3) - realopcionmenu1=2; - END - - - IF (comprueba_raton(0,12,247,29)==3) - if (editando==0) - introduce_nombre(0); - ELSE - signal (TYPE introduce_nombre,s_kill); - introduce_nombre(0); - END - END - IF (comprueba_raton(392,13,639,30)==3) - IF (editando==0) - introduce_nombre(12); - ELSE - signal (TYPE introduce_nombre,s_kill); - introduce_nombre(12); - END - END - - - IF (comprueba_raton(1,73,264,92)==3) - IF (editando==0) - introduce_nombre(1); - ELSE - signal (TYPE introduce_nombre,s_kill); - introduce_nombre(1); - END - END - IF (comprueba_raton(380,73,639,92)==3) - IF (editando==0) - introduce_nombre(13); - ELSE - signal (TYPE introduce_nombre,s_kill); - introduce_nombre(13); - END - END - - - FOR (contador=2;contador<12;contador++) - IF (comprueba_raton(1,66+(contador*21),263,68+(contador*21)+19)==3) - IF (editando==0) - introduce_nombre(contador); - ELSE - signal (TYPE introduce_nombre,s_kill); - introduce_nombre(contador); - END - END - IF (comprueba_raton(381,66+(contador*21),639,68+(contador*21)+19)==3) - IF (editando==0) - introduce_nombre(contador+12); - ELSE - signal (TYPE introduce_nombre,s_kill); - introduce_nombre(contador+12); - END - END - END - - - ponletras (358,416,-10,6); - FRAME; -END - - - - - - - - -PROCESS ponletras (x,y,z,graph) - -BEGIN - FRAME; -END - - - - - - - -PROCESS pontiempo (x,y,graph) - -BEGIN - FRAME; -END - - - - - - - - - -PROCESS bot¢n(x,y,cual,estado,file) - -BEGIN - - IF (cual==0) - flags=1; - ELSE - flags=0; - END - - - IF (estado==0) - graph=51; - ELSE - graph=50; - END - FRAME; -END - - - - - - - - - - - - - -PROCESS comprueba_raton(x1,y1,x2,y2) - -BEGIN - - - IF (mouse.x>x1 AND mouse.xy1 AND mouse.y9) colorini1[graph-1]=0; END - ELSE - oldcolorini=colorini2[graph-1]; - colorini2[graph-1]++; - IF (colorini2[graph-1]>9) colorini2[graph-1]=0; END - END - - - FOR (contador=1;contador<6;contador++) - IF (file==fichero2) - paljugador2[(oldcolorini*5)+contador]=(colorini1[graph-1]*5)+contador; - ELSE - paljugador1[(oldcolorini*5)+contador]=(colorini2[graph-1]*5)+contador; - END - END - - - IF (file==fichero2) - convert_palette(file,graph,&paljugador2); - ELSE - convert_palette(file,graph,&paljugador1); - END - WHILE (mouse.left) FRAME; END - END - FRAME; - END -END - - - - - - -PROCESS poncontrol(x,y,graph) - -BEGIN - FRAME; -END - - - - - - -PROCESS textopulsaunatecla() - -PRIVATE - pausatexto=0; - -BEGIN - - x=452; - y=414; - graph=49; - file=fichero4; - LOOP - - - pausatexto++;IF (pausatexto>9) pausatexto=0; END - - - IF (pausatexto<7) graph=49; ELSE graph=0; END - FRAME; - END -END - - - - - - - -PROCESS introduce_nombre(cualnombre) - -PRIVATE - - posicicursor=10; - inixcursor,iniycursor; - parpadeocursor=0; - tecladeraton; - - - tablascan[29]=16,17,18,19,20, 21,22,23,24,25, - 30,31,32,33,34, 35,36,37,38,39, - 44,45,46,47,48, 49,50,57,52,14; - - contadorespacios; -BEGIN - - editando=1; - - contadorespacios=9; - WHILE (contadorespacios>-1) - IF (nombres[cualnombre].letras[contadorespacios]==letras[27]) - contadorespacios--; - ELSE - BREAK; - END - END - posicicursor=contadorespacios+1; - - - SWITCH (cualnombre) - CASE 0: inixcursor=80; iniycursor=20; END - CASE 1: inixcursor=80; iniycursor=83; END - CASE 2..11:inixcursor=80; iniycursor=75+(cualnombre*21); END - CASE 12: inixcursor=460; iniycursor=20; END - CASE 13: inixcursor=460; iniycursor=83; END - CASE 14..23:inixcursor=460; iniycursor=75+((cualnombre-12)*21); END - END - - - WHILE (NOT mouse.right AND NOT key(_enter) AND NOT key(_esc)) - - IF (parpadeocursor<3) - poncursor(inixcursor+(posicicursor*10),iniycursor,9); - ELSE - poncursor(inixcursor+(posicicursor*10),iniycursor,0); - END - parpadeocursor++;IF (parpadeocursor>5) parpadeocursor=0;END - FRAME; - - - IF (mouse.left AND - mouse.x>152 AND mouse.x<565 AND - mouse.y>354 AND mouse.y<477) - - - tecladeraton=((mouse.x-153)/42)+(((mouse.y-355)/42)*10); - - - IF (tecladeraton==29) - - posicicursor--; IF (posicicursor<0)posicicursor=0; END - nombres[cualnombre].letras[posicicursor]=letras[27]; - ELSE - - IF (posicicursor<10) - nombres[cualnombre].letras[posicicursor]=letras[tecladeraton]; - END - posicicursor++; IF (posicicursor>10)posicicursor=10; END - END - - - pontecla(tecladeraton); - WHILE (mouse.left) FRAME; END - END - - - IF (scan_code<>0) - - FOR (contador=0;contador<30;contador++) - IF (scan_code==tablascan[contador]) - - IF (contador==29) - - posicicursor--; IF (posicicursor<0)posicicursor=0; END - nombres[cualnombre].letras[posicicursor]=letras[27]; - ELSE - - IF (posicicursor<10) - nombres[cualnombre].letras[posicicursor]=letras[contador]; - END - posicicursor++; IF (posicicursor>10)posicicursor=10; END - END - - pontecla(contador); - - WHILE (key(tablascan[contador])) FRAME; END - BREAK; - END - END - END - - END - editando=0; -END - - - - - - - -PROCESS pontecla (cualtecla) - -BEGIN - - x=175+((cualtecla MOD 10)*41); - y=375+((cualtecla/10)*41); - graph=7; - z=-5; - FRAME(300); -END - - - - - - - -PROCESS poncursor (x,y,graph) - -BEGIN - FRAME; -END - - - - - - -PROCESS c mara() - -PRIVATE - - xdestc; - ydestc; - cincx; - cincy; - cangle; - cdist; - cvelo; - -BEGIN - - ctype=2; - x=32000; - y=100000; - graph=0; - angle=90000; - resolution=100; - LOOP - - IF (controljugador==2) - - x=idpelota.x; - y=idpelota.y+(distanciacamara*100); - xdestc=x; - ydestc=y; - ELSE - - IF (equipototal[1].conbalon<>0) - xdestc=equipototal[1].conbalon.x; - ydestc=equipototal[1].conbalon.y+(distanciacamara*100); - ELSE - - IF (equipototal[1].esperandopase<>0) - xdestc=equipototal[1].esperandopase.x; - ydestc=equipototal[1].esperandopase.y+(distanciacamara*100); - xdestc=(xdestc+idpelota.x*2)/3; - ELSE - - IF (equipototal[1].desmarcado<>0) - xdestc=equipototal[1].desmarcado.x; - ydestc=equipototal[1].desmarcado.y+(distanciacamara*100); - xdestc=(xdestc+idpelota.x*2)/3; - ELSE - - xdestc=idpelota.x; - ydestc=idpelota.y+(distanciacamara*100); - END - END - END - - - - cangle=fget_angle(x,y,xdestc,ydestc); - - - cdist=fget_dist(x,y,xdestc,ydestc); - - - cvelo=cdist/totaltestigo; - - - IF (cvelo>vmaxima*6) cvelo=vmaxima*6; END - - - cincx=get_distx(cangle,cvelo); - cincy=get_disty(cangle,cvelo); - - - x+=cincx; - y+=cincy; - END - - - IF (y72100) x=72100; END - IF (y<51300) y=51300; END - IF (y>124900) y=124900; END - - FRAME; - END -END - - - - - - -PROCESS valla() - -BEGIN - - file=fichero1; - graph=101; - ctype=2; - - - x=((xfcampo-xicampo)/2)+xicampo; y=0; - - - size=444; - LOOP FRAME; END - -END - - - - - - -PROCESS tu_porteria() - -BEGIN - - file=fichero1; - ctype=2; - graph=203; - - - x=((xfcampo-xicampo)/2)+xicampo; - y=yfcampo+2; - flags=4; - palo1(); - LOOP FRAME; END - -END - - - - - - -PROCESS palo1() - -BEGIN - - file=fichero1; - graph=204; - ctype=2; - - - x=((xfcampo-xicampo)/2)+xicampo; y=yfcampo+1; - LOOP FRAME; END -END - - - - - - -PROCESS su_porteria() - -BEGIN - - file=fichero1; - graph=102+(100*modovideo); - ctype=2; - - - x=((xfcampo-xicampo)/2)+xicampo; - y=yicampo-2; - - - flags=4; - - - palo2(); - LOOP FRAME; END -END - - - - - - -PROCESS palo2() -BEGIN - - file=fichero1; - graph=201; - ctype=2; - - - x=((xfcampo-xicampo)/2)+xicampo; y=yicampo-1; - LOOP FRAME; END -END - - - - - - -PROCESS bal¢n() - -PRIVATE - - incrx,incry; - -BEGIN - - x=(((xfcampo-xicampo)/2)+xicampo)*100; - y=(((yfcampo-yicampo)/2)+yicampo)*100; - height=0; - - - file=fichero6; - graph=1; - size=20; - ctype=2; - resolution=100; - sombrabalon(); - - LOOP - - IF (velocidadpelota>0) - velocidadpelota-=incrvelocidadpelota; - - x+=get_distx(angulopelota,velocidadpelota); - y+=get_disty(angulopelota,velocidadpelota); - END - - - IF (incbote<>0) - height+=incactual; - incactual-=2; - IF (abs(incactual)>abs(incbote)) - sound(idsonido5,50,256); - - incbote=(((velocidadpelota/100)-15)/10)*2; - - IF (incbote>20) incbote=20; END - IF (incbote<0) incbote=0; END - incactual=incbote; - END - END - - - IF (velocidadpelota>0 OR incbote<>0 OR - equipototal[0].conbalon<>0 OR equipototal[1].conbalon<>0) - IF (graph<>0) - graph++;IF (graph>6) graph=1; END - END - END - - - IF (xxfcampo*100 AND sacando==0 AND estadojuego==4) - bal¢nfantasma(x,y,size,height,graph,file,velocidadpelota,angulopelota); - graph=0; - ponmensajes (4,20); - estadojuego=10; - quiensacadebanda=1-ultimotiro; - x=(xfcampo+5)*100; - velocidadpelota=0; - END - - - IF (y((((xfcampo-xicampo)/2)+xicampo-40)*100) AND x<((((xfcampo-xicampo)/2)+xicampo+40)*100)) - ponmensajes (3,25); - quienmetegol=2; - quienempieza=0; - estadojuego=5; - goles[0]++; - sound(idsonido1,50,256); - END - - - IF (y>yfcampo*100 AND x>((((xfcampo-xicampo)/2)+xicampo-40)*100) AND x<((((xfcampo-xicampo)/2)+xicampo+40)*100)) - ponmensajes (3,25); - quienmetegol=1; - quienempieza=1; - estadojuego=5; - goles[1]++; - sound(idsonido1,50,256); - END - - - IF ((yyfcampo*100) AND ((x>((((xfcampo-xicampo)/2)+xicampo-48)*100) AND x<((((xfcampo-xicampo)/2)+xicampo-40)*100)) OR - (x>((((xfcampo-xicampo)/2)+xicampo+40)*100) AND x<((((xfcampo-xicampo)/2)+xicampo+48)*100)))) - incrx=get_distx(angulopelota,velocidadpelota); - incry=get_disty(angulopelota,velocidadpelota); - incry=-incry; - angulopelota=fget_angle(0,0,incrx,incry); - END - IF ((yyfcampo*100) AND x>((((xfcampo-xicampo)/2)+xicampo-48)*100) AND x<((((xfcampo-xicampo)/2)+xicampo-40)*100) AND - x>((((xfcampo-xicampo)/2)+xicampo+40)*100) AND x<((((xfcampo-xicampo)/2)+xicampo+48)*100)) - incrx=get_distx(angulopelota,velocidadpelota); - incry=get_disty(angulopelota,velocidadpelota); - incry=-incry; - angulopelota=fget_angle(0,0,incrx,incry); - END - - - IF (y<=yicampo*100 AND (x<((((xfcampo-xicampo)/2)+xicampo-48)*100) OR x>((((xfcampo-xicampo)/2)+xicampo+48)*100)) AND sacandocorner==0 AND sacandoporteria==0) - - bal¢nfantasma(x,y,size,height,graph,file,velocidadpelota,angulopelota); - graph=0; - IF (ultimotiro==1) - idporteros[1].velocidad=0; - idporteros[1].estado=conbalon; - velocidadpelota=0; - estadojuego=15; - porterosacando=1; - sacandoporteria=1; - ELSE - - ponmensajes (5,20); - sacandocorner=0; - estadojuego=20; - quiensacacorner=1; - - IF (x<((((xfcampo-xicampo)/2)+xicampo-48)*100)) - esquinacorner=0; - idpelota.x=xicampo*100; - ELSE - esquinacorner=1; - idpelota.x=xfcampo*100; - END - idpelota.y=yicampo*100; - idpelota.height=0; - END - END - - - IF (y=>yfcampo*100 AND (x<((((xfcampo-xicampo)/2)+xicampo-48)*100) OR x>((((xfcampo-xicampo)/2)+xicampo+48)*100)) AND sacandocorner==0 AND sacandoporteria==0) - bal¢nfantasma(x,y,size,height,graph,file,velocidadpelota,angulopelota); - graph=0; - IF (ultimotiro==0) - - idporteros[0].velocidad=0; - idporteros[0].estado=conbalon; - velocidadpelota=0; - estadojuego=15; - porterosacando=0; - sacandoporteria=1; - ELSE - - ponmensajes (5,20); - sacandocorner=0; - estadojuego=20; - quiensacacorner=0; - - IF (x<((((xfcampo-xicampo)/2)+xicampo-48)*100)) - esquinacorner=2; - idpelota.x=xicampo*100; - ELSE - esquinacorner=3; - idpelota.x=xfcampo*100; - END - idpelota.y=yfcampo*100; - idpelota.height=0; - END - END - - - IF (height<0) height=0; END - FRAME; - END -END - - - - - - -PROCESS sombrabalon() - -BEGIN - - file=fichero1; - graph=11; - size=50; - - ctype=2; - resolution=100; - - flags=4; - z=(father.z)+10; - - LOOP - - x=father.x; - y=father.y-2; - FRAME; - END - -END - - - - - - - - -PROCESS ponjugador(n£mero,equipo) - -PRIVATE - - estado_anterior; - xdest; ydest; - pospelox,pospeloy; - pasex,pasey; - fuerzabalon; - iniciosaque; - - - - tablag1[]=8,67,68,69,70,71,72,65,66; - - tablag10[]=8,17,25,33,-25,-17, -9,1, 9; - tablag11[]=8,18,26,34,-26,-18,-10,2,10; - tablag12[]=8,19,27,35,-27,-19,-11,3,11; - tablag13[]=8,20,28,36,-28,-20,-12,4,12; - tablag14[]=8,21,29,37,-29,-21,-13,5,13; - tablag15[]=8,22,30,38,-30,-22,-14,6,14; - tablag16[]=8,23,31,39,-31,-23,-15,7,15; - tablag17[]=8,24,32,40,-32,-24,-16,8,16; - - tablag20[]=8,57,58,59,60,61,62,63,64; - - tablag30[]=8,51,52,53,54,55,56,49,50; - tablag31[]=8,43,44,45,46,47,48,41,42; - tablag32[]=8,75,76,77,78,79,80,73,74; - - tablag40[]=8,83,84,85,86,87,88,81,82; - tablag41[]=8,91,92,93,94,95,96,89,90; - dirconcontrol; - -BEGIN - - height=-5; - - - sombrajugador(); - - IF (equipo==0) - - file=fichero2; - xgraph=&tablag1; - - - IF (quienempieza==0) - xi=(t ctica[n£mero].xi0+xicampo)*100; - yi=(t ctica[n£mero].yi0+yicampo)*100; - ELSE - xi=(t ctica[n£mero].xi1+xicampo)*100; - yi=(t ctica[n£mero].yi1+yicampo)*100; - END - xp0=(t ctica[n£mero].xp0+rand(-20,20)+xicampo)*100; - yp0=(t ctica[n£mero].yp0+rand(-20,20)+yicampo)*100; - xp1=(t ctica[n£mero].xp1+rand(-20,20)+xicampo)*100; - yp1=(t ctica[n£mero].yp1+rand(-20,20)+yicampo)*100; - ELSE - - file=fichero3; - xgraph=&tablag1; - - - IF (quienempieza==0) - xi=(xfcampo-tactica[n£mero].xi1)*100; - yi=(yfcampo-tactica[n£mero].yi1)*100; - ELSE - xi=(xfcampo-tactica[n£mero].xi0)*100; - yi=(yfcampo-tactica[n£mero].yi0)*100; - END - xp0=(xfcampo-tactica[n£mero].xp0+rand(-20,20))*100; - yp0=(yfcampo-tactica[n£mero].yp0+rand(-20,20))*100; - xp1=(xfcampo-tactica[n£mero].xp1+rand(-20,20))*100; - yp1=(yfcampo-tactica[n£mero].yp1+rand(-20,20))*100; - END - - - p0=tactica[n£mero].p0; - p1=tactica[n£mero].p1; - - - estado=parado; - - - x=rand(500,1500); - y=rand(50500,52500); - - - size=150; - ctype=2; - resolution=100; - cuentaanima=rand(0,7); - velocidad=1; - LOOP - - IF (fget_dist(x,y,idpelota.x,idpelota.y)0 AND idpelota.height<100) - idpelota.angulopelota=rand(0,360)*100; - idpelota.x+=get_distx(idpelota.angulopelota,idpelota.velocidadpelota); - idpelota.y+=get_disty(idpelota.angulopelota,idpelota.velocidadpelota); - ultimotiro=equipo; - END - - - IF ((testigo1==(n£mero/(10/totaltestigo)) AND equipo==0) OR - (testigo2==(n£mero/(10/totaltestigo)) AND equipo==1) ) - REPEAT - - estado_anterior=estado; - - - SWITCH (estado) - - CASE parado: - velocidad=fget_dist(x,y,xi,yi)/totaltestigo; - IF (velocidad>vmaxima) velocidad=vmaxima; END - IF (velocidad<100) velocidad=100; END - angle=fget_angle(x,y,xi,yi); - IF (fget_dist(x,y,xi,yi)<=(vmaxima+200)/2) velocidad=0; END - IF (velocidad==0) angle=fget_angle(x,y,idpelota.x,idpelota.y); END - END - - - CASE normal: - - - xdest=((xp0*p0*equipototal[equipo].defensa)+ - (xp1*p1*equipototal[equipo].ataque)+ - (idpelota.x*pesopelota*100))/ - (p0*equipototal[equipo].defensa+ - p1*equipototal[equipo].ataque+ - pesopelota*100); - - ydest=((yp0*p0*equipototal[equipo].defensa)+ - (yp1*p1*equipototal[equipo].ataque)+ - (idpelota.y*pesopelota*100))/ - (p0*equipototal[equipo].defensa+ - p1*equipototal[equipo].ataque+ - pesopelota*100); - - - IF (fget_dist(x,y,xdest,ydest)>3000) - velocidad=fget_dist(x,y,xdest,ydest)/totaltestigo; - IF (velocidad>vmaxima) velocidad=vmaxima; END - IF (velocidad<100) velocidad=100; END - angle=fget_angle(x,y,xdest,ydest); - IF (fget_dist(x,y,xdest,ydest)<=(vmaxima+200)/2) velocidad=0; END - ELSE - velocidad=0; - END - END - - - CASE conbalon: - ultimotiro=equipo; - - - IF (equipototal[equipo].desmarcado<>0) - equipototal[equipo].desmarcado.estado=normal; - END - equipototal[equipo].desmarcado=0; - - - IF (equipototal[equipo].esperandopase<>0) - equipototal[equipo].esperandopase.estado=normal; - END - equipototal[equipo].esperandopase=0; - - IF (equipo==0) - - IF (y>(yfcampo*100)-zonatiro1) - sound(idsonido3,50,256); - - estado=atontado; - cuentaatontado=retardoatontado; - - idpelota.angulopelota=fget_angle(x,y,((((xfcampo-xicampo)/2)+xicampo)*100)+((rand(-azar*10,azar*10))*100),yfcampo*100); - idpelota.velocidadpelota=coge_veloc(fget_dist(x,y,((((xfcampo-xicampo)/2)+xicampo)*100)+((rand(-azar*10,azar*10))*100),yfcampo*100)); - IF (idpelota.velocidadpelota>conbote) - incactual=(idpelota.velocidadpelota-conbote)/50; incbote=(idpelota.velocidadpelota-conbote)/50; idpelota.height=0; - END - (equipototal[0].conbalon).estado=normal; - equipototal[0].conbalon=0; - tirando=2; - ultimotiro=0; - ELSE - - FOR (contador=0;contador<10;++contador) - IF (fget_dist(x,y,idjugadores2[contador].x,idjugadores2[contador].y)(yfcampo*100)-zonatiro2) - - sound(idsonido3,50,256); - - - idpelota.angulopelota=fget_angle(x,y,((((xfcampo-xicampo)/2)+xicampo)*100)+((rand(-azar*10,azar*10))*100),yfcampo*100); - idpelota.velocidadpelota=coge_veloc(fget_dist(x,y,((((xfcampo-xicampo)/2)+xicampo)*100)+((rand(-azar*10,azar*10))*100),yfcampo*100)); - IF (idpelota.velocidadpelota>conbote) - incactual=(idpelota.velocidadpelota-conbote)/50; incbote=(idpelota.velocidadpelota-conbote)/50; idpelota.height=0; - END - equipototal[0].conbalon=0; - - - estado=atontado; - cuentaatontado=retardoatontado; - tirando=2; - ultimotiro=0; - ELSE - - - sound(idsonido3,50,256); - - - pasa_a=daquienpasa(equipo); - - - idpelota.angulopelota=fget_angle(x,y,idjugadores1[pasa_a].x,idjugadores1[pasa_a].y); - angle=fget_angle(x,y,idjugadores1[pasa_a].x,idjugadores1[pasa_a].y); - idpelota.velocidadpelota=coge_veloc(fget_dist(x,y,idjugadores1[pasa_a].x,idjugadores1[pasa_a].y))+(rand(-azar,azar)*100); - IF (idpelota.velocidadpelota>conbote) - incactual=(idpelota.velocidadpelota-conbote)/50; incbote=(idpelota.velocidadpelota-conbote)/50; idpelota.height=0; - END - ultimotiro=0; - - - idjugadores1[pasa_a].estado=esperandopase; - idjugadores1[pasa_a].velocidad=0; - equipototal[0].esperandopase=idjugadores1[pasa_a]; - equipototal[0].conbalon=0; - - - estado=atontado; - cuentaatontado=retardoatontado; - tirando=2; - END - END - END - - IF (estado==conbalon) - velocidad=fget_dist(x,y,(((xfcampo-xicampo)/2)+xicampo)*100,yfcampo*100)/totaltestigo; - IF (velocidad>vmaximacg) velocidad=vmaximacg; END - IF (velocidad<100) velocidad=100; END - angle=fget_angle(x,y,(((xfcampo-xicampo)/2)+xicampo)*100,yfcampo*100); - END - END - ELSE - - - IF (controljugador==2) - - IF (y<(yicampo*100)+zonatiro1) - - sound(idsonido3,50,256); - - estado=atontado; - cuentaatontado=retardoatontado; - - idpelota.angulopelota=fget_angle(x,y,((((xfcampo-xicampo)/2)+xicampo)*100)+((rand(-azar*10,azar*10))*100),yicampo*100); - idpelota.velocidadpelota=coge_veloc(fget_dist(x,y,((((xfcampo-xicampo)/2)+xicampo)*100)+((rand(-azar*10,azar*10))*100),yicampo*100)); - - IF (idpelota.velocidadpelota>conbote) - incactual=(idpelota.velocidadpelota-conbote)/50; incbote=(idpelota.velocidadpelota-conbote)/50; idpelota.height=0; - END - (equipototal[1].conbalon).estado=normal; - equipototal[1].conbalon=0; - tirando=2; - ultimotiro=1; - ELSE - - - FOR (contador=0;contador<10;++contador) - IF (fget_dist(x,y,idjugadores1[contador].x,idjugadores1[contador].y)atontado) - - IF (y<(yicampo*100)+zonatiro2) - - - sound(idsonido3,50,256); - - - idpelota.angulopelota=fget_angle(x,y,((((xfcampo-xicampo)/2)+xicampo)*100)+((rand(-azar*10,azar*10))*100),yicampo*100); - idpelota.velocidadpelota=coge_veloc(fget_dist(x,y,((((xfcampo-xicampo)/2)+xicampo)*100)+((rand(-azar*10,azar*10))*100),yicampo*100)); - IF (idpelota.velocidadpelota>conbote) - incactual=(idpelota.velocidadpelota-conbote)/50; incbote=(idpelota.velocidadpelota-conbote)/50; idpelota.height=0; - END - equipototal[1].conbalon=0; - contador=10; - - - estado=atontado; - cuentaatontado=retardoatontado; - tirando=2; - ultimotiro=1; - ELSE - - sound(idsonido3,50,256); - ultimotiro=1; - - - pasa_a=daquienpasa(equipo); - - - idpelota.angulopelota=fget_angle(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y); - angle=fget_angle(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y); - idpelota.velocidadpelota=coge_veloc(fget_dist(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y))+(rand(-azar,azar)*100);; - - - IF (idpelota.velocidadpelota>conbote) - incactual=(idpelota.velocidadpelota-conbote)/50; incbote=(idpelota.velocidadpelota-conbote)/50; idpelota.height=0; - END - - - idjugadores2[pasa_a].estado=esperandopase; - idjugadores2[pasa_a].velocidad=0; - equipototal[1].esperandopase=idjugadores2[pasa_a]; - equipototal[1].conbalon=0; - contador=10; - - - estado=atontado; - cuentaatontado=retardoatontado; - tirando=2; - END - END - END - - IF (estado==conbalon) - velocidad=fget_dist(x,y,(((xfcampo-xicampo)/2)+xicampo)*100,yicampo*100)/totaltestigo; - IF (velocidad>vmaximacg) velocidad=vmaximacg; END - IF (velocidad<100) velocidad=100; END - angle=fget_angle(x,y,(((xfcampo-xicampo)/2)+xicampo)*100,yicampo*100); - END - END - ELSE - - FOR (contador=0;contador<10;++contador) - IF (fget_dist(x,y,idjugadores1[contador].x,idjugadores1[contador].y)conbote) - incactual=(idpelota.velocidadpelota-conbote)/50; incbote=(idpelota.velocidadpelota-conbote)/50; idpelota.height=0; - END - - - idjugadores2[pasa_a].estado=esperandopase; - idjugadores2[pasa_a].velocidad=0; - equipototal[1].esperandopase=idjugadores2[pasa_a]; - equipototal[1].conbalon=0; - contador=10; - - - estado=atontado; - cuentaatontado=retardoatontado; - tirando=2; - END - END - - dirconcontrol=0; - IF (controljugador==0) - - - IF (joy.right) dirconcontrol+=1; END - IF (joy.left) dirconcontrol-=1; END - IF (joy.up) dirconcontrol-=10; END - IF (joy.down) dirconcontrol+=10; END - ELSE - - - IF (key(_right)) dirconcontrol+=1; END - IF (key(_left)) dirconcontrol-=1; END - IF (key(_up)) dirconcontrol-=10; END - IF (key(_down)) dirconcontrol+=10; END - END - - - IF (dirconcontrol<>0) velocidad=400; ELSE velocidad-=300; END - IF (velocidad>vmaximacgjug) velocidad=vmaximacgjug; END - IF (velocidad<100) velocidad=0; END - - - SWITCH(dirconcontrol) - CASE -11: angle=135000; END - CASE -10: angle=90000; END - CASE -9: angle=45000; END - CASE -1: angle=180000; END - CASE 1: angle=0; END - CASE 9: angle=225000; END - CASE 10: angle=270000; END - CASE 11: angle=315000; END - END - IF (controljugador==0) - IF (joy.button1 AND tirandose==0) - sound(idsonido3,50,256); - - - idpelota.angulopelota=angle; - idpelota.velocidadpelota=2000; - fuerza_tiro(); - incactual=16; incbote=16; idpelota.height=0; - - - estado=atontado; - cuentaatontado=retardoatontado; - equipototal[equipo].conbalon=0; - tirando=2; - ultimotiro=1; - END - - IF (joy.button2) - sound(idsonido3,50,256); - ultimotiro=1; - - - pasex=x+get_distx(angle,35000); - pasey=y+get_disty(angle,35000); - pasa_a=0; - FROM contador=0 TO 9; - IF (numero<>contador) - IF (fget_dist(pasex,pasey,idjugadores2[contador].x,idjugadores2[contador].y)< - fget_dist(pasex,pasey,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y)) - pasa_a=contador; - END - END - END - - - idpelota.angulopelota=fget_angle(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y); - angle=fget_angle(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y); - idpelota.velocidadpelota=coge_veloc(fget_dist(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y)); - estado=atontado; - cuentaatontado=retardoatontado; - tirando=2; - equipototal[equipo].conbalon=0; - END - ELSE - - IF (key(_control) AND tirandose==0) - - - sound(idsonido3,50,256); - - - idpelota.angulopelota=angle; - idpelota.velocidadpelota=2000; - fuerza_tiro(); - incactual=16; incbote=16; idpelota.height=0; - - - estado=atontado; - cuentaatontado=retardoatontado; - equipototal[equipo].conbalon=0; - tirando=2; - ultimotiro=1; - END - IF (key(_alt)) - - - sound(idsonido3,50,256); - ultimotiro=1; - - - pasex=x+get_distx(angle,35000); - pasey=y+get_disty(angle,35000); - pasa_a=0; - FROM contador=0 TO 9; - IF (numero<>contador) - IF (fget_dist(pasex,pasey,idjugadores2[contador].x,idjugadores2[contador].y)< - fget_dist(pasex,pasey,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y)) - pasa_a=contador; - END - END - END - idpelota.angulopelota=fget_angle(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y); - angle=fget_angle(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y); - idpelota.velocidadpelota=coge_veloc(fget_dist(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y)); - - - estado=atontado; - cuentaatontado=retardoatontado; - tirando=2; - equipototal[equipo].conbalon=0; - END - END - END - END - END - - CASE atontado: - - - cuentaatontado--; - IF (cuentaatontado==0) - - estado=normal; - END - END - - CASE esperandopase: - - IF (fget_dist(x,y,idpelota.x,idpelota.y)0) - (equipototal[equipo].desmarcado).estado=normal; - END - equipototal[equipo].desmarcado=0; - - - IF (equipototal[0].conbalon<>0) - (equipototal[0].conbalon).estado=atontado; - (equipototal[0].conbalon).cuentaatontado=retardoatontado; - equipototal[0].conbalon=0; - END - IF (equipototal[1].conbalon<>0) - (equipototal[1].conbalon).estado=atontado; - (equipototal[1].conbalon).cuentaatontado=retardoatontado; - equipototal[1].conbalon=0; - END - - - estado=conbalon; - equipototal[equipo].conbalon=id; - equipototal[equipo].esperandopase=0; - END - - - IF (idpelota.velocidadpelota<500) - idpelota.velocidadpelota=0; - velocidad=fget_dist(x,y,idpelota.x,idpelota.y)/totaltestigo; - IF (velocidad>vmaxima) velocidad=vmaxima; END - IF (velocidad<100) velocidad=100; END - angle=fget_angle(x,y,idpelota.x,idpelota.y); - ELSE - velocidad=0; - END - END - - CASE desmarcado: - - - IF (equipo==0) - - - pospelox=da_pos_balon(0,equipo); - pospeloy=da_pos_balon(1,equipo); - velocidad=fget_dist(x,y,pospelox,pospeloy)/totaltestigo; - IF (velocidad>vmaxima) velocidad=vmaxima; END - IF (velocidad<100) velocidad=100; END - angle=fget_angle(x,y,pospelox,pospeloy); - ELSE - - - IF (controljugador==2) - - pospelox=da_pos_balon(0,equipo); - pospeloy=da_pos_balon(1,equipo); - velocidad=fget_dist(x,y,pospelox,pospeloy)/totaltestigo; - IF (velocidad>vmaxima) velocidad=vmaxima; END - IF (velocidad<100) velocidad=100; END - angle=fget_angle(x,y,pospelox,pospeloy); - ELSE - - dirconcontrol=0; - IF (controljugador==0) - - IF (joy.right) dirconcontrol+=1; END - IF (joy.left) dirconcontrol-=1; END - IF (joy.up) dirconcontrol-=10; END - IF (joy.down) dirconcontrol+=10; END - IF (joy.button1 AND fget_dist(x,y,idpelota.x,idpelota.y)0) velocidad+=400; ELSE velocidad-=300; END - IF (velocidad>vmaximajug) velocidad=vmaximajug; END - IF (velocidad<100) velocidad=0; END - - - SWITCH(dirconcontrol) - CASE -11: angle=135000; END - CASE -10: angle=90000; END - CASE -9: angle=45000; END - CASE -1: angle=180000; END - CASE 1: angle=0; END - CASE 9: angle=225000; END - CASE 10: angle=270000; END - CASE 11: angle=315000; END - END - END - END - - - IF (fget_dist(x,y,idpelota.x,idpelota.y)0) - (equipototal[0].conbalon).estado=atontado; - (equipototal[0].conbalon).cuentaatontado=retardoatontado; - equipototal[0].conbalon=0; - END - IF (equipototal[1].conbalon<>0) - (equipototal[1].conbalon).estado=atontado; - (equipototal[1].conbalon).cuentaatontado=retardoatontado; - equipototal[1].conbalon=0; - END - - - estado=conbalon; - equipototal[equipo].conbalon=id; - - - IF (equipototal[0].esperandopase<>0) - (equipototal[0].esperandopase).estado=normal; - END - IF (equipototal[1].esperandopase<>0) - (equipototal[1].esperandopase).estado=normal; - END - equipototal[0].esperandopase=0; - equipototal[1].esperandopase=0; - END - IF (fget_dist(x,y,idpelota.x,idpelota.y)0) - sound(idsonido6,50,256); - tirandose=1; - END - ELSE - IF (equipototal[0].conbalon<>0) - sound(idsonido5,50,256); - tirandose=1; - END - END - END - END - - - CASE irasaque: - - velocidad=fget_dist(x,y,idpelota.x,idpelota.y)/totaltestigo; - IF (velocidad>vmaxima) velocidad=vmaxima; END - IF (velocidad<100) velocidad=100; END - angle=fget_angle(x,y,idpelota.x,idpelota.y); - - IF (fget_dist(x,y,idpelota.x,idpelota.y)<=(vmaxima+200)/2) - velocidad=0; - estado=saquedebanda; - idpelota.graph=1; - END - END - - - CASE saquedebanda: - - SWITCH (estadosaque) - CASE 0: - - xgraph=&tablag30; - angle=fget_angle(x,y,(((xfcampo-xicampo)/2)+xicampo)*100,(((yfcampo-yicampo)/2)+yicampo)*100); - IF (equipo==1 AND controljugador<2) - IF (numero==0) elegidosaque=1; iniciosaque=2; ELSE elegidosaque=0; iniciosaque=1; END - FOR (contador=iniciosaque;contador<10;contador++) - IF (contador<>numero) - IF (fget_dist(idpelota.x,idpelota.y,idjugadores2[contador].x,idjugadores2[contador].y)< - fget_dist(idpelota.x,idpelota.y,idjugadores2[elegidosaque].x,idjugadores2[elegidosaque].y)) - elegidosaque=contador; - END - END - END - elige_saque(numero); - FRAME; - pasa_a=elegidosaque; - ELSE - - pasa_a=daquienpasa(equipo); - END - sound(idsonido7,50,256); - - pesopelota=6; - - idpelota.graph=0; - IF (equipo==0) - angle=fget_angle(x,y,idjugadores1[pasa_a].x,idjugadores1[pasa_a].y); - ELSE - angle=fget_angle(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y); - END - END - CASE 1: - - IF (equipo==0) - angle=fget_angle(x,y,idjugadores1[pasa_a].x,idjugadores1[pasa_a].y); - ELSE - angle=fget_angle(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y); - END - - xgraph=&tablag31; - END - CASE 2: - - IF (equipo==0) - idpelota.angulopelota=fget_angle(x,y,idjugadores1[pasa_a].x,idjugadores1[pasa_a].y); - idpelota.velocidadpelota=coge_veloc(fget_dist(x,y,idjugadores1[pasa_a].x,idjugadores1[pasa_a].y)); - ELSE - idpelota.angulopelota=fget_angle(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y); - idpelota.velocidadpelota=coge_veloc(fget_dist(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y)); - END - - IF (equipo==0) - angle=fget_angle(x,y,idjugadores1[pasa_a].x,idjugadores1[pasa_a].y); - ELSE - angle=fget_angle(x,y,idjugadores2[pasa_a].x,idjugadores2[pasa_a].y); - END - - xgraph=&tablag32; - - - idpelota.graph=10; - - - idpelota.height=90; - incactual=0; incbote=18; - IF (equipo==0) - idjugadores1[pasa_a].estado=esperandopase; - equipototal[0].esperandopase=idjugadores1[pasa_a]; - ELSE - idjugadores2[pasa_a].estado=esperandopase; - equipototal[1].esperandopase=idjugadores2[pasa_a]; - - END - - END - END - ++estadosaque; - END - - CASE iracorner: - - - velocidad=fget_dist(x,y,idpelota.x,idpelota.y)/totaltestigo; - IF (velocidad>vmaxima) velocidad=vmaxima; END - IF (velocidad<100) velocidad=100; END - angle=fget_angle(x,y,idpelota.x,idpelota.y); - - - IF (fget_dist(x,y,idpelota.x,idpelota.y)<=(vmaxima+200)/2) - velocidad=0; - estado=tirandocorner; - idpelota.graph=1; - END - END - - CASE tirandocorner: - - - - - IF (estadojuego==4 OR estadojuego>21) - - tirando=2; - - estado=atontado; - cuentaatontado=retardoatontado; - END - - - IF (estadojuego<>4) - - SWITCH(esquinacorner) - CASE 0: x=idpelota.x-400; y=idpelota.y-400; END - CASE 1: x=idpelota.x+400; y=idpelota.y-400; END - CASE 2: x=idpelota.x-400; y=idpelota.y+400; END - CASE 3: x=idpelota.x+400; y=idpelota.y+400; END - END - END - angle=get_angle(idpelota); - END - - - CASE irarecibecorner: - - - IF (quiensacacorner==1) - - IF (equipo==0) - - xdest=(t ctica[n£mero].xc0+xicampo)*100; - ydest=(t ctica[n£mero].yc0+yicampo)*100; - ELSE - xdest=(t ctica[n£mero].xc1+xicampo)*100; - ydest=(t ctica[n£mero].yc1+yicampo)*100; - END - ELSE - - IF (equipo==0) - xdest=(xfcampo-tactica[n£mero].xc1)*100; - ydest=(yfcampo-tactica[n£mero].yc1)*100; - ELSE - xdest=(xfcampo-tactica[n£mero].xc0)*100; - ydest=(yfcampo-tactica[n£mero].yc0)*100; - END - END - - - velocidad=fget_dist(x,y,xdest,ydest)/totaltestigo; - IF (velocidad>vmaxima) velocidad=vmaxima; END - IF (velocidad<100) velocidad=100; END - angle=fget_angle(x,y,xdest,ydest); - - - IF (fget_dist(x,y,xdest,ydest)<=(vmaxima+200)/2) - velocidad=0; - estado=recibecorner; - END - END - END - - - until (estado_anterior==estado) - END - - - IF (estado==esperandopase && fget_dist(x,y,idpelota.x,idpelota.y)0) - (equipototal[equipo].desmarcado).estado=normal; - END - equipototal[equipo].desmarcado=0; - IF (equipototal[0].conbalon<>0) - (equipototal[0].conbalon).estado=atontado; - (equipototal[0].conbalon).cuentaatontado=retardoatontado; - equipototal[0].conbalon=0; - END - - - IF (equipototal[1].conbalon<>0) - (equipototal[1].conbalon).estado=atontado; - (equipototal[1].conbalon).cuentaatontado=retardoatontado; - equipototal[1].conbalon=0; - END - - - equipototal[equipo].conbalon=id; - equipototal[equipo].conbalon.estado=conbalon; - equipototal[equipo].esperandopase=0; - END - - - advance(velocidad); - - - IF (estado<>saquedebanda) - - - IF (estado==conbalon OR fget_dist(x,y,idpelota.x,idpelota.y)>zonaquitada) - tirandose=0; - END - - - IF (velocidad==0 AND tirando==0) - - xgraph=&tablag1; - ELSE - - IF (tirandose==1) - xgraph=&tablag20; - ELSE - - IF (tirando>0) - IF (tirando==2) - xgraph=&tablag40; - ELSE - xgraph=&tablag41; - END - --tirando; - ELSE - - SWITCH(cuentaanima) - CASE 0: xgraph=&tablag10;END - CASE 1: xgraph=&tablag11;END - CASE 2: xgraph=&tablag12;END - CASE 3: xgraph=&tablag13;END - CASE 4: xgraph=&tablag14;END - CASE 5: xgraph=&tablag15;END - CASE 6: xgraph=&tablag16;END - CASE 7: xgraph=&tablag17;END - END - ++cuentaanima;IF (cuentaanima>7) cuentaanima=0; END - END - END - END - - - IF (estado==conbalon) - idpelota.x=x+get_distx(angle,300); - idpelota.y=y+get_disty(angle,300); - END - END - FRAME; - END -END - - - - - - - -PROCESS controlaequipo(cual) - -PRIVATE - - mascerca; - pospelox; - pospeloy; - -BEGIN - graph=0; - timer[1]=0; - LOOP - - IF (estadojuego==4 AND estadoequipo==1) - - - IF (testigo3==cual) - - - IF (equipototal[cual].conbalon==0 ) - - IF (cual==0) - IF (equipototal[cual].desmarcado<>0) - (equipototal[cual].desmarcado).estado=normal; - equipototal[cual].desmarcado=0; - END - ELSE - IF (timer[1]>cambiodesmarcado) - IF (equipototal[cual].desmarcado<>0) - (equipototal[cual].desmarcado).estado=normal; - equipototal[cual].desmarcado=0; - END - END - END - - - IF (cual==0) - - - pospelox=da_pos_balon(0,cual); - pospeloy=da_pos_balon(1,cual); - - - mascerca=0; - - - FOR (contador=1;contador<10;++contador) - - IF (idjugadores1[contador].estado<>normal) - contador++; - ELSE - - IF(fget_dist(idjugadores1[contador].x,idjugadores1[contador].y,pospelox,pospeloy)< - fget_dist(idjugadores1[mascerca].x,idjugadores1[mascerca].y,pospelox,pospeloy)) - - mascerca=contador; - END - END - END - - - idjugadores1[mascerca].estado=desmarcado; - equipototal[0].desmarcado=idjugadores1[mascerca]; - equipototal[0].distanciaminima=fget_dist(idjugadores1[mascerca].x,idjugadores1[mascerca].y,pospelox,pospeloy); - ELSE - - - pospelox=da_pos_balon(0,cual); - pospeloy=da_pos_balon(1,cual); - mascerca=0; - FOR (contador=1;contador<10;++contador) - IF (idjugadores2[contador].estado<>normal) - contador++; - ELSE - IF(fget_dist(idjugadores2[contador].x,idjugadores2[contador].y,pospelox,pospeloy)< - fget_dist(idjugadores2[mascerca].x,idjugadores2[mascerca].y,pospelox,pospeloy)) - mascerca=contador; - END - END - END - IF (controljugador==2) - idjugadores2[mascerca].estado=desmarcado; - equipototal[1].desmarcado=idjugadores2[mascerca]; - equipototal[1].distanciaminima=fget_dist(idjugadores2[mascerca].x,idjugadores2[mascerca].y,pospelox,pospeloy); - ELSE - IF (timer[1]>cambiodesmarcado) - idjugadores2[mascerca].estado=desmarcado; - equipototal[1].desmarcado=idjugadores2[mascerca]; - equipototal[1].distanciaminima=fget_dist(idjugadores2[mascerca].x,idjugadores2[mascerca].y,pospelox,pospeloy); - timer[1]=0; - END - END - END - END - END - - - IF (equipototal[cual].desmarcado<>0) - (equipototal[cual].desmarcado).estado=desmarcado; - END - IF (equipototal[cual].conbalon<>0) - (equipototal[cual].conbalon).estado=conbalon; - END - - END - - - equipototal[0].defensa=100-estadoataque; - equipototal[1].defensa=estadoataque; - equipototal[0].ataque=estadoataque; - equipototal[1].ataque=100-estadoataque; - - - IF (equipototal[0].conbalon<>0) - (equipototal[0].ataque)+=10; - END - IF (equipototal[1].conbalon<>0) - (equipototal[1].ataque)+=10; - END - - FRAME; - END -END - - - - - - - -PROCESS flecha(tipo) - -BEGIN - - file=fichero1; - graph=4; - - - resolution=100; - - - ctype=2; - z=20; - - - flags=4; - LOOP - - IF (equipototal[tipo].conbalon<>0) - x=equipototal[tipo].conbalon.x; - y=equipototal[tipo].conbalon.y-300; - graph=4; - ELSE - - IF (equipototal[tipo].desmarcado<>0) - x=equipototal[tipo].desmarcado.x; - y=equipototal[tipo].desmarcado.y-300; - graph=4; - ELSE - - graph=0; - END - END - FRAME; - END -END - - - - - - - - -PROCESS coge_veloc(dist) - -PRIVATE - n=100; - incdist=0; - -BEGIN - - - WHILE (incdist0) - posx=(equipototal[1].conbalon).x+get_distx((equipototal[1].conbalon).angle,(equipototal[1].conbalon).velocidad*totaltestigo); - posy=(equipototal[1].conbalon).y+get_disty((equipototal[1].conbalon).angle,(equipototal[1].conbalon).velocidad*totaltestigo); - ELSE - IF (cualequipo==1 AND equipototal[0].conbalon<>0) - posx=(equipototal[0].conbalon).x+get_distx((equipototal[0].conbalon).angle,(equipototal[0].conbalon).velocidad*totaltestigo); - posy=(equipototal[0].conbalon).y+get_disty((equipototal[0].conbalon).angle,(equipototal[0].conbalon).velocidad*totaltestigo); - ELSE - - posx=idpelota.x; - posy=idpelota.y; - - - velo=idpelota.velocidadpelota; - - - WHILE (velo==0) - posx+=get_distx(idpelota.angulopelota,velo); - posy+=get_disty(idpelota.angulopelota,velo); - velo-=100; - END - END - END - - - IF (cual==0) - RETURN(posx); - ELSE - RETURN(posy); - END - -END - - - - - - -PROCESS minicampo() - -BEGIN - - - file=fichero1; - IF (modovideo==0) - graph=104; - ELSE - graph=108; - END - - - x=572-(286*modovideo); - y=108-(54*modovideo); - z=-10; - - - FOR (contador=0;contador<23;contador++) - pintapunto(contador); - END - LOOP - IF(conmarcadores==0) - graph=0; - ELSE - IF (modovideo==0) - graph=104; - ELSE - graph=108; - END - END - FRAME; - END - -END - - - - - - - -PROCESS pintapunto(cual) - -BEGIN - - file=fichero1; - - - z=-12; - - - LOOP - IF(conmarcadores==0) - graph=0; - ELSE - SWITCH (cual) - CASE 0..9,21: - IF (modovideo==0) - graph=106; - ELSE - graph=109; - END - END - CASE 0..19,22: - IF (modovideo==0) - graph=107; - ELSE - graph=110; - END - END - CASE 20:graph=105: END - END - END - - - SWITCH (cual) - CASE 0..9: - x=((idjugadores1[cual].x-(xicampo*100))/(500+(500*modovideo)))+517-(261*modovideo); - y=(idjugadores1[cual].y-(yicampo*100))/(500+(500*modovideo))+(10-(4*modovideo)); - END - CASE 10..19: - x=((idjugadores2[cual-10].x-(xicampo*100))/(500+(500*modovideo)))+517-(261*modovideo); - y=(idjugadores2[cual-10].y-(yicampo*100))/(500+(500*modovideo))+(10-(4*modovideo)); - END - CASE 20: - x=((idpelota.x-(xicampo*100))/(500+(500*modovideo)))+517-(261*modovideo); - y=(idpelota.y-(yicampo*100))/(500+(500*modovideo))+(10-(4*modovideo)); - END - CASE 21: - x=((idporteros[0].x-(xicampo*100))/(500+(500*modovideo)))+517-(261*modovideo); - y=(idporteros[0].y-(yicampo*100))/(500+(500*modovideo))+(10-(4*modovideo)); - END - CASE 22: - x=((idporteros[1].x-(xicampo*100))/(500+(500*modovideo)))+517-(261*modovideo); - y=(idporteros[1].y-(yicampo*100))/(500+(500*modovideo))+(10-(4*modovideo)); - END - END - FRAME; - END -END - - - - - - -PROCESS sombrajugador() - -PRIVATE - - - - tablag1[]=8,67,68,69,70,71,72,65,66; - - tablag10[]=8,17,25,33,113,105, 97,1, 9; - tablag11[]=8,18,26,34,114,106, 98,2,10; - tablag12[]=8,19,27,35,115,107, 99,3,11; - tablag13[]=8,20,28,36,116,108,100,4,12; - tablag14[]=8,21,29,37,117,109,101,5,13; - tablag15[]=8,22,30,38,118,110,102,6,14; - tablag16[]=8,23,31,39,119,111,103,7,15; - tablag17[]=8,24,32,40,120,112,105,8,16; - - tablag20[]=8,57,58,59,60,61,62,63,64; - - tablag30[]=8,51,52,53,54,55,56,49,50; - tablag31[]=8,43,44,45,46,47,48,41,42; - tablag32[]=8,75,76,77,78,79,80,73,74; - - tablag40[]=8,83,84,85,86,87,88,81,82; - tablag41[]=8,91,92,93,94,95,96,89,90; - - -BEGIN - - ctype=2; - file=fichero7; - - - flags=4; - - - resolution=100; - - - z=(father.z)+10; - LOOP - - - angle=father.angle; - x=father.x; - y=father.y-2; - - IF (father.estado<>saquedebanda) - - IF (father.velocidad==0 && father.tirando==0) - xgraph=&tablag1; - ELSE - - IF (father.tirandose==1) - xgraph=&tablag20; - ELSE - - IF (father.tirando>0) - IF (father.tirando==2) - xgraph=&tablag40; - ELSE - xgraph=&tablag41; - END - ELSE - - SWITCH(father.cuentaanima) - CASE 0: xgraph=&tablag10;END - CASE 1: xgraph=&tablag11;END - CASE 2: xgraph=&tablag12;END - CASE 3: xgraph=&tablag13;END - CASE 4: xgraph=&tablag14;END - CASE 5: xgraph=&tablag15;END - CASE 6: xgraph=&tablag16;END - CASE 7: xgraph=&tablag17;END - END - END - END - END - ELSE - SWITCH (estadosaque) - CASE 0: xgraph=&tablag30; END - CASE 1: xgraph=&tablag31; END - CASE 2: xgraph=&tablag32; END - END - END - FRAME; - END - -END - - - - - - - -PROCESS controlajuego () - -PRIVATE - cuentaparados; - pasaa; - mascerca; - xtemp,ytemp; - iniciosaque; -BEGIN - graph=0; - LOOP - - SWITCH (estadojuego) - - CASE 1: - IF (quienempieza==1 AND controljugador<>2) - elegidosaque=8; - elige_saque(9); - FRAME; - pasaa=elegidosaque; - ELSE - IF (quienempieza==1) - pasaa=daquienpasa(1); - END - END - ponmensajes (0,20); - - - IF (inicioparte==0) - inicioparte=1; - timer[0]=0; - END - IF (inicioparte==3) - inicioparte=4; - timer[0]=0; - END - sound(idsonido3,50,256); - - - IF (quienempieza==0) - idpelota.angulopelota=fget_angle(idpelota.x,idpelota.y,idjugadores1[9].x,idjugadores1[9].y); - idpelota.velocidadpelota=coge_veloc(fget_dist(idpelota.x,idpelota.y,idjugadores1[9].x,idjugadores1[9].y)); - idjugadores1[8].tirando=2; - ELSE - idpelota.angulopelota=fget_angle(idpelota.x,idpelota.y,idjugadores2[9].x,idjugadores2[9].y); - idpelota.velocidadpelota=coge_veloc(fget_dist(idpelota.x,idpelota.y,idjugadores2[9].x,idjugadores2[9].y)); - idjugadores2[8].tirando=2; - END - - estadojuego=2; - END - CASE 2: - - IF (quienempieza==0) - - IF (fget_dist(idjugadores1[9].x,idjugadores1[9].y,idpelota.x,idpelota.y)conbote) - incactual=(idpelota.velocidadpelota-conbote)/50; incbote=(idpelota.velocidadpelota-conbote)/50; idpelota.height=0; - END - - - idjugadores1[pasaa].estado=esperandopase; - idjugadores1[pasaa].velocidad=0; - equipototal[0].esperandopase=idjugadores1[pasaa]; - estadojuego=3; - idjugadores1[9].tirando=2; - END - ELSE - - IF (fget_dist(idjugadores2[9].x,idjugadores2[9].y,idpelota.x,idpelota.y)conbote) - incactual=(idpelota.velocidadpelota-conbote)/50; incbote=(idpelota.velocidadpelota-conbote)/50; idpelota.height=0; - END - - idjugadores2[pasaa].estado=esperandopase; - idjugadores2[pasaa].velocidad=0; - equipototal[1].esperandopase=idjugadores2[pasaa]; - estadojuego=3; - idjugadores2[9].tirando=2; - END - END - END - CASE 3: - estadoequipo=1; - estadojuego=4; - END - - CASE 5: - - idpelota.x=(((xfcampo-xicampo)/2)+xicampo)*100; - idpelota.y=(((yfcampo-yicampo)/2)+yicampo)*100; - idpelota.velocidadpelota=0; idpelota.angulopelota=0; - idpelota.height=0; incactual=0; incbote=0; - - - FOR (contador=0;contador<10;contador++) - (idjugadores1[contador]).estado=parado; - (idjugadores2[contador]).estado=parado; - IF (quienempieza==0) - (idjugadores1[contador]).xi=(t ctica[contador].xi0+xicampo)*100; - (idjugadores1[contador]).yi=(t ctica[contador].yi0+yicampo)*100; - (idjugadores2[contador]).xi=(xfcampo-tactica[contador].xi1)*100; - (idjugadores2[contador]).yi=(yfcampo-tactica[contador].yi1)*100; - ELSE - (idjugadores1[contador]).xi=(t ctica[contador].xi1+xicampo)*100; - (idjugadores1[contador]).yi=(t ctica[contador].yi1+yicampo)*100; - (idjugadores2[contador]).xi=(xfcampo-tactica[contador].xi0)*100; - (idjugadores2[contador]).yi=(yfcampo-tactica[contador].yi0)*100; - END - END - - - equipototal[0].conbalon=0; - equipototal[1].conbalon=0; - equipototal[0].desmarcado=0; - equipototal[1].desmarcado=0; - equipototal[0].esperandopase=0; - equipototal[1].esperandopase=0; - - - estadojuego=0; - estadoequipo=0; - END - - CASE 10: - IF (sacando==0) - - IF (equipototal[0].desmarcado<>0 ) - (equipototal[0].desmarcado).estado=normal; - END - IF (equipototal[1].desmarcado<>0 ) - (equipototal[1].desmarcado).estado=normal; - END - - IF (equipototal[0].conbalon<>0 ) - (equipototal[0].conbalon).estado=normal; - END - IF (equipototal[1].conbalon<>0 ) - (equipototal[1].conbalon).estado=normal; - END - - IF (equipototal[0].esperandopase<>0 ) - (equipototal[0].esperandopase).estado=normal; - END - IF (equipototal[1].esperandopase<>0 ) - (equipototal[1].esperandopase).estado=normal; - END - - - equipototal[0].desmarcado=0; - equipototal[1].desmarcado=0; - equipototal[0].conbalon=0; - equipototal[1].conbalon=0; - equipototal[0].esperandopase=0; - equipototal[1].esperandopase=0; - - - FOR (contador=1;contador<10;++contador) - idjugadores1[mascerca].estado=normal; - idjugadores2[mascerca].estado=normal; - END - - - IF (quiensacadebanda==0) - mascerca=0; - FOR (contador=1;contador<10;++contador) - IF (fget_dist(idjugadores1[contador].x,idjugadores1[contador].y,idpelota.x,idpelota.y)< - fget_dist(idjugadores1[mascerca].x,idjugadores1[mascerca].y,idpelota.x,idpelota.y)) - mascerca=contador; - END - END - equipototal[quiensacadebanda].saquedebanda=idjugadores1[mascerca]; - idjugadores1[mascerca].estado=irasaque; - ELSE - mascerca=0; - FOR (contador=1;contador<10;++contador) - IF (fget_dist(idjugadores2[contador].x,idjugadores2[contador].y,idpelota.x,idpelota.y)< - fget_dist(idjugadores2[mascerca].x,idjugadores2[mascerca].y,idpelota.x,idpelota.y)) - mascerca=contador; - END - END - equipototal[quiensacadebanda].saquedebanda=idjugadores2[mascerca]; - idjugadores2[mascerca].estado=irasaque; - END - - idpelota.velocidadpelota=0; - idpelota.angulopelota=0; - idpelota.height=0; - - estadojuego=11; - estadosaque=0; - sacando=1; - END - END - CASE 11: - IF (estadosaque>2) - pesopelota=3; - - - IF (equipototal[0].saquedebanda<>0) - (equipototal[0].saquedebanda).estado=atontado; - (equipototal[0].saquedebanda).cuentaatontado=retardoatontado; - equipototal[0].saquedebanda=0; - END - IF (equipototal[1].saquedebanda<>0) - (equipototal[1].saquedebanda).estado=atontado; - (equipototal[1].saquedebanda).cuentaatontado=retardoatontado; - equipototal[1].saquedebanda=0; - END - - estadojuego=4; - sacando=0; - END - END - - - CASE 15: - IF (sacandoporteria==1) - - equipototal[0].desmarcado=0; - equipototal[1].desmarcado=0; - equipototal[0].conbalon=0; - equipototal[1].conbalon=0; - equipototal[0].esperandopase=0; - equipototal[1].esperandopase=0; - FROM contador=0 TO 9; - idjugadores1[contador].estado=parado; - idjugadores2[contador].estado=parado; - END - estadoequipo=0; - estadojuego=16; - sacandoporteria=2; - - IF (porterosacando==0) - get_point(fichero4,idporteros[porterosacando].graph,1,&xtemp,&ytemp); - idpelota.y=idporteros[porterosacando].y-100; - ELSE - get_point(fichero5,idporteros[porterosacando].graph,1,&xtemp,&ytemp); - idpelota.y=idporteros[porterosacando].y+100; - END - idpelota.x=(idporteros[porterosacando].x+((xtemp-50)*150)); - idpelota.height=(105-ytemp); - END - END - CASE 17: - IF (porterosacando<>1 AND controljugador<>2 AND sacandoporteria==3) - elegidosaque=0; - FROM contador=0 TO 9; - IF (fget_dist(idpelota.x,idpelota.y,idjugadores2[contador].x,idjugadores2[contador].y)< - fget_dist(idpelota.x,idpelota.y,idjugadores2[elegidosaque].x,idjugadores2[elegidosaque].y)) - elegidosaque=contador; - END - END - elige_saque(10); - FRAME; - pasaa=elegidosaque; - END - sacandoporteria=4; - END - CASE 18: - IF (sacandoporteria==4) - estadojuego=19; - sacandoporteria=5; - END - END - - CASE 19: - IF (sacandoporteria==5); - - FROM contador=0 TO 9; - idjugadores1[contador].estado=normal; - idjugadores2[contador].estado=normal; - END - - IF (porterosacando==1) - - pasaa=daquienpasa(0); - - idpelota.angulopelota=fget_angle(idpelota.x,idpelota.y,idjugadores1[pasaa].x,idjugadores1[pasaa].y); - idpelota.velocidadpelota=coge_veloc(fget_dist(idpelota.x,idpelota.y,idjugadores1[pasaa].x,idjugadores1[pasaa].y)); - idjugadores1[pasaa].estado=esperandopase; - equipototal[0].esperandopase=idjugadores1[pasaa]; - ELSE - IF (controljugador==2) - pasaa=daquienpasa(1); - END - idpelota.angulopelota=fget_angle(idpelota.x,idpelota.y,idjugadores2[pasaa].x,idjugadores2[pasaa].y); - idpelota.velocidadpelota=coge_veloc(fget_dist(idpelota.x,idpelota.y,idjugadores2[pasaa].x,idjugadores2[pasaa].y)); - idjugadores2[pasaa].estado=esperandopase; - equipototal[1].esperandopase=idjugadores2[pasaa]; - END - - estadojuego=4; - estadoequipo=1; - idporteros[porterosacando].estado=normal; - - idpelota.height=60;incactual=-12; incbote=18; - cuenporterosacando=0; - sacandoporteria=0; - idpelota.x+=get_distx(idpelota.angulopelota,idpelota.velocidadpelota); - idpelota.y+=get_disty(idpelota.angulopelota,idpelota.velocidadpelota); - - END - END - - - CASE 20: - IF (sacandocorner==0) - SWITCH (esquinacorner) - CASE 0: idpelota.x=xicampo*100;idpelota.y=yicampo*100; END - CASE 1: idpelota.x=xfcampo*100;idpelota.y=yicampo*100; END - CASE 2: idpelota.x=xicampo*100;idpelota.y=yfcampo*100; END - CASE 3: idpelota.x=xfcampo*100;idpelota.y=yfcampo*100; END - END - - - IF (equipototal[0].desmarcado<>0 ) - (equipototal[0].desmarcado).estado=normal; - END - IF (equipototal[1].desmarcado<>0 ) - (equipototal[1].desmarcado).estado=normal; - END - IF (equipototal[0].conbalon<>0 ) - (equipototal[0].conbalon).estado=normal; - END - IF (equipototal[1].conbalon<>0 ) - (equipototal[1].conbalon).estado=normal; - END - IF (equipototal[0].esperandopase<>0 ) - (equipototal[0].esperandopase).estado=normal; - END - IF (equipototal[1].esperandopase<>0 ) - (equipototal[1].esperandopase).estado=normal; - END - - - equipototal[0].desmarcado=0; - equipototal[1].desmarcado=0; - equipototal[0].conbalon=0; - equipototal[1].conbalon=0; - equipototal[0].esperandopase=0; - equipototal[1].esperandopase=0; - - - idporteros[0].estado=recibecorner; - idporteros[1].estado=recibecorner; - - - idpelota.velocidadpelota=0; - idpelota.angulopelota=0; - idpelota.height=0; - - - IF (quiensacacorner==0) - - mascerca=0; - FOR (contador=1;contador<10;++contador) - IF (fget_dist(idjugadores1[contador].x,idjugadores1[contador].y,idpelota.x,idpelota.y)< - fget_dist(idjugadores1[mascerca].x,idjugadores1[mascerca].y,idpelota.x,idpelota.y)) - mascerca=contador; - END - END - idjugadores1[mascerca].estado=iracorner; - equipototal[0].sacacorner=idjugadores1[mascerca]; - - FOR (contador=0;contador<10;++contador) - IF (idjugadores1[contador].estado<>iracorner) - idjugadores1[contador].estado=irarecibecorner; - END - idjugadores2[contador].estado=irarecibecorner; - END - ELSE - mascerca=0; - FOR (contador=1;contador<10;++contador) - IF (fget_dist(idjugadores1[contador].x,idjugadores2[contador].y,idpelota.x,idpelota.y)< - fget_dist(idjugadores1[mascerca].x,idjugadores2[mascerca].y,idpelota.x,idpelota.y)) - mascerca=contador; - END - END - idjugadores2[mascerca].estado=iracorner; - equipototal[1].sacacorner=idjugadores2[mascerca]; - FOR (contador=0;contador<10;++contador) - IF (idjugadores2[contador].estado<>iracorner) - idjugadores2[contador].estado=irarecibecorner; - END - idjugadores1[contador].estado=irarecibecorner; - END - END - - estadojuego=21; - sacandocorner=1; - END - END - CASE 21: - IF (sacandocorner==1) - - cuentaparados=0; - FOR (contador=0;contador<10;contador++) - IF (idjugadores1[contador].estado==recibecorner) - cuentaparados++; - END - IF (idjugadores1[contador].estado==tirandocorner) - cuentaparados++; - END - - IF (idjugadores2[contador].estado==recibecorner) - cuentaparados++; - END - IF (idjugadores2[contador].estado==tirandocorner) - cuentaparados++; - END - END - - IF (cuentaparados==20) sacandocorner=2; estadojuego=22; END - END - END - CASE 22: - IF (sacandocorner==2) - sound(idsonido3,50,256); - IF (quiensacacorner==1 AND controljugador<2) - IF (equipototal[1].sacacorner.numero==0) - iniciosaque=2; - elegidosaque=1; - ELSE - iniciosaque=1; - elegidosaque=0; - END - FOR (contador=iniciosaque;contador<10;contador++) - IF (contador<>equipototal[1].sacacorner.numero) - IF (fget_dist(idpelota.x,idpelota.y,idjugadores2[contador].x,idjugadores2[contador].y)< - fget_dist(idpelota.x,idpelota.y,idjugadores2[elegidosaque].x,idjugadores2[elegidosaque].y)) - elegidosaque=contador; - END - END - END - elige_saque((equipototal[1].sacacorner).numero); - FRAME; - idpelota.angulopelota=fget_angle(idpelota.x,idpelota.y,idjugadores2[elegidosaque].x,idjugadores2[elegidosaque].y); - idpelota.velocidadpelota=coge_veloc(fget_dist(idpelota.x,idpelota.y,idjugadores2[elegidosaque].x,idjugadores2[elegidosaque].y)); - ELSE - - SWITCH (esquinacorner) - CASE 0: idpelota.angulopelota=rand (280000,350000); END - CASE 1: idpelota.angulopelota=rand (190000,260000); END - CASE 2: idpelota.angulopelota=rand ( 10000, 80000); END - CASE 3: idpelota.angulopelota=rand (100000,170000); END - END - - idpelota.velocidadpelota= coge_veloc(rand(12000,44000)); - - END - FOR (contador=0;contador<10;contador++) - IF (idjugadores1[contador].estado==recibecorner) - idjugadores1[contador].estado=normal; - END - IF (idjugadores2[contador].estado==recibecorner) - idjugadores2[contador].estado=normal; - END - END - idporteros[0].estado=normal; - idporteros[1].estado=normal; - - estadojuego=23; - sacandocorner=3; - END - END - CASE 23: - IF (sacandocorner==3) - - IF (equipototal[0].sacacorner<>0) - equipototal[0].sacacorner=0; - END - IF (equipototal[1].sacacorner<>0) - equipototal[1].sacacorner=0; - END - - sacandocorner=0; - estadojuego=4; - END - END - END - - - cuentaparados=0; - IF (estadoequipo==0 AND estadojuego==0) - FROM contador=0 TO 9; - IF (idjugadores1[contador].estado==parado AND - idjugadores1[contador].velocidad==0 AND - idjugadores2[contador].estado==parado AND - idjugadores2[contador].velocidad==0 ) - cuentaparados++; - END - END - IF (cuentaparados==10) - estadojuego=1; - END - END - cuentaparados=0; - IF (estadojuego==16 AND estadoequipo==0 AND sacandoporteria==2) - FROM contador=0 TO 9; - IF (idjugadores1[contador].estado==parado AND - idjugadores1[contador].velocidad==0 AND - idjugadores2[contador].estado==parado AND - idjugadores2[contador].velocidad==0 ) - cuentaparados++; - END - END - IF (cuentaparados==10) - estadojuego=17; - cuentaparados=0; - sacandoporteria=3; - END - END - - FRAME; - - END -END - - - - - - - - -PROCESS daquienpasa(equipo) - -PRIVATE - - distanciasmin[10]= 11 DUP (0); - - mascerca; - masadelantado; - -BEGIN - - - FOR (contador=0;contador<10;contador++) - - IF (equipo==0) - - IF (idjugadores1[contador].estado<>normal) - - distanciasmin[contador]=0; - ELSE - - mascerca=0; - - FOR (contador2=1;contador2<10;contador2++) - - IF (fget_dist(idjugadores1[contador].x,idjugadores1[contador].y,idjugadores2[contador2].x,idjugadores2[contador2].y)< - fget_dist(idjugadores1[contador].x,idjugadores1[contador].y,idjugadores2[mascerca].x,idjugadores2[mascerca].y)) - mascerca=contador2; - END - END - masadelantado=fget_dist(idjugadores1[contador].x,idjugadores1[contador].y,(((xfcampo*100)-(xicampo*100))/2)+(xicampo*100),yfcampo*100)/((xfcampo-xicampo)*100); - - distanciasmin[contador]=fget_dist(idjugadores1[contador].x,idjugadores1[contador].y,idjugadores2[mascerca].x,idjugadores2[mascerca].y)-(masadelantado*5000); - END - ELSE - - IF (idjugadores2[contador].estado<>normal) - distanciasmin[contador]=0; - ELSE - mascerca=0; - FOR (contador2=1;contador2<10;contador2++) - IF (fget_dist(idjugadores2[contador].x,idjugadores2[contador].y,idjugadores1[contador2].x,idjugadores1[contador2].y)< - fget_dist(idjugadores2[contador].x,idjugadores2[contador].y,idjugadores1[mascerca].x,idjugadores1[mascerca].y)) - mascerca=contador2; - END - END - masadelantado=fget_dist(idjugadores2[contador].x,idjugadores2[contador].y,(((xfcampo*100)-(xicampo*100))/2)+(xicampo*100),yicampo*100)/((xfcampo-xicampo)*100); - distanciasmin[contador]=fget_dist(idjugadores2[contador].x,idjugadores2[contador].y,idjugadores1[mascerca].x,idjugadores1[mascerca].y)-(masadelantado*5000); - END - END - END - - - mascerca=0; - FOR (contador=1;contador<10;contador++) - - IF (distanciasmin[contador]>distanciasmin[mascerca]) - - mascerca=contador; - END - END - - RETURN(mascerca); -END - - - - - - - - - -PROCESS porteros(cual, yiportero, file) - -PRIVATE - - pesopelota2; - distbalon; - destx,desty; - xtemp2,ytemp2; - cuentatirada=0; - -BEGIN - height=-5; - ctype=2; - resolution=100; - size=150; - graph=17; - - - x=(((xfcampo-xicampo)/2)+xicampo)*100; - y=yiportero; - - - estado=normal; - LOOP - - IF (cual==testigo3) - - SWITCH (estado) - - CASE normal: - - destx=((381+((((idpelota.x/100))*165)/926))*100); - - distbalon=fget_dist(x,y,idpelota.x,idpelota.y); - - IF (distbalon>30000) - pesopelota2=0; - ELSE - pesopelota2=(30000-distbalon)/600; - END - - desty=(((100*yiportero)+(pesopelota2*idpelota.y))/(100+pesopelota2)); - - velocidad=fget_dist(x,y,destx,desty)/4; - IF (velocidad>vmaxima) velocidad=vmaxima; END - IF (velocidad<100) velocidad=100; END - anguloportero=fget_angle(x,y,destx,desty); - - IF (fget_dist(x,y,idpelota.x,idpelota.y)<=(vmaxima)/2) velocidad=0; END - - - IF (fget_dist(x,y,idpelota.x,idpelota.y)vmaxima) velocidad=vmaxima; END - IF (velocidad<100) velocidad=100; END - anguloportero=fget_angle(x,y,idpelota.x,idpelota.y); - IF (fget_dist(x,y,idpelota.x,idpelota.y)<=(vmaxima+200)/2) velocidad=0; END - ELSE - velocidad=fget_dist(x,y,destx,desty)/4; - IF (velocidad>vmaxima) velocidad=vmaxima; END - IF (velocidad<100) velocidad=100; END - anguloportero=fget_angle(x,y,destx,desty); - IF (fget_dist(x,y,destx,desty)<=(vmaxima+200)/2) velocidad=0; END - END - - - IF (velocidad>0) - x+=get_distx(anguloportero,velocidad); - y+=get_disty(anguloportero,velocidad); - END - - - IF (fget_dist(x,y,idpelota.x,idpelota.y)zonarecogida*3 AND idpelota.velocidadpelota>0) - estado=porterotirandose; - cuentatirada=0; - pesopelota=1; - END - - - IF (x_vieja<>x) - IF (x_vieja23)graph=17; END - ELSE - graph--;IF (graph<17)graph=23; END - END - ELSE - IF (y_vieja<>y) - IF (y_vieja23)graph=17; END - ELSE - graph--;IF (graph<17)graph=23; END - END - END - END - END - - - CASE conbalon: - graph=9; - - IF (porterosacando==0) - get_point(fichero4,graph,1,&xtemp2,&ytemp2); - idpelota.y=idporteros[porterosacando].y-100; - ELSE - get_point(fichero5,graph,1,&xtemp2,&ytemp2); - idpelota.y=idporteros[porterosacando].y+100; - END - idpelota.x=(idporteros[porterosacando].x+((xtemp2-50)*150)); - idpelota.height=(105-ytemp2); - - idpelota.graph=1; - IF (estadojuego>16) - - SWITCH(cuenporterosacando) - - CASE 0: - graph=9; - END - CASE 1..7: - graph++; - END - - CASE 8: - estadojuego=18; - pesopelota=3; - graph=17; - END - END - - IF (porterosacando==0) - get_point(fichero4,graph,1,&xtemp2,&ytemp2); - idpelota.y=y-100; - ELSE - get_point(fichero5,graph,1,&xtemp2,&ytemp2); - idpelota.y=y+100; - END - - idpelota.x=x+((xtemp2-50)*150); - idpelota.height=(105-ytemp2); - ++cuenporterosacando; - END - END - - - CASE porterotirandose: - - SWITCH(cuentatirada) - CASE 0: - - IF (x>idpelota.x) - IF (cual) - flags=1; - ELSE - flags=0; - END - ELSE - IF (cual) - flags=0; - ELSE - flags=1; - END - END - graph=1; - END - - CASE 1..7: - graph++; - END - - CASE 8: - estado=normal; - graph=17; - flags=0; - END - END - - FOR (contador=1;contador<6;contador++) - IF (porterosacando==0) - get_point(fichero4,graph,contador,&xtemp2,&ytemp2); - ELSE - get_point(fichero5,graph,contador,&xtemp2,&ytemp2); - END - IF ((abs(idpelota.x-(x+(xtemp2*150)-5000))<2000 AND abs(idpelota.height-ytemp2)<2000 AND abs(idpelota.y-y)<200)) - estado=normal; - graph=17; - flags=0; - angulopelota=fget_angle(0,0,get_distx(angulopelota,velocidadpelota),-get_disty(angulopelota,velocidadpelota)); - velocidadpelota+=4; - END - END - cuentatirada++; - END - END - END - - - ponsombraportero(cual); - FRAME; - - - x_vieja=x;y_vieja=y; - END - -END - - - - - - - -PROCESS ponsombraportero(cualportero) - -BEGIN - - IF (cualportero==0) - file=fichero8; - ELSE - file=fichero9; - END - - - if (father.estado==tirandose) - - IF (father.x>idpelota.x) - IF (cualportero) - flags=1; - ELSE - flags=0; - END - ELSE - IF (cualportero) - flags=0; - ELSE - flags=1; - END - END - END - height=15; - resolution=100; - ctype=2; - flags=4; - - - x=father.x; - y=father.y-2; - graph=father.graph; - FRAME; -END - - - - - - - -PROCESS bander¡n (x,y) - -BEGIN - - - file=fichero1; - graph=1; - ctype=2; - LOOP - FRAME; - END -END - - - - - - - - -PROCESS ponmensajes (cualmensaje, tiempopuesto) - -PRIVATE - - - mensaje[]="FIRST SHOOT","1st TIME","2nd TIME","GOAL!!","OUT","CORNER","END FIRST TIME"," FINISH "; - contatexto; - -BEGIN - - - sound(idsonido0,50,256); - - - contatexto=tiempopuesto; - - - IF (modovideo==0) - idtextomensaje=write(fuente1,320-(160*modovideo),240-(140*modovideo),4,mensaje[cualmensaje]); - ELSE - idtextomensaje=write(fuente2,320-(160*modovideo),240-(140*modovideo),4,mensaje[cualmensaje]); - END - - - WHILE (contatexto>0) - contatexto--; - FRAME; - END - - - IF (idtextomensaje<>0) - delete_text(idtextomensaje); - idtextomensaje=0; - END - -END - - - - - - -PROCESS ponnombrejugador() - -PRIVATE - numerojugador; - -BEGIN - - - FOR (contador=0;contador<240;++contador); - IF (idnombres[contador/10].idletras[contador MOD 10]<>-1) - delete_text(idnombres[contador/10].idletras[contador MOD 10]); - idnombres[contador/10].idletras[contador MOD 10]=-1; - END - END - - - IF (idnumerojugador<>0) - delete_text(idnumerojugador); - idnumerojugador=0; - END - - IF (conmarcadores==0) RETURN; END - - - IF (idporteros[1].estado==conbalon) - IF (modovideo==0) - escribe_nombre(260-(140*modovideo),460-(270*modovideo),13,fuente2,20); - idnumerojugador=write_int(fuente2,240-(140*modovideo),460-(270*modovideo),1,"1"); - ELSE - escribe_nombre(260-(140*modovideo),460-(270*modovideo),13,0,10); - idnumerojugador=write_int(0,240-(140*modovideo),460-(270*modovideo),1,"1"); - END - ELSE - IF (idporteros[0].estado==conbalon) - IF (modovideo==0) - escribe_nombre(260-(140*modovideo),460-(270*modovideo),1,fuente2,20); - idnumerojugador=write_int(fuente2,240-(140*modovideo),460-(270*modovideo),1,"1"); - ELSE - escribe_nombre(260-(140*modovideo),460-(270*modovideo),1,0,10); - idnumerojugador=write_int(0,240-(140*modovideo),460-(270*modovideo),1,"1"); - END - ELSE - - IF (equipototal[0].conbalon<>0) - - IF (modovideo==0) - - escribe_nombre(260-(140*modovideo),460-(270*modovideo),(equipototal[0].conbalon.n£mero)+14,fuente2,20); - ELSE - escribe_nombre(260-(140*modovideo),460-(270*modovideo),(equipototal[0].conbalon.n£mero)+14,0,10); - END - - numerojugador=(equipototal[0].conbalon.n£mero)+2; - - IF (modovideo==0) - idnumerojugador=write_int(fuente2,240-(140*modovideo),460-(270*modovideo),1,&numerojugador); - ELSE - idnumerojugador=write_int(0,240-(140*modovideo),460-(270*modovideo),1,&numerojugador); - END - END - - - IF (equipototal[1].conbalon<>0) - IF (modovideo==0) - escribe_nombre(260-(140*modovideo),460-(270*modovideo),(equipototal[1].conbalon.n£mero)+2,fuente2,20); - ELSE - escribe_nombre(260-(140*modovideo),460-(270*modovideo),(equipototal[1].conbalon.n£mero)+2,0,10); - END - numerojugador=(equipototal[1].conbalon.n£mero)+2; - IF (modovideo==0) - idnumerojugador=write_int(fuente2,240-(140*modovideo),460-(270*modovideo),1,&numerojugador); - ELSE - idnumerojugador=write_int(0,240-(140*modovideo),460-(270*modovideo),1,&numerojugador); - END - END - - - IF (equipototal[0].sacacorner<>0) - IF (modovideo==0) - escribe_nombre(260-(140*modovideo),460-(270*modovideo),(equipototal[0].sacacorner.n£mero)+14,fuente2,20); - ELSE - escribe_nombre(260-(140*modovideo),460-(270*modovideo),(equipototal[0].sacacorner.n£mero)+14,0,10); - END - numerojugador=(equipototal[0].sacacorner.n£mero)+2; - IF (modovideo==0) - idnumerojugador=write_int(fuente2,240-(140*modovideo),460-(270*modovideo),1,&numerojugador); - ELSE - idnumerojugador=write_int(0,240-(140*modovideo),460-(270*modovideo),1,&numerojugador); - END - END - IF (equipototal[1].sacacorner<>0) - IF (modovideo==0) - escribe_nombre(260-(140*modovideo),460-(270*modovideo),(equipototal[1].sacacorner.n£mero)+2,fuente2,20); - ELSE - escribe_nombre(260-(140*modovideo),460-(270*modovideo),(equipototal[1].sacacorner.n£mero)+2,0,10); - END - numerojugador=(equipototal[1].sacacorner.n£mero)+2; - IF (modovideo==0) - idnumerojugador=write_int(fuente2,240-(140*modovideo),460-(270*modovideo),1,&numerojugador); - ELSE - idnumerojugador=write_int(0,240-(140*modovideo),460-(270*modovideo),1,&numerojugador); - END - END - - - IF (equipototal[0].saquedebanda<>0) - IF (modovideo==0) - escribe_nombre(260-(140*modovideo),460-(270*modovideo),(equipototal[0].saquedebanda.n£mero)+14,fuente2,20); - ELSE - escribe_nombre(260-(140*modovideo),460-(270*modovideo),(equipototal[0].saquedebanda.n£mero)+14,0,10); - END - numerojugador=(equipototal[0].saquedebanda.n£mero)+2; - IF (modovideo==0) - idnumerojugador=write_int(fuente2,240-(140*modovideo),460-(270*modovideo),1,&numerojugador); - ELSE - idnumerojugador=write_int(0,240-(140*modovideo),460-(270*modovideo),1,&numerojugador); - END - END - IF (equipototal[1].saquedebanda<>0) - IF (modovideo==0) - escribe_nombre(260-(140*modovideo),460-(270*modovideo),(equipototal[1].saquedebanda.n£mero)+2,fuente2,20); - ELSE - escribe_nombre(260-(140*modovideo),460-(270*modovideo),(equipototal[1].saquedebanda.n£mero)+2,0,10); - END - numerojugador=(equipototal[1].saquedebanda.n£mero)+2; - IF (modovideo==0) - idnumerojugador=write_int(fuente2,240-(140*modovideo),460-(270*modovideo),1,&numerojugador); - ELSE - idnumerojugador=write_int(0,240-(140*modovideo),460-(270*modovideo),1,&numerojugador); - END - END - END - END - FRAME; -END - - - - - - - -PROCESS traje2(x,y,graph,file) - -BEGIN - LOOP FRAME; END -END - - - - - - - -PROCESS ponminicamisas(x,y,graph,file,size) - -PRIVATE - guardagrafico; - -BEGIN - guardagrafico=graph; - LOOP - IF (conmarcadores==0) graph=0; ELSE graph=guardagrafico; END - FRAME; - END -END - - - - - - -PROCESS cr‚ditos() - -PRIVATE - idfondopant; - -BEGIN - - - fade_off(); - let_me_alone(); - delete_text(all_text); - - - mouse.file=fichero1; mouse.graph=909; - idfondopant=load_map("soccer\presenta.map"); - load_pal("soccer\presenta.map"); - - - put_screen(0,idfondopant); - - - unload_fnt(fuente1); - - - fuente1=load_fnt("soccer\futbol4.fnt"); - - - write(fuente1,320,0,1,"- CREDITS -"); - write(fuente1,320,50,1,"CODER:"); - write(fuente1,320,80,1,"ANTONIO MARCHAL."); - write(fuente1,320,130,1,"GRAPHICS:"); - write(fuente1,320,160,1,"RAFAEL BARRASO."); - write(fuente1,320,190,1,"JOSE FERNANDEZ."); - write(fuente1,320,240,1,"ARTWORK:"); - write(fuente1,320,270,1,"CESAR VALENCIA."); - write(fuente1,320,320,1,"MUSIC:"); - write(fuente1,320,350,1,"MOISES DIAZ TOLEDANO"); - - write(fuente1,320,400,1,"-COPYRIGHT 1997-"); - - fade_on(); - - - scan_code=0; - WHILE (scan_code==0 AND NOT mouse.left AND NOT mouse.right) - FRAME; - END - - - save ("dat\soccer\traje0.dat",&colorini1,sizeof(colorini1)); - save ("dat\soccer\traje1.dat",&colorini2,sizeof(colorini2)); - - - fade_off(); - exit("Thanks for playing!",0); -END - - - - - - - - - -PROCESS bal¢nfantasma(x,y,size,height,graph,file,velocidadpelota,angulopelota) - -BEGIN - resolution=100; - ctype=2; - REPEAT - - - IF (velocidadpelota>0) - velocidadpelota-=incrvelocidadpelota; - - x+=get_distx(angulopelota,velocidadpelota); - y+=get_disty(angulopelota,velocidadpelota); - END - - - IF (velocidadpelota>0) - IF (graph<>0) - graph++;IF (graph>6) graph=1; END - END - END - FRAME; - UNTIL (x<(xicampo-180)*100 OR x>(xfcampo+180)*100 OR - y<(yicampo-180)*100 OR y>(yfcampo+180)*100 OR - velocidadpelota9) elegidosaque=0; END - IF (elegidosaque==numerojugador) elegidosaque++; END - IF (elegidosaque>9) elegidosaque=0; END - WHILE (key(_right) OR key (_up) OR joy.right OR joy.up) FRAME; END - END - IF (key(_left) OR key (_down) OR joy.left OR joy.down) - elegidosaque--; - IF (elegidosaque<0) elegidosaque=9; END - IF (elegidosaque==numerojugador) elegidosaque--; END - IF (elegidosaque<0) elegidosaque=9; END - WHILE (key(_left) OR key (_down) OR joy.left OR joy.down) FRAME; END - END - x=idjugadores2[elegidosaque].x; - y=idjugadores2[elegidosaque].y; - - - canglec=fget_angle(idcamara.x,idcamara.y,idjugadores2[elegidosaque].x,idjugadores2[elegidosaque].y+(distanciacamara*100)); - - - cdistc=fget_dist(idcamara.x,idcamara.y,idjugadores2[elegidosaque].x,idjugadores2[elegidosaque].y+(distanciacamara*100)); - - - cveloc=cdistc/totaltestigo; - - - IF (cveloc>vmaxima*6) cveloc=vmaxima*6; END - - - cincrx=get_distx(canglec,cveloc); - cincry=get_disty(canglec,cveloc); - - - idcamara.x+=cincrx; - idcamara.y+=cincry; - FRAME; - timer[0]=paratimer; - END - - - signal(idinicio,s_wakeup_tree); -END - - - - - -PROCESS fuerza_tiro() - -PRIVATE - tiempomaximo; - -BEGIN - - WHILE ((key (_control) OR joy.button1) AND tiempomaximo<10) - - idpelota.velocidadpelota=2000; - tiempomaximo++; - FRAME; - END - -END - -