Imported contents: kraptor_final_apr_03_2004.tar.gz
[kraptor.git] / include / enemigo.h
blobc2626164755ff0d9093dbcbecf02543ca7ccd72f
1 // --------------------------------------------------------
2 // enemigo.h
3 // --------------------------------------------------------
4 // Copyright (c) Kronoman
5 // En memoria de mi querido padre
6 // --------------------------------------------------------
7 // Todo lo relacionado con los enemigos
8 // --------------------------------------------------------
9 #ifndef ENEMIGO_H
10 #define ENEMIGO_H
12 #include "allegro.h"
13 #include "ia.h"
14 #include "pmask.h"
16 /* friccion X,Y */
17 #define FRC_X_E 0.1
18 #define FRC_Y_E 0.1
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]
45 1 = direccion al azar
46 2 = abanico triple
47 3 = doble recto
48 4 = 1 direccionado hacia el jugador (sale hacia el jugador)
49 5 = 5 tiros direccionados (apunta al jugador, solo en X)
50 6 = cuadruple al azar
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 */
72 } ARMA_ENE;
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
95 } ENEM_T;
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
110 // Referente a la IA
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;
118 } ENEMIGO;
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;
130 } DISP_ENE;
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();
151 #endif