1 // --------------------------------------------------------
3 // --------------------------------------------------------
4 // Copyright (c) Kronoman
5 // En memoria de mi querido padre
6 // --------------------------------------------------------
7 // Todo lo relacionado con los enemigos
8 // --------------------------------------------------------
20 /* velocidad maxima X, Y */
21 #define MAX_VEL_E_X 15
22 #define MAX_VEL_E_Y 15
24 /* Cantidad maxima de tipos de enemigos/armas, con 100 es mas que suficiente */
25 #define MAX_E_CLASS 100
27 /* Esta bandera indica cuando el enemigo esta muerto
28 DEBE ser un valor NEGATIVO, ej: -150
29 Es para que agonize en llamas... :^P
30 Para los monstruos (boss) se multiplica x 2 <- DEBUG: NO IMPLEMENTADO! */
31 #define ENE_MUERTO -200
33 /* Tipo de datos que contiene la definicion de armas de los enemigos */
34 typedef struct ARMA_ENE
{
35 BITMAP
*spr
; /* sprite que representa el disparo */
36 struct PMASK
*mask
; /* mascara de choque */
37 SAMPLE
*snd
[2]; /* 0 = sonido al dispararlo, 1 = sonido al impactar */
39 fixed vx
, vy
; /* velocidad x, y */
40 int vida
; /* duracion del disparo, si es < 1, el tipo de arma no existe */
41 int punch
; /* `golpe` del arma */
43 int t
; /* tipo de disparo:
44 0 = recto [sale del centro]
48 4 = 1 direccionado hacia el jugador (sale hacia el jugador)
49 5 = 5 tiros direccionados (apunta al jugador, solo en X)
51 7 = 20 a 30 al azar (ideal para boss)
52 8 = 20 direccionados (ideal para boss)
53 9 = 20 a 30 en todas direcciones (ideal para boss)
54 10 = 5 a 30 en todas direcciones (ideal para boss)
55 11 = 4 a 8 en todas direcciones (para un enemigo)
58 /* Esto es referente a la estela de particulas que
59 el arma puede dejar, o no.
60 Cada parametro tiene 2 indices, el valor minimo y maximo que puede tomar
61 respectivamente (para variacion al azar)
62 Cabe aclarar que la dx, dy es un numero decimal multiplicado por 100 (100 = 0.01)
63 Si vida[0] <= 0, no deja ninguna estela */
64 int est_vida
[2]; /* vida de la particula */
65 int est_cant
[2]; /* cantidad de particulas x frame */
66 int est_color
[3][2]; /* color, el primer indice indica RGB, y el 2ndo min-max */
67 int est_dx
[2]; /* aceleracion x inicial (100 = 0.01) */
68 int est_dy
[2]; /* aceleracion y inicial */
69 int est_tipo
[2]; /* tipo(s) de particula */
70 int est_rad
[2]; /* radio */
71 int est_transp
; /* transparencia */
74 /* Tipo de datos que contiene los tipos de enemigos */
75 typedef struct ENEM_T
{
76 int vida
; /* vida inicial, si es < 1, la clase de enemigo no existe */
78 int peso
; /* esto indica el 'peso' del enemigo, o sea, cuanta energia
79 le quita al jugador en caso de colision */
81 BITMAP
*spr
[4]; // sprites 0..3 = frames de animacion
82 BITMAP
*spr_shadow
[4]; // sombra (autogenerada al cargar data)
83 int spr_delay
; // delay de animacion en tics (30 = 1 segundo)
85 PMASK
*mask
[4]; /* mascara de colision de cada sprite*/
87 int dinero
; /* dinero que vale matar a este enemigo */
89 int premio_idx
, premio_prob
; /* indice de premio y probabilidad de darlo (%) */
91 // Referente a la IA del enemigo - DEBUG, nuevo!
92 int ia_azar
; // la IA del enemigo debe comenzar al azar? (es decir, comienza por bytecode 0 o por cualquiera?)
93 IA_NODE
*ia_node
; // nodo con bytecodes de la IA a ejecutar para esta clase de enemigo
94 int ia_boss
; // es un BOSS? -1 = si
97 /* Nodos que contienen los enemigos, en lista enlazada */
98 typedef struct ENEMIGO
{
99 fixed x
, y
; /* posicion */
101 int vida
; /* vida que le queda */
103 int ene_t
; /* tipo de enemigo (se fija en la matriz ENEM_T) */
105 int spr_delay
; // contador para la animacion
106 int spr_actual
; // sprite actual de animacion
108 int arma_actual
; // lo uso como referencia para disparar
111 int bytecode_actual
; // bytecode en ejecucion (indice [])
112 int bytecode_loop
; // contador para realizar los bytecodes con loop (parametro "loop")
113 IA_NODE
*ia_node
; // nodo de IA a ejecutar, se iguala a la clase de enemigo, es para evitar sintaxis complicadas... :)
114 IA_BYTECODE bytecode_exe
; // copia del bytecode ejecutandose (para los loops)
116 /* puntero al siguiente */
117 struct ENEMIGO
*next
;
120 /* Nodo de disparo del enemigo, en lista enlazada */
121 typedef struct DISP_ENE
{
122 fixed x
, y
; /* posicion */
123 fixed dx
, dy
; /* direccion */
124 int vida
; /* vida que le queda */
126 int arma
; /* indice de la matriz ARMA_ENE que indica el tipo de disparo, etc */
128 /* puntero al siguiente */
129 struct DISP_ENE
*next
;
133 /* GLOBALES EXPORTADAS */
134 extern ARMA_ENE arma_ene
[MAX_E_CLASS
];
135 extern ENEM_T enem_t
[MAX_E_CLASS
];
136 extern ENEMIGO
*enemigo_1
;
137 extern DISP_ENE
*disp_ene_1
;
138 extern int cant_enemigos_debug
;
140 /* Prototipos de funciones */
141 void agregar_enemigo(int x
, int y
, int tipo
);
142 void IA_enemigo(ENEMIGO
*ene
);
143 void mover_enemigos(int fy
);
144 void liberar_lista_enemigos();
145 void dibujar_enemigos(BITMAP
*bmp
, int x
, int y
);
147 void agregar_disparo_ene(ENEMIGO
*ene
);
148 void mover_disparos_ene(int fy
);
149 void dibujar_disp_ene(BITMAP
*bmp
, int x
, int y
);
150 void liberar_lista_disparos_ene();