diff --git a/ediv/CHANGE_LOG.txt b/ediv/CHANGE_LOG.txt index 2dc108b..1e66d37 100644 --- a/ediv/CHANGE_LOG.txt +++ b/ediv/CHANGE_LOG.txt @@ -1,3 +1,12 @@ +24/10/2002 +---------- + * Ahora los id's de los procesos son siempre impares. (Er_Makina) + * Arreglado collision. He sustituido el algoritmo de choque entre dos cajas, + aunque no hacía falta, pero quizás así queda un poco más limpio. (Er_Makina) + * Añadido timer[], pero sólo en Win32. Hay que adaptarlo a Linux. (Er_Makina) + * tutor0b ya rula.. el robots asesinos ya parece que rula bien pero no puedo + mover al personaje, no se por qué... fallo en la input? (Er_Makina) + 21/10/2002 ---------- * delete_text() daba un runtime error si no existia el texto a eliminar. en diff --git a/ediv/bin/ROBOTS.PRG b/ediv/bin/ROBOTS.PRG new file mode 100644 index 0000000..bb4c43b --- /dev/null +++ b/ediv/bin/ROBOTS.PRG @@ -0,0 +1,318 @@ +/********************* + Los Robots Asesinos + ********************* + + (c) Er_Makina, 2000 + + www.sferasoft.org + + ******************** + Este programa es SOFTWARE LIBRE y puedes hacer con él + lo de te salga de las narices. Puedes modificarlo y + redistribuirlo libremente sin necesidad de notificar- + me nada. + ******************** + NOTAS: + - El programa funcionará bajo DIV 1 si se quita la 1ª + línea del programa (compiler_options) + - Para ejecutar el EXE, es necesario el archivo + DIV32RUN.DLL que podrás encontrar en la web oficial + de DIV (www.divgames.com) + ********************/ + +COMPILER_OPTIONS _extended_conditions; + +Program Juego_robots; +CONST + max_robots=25; + +GLOBAL + prota; + num_robots=5; + robots[max_robots]; + muerto[max_robots]; + muertos; + cogido; + ya; + +LOCAL + i; + +PRIVATE + protax; + protay; + mueve; + harf; + j; + espe; + +BEGIN + load_fpg("robots.fpg"); + load_fnt("system.fnt"); + write(1,0,0,0,"Pulsa F1 para obtener ayuda"); + write(1,160,100,4,"¨PREPARADO?"); + espe=1; + mouse.flags=4; + loop +// fade_on(); + prota=protag(rand(0,39)*8,rand(0,24)*8); + for(i=1;i<=num_robots;i++) + loop + x=rand(0,39); + y=rand(0,24); + graph=2; + if(fget_dist(x,y,prota.x/8,prota.y/8)>2) + x*=8; + y*=8; + if(i==1) + robots[i]=robot(x,y); + muerto[i]=0; + break; + else + harf=0; + for(j=1;j<=i-1;j++) + if(robots[j].x<>x && robots[j].y<>y) + harf++; + end + end + if(harf==i-1) + robots[i]=robot(x,y); + muerto[i]=0; + break; + end + end + end + end + end + graph=0; + protax=prota.x; + protay=prota.y; + if(espe) + timer[2]=0; + while(/*fading ||*/ timer[2]<200) + frame; + end + delete_text(all_text); + espe=0; + end + loop + frame; + if(cogido) + repeat + frame; + until(ya) + break; + end + if((key(_up) || key(_c_up) || key(_c_home) || key(_c_pgup)) && prota.y>0) + while(key(_up) || key(_c_up)) + frame; + end + protay-=8; + mueve=1; + end + if((key(_down) || key(_c_down) || key(_c_end) || key(_c_pgdn)) && prota.y<191) + while(key(_down) || key(_c_down)) + frame; + end + protay+=8; + mueve=1; + end + if((key(_left) || key(_c_left) || key(_c_home) || key(_c_end)) && prota.x>0) + while(key(_left) || key(_c_left) || key(_c_home) || key(_c_end)) + frame; + end + protax-=8; + mueve=1; + end + if((key(_right) || key(_c_right) || key(_c_pgup) || key(_c_pgdn)) && prota.x<311) + while(key(_right) || key(_c_right) || key(_c_pgup) || key(_c_pgdn)) + frame; + end + protax+=8; + mueve=1; + end + if(key(_c_center)) + while(key(_c_center)) + frame; + end + mueve=1; + end + if(key(_t)) + while(key(_t)) + frame; + end + loop + x=rand(0,39); + y=rand(0,24); + j=0; + for(i=1;i<=num_robots;i++) + if(fget_dist(x,y,robots[i].x/8,robots[i].y/8)>2) + j++; + end + end + if(j==num_robots) + break; + end + end + protax=x*8; + protay=y*8; + mueve=1; + end + if(key(_u)) + while(key(_u)) + frame; + end + protax=rand(0,39)*8; + protay=rand(0,24)*8; + mueve=1; + end + if(key(_f1)) + graph=14; + x=160; + y=100; + z=-20; + while(key(_f1)) + frame; + end + repeat + frame; + until(key(_space) || key(_enter)) + graph=0; + end + if(mueve==1) + prota.x=protax; + prota.y=protay; + mueve=0; + mueve_robots(); + end + end + //signal(prota,s_kill); + //signal(type robot,s_kill); + muertos=0; + cogido=0; + ya=0; + end +END + +Process Protag(x,y) +PRIVATE + imagen=0; + imagenes[12]=1,9,10,11,12,13,12,13,12,11,10,9,1; + saludando; + esp_frame; + coge_robot; + +BEGIN + graph=imagenes[imagen]; + timer[1]=0; + loop + frame; + if(coge_robot=collision(type robot)) + cogido=1; + if(coge_robot.graph==3) + write(1,160,100,4,"­­ PERO QU HACES !!"); + else + write(1,160,100,4,"­­ TE HAN COGIDO !!"); + end + write(1,160,199,7,"Pulsa una tecla"); + repeat + frame; + until(key(_space) || key(_enter)) + /*fade_off(); + while(fading) + frame; + end*/ + delete_text(all_text); + ya=1; + frame; + end + if(saludando==0 && timer[1]=>500) + saludando=1; + end + if(saludando==1) + if(imagen<12) + esp_frame++; + if(esp_frame==2) + esp_frame=0; + imagen++; + graph=imagenes[imagen]; + end + else + saludando=0; + imagen=0; + timer[1]=0; + end + end + if(muertos==num_robots) + cogido=1; + write(1,160,100,4,"­­ MUY BIEN !!"); + write(1,160,199,7,"Pulsa una tecla"); + num_robots++; + repeat + frame; + until(key(_space) || key(_enter)) + /*fade_off(); + while(fading) + frame; + end*/ + delete_text(all_text); + ya=1; + if(num_robots>max_robots) + //exit("­Te has pasado el juego!",0); + end + frame; + end + end +END + +Process Robot(x,y) +PRIVATE + imagen=0; + imagenes[3]=2,6,7,8; + ya_mue; + esp_frame; + +BEGIN + graph=imagenes[imagen]; + loop + frame; + if(collision(type robot)) + graph=3; + if(!ya_mue) + muertos++; + ya_mue=1; + end + end + if(graph<>3) + esp_frame++; + if(esp_frame==2) + esp_frame=0; + imagen=(imagen+1)mod 3; + graph=imagenes[imagen]; + end + end + end +END + +Process mueve_robots() +BEGIN + for(i=1;i<=num_robots;i++) + if(robots[i].graph==3) + muerto[i]=1; + end + if(!muerto[i]) + if(robots[i].xprota.x) + robots[i].x-=8; + end + if(robots[i].yprota.y) + robots[i].y-=8; + end + end + end +END diff --git a/ediv/ideQT/main.cpp b/ediv/ideQT/main.cpp index e77dcf7..dd5c93e 100644 --- a/ediv/ideQT/main.cpp +++ b/ediv/ideQT/main.cpp @@ -24,6 +24,9 @@ int main( int argc, char** argv ) RegCloseKey(subkey); Main.personal_folder.setLatin1((char*)datos); } + else { + Main.personal_folder.setLatin1(".\\"); + } #else Main.personal_folder.setLatin1(getenv("HOME")); #endif diff --git a/ediv/src/dlls/dlls.suo b/ediv/src/dlls/dlls.suo index 0611bbe..50fdb4e 100644 Binary files a/ediv/src/dlls/dlls.suo and b/ediv/src/dlls/dlls.suo differ diff --git a/ediv/src/dlls/edivstd/edivstd.c b/ediv/src/dlls/edivstd/edivstd.c index 7e7f1c5..f7f01c0 100644 --- a/ediv/src/dlls/edivstd/edivstd.c +++ b/ediv/src/dlls/edivstd/edivstd.c @@ -23,6 +23,17 @@ * DIV, tal como las opciones de compilación, estructura reserved, etc. */ +#ifdef _WIN32 +# include +# include + unsigned int tiempo; + unsigned int ultimo_tiempo; +#else +# error ¡adapta las rutinas de timer a Linux! +#endif + +#include + #include "export.h" //#include "../../shared/varindex.h" @@ -152,6 +163,7 @@ int ExportaFuncs(EXPORTAFUNCS_PARAMS) FUNCTION("define_region",5,eDiv_DefineRegion) ; ENTRYPOINT( first_load ) ; + ENTRYPOINT(frame); // POR HACER: funciones signal, system, ignore_error... @@ -201,7 +213,7 @@ int eDiv_GetId(FUNCTION_PARAMS) { return ( fp->procs_s[ fp->proc_orden[ i ] ].id ) ; } - } + } *last_type = 0 ; return 0 ; } @@ -242,6 +254,12 @@ void first_load(FUNCTION_PARAMS) { int i ; + #ifdef _WIN32 + struct timeb tiempob; + ftime(&tiempob); + ultimo_tiempo=tiempob.time*100+tiempob.millitm/10; + #endif + for ( i = 0 ; i < 32 ; i++ ) { regions[i].x = 0 ; @@ -253,8 +271,23 @@ void first_load(FUNCTION_PARAMS) fp->regions = regions ; fp->existe.regions = 1 ; - } +void frame(FUNCTION_PARAMS) +{ + int i; + int timer; + #ifdef _WIN32 + struct timeb tiempob; + ftime(&tiempob); + tiempo=tiempob.time*100+tiempob.millitm/10; + timer=globalptr("timer"); + for(i=0;i<10;i++) + fp->mem[timer+i]+=tiempo-ultimo_tiempo; + ultimo_tiempo=tiempo; + #endif +} + + diff --git a/ediv/src/dlls/export.h b/ediv/src/dlls/export.h index c4044a2..bdbaf0a 100644 --- a/ediv/src/dlls/export.h +++ b/ediv/src/dlls/export.h @@ -271,6 +271,7 @@ struct _fun_params{ TYPEOF_Critical_Error *Critical_Error ; TYPEOF_GetVarOffset *GetVarOffset ; TYPEOF_Stub_Quit *Stub_Quit ; + int imem_max; } ; diff --git a/ediv/src/dlls/graphics/graphics.vcproj b/ediv/src/dlls/graphics/graphics.vcproj index a4bb590..58122ac 100644 --- a/ediv/src/dlls/graphics/graphics.vcproj +++ b/ediv/src/dlls/graphics/graphics.vcproj @@ -105,6 +105,7 @@ SuppressStartupBanner="TRUE" IgnoreDefaultLibraryNames="LIBCMTD.lib" ModuleDefinitionFile=".\graphics.def" + GenerateDebugInformation="TRUE" ProgramDatabaseFile=".\Debug/graphics.pdb" ImportLibrary=".\Debug/graphics.lib"/> //#include #include "export.h" -#include "errors.h" +//#include "errors.h" // Falta añadir errors.h al CVS #include #include "graphics.h" #include "SDL_rotozoom.h" +#define ERR_CANNOTOPENFPG 105 +#define ERR_INVALIDFPGHEADER 106 +#define ERR_INVALIDMAPCODE 110 + +#define Miedzy(x,a,b) (((x) >= (a)) && ((x) <= (b))) + //#include "varindex.h" @@ -213,6 +219,22 @@ int ExportaFuncs(EXPORTAFUNCS_PARAMS) return TRUE; } +/* + * int IntersectionRR(int rc1left,int rc1top,int rc1right,int rc1bottom,int rc2left,int rc2top,int rc2right,int rc2bottom) + * Comprueba si hay colisión entre dos regiones rectangulares. + * + * Devuelve: + * 0 - No hay colisión + * 1 - Hay colisión + */ +int IntersectionRR(int rc1left,int rc1top,int rc1right,int rc1bottom,int rc2left,int rc2top,int rc2right,int rc2bottom) +{ + return ((Miedzy(rc1left,rc2left,rc2right) || Miedzy(rc1right,rc2left,rc2right) || + Miedzy(rc2left,rc1left,rc1right) || Miedzy(rc2right,rc1left,rc1right)) && + (Miedzy(rc1top,rc2top,rc2bottom) || Miedzy(rc1bottom,rc2top,rc2bottom) || + Miedzy(rc2top,rc1top,rc1bottom) || Miedzy(rc2bottom,rc1top,rc1bottom))); +} + /* A continuación las funciones que queremos exportar. Para una mayor * sencillez las hemos puesto en este mismo archivo, aunque puede ser * aconsejable ponerlas en archivos aparte. @@ -226,14 +248,19 @@ int eDIV_COLLISION(FUNCTION_PARAMS) int a, i ; SDL_Rect r1 , r2 ; a = getparm() ; + + id1 = fp->procs_s[ fp->proc_orden[ *fp->proceso_actual ] ].id ; + + g1 = local("graph",id1) ; + f1 = local("file",id1) ; + if ( files[f1].existe == 0 || files[f1].mapa[g1].existe == 0 ) + return 0; + // Si se le pasa un ID - if ( a < 4000000 ) + //if ( a < 4000000 ) + if(aimem_max) { - id1 = fp->procs_s[ fp->proc_orden[ *fp->proceso_actual ] ].id ; - g1 = local("graph",id1) ; - f1 = local("file",id1) ; - if ( files[f1].existe == 0 || files[f1].mapa[g1].existe == 0 ) - return -1 ; + if(a==id1) return 0; r1.x = local("x",id1) ; r1.y = local("y",id1) ; r1.w = files[f1].mapa[g1].Surface->w ; @@ -242,47 +269,66 @@ int eDIV_COLLISION(FUNCTION_PARAMS) g2 = local("graph",id2) ; f2 = local("file",id2); if ( files[f2].existe == 0 || files[f2].mapa[g2].existe == 0 ) - return -1 ; + return 0; r2.x = local("x",id2) ; r2.y = local("y",id2) ; r2.w = files[f2].mapa[g2].Surface->w ; r2.h = files[f2].mapa[g1].Surface->h ; //Colision barata :P - if (!( (r2.x > r1.x && r2.x > r1.x + r1.w) || (r2.x+r2.w < r1.x && r2.x+r2.w r1.x && r2.x > r1.x + r1.w) || (r2.x+r2.w < r1.x && r2.x+r2.w r1.y && r2.y > r1.y + r1.h) || (r2.y+r2.h < r1.y && r2.y+r2.hnum_procs ; i++ ) + + if(*type_scan!=a) { + *id_scan=0; + *type_scan=a; + } + + for ( i = *id_scan+1 ; i < *fp->num_procs ; i++ ) { - id1 = fp->procs_s[ fp->proc_orden[ i ] ].id ; + id2 = fp->procs_s[ fp->proc_orden[ i ] ].id; + if(id2==id1) continue; + printf("collision: %d\n",id2); //Si el proceso se corresponde con el type - if ( reserved("process_type",id1) == a ) + if ( reserved("process_type",id2) == a ) { - g1 = local("graph",id1) ; - f1 = local("file",id1) ; - if ( files[f1].existe == 0 || files[f1].mapa[g1].existe == 0 ) - return -1 ; + printf("collision: encontrado: id %d\n",id2); r1.x = local("x",id1) ; r1.y = local("y",id1) ; r1.w = files[f1].mapa[g1].Surface->w ; r1.h = files[f1].mapa[g1].Surface->h ; - id2 = a ; + //id2 = a ; g2 = local("graph",id2) ; f2 = local("file",id2) ; if ( files[f2].existe == 0 || files[f2].mapa[g2].existe == 0 ) - return -1 ; + continue; r2.x = local("x",id2) ; r2.y = local("y",id2) ; r2.w = files[f2].mapa[g2].Surface->w ; r2.h = files[f2].mapa[g1].Surface->h ; //Colision barata :P - if (!( (r2.x > r1.x && r2.x > r1.x + r1.w) || (r2.x+r2.w < r1.x && r2.x+r2.w r1.y && r2.y > r1.y + r1.h) || (r2.y+r2.h < r1.y && r2.y+r2.h r1.x && r2.x > r1.x + r1.w) || (r2.x+r2.w < r1.x && r2.x+r2.w r1.y && r2.y > r1.y + r1.h) || (r2.y+r2.h < r1.y && r2.y+r2.himem_max-iloc_len) critical_error(8); // demasiados procesos en ejecución memcpy(&mem[procs_s[num_proc].id],&mem[iloc],iloc_pub_len<<2); reserved("process_id",procs_s[num_proc].id)=procs_s[num_proc].id; @@ -548,7 +549,8 @@ int proceso( int num, int padre ) if ( devolver > 0 && no_devuelve == 0 ) { - pila[++sp] = 0 ;// AQUI SE DEBERA DEVOLVER EL ID + //pila[++sp] = 0 ;// AQUI SE DEBERA DEVOLVER EL ID + pila[++sp]=procs_s[num_proc].id; devolver-- ; } diff --git a/ediv/src/stub/stub.c b/ediv/src/stub/stub.c index abf4bcb..505d5d7 100644 --- a/ediv/src/stub/stub.c +++ b/ediv/src/stub/stub.c @@ -322,7 +322,7 @@ int main(int argc, char* argv[]) switch( event[0].type ) { case SDL_QUIT: - assert(0); + //assert(0); stub_quit(0) ; break ; case SDL_NOEVENT: diff --git a/ediv/src/visual c/ediv_ws.suo b/ediv/src/visual c/ediv_ws.suo index 31071c8..85d99a1 100644 Binary files a/ediv/src/visual c/ediv_ws.suo and b/ediv/src/visual c/ediv_ws.suo differ