//==============================================================================
// WORMS GEMIX EDITION
// JUEGO (OPEN SOURCE)
// AUTOR: EZEQUIEL DELUCA
// GEMIX STUDIO BETA 5.7
//==============================================================================
PROGRAM gemix_worms;
CONST
//CONSTANTES QUE DEFINEN LOS ESTADOS
normal=0;
camina=1;
salto=2;
caida=3;
salto_adelante=4;
salto_en_lugar=5;
salto_backflip=6;
//CONSTANTES QUE DEFINEN EL TIPO DE SUELO QUE ESTA PISANDO EL WORM
RAMPA_ARRIBA=1;
RAMPA_ABAJO=2;
SUELO_LLANO=3;
PARED=4;
//CONSTANTE QUE MANEJA LA RESOLUTION GLOBAL
resolucion_global=100;
//CONSTANTE DE AVANCE EN EL SUELO
avance_suelo=50;
//CONSTANTE DE MAXIMA VELOCIDAD DE CAIDA
descenso_maximo=1000;
//CONSTANTE DE CANTIDAD DE PIXELES QUE CAE EL WORM
avance_caida_y=8;
GLOBAL
//VARIABLES PARA GUARDAR LOS IDs DE LOS FPGs
fichero_mapas;
fichero_durezas;
fichero_sistema;
//VARIABLE PARA GUARDAR EL NUMERO DE MAPA DENTRO DEL FPG DE DUREZAS
mapa_durezas;
//VARIABLE QUE GUARDA EL COLOR VERDE QUE SE USA PARA DETECTAR LAS DUREZAS
color_dureza_verde;
//TEMPORAL: ESTAS ANIMACIONES SERAN CAMBIADAS POR UNA UNICA TABLA
anim_worm_normal[]=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,0;
anim_worm_caida[]=31,32,0;
anim_worm_camina[]=33,34,35,36,37,38,39,40,41,42,43,44,45,46,0;
LOCAL
//VARIABLE PARA CANTIDAD DE PIXELES DE DIFERENCIA ENTRE EL SUELO EN UNA RAMPA
conteo_rampa;
//VARIABLE DE ESTADO
estado;
//VARIABLE QUE CONTROLA EL Y DEL SUELO
suelo=-40000;
BEGIN
//SETEO MODO DE VIDEO (640X480 A 32 BITS A 60 FPS CON VSYNC)
set_mode(640,480,32,mode_waitvsync,mode_rate_60); //mode_bufferflip |
set_fps(0,0);
change_mode(mode_fullscreen);
//CARGO FPGS
fichero_sistema=load_fpg("FPG/Sistema.fpg");
fichero_durezas=load_fpg("FPG/Durezas.fpg");
fichero_mapas=load_fpg("FPG/Mapas.fpg");
//OBTENGO EL COLOR DE LA DUREZA (EL VERDE) DEL MAPA 1 DEL FPG DE DUREZAS
color_dureza_verde=map_get_pixel(fichero_durezas,1,1,0);
//ESTABLEZCO EL NUMERO DEL MAPA DE DUREZAS A USAR
mapa_durezas=2;
//DEFINO REGION Y CREO EL SCROLL
//define_region(1,0,0,MODE_INFO(mode_width),MODE_INFO(mode_height));
start_scroll(0,fichero_mapas,mapa_durezas,mapa_durezas+1,0,0);
//LLAMO AL PROCESO WORM
worm(60,0,1);
//LLAMO AL PROCESO CIRCULO_LOCO (TEMPORAL)
circulo_loco(320,900);
LOOP
FRAME;
END
END
//*********************************************//
// //
// //
// PROCESO WORM //
// //
// //
//*********************************************//
PROCESS worm(x,y,equipo);
PRIVATE
//VARIABLE PARA CONTROLAR LAS ANIMACIONES
inc_anim;
//VARIABLE QUE GUARDA EL ID DEL FICHERO DEL WORM (EN FUTURAS VERSIONES SERÁ IMPORTANTE)
fichero_local;
//VARIABLE QUE GUARDA LA DISTANCIA DESDE EL CENTRO HACIA LOS PIES
distancia_pies=10*resolucion_global;
//VARIABLE QUE GUARDA EL ESTADO DEL FRAME ANTERIOR
estado_anterior;
//VARIABLE QUE ESTABLECE LA FUERZA DE GRAVEDAD
descenso;
//VARIABLE PARA INCREMENTOS EN Y
inc_y;
BEGIN
//MULTIPLICO EL X E Y INICIALES POR LA RESOLUTION GLOBAL
x*=resolucion_global;
y*=resolucion_global;
//ESTABLEZCO LA RESOLUTION
resolution=resolucion_global;
//METO AL PROCESO EN EL SCROLL
ctype=c_scroll;
//PONGO LA CAMARA DEL SCROLL PARA QUE SIGA AL PROCESO
scroll[0].camera=ID;
//CARGO EL FICHERO CON LOS GRAFICOS DEL WORM
fichero_local=load_fpg("FPG/Worms.fpg");
file=fichero_local;
graph=1;
//EL SIGUIENTE IF - REPEAT BAJA AL WORM HASTA QUE ENCUENTRA EL SUELO (PARA POSICIONARLO MAS FACIL)
IF(control_dureza_suelo(x,y+distancia_pies)<>TRUE)
REPEAT
y+=1;
UNTIL(control_dureza_suelo(x,y+distancia_pies)==TRUE)
END
//ESTABLEZCO EL SUELO DONDE SE ESTA PISANDO
suelo=y;
LOOP
//SIEMPRE PONGO EL ESTADO A NORMAL AL PRINCIPIO DE CADA FRAME
estado=normal;
//MOVIMIENTO A LA IZQUIERDA
IF(key(_a) AND suelo==y)
flags=0;
SWITCH(control_rampa(x,y+distancia_pies,-avance_suelo))
CASE RAMPA_ABAJO;
x-=avance_suelo;
y+=conteo_rampa;
suelo=y;
estado=camina;
END
CASE RAMPA_ARRIBA;
x-=avance_suelo;
y-=conteo_rampa;
suelo=y;
estado=camina;
END
CASE SUELO_LLANO;
x-=avance_suelo;
estado=camina;
END
END
END
//MOVIMIENTO A LA DERECHA
IF(key(_d) AND suelo==y)
flags=1;
SWITCH(control_rampa(x,y+distancia_pies,avance_suelo))
CASE RAMPA_ABAJO;
x+=avance_suelo;
y+=conteo_rampa;
suelo=y;
estado=camina;
END
CASE RAMPA_ARRIBA;
x+=avance_suelo;
y-=conteo_rampa;
suelo=y;
estado=camina;
END
CASE SUELO_LLANO;
x+=avance_suelo;
estado=camina;
END
END
END
//CAIDA
IF(control_dureza_suelo(x,y+distancia_pies)==FALSE)
IF(suelo==y)
descenso=100;
END
suelo=-40000;
estado=caida;
inc_y=0;
REPEAT
y+=avance_caida_y;
inc_y+=avance_caida_y;
UNTIL(inc_y=>descenso OR control_dureza_suelo(x,y+distancia_pies)==TRUE)
IF(descenso<descenso_maximo)
descenso+=avance_caida_y;
END
ELSE
IF(suelo<>y)
suelo=y;
estado=normal;
END
END
IF(estado<>estado_anterior)
inc_anim=0;
END
estado_anterior=estado;
//ESTADO NORMAL
IF(estado==normal)
graph=anim_worm_normal[inc_anim];
inc_anim++;
IF(anim_worm_normal[inc_anim]==0)
inc_anim=0;
END
END
//ESTADO CAMINA
IF(estado==camina)
graph=anim_worm_camina[inc_anim];
inc_anim++;
IF(anim_worm_camina[inc_anim]==0)
inc_anim=0;
END
END
//ESTADO CAIDA
IF(estado==caida)
graph=anim_worm_caida[inc_anim];
inc_anim++;
IF(anim_worm_caida[inc_anim]==0)
inc_anim=0;
END
END
FRAME;
END
END
//*********************************************//
// //
// //
// PROCESO CIRCULO LOCO //
// //
// //
//*********************************************//
PROCESS circulo_loco(x,y);
PRIVATE
grafico_temp;
BEGIN
file=fichero_sistema;
graph=1;
ctype=c_scroll;
LOOP
IF(key(_c_minus) OR mouse.wheeldown)
size_x-=3;
size_y-=3;
END
IF(key(_c_plus) OR mouse.wheelup)
size_x+=3;
size_y+=3;
END
IF(key(_pgdn))
size_y-=3;
END
IF(key(_pgup))
size_y+=3;
END
IF(key(_home))
size_x+=3;
END
IF(key(_end))
size_x-=3;
END
IF(key(_left))
x-=3;
END
IF(key(_right))
x+=3;
END
IF(key(_up))
y-=3;
END
IF(key(_down))
y+=3;
END
x = scroll.x0 + mouse.x;
y = scroll.y0 + mouse.y;
IF(key(_backspace) OR mouse.right)
graph=1;
map_xxput(fichero_durezas,mapa_durezas,fichero_sistema,graph,x,y,0,size_x,size_y,0,0,0,0,255,0);
map_xxput(fichero_mapas,mapa_durezas,fichero_sistema,graph,x,y,0,size_x,size_y,0,0,0,0,255,0);
map_set_color(fichero_durezas,mapa_durezas,map_get_pixel(fichero_sistema,1,50,50),0,0,0);
map_set_color(fichero_mapas,mapa_durezas,map_get_pixel(fichero_sistema,1,50,50),0,0,0);
refresh_scroll(0);
END
IF(key(_enter) OR mouse.left)
graph=2;
map_xxput(fichero_durezas,mapa_durezas,fichero_sistema,graph,x,y,0,size_x,size_y,0,0,0,0,255,0);
map_xxput(fichero_mapas,mapa_durezas,fichero_sistema,graph,x,y,0,size_x,size_y,0,0,0,0,255,0);
refresh_scroll(0);
END
FRAME;
END
END
//*********************************************//
// //
// //
// FUNCION CONTROL DUREZA //
// //
// //
//*********************************************//
FUNCTION control_dureza_suelo(x,y);
PRIVATE
color_dureza;
BEGIN
x/=resolucion_global;
y/=resolucion_global;
color_dureza=map_get_pixel(fichero_durezas,mapa_durezas,x,y);
IF(color_dureza==color_dureza_verde)
RETURN(TRUE);
ELSE
RETURN(FALSE);
END
END
//*********************************************//
// //
// //
// FUNCION CONTROL RAMPA //
// //
// //
//*********************************************//
FUNCTION control_rampa(x,y,direccion);
PRIVATE
//VARIABLE QUE DEVUELVE EL TIPO DE RAMPA (MAS BIEN DE SUELO) QUE SE ESTA PISANDO
tipo_rampa;
//CONTADOR DE PIXELES, PARA VER CUANTOS PIXELES CORRELATIVOS HAY EN UNA MISMA LINEA VERTICAL
contador=1*resolucion_global;
//VARIABLE QUE INDICA HASTA CUANTOS PIXELES SE CONSIDERA RAMPA DESCENDENTE Y NO ABISMO
maximo_soporte_rampa_abajo=10*resolucion_global;
//VARIABLE QUE INDICA HASTA CUANTOS PIXELES SE CONSIDERA RAMPA ASCENDENTE Y NO PARED
maximo_soporte_rampa_arriba=10*resolucion_global;
BEGIN
//CONTROL PARA RAMPAS QUE BAJAN
IF(control_dureza_suelo(x,y)==TRUE AND control_dureza_suelo(x+direccion,y)==FALSE)
WHILE(contador<=maximo_soporte_rampa_abajo)
IF(control_dureza_suelo(x+direccion,y+contador)==TRUE)
tipo_rampa=RAMPA_ABAJO;
father.conteo_rampa=contador;
contador=maximo_soporte_rampa_abajo;
END
contador+=100;
END
IF(tipo_rampa==0)
tipo_rampa=SUELO_LLANO;
END
END
//CONTROL PARA RAMPAS QUE SUBEN
IF(control_dureza_suelo(x,y)==TRUE AND control_dureza_suelo(x+direccion,y)==TRUE)
WHILE(contador<=maximo_soporte_rampa_abajo)
IF(control_dureza_suelo(x+direccion,y-contador)==TRUE)
tipo_rampa=RAMPA_ARRIBA;
father.conteo_rampa=contador;
END
contador+=100;
END
//SI SE EXCEDE EL MAXIMO DE ESCALADA PERMITIDO, INDICA QUE HAY PARED
IF(control_dureza_suelo(x+direccion,y-contador)==TRUE)
tipo_rampa=PARED;
END
//SI NO SE DAN NINGUNA DE LAS OTRAS CONDICIONES, EL SUELO ES LLANO
IF(tipo_rampa==0)
tipo_rampa=SUELO_LLANO;
END
END
RETURN(tipo_rampa);
END