DYNA/DYNA_TBL.JD
2021-09-08 21:02:03 +02:00

758 lines
30 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**************************************************************************\
|* *|
|* DYNA_TBL *|
|* *|
|* Descripci¢n: *|
|* M¢dulo encargado de cargar los elementos del tablero y *|
|* enemigos del juegos. Tambin se encarga de generar el *|
|* tablero seg£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¢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¢n es constante y sirve para saber como tratar a los Sprite's
const DatosTipo InfoSprites[] = {
// 00 > Cuadros est ticos 16x16 ( Power UPs )
0x02,
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x12, 0x00, 0x00, 0x00, 0x00 },
0x10, 0x10,
// 01 > Cuadros est ticos 16x16 ( Unidades )
0x02,
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x01, 0x00, 0x00, 0x00, 0x00 },
0x10, 0x10,
// 02 > Cuadros est ticos 16x16 ( Mapas )
0x02,
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x2D, 0x00, 0x00, 0x00, 0x00 },
0x10, 0x10,
// 03 > Cuadros est 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 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 David Guillen || _-ù FuTuRe ViSiOn ù-_ || InfoMundo" );
printf( "\n>_ " );
fflush( stdin );
return OK;
}
/**************************************************************************\
|* *|
|* CargaObjetosBasicos *|
|* *|
|* Descripci¢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¢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;
// þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
// 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;
// þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
// 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;
// þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
// 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;
// þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
// 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;
// þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
// 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;
// þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
// 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;
// þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
// 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;
// þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
// 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;
// þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
// 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¢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¢n:
if (
// Numeros
MemoriaBitmap( POS_NUMEROS, SPR_NUMEROS ) != OK ||
// Elementos del Mapa
MemoriaBitmap( POS_ELEM_MAPA, SPR_ELEM_MAPA ) != OK ||
// Power Ups ( peque¤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¢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¢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¢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¢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¢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¢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¢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¢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;
}