First commit 16/12/1996

This commit is contained in:
2021-09-08 21:02:03 +02:00
commit 1de08b2d10
24 changed files with 2822 additions and 0 deletions

757
DYNA_TBL.JD Normal file
View File

@ -0,0 +1,757 @@
/**************************************************************************\
|* *|
|* DYNA_TBL *|
|* *|
|* Descripci<63>n: *|
|* M<>dulo encargado de cargar los elementos del tablero y *|
|* enemigos del juegos. Tambi<62>n se encarga de generar el *|
|* tablero seg<65>n preferencias de usuario... *|
|* *|
|* Fecha: 17-07-96 00.08 / 01.34 *|
|* 18-07-96 12.51 / 14.24 *|
|* 15.10 / *|
|* *|
\**************************************************************************/
#include <alloc.h>
#include <stdio.h>
#include "..\modex\modex.h"
#include "..\modex\c_utils.h"
#include <conio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
// Defino las posiciones dentro de Sprite que ocupan los distintos elementos
// y el tipo de Sprite del que se trata
#define POS_NUMEROS 0
#define POS_ELEM_MAPA 1
#define POS_POWERUP 2
#define POS_BOMBA 3
#define POS_TELEPORT 4
#define POS_GLOBO 5
#define POS_GOSTH 6
#define POS_ESTRELLA 7
#define POS_BAQUERO 8
#define POS_PLATANO 9
#define POS_BOSQUE 18
#define SPR_NUMEROS 3
#define SPR_ELEM_MAPA 2
#define SPR_POWERUP 0
#define SPR_BOMBA 4
#define SPR_TELEPORT 4
#define SPR_GLOBO 5
#define SPR_GOSTH 5
#define SPR_ESTRELLA 6
#define SPR_BAQUERO 5
#define SPR_PLATANO 5
int CargaPaleta(char *file);
void ProcesaPuntoBasico( int x, int y, char color );
int MuestraImagen( char *file, int page, int col_Inv );
int CargaObjetosBasicos( void );
int InsertaObjetosBase( int Objetos );
int InicializaElementosBasicos( void );
int MemoriaBitmap( int Pos, int TipoSprite );
void LiberaMemoriaObjetos(void);
void InicializaJuego(void);
typedef struct
{
char Entorno;
} PREFERENCIAS;
typedef struct
{
char NDirecciones; // # de direcciones
// Inicio del Despl a...
char Inicios[5]; // Izq, Der, Arr, Abj, Muerte
char Movimientos[5]; // Movimientos por cada direcci<63>n
unsigned char Ancho, Alto; // Dimensiones del objeto
} DatosTipo;
typedef struct EnemigO
{
char Tipo; // Cada tipo de enemigo tiene un codigo
// de ajuste...
char *Sprite[5]; // 5 puteros por direccion + muerte
} SPRITE;
SPRITE *Sprite;
int NObjetos=0; // # de objetos ya contenidos en Sprite
// Establece preferencias
PREFERENCIAS Pref = { POS_BOSQUE };
// Esta informaci<63>n es constante y sirve para saber como tratar a los Sprite's
const DatosTipo InfoSprites[] = {
// 00 > Cuadros est<73>ticos 16x16 ( Power UPs )
0x02,
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x12, 0x00, 0x00, 0x00, 0x00 },
0x10, 0x10,
// 01 > Cuadros est<73>ticos 16x16 ( Unidades )
0x02,
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x01, 0x00, 0x00, 0x00, 0x00 },
0x10, 0x10,
// 02 > Cuadros est<73>ticos 16x16 ( Mapas )
0x02,
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x2D, 0x00, 0x00, 0x00, 0x00 },
0x10, 0x10,
// 03 > Cuadros est<73>ticos 16x18 ( Numeros )
0x02,
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x0A, 0x00, 0x00, 0x00, 0x00 },
0x10, 0x12,
// 04 > Anim. como Bomba, TelePort... 16x18
0x02,
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x03, 0x03, 0x03, 0x03, 0x03 },
0x10, 0x12,
// 05 > Monstruos como Globo y Fantasma 16x18
0x02,
{ 0x00, 0x00, 0x00, 0x00, 0x03 },
{ 0x03, 0x03, 0x03, 0x03, 0x06 },
0x10, 0x12,
// 06 > Monstruos 4dir. Estrella... 16x18
0x05,
{ 0x00, 0x03, 0x06, 0x09, 0x0C },
{ 0x03, 0x03, 0x03, 0x03, 0x06 },
0x10, 0x12,
};
char prt_tbl[13][21] =
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0 },
{ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0 },
{ 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0 },
{ 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
void Error(int code)
{
set_video_mode (3);
LiberaMemoriaObjetos();
exit(code);
};
int MuestraMenu(void)
{
return ERROR;
};
void ComienzaJuego(void)
{};
int MuestraMensajeCargando(void)
{
if ( MuestraImagen( "images\\dyna_car.pcx", 1, -1 ) == ERROR ) Error(0x12);
copy_page(1, 2);
copy_bitmap ( 2, 81, 85, 108, 112, 1, 81, 175 );
if ( CargaPaleta( "images\\dyna_car.pcx" ) !=OK ) Error(0x11);
copy_page(1, 0);
// if ( InicializaSonidos() != OK ) Error(0x20);
copy_bitmap ( 2, 81, 175, 108, 202, 0, 81, 85 );
if ( CargaObjetosBasicos() != OK ) Error(0x12);
copy_bitmap ( 2, 81, 175, 108, 202, 0, 81, 128 );
// Inicializa mapa
copy_bitmap ( 2, 81, 175, 108, 202, 0, 81, 175 );
return OK;
};
int main( void )
{
printf( "\n> Inicializando ModoX" );
printf( "\n> Jos<6F> David Guillen" );
init_random ();
if (set_vga_modex( Mode_360x240, 360, 240, 3) == 0) Error(0x00);
if ( MuestraMensajeCargando() != OK ) Error(0x10);
/*
while ( MuestraMenu() == OK )
{
*/
InicializaJuego();
set_display_page( 2 );
if ( CargaPaleta("images\\dyna_tbl.pcx") !=OK ) Error(0x11);
while( getch()!=27 )
{
InicializaJuego();
};
/*
copy_page( 2, 1 );
copy_page( 2, 0 );
ComienzaJuego();
};
*/
set_video_mode (3);
LiberaMemoriaObjetos();
printf( "\n> Gracias a todos los que han echo posible este juego. " );
printf( "\n> En especial a mi hermano Antonio. " );
printf( "\n> Jos<6F> David Guillen || _-<2D> FuTuRe ViSiOn <20>-_ || InfoMundo" );
printf( "\n>_ " );
fflush( stdin );
return OK;
}
/**************************************************************************\
|* *|
|* CargaObjetosBasicos *|
|* *|
|* Descripci<63>n: *|
|* Carga los objetos Basicos del fichero Dyna_tbl.PCX *|
|* *|
|* *|
|* Entradas: (ninguna) *|
|* *|
|* Salidas: OK Todo ha ido bien *|
|* ERROR Algo va mal *|
|* *|
\**************************************************************************/
int CargaObjetosBasicos( void )
{
FILE *fp;
int ancho, alto;
int contador;
unsigned char byte;
// Pido memoria para los elementos b<>sicos
if ( InicializaElementosBasicos() != OK ) return ERROR;
// Abrimos el fichero
if ( (fp = fopen("images\\dyna_tbl.pcx","rb")) == NULL ) return ERROR;
// Saltamos la cabecera
fseek( fp, 128, SEEK_SET );
for(alto=0; alto<200; alto++)
{
for(ancho=0; ancho<320; )
{
byte=getc(fp);
if(byte<=0xC0)
{
byte = byte == 254 ? 0 : byte;
ProcesaPuntoBasico( ancho, alto, byte );
ancho++;
}
else
{
contador=byte&0x3F; byte=getc(fp);
byte = byte == 254 ? 0 : byte;
for(; contador>0; contador--)
{
ProcesaPuntoBasico( ancho, alto, byte );
ancho++;
}
}
}
}
return OK;
}
/**************************************************************************\
|* *|
|* ProcesaPuntoBasico *|
|* *|
|* Descripci<63>n: *|
|* inserta la imagen en su lugar correspondiente *|
|* *|
|* Entradas: x,y coordenadas actuales del punto *|
|* byte color *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void ProcesaPuntoBasico( int x, int y, char color )
{
int i, j, Xw, Yw;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Guarda al Globo 16x18
Xw = InfoSprites[ SPR_GLOBO ].Ancho;
Yw = InfoSprites[ SPR_GLOBO ].Alto;
for ( i=0; i<3; i++ )
if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 0 && y < 18 )
Sprite[POS_GLOBO].Sprite[0][( ( x - (Xw+1)*i ) + (Xw*y) ) + (Xw*Yw*i)] = color;
for ( i=3; i<9; i++ )
if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 0 && y < 18 )
Sprite[POS_GLOBO].Sprite[4][( ( x - (Xw+1)*i ) + (Xw*y) ) + (Xw*Yw*(i-3))] = color;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Guarda al Fantasma 16x18
Xw = InfoSprites[ SPR_GOSTH ].Ancho;
Yw = InfoSprites[ SPR_GOSTH ].Alto;
for ( i=0; i<3; i++ )
if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 19 && y < 37 )
Sprite[POS_GOSTH].Sprite[0][( ( x - (Xw+1)*i ) + (Xw*(y-19)) ) + (Xw*Yw*i)] = color;
for ( i=3; i<9; i++ )
if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 19 && y < 37 )
Sprite[POS_GOSTH].Sprite[4][( ( x - (Xw+1)*i ) + (Xw*(y-19)) ) + (Xw*Yw*(i-3))] = color;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Guarda al Baquero 16x18
Xw = InfoSprites[ SPR_BAQUERO ].Ancho;
Yw = InfoSprites[ SPR_BAQUERO ].Alto;
for ( i=0; i<3; i++ )
if ( x >= (0 + (Xw+1)*(i+9)) && x < (Xw + (Xw+1)*(i+9)) && y >= 0 && y < 18 )
Sprite[POS_BAQUERO].Sprite[0][( ( x - (Xw+1)*(i+9) ) + (Xw*y) ) + (Xw*Yw*i)] = color;
for ( i=3; i<9; i++ )
if ( x >= (0 + (Xw+1)*(i+9)) && x < (Xw + (Xw+1)*(i+9)) && y >= 0 && y < 18 )
Sprite[POS_BAQUERO].Sprite[4][( ( x - (Xw+1)*(i+9) ) + (Xw*y) ) + (Xw*Yw*(i-3))] = color;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Guarda al Platano 16x18
Xw = InfoSprites[ SPR_PLATANO ].Ancho;
Yw = InfoSprites[ SPR_PLATANO ].Alto;
for ( i=0; i<3; i++ )
if ( x >= (0 + (Xw+1)*(i+9)) && x < (Xw + (Xw+1)*(i+9)) && y >= 19 && y < 37 )
Sprite[POS_PLATANO].Sprite[0][( ( x - (Xw+1)*(i+9) ) + (Xw*(y-19)) ) + (Xw*Yw*i)] = color;
for ( i=3; i<9; i++ )
if ( x >= (0 + (Xw+1)*(i+9)) && x < (Xw + (Xw+1)*(i+9)) && y >= 19 && y < 37 )
Sprite[POS_PLATANO].Sprite[4][( ( x - (Xw+1)*(i+9) ) + (Xw*(y-19)) ) + (Xw*Yw*(i-3))] = color;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Guarda la Bomba 16x18
Xw = InfoSprites[ SPR_BOMBA ].Ancho;
Yw = InfoSprites[ SPR_BOMBA ].Alto;
for ( i=0; i<3; i++ )
if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 38 && y < 56 )
Sprite[POS_BOMBA].Sprite[0][( ( x - (Xw+1)*i) + (Xw*(y-38)) ) + (Xw*Yw*i)] = color;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Guarda el TelePort 16x18
Xw = InfoSprites[ SPR_TELEPORT ].Ancho;
Yw = InfoSprites[ SPR_TELEPORT ].Alto;
for ( i=0; i<3; i++ )
if ( x >= (0 + (Xw+1)*(i+3)) && x < (Xw + (Xw+1)*(i+3)) && y >= 38 && y < 56 )
Sprite[POS_TELEPORT].Sprite[0][( ( x - (Xw+1)*(i+3)) + (Xw*(y-38)) ) + (Xw*Yw*i)] = color;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Guarda los Numeros 16x18
Xw = InfoSprites[ SPR_NUMEROS ].Ancho;
Yw = InfoSprites[ SPR_NUMEROS ].Alto;
for ( i=0; i<10; i++ )
if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 76 && y < 94 )
Sprite[POS_NUMEROS].Sprite[0][( ( x - (Xw+1)*i) + (Xw*(y-76)) ) + (Xw*Yw*i)] = color;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Guarda los PowerUps
Xw = InfoSprites[ SPR_POWERUP ].Ancho;
Yw = InfoSprites[ SPR_POWERUP ].Alto;
for ( j=0; j<2; j++ )
for ( i=0; i<9; i++ )
if ( x >= (0 + (Xw+1)*i) && x < (Xw + (Xw+1)*i) && y >= 114+17*j && y < 130+17*j )
Sprite[POS_POWERUP].Sprite[0][( ( x - (Xw+1)*i) + (Xw*(y-(114+16*j))) ) + (Xw*Yw*(i+j*9))] = color;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Guarda los Mapas
Xw = InfoSprites[ SPR_ELEM_MAPA ].Ancho;
Yw = InfoSprites[ SPR_ELEM_MAPA ].Alto;
for ( j=0; j<5; j++ )
for ( i=0; i<9; i++ )
if ( x >= (0 + (Xw+1)*(i+9)) && x < (Xw + (Xw+1)*(i+9)) && y >= 114+17*j && y < 130+17*j )
Sprite[POS_ELEM_MAPA].Sprite[0][( ( x - (Xw+1)*(i+9)) + (Xw*(y-(114+17*j))) ) + (Xw*Yw*(i+9*j))] = color;
}
/**************************************************************************\
|* *|
|* InicializaElementosBasicos *|
|* *|
|* Descripci<63>n: *|
|* Pide memoria para los 9 elementos b<>sicos... *|
|* *|
|* Entradas: (ninguna) *|
|* *|
|* Salidas: OK Todo ha ido bien *|
|* ERROR Algo va mal *|
|* *|
\**************************************************************************/
int InicializaElementosBasicos( void )
{
// Pedimos memoria base para
if ( InsertaObjetosBase( 10) != OK ) return ERROR;
// Pide espacio para el BitMap del objeto, incluida animaci<63>n:
if (
// Numeros
MemoriaBitmap( POS_NUMEROS, SPR_NUMEROS ) != OK ||
// Elementos del Mapa
MemoriaBitmap( POS_ELEM_MAPA, SPR_ELEM_MAPA ) != OK ||
// Power Ups ( peque<75>os )
MemoriaBitmap( POS_POWERUP, SPR_POWERUP ) != OK ||
// Bomba
MemoriaBitmap( POS_BOMBA, SPR_BOMBA ) != OK ||
// TelePort
MemoriaBitmap( POS_TELEPORT, SPR_TELEPORT ) != OK ||
// Globo
MemoriaBitmap( POS_GLOBO, SPR_GLOBO ) != OK ||
// Fantasma
MemoriaBitmap( POS_GOSTH, SPR_GOSTH ) != OK ||
// Estrella
MemoriaBitmap( POS_ESTRELLA, SPR_ESTRELLA ) != OK ||
// Baquero
MemoriaBitmap( POS_BAQUERO, SPR_BAQUERO ) != OK ||
// Platano
MemoriaBitmap( POS_PLATANO, SPR_PLATANO ) != OK
) return ERROR;
return OK;
}
/**************************************************************************\
|* *|
|* InsertaObjetosBase *|
|* *|
|* Descripci<63>n: *|
|* Pide memoria para las estructuras de soporte de SPRITE *|
|* *|
|* Entradas: Estructuras de SPRITE a insertar *|
|* *|
|* Salidas: OK Todo ha ido bien *|
|* ERROR Algo va mal *|
|* *|
\**************************************************************************/
int InsertaObjetosBase( int Objetos )
{
// Si no hay ningun elemento, solo pido los reclamados
if ( Sprite == NULL )
{
if ( (Sprite = (SPRITE *)calloc( Objetos, sizeof(SPRITE) )) == NULL )
return ERROR;
NObjetos = Objetos;
} else {
NObjetos += Objetos;
if ( (Sprite = (SPRITE *)realloc( Sprite, sizeof(SPRITE)*NObjetos ) ) == NULL )
return NULL;
}
return OK;
}
/**************************************************************************\
|* *|
|* MemoriaBitmap *|
|* *|
|* Descripci<63>n: *|
|* Libera la memoria asignada para los objetos *|
|* *|
|* Entradas: ( ninguna ) *|
|* Salidas: ( ninguna ) *|
|* *|
\**************************************************************************/
int MemoriaBitmap( int Pos, int TipoSprite )
{
int i;
// Rango no valido
if ( Pos >= NObjetos )
return ERROR;
// El sprite que ocupa esa posici<63>n esta ocupado
if ( Sprite[Pos].Sprite[0] == NULL )
{
// Por cada direccion, miro cuantos sprites le corresponden.
for ( i = 0; i < InfoSprites[TipoSprite].NDirecciones - 1 && i < 4; i++)
if ( InfoSprites[TipoSprite].Movimientos[i] != 0 )
if ( ( Sprite[Pos].Sprite[i] = (char *)malloc( sizeof(char)*InfoSprites[TipoSprite].Movimientos[i]*InfoSprites[TipoSprite].Ancho*InfoSprites[TipoSprite].Alto ) ) == NULL )
return ERROR;
// La muerte siempre esta en el punto 5
if ( InfoSprites[TipoSprite].Movimientos[4] != 0 )
if ( ( Sprite[Pos].Sprite[4] = (char *)malloc( sizeof(char)*InfoSprites[TipoSprite].Movimientos[4]*InfoSprites[TipoSprite].Ancho*InfoSprites[TipoSprite].Alto ) ) == NULL )
return ERROR;
} else return ERROR;
return OK;
}
/**************************************************************************\
|* *|
|* LiberaMemoriaObjetos *|
|* *|
|* Descripci<63>n: *|
|* Libera la memoria asignada para los objetos *|
|* *|
|* Entradas: ( ninguna ) *|
|* Salidas: ( ninguna ) *|
|* *|
\**************************************************************************/
void LiberaMemoriaObjetos(void)
{
int Objeto, DirObjeto;
// Este proceso empieza desde los mas enraizados punteros hacia afuera
// Recorre cada objeto de la estructura para eliminar su doble puntero
for ( Objeto=0; Objeto < NObjetos; Objeto++ )
{
// Recorro cada direcci<63>n del objeto
for ( DirObjeto=0; DirObjeto < InfoSprites[Sprite[Objeto].Tipo].NDirecciones; DirObjeto++ )
free( Sprite[Objeto].Sprite[DirObjeto] );
}
// Ya podemos eliminar la estructura.
free ( Sprite );
}
/**************************************************************************\
|* *|
|* CargaPaleta *|
|* *|
|* Descripci<63>n: *|
|* Carga la paleta con los colores por defecto *|
|* *|
|* *|
|* Entradas: achivo PCX de donde cargar la paleta *|
|* *|
|* Salidas: OK Todo ha ido bien *|
|* ERROR Algo va mal *|
|* *|
\**************************************************************************/
int CargaPaleta(char *file )
{
int index;
FILE *fp;
if ( (fp=fopen( file, "rb" ) ) == NULL )
return ERROR;
if ( fseek( fp, -768L, SEEK_END ) == 0 )
{
for (index=0; index<256; index++)
{
// get the red component
// get the green component
// get the blue component
// set components
set_dac_register ( index, (getc(fp) >> 2), (getc(fp) >> 2), (getc(fp) >> 2) );
} // end for index
}
fclose( fp );
return OK;
}
/**************************************************************************\
|* *|
|* InicializaJuego *|
|* *|
|* Descripci<63>n: *|
|* Inicializa el tablero de juego segun se especifique en *|
|* puntero de tablero. *|
|* *|
|* Entradas: (ninguna) *|
|* *|
|* Salidas: OK Todo ha ido bien *|
|* ERROR Algo va mal *|
|* *|
\**************************************************************************/
void InicializaJuego(void)
{
int j, i;
int Xw, Yw;
int Elecc = 0;
set_active_page(2);
// 1<> Relleno el suelo
Xw = InfoSprites[SPR_ELEM_MAPA].Ancho;
Yw = InfoSprites[SPR_ELEM_MAPA].Alto;
for( j = 0; j < 350; j+=16 )
for ( i = 0; i < 230; i+=16 )
draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), j, i, Xw, Yw );
// 2<> Pongo el marco al tablero
MuestraImagen( "images\\dyna_fnd.pcx", 2, 255 );
// 3<> Coloco los cuadros indestructibles
for ( i = 0; i < 21; i++ )
for ( j = 0; j < 13; j++ )
{
if ( prt_tbl[j][i] == 1 )
{
tdraw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+Elecc) ), 12+i*16, 20+j*16, Xw, Yw );
Elecc = random_int(2);
}
}
char prt_tbl2[13][21];
for ( j = 0; j<13; j++)
for ( i = 0; i<21; i++)
prt_tbl2[j][i] = prt_tbl[j][i];
// 4<> Coloco los cuadros destructibles
// Uno los dos intentos, para reforzar el n<> de arboles que aparecen
// >>>>>>>> 1<> intento del algoritmo que soporta 4
for ( i = 0; i<21*13; i++)
{
Elecc = random_int(2);
j = random_int(21*13);
if ( prt_tbl[j/21][j%21] == 0 )
{
tdraw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+2+Elecc) ), 12+(j%21)*16, 20+(j/21)*16, Xw, Yw );
prt_tbl[j/21][j%21] = 2;
}
}
// >>>>>>>> 2<> intento del algoritmo que soporta 4
for ( i = 0; i < 21; i++ )
for ( j = 0; j < 13; j++ )
{
Elecc = random_int(2);
if ( prt_tbl[j][i] == 0 && random_int(5)%2 )
{
tdraw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+2+Elecc) ), 12+i*16, 20+j*16, Xw, Yw );
prt_tbl[j][i] = 2;
}
}
// Dejo respirar a los jugadores
prt_tbl[ 0][ 0] = 0; prt_tbl[ 0][ 1] = 0; prt_tbl[ 1][ 0] = 0;
draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 0, 20+16* 0, Xw, Yw );
draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 0, 20+16* 1, Xw, Yw );
draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 1, 20+16* 0, Xw, Yw );
prt_tbl[ 0][12] = 0; prt_tbl[ 1][12] = 0; prt_tbl[ 0][11] = 0;
draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 0, 20+16* 12, Xw, Yw );
draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 1, 20+16* 12, Xw, Yw );
draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 0, 20+16* 11, Xw, Yw );
prt_tbl[20][ 0] = 0; prt_tbl[19][ 0] = 0; prt_tbl[20][ 1] = 0;
draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 20, 20+16* 0, Xw, Yw );
draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 19, 20+16* 0, Xw, Yw );
draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 20, 20+16* 1, Xw, Yw );
prt_tbl[20][12] = 0; prt_tbl[20][11] = 0; prt_tbl[19][12] = 0;
draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 20, 20+16* 12, Xw, Yw );
draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 20, 20+16* 11, Xw, Yw );
draw_bitmap ((char far*)( Sprite[POS_ELEM_MAPA].Sprite[0] + Xw * Yw * (Pref.Entorno+4) ), 12+16* 19, 20+16* 12, Xw, Yw );
// 1 cuadro indestructible
// 2 cuadro destructible
// A jugador A 1
// B jugador B 2
// C jugador C 3
// D jugador D 4
for ( j = 0; j<13; j++)
for ( i = 0; i<21; i++)
prt_tbl[j][i] = prt_tbl2[j][i];
};
/**************************************************************************\
|* *|
|* MuestraImagen *|
|* *|
|* Descripci<63>n: *|
|* Descomprime y copia a la pagina indicada un PCX *|
|* *|
|* Entradas: nombre de la imagen *|
|* pagina *|
|* color_invisible ( -1 si ninguno ) *|
|* *|
|* *|
|* Salidas: OK Todo ha ido bien *|
|* ERROR Algo va mal *|
|* *|
\**************************************************************************/
int MuestraImagen( char *file, int page, int col_Inv )
{
int curr_page;
FILE *fp;
int alto, ancho, contador;
unsigned char byte;
if ( (fp = fopen( file,"rb")) != NULL )
{
curr_page = get_active_page();
set_active_page(page);
// Saltamos la cabecera
fseek( fp, 128, SEEK_SET );
for(alto=0; alto<240; alto++)
{
for(ancho=0; ancho<360; )
{
byte=getc(fp);
if(byte<=0xC0)
{
if ( col_Inv < 0 || byte != col_Inv ) set_point (ancho, alto, byte);
ancho++;
}
else
{
contador=byte&0x3F; byte=getc(fp);
for(; contador>0; contador--)
{
if ( col_Inv < 0 || byte != col_Inv ) set_point (ancho, alto, byte);
ancho++;
}
}
}
}
fclose(fp);
} else return ERROR;
set_active_page(curr_page);
return OK;
}