disable the unrecognized nls and x flags
[AROS-Contrib.git] / Games / XInvaders3D / player.c
blobe22178d6c2d9f69e2e07159a95c500a17036d950
1 /*------------------------------------------------------------------
2 player.c:
4 XINVADERS 3D - 3d Shoot'em up
5 Copyright (C) 2000 Don Llopis
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 ------------------------------------------------------------------*/
22 #include "game.h"
24 /*================================================================*/
26 #define PLAYER_RADIUS 20.0f
27 #define PLAYER_RADIUS_SQUARED 400.0f
28 #define MISSLE_RADIUS 20.0f
29 #define MISSLE_RADIUS_SQUARED 400.0f
31 #define MAX_X 550.0f
32 #define MIN_X -550.0f
33 #define MAX_Y 450.0f
34 #define MIN_Y 50.0f
36 #define ROT_Z 0.087266463 /* 5 degrees per frame */
37 #define MAX_ROT 0.785398163 /* max of 45 degrees */
39 enum player_enum
41 PLAYER_BLINK = TRUE,
42 PLAYER_BLINK_TIME = 5000 /* 5.0 sec */
45 OBJECT player_1, *player;
46 OBJECT player_missile, *pm;
48 static VECTOR4 start_pos = { 0.0f, 250.0f, -25.0f, 1.0f };
49 static VECTOR4 start_dir = { 0.0f, 0.0f, -1.0f, 1.0f };
50 static VECTOR4 thrust_up = { 0.0f, 10.0f, 0.0f, 1.0f };
51 static VECTOR4 thrust_down = { 0.0f, -10.0f, 0.0f, 1.0f };
52 static VECTOR4 thrust_left = { -10.0f, 0.0f, 0.0f, 1.0f };
53 static VECTOR4 thrust_right = { 10.0f, 0.0f, 0.0f, 1.0f };
54 static VECTOR4 missile_offset = { 0.0f, 0.0f, 0.0f, 1.0f };
55 static VECTOR4 missile_thrust = { 0.0f, 0.0f, -50.0f, 1.0f };
57 static int pcolor; /* Player color */
59 /*================================================================*/
61 void Player_init ( void )
63 gv->pblinking = TRUE;
65 player = &player_1;
67 Object_init ( player );
68 Object_set_actionfn ( player, Player_update );
69 Object_set_drawfn ( player, Player_blink );
71 Object_set_pos ( player, start_pos );
72 Object_set_dir ( player, start_dir );
74 player->active = TRUE;
75 player->radius = PLAYER_RADIUS;
76 player->radius_squared = PLAYER_RADIUS_SQUARED;
77 player->frame = 0;
78 player->rot = 0.0;
79 pcolor = RED;
80 Object_update_zone ( player );
82 pm = &player_missile;
83 Object_init ( pm );
84 Object_set_actionfn ( pm, Player_missile_update );
85 Object_set_drawfn ( pm, Player_missile_draw );
87 pm->radius = MISSLE_RADIUS;
88 pm->radius_squared = MISSLE_RADIUS_SQUARED;
91 /*================================================================*/
93 void Player_update ( OBJECT *obj )
95 if ( gv->key_UP )
97 obj->pos[YPOS] += thrust_up[YPOS] * gv->fadjust;
98 Object_update_zone ( obj );
99 if ( obj->pos[YPOS] > MAX_Y )
100 obj->pos[YPOS] = MAX_Y;
103 if ( gv->key_DOWN )
105 obj->pos[YPOS] += thrust_down[YPOS] * gv->fadjust;
106 Object_update_zone ( obj );
107 if ( obj->pos[YPOS] < MIN_Y )
108 obj->pos[YPOS] = MIN_Y;
111 if ( gv->key_LEFT )
113 obj->pos[XPOS] += thrust_left[XPOS] * gv->fadjust;
114 player->rot += ROT_Z * gv->fadjust;
116 if ( obj->pos[XPOS] < MIN_X )
117 obj->pos[XPOS] = MIN_X;
119 if ( player->rot > MAX_ROT )
120 player->rot = MAX_ROT;
123 if ( gv->key_RIGHT )
125 obj->pos[XPOS] += thrust_right[XPOS] * gv->fadjust;
126 player->rot -= ROT_Z * gv->fadjust;
128 if ( obj->pos[XPOS] > MAX_X )
129 obj->pos[XPOS] = MAX_X;
131 if ( player->rot < -MAX_ROT )
132 player->rot = -MAX_ROT;
135 if ( (gv->key_LEFT == FALSE) && (gv->key_RIGHT == FALSE) )
137 /* please re-do this major hackyness */
138 if ( ( player->rot < -0.03 ) ||
139 ( player->rot > 0.03 ) )
141 if ( player->rot < -0.03 )
143 player->rot += ROT_Z * gv->fadjust;
144 if ( player->rot > 0.0 )
145 player->rot = 0.0;
147 else
149 if ( player->rot > 0.03 )
151 player->rot -= ROT_Z * gv->fadjust;
152 if ( player->rot < 0.0 )
153 player->rot = 0.0;
159 if ( gv->key_FIRE && !pm->active )
161 pm->active = TRUE;
162 pm->zone = obj->zone;
163 pm->zheight = obj->zheight;
165 Vector_init ( pm->pos );
166 Vector_copy ( obj->pos, pm->pos );
167 Vector_copy ( obj->pos, pm->old_pos );
168 Vector_addd ( pm->pos, missile_offset );
173 void Player_blink ( OBJECT *obj, MATRIX4 r )
175 static long blink = 0;
176 static int color = 0;
178 blink += gv->msec;
179 if ( blink > 50 )
181 blink -= 250;
182 color++;
183 if ( color == 3 )
184 color = 0;
187 pcolor = RED - ( color * 15 );
189 obj->frame += gv->msec;
190 if ( obj->frame > PLAYER_BLINK_TIME )
192 pcolor = RED;
193 gv->pblinking = FALSE;
194 Object_set_drawfn ( obj, Player_draw );
197 Player_draw ( obj, r );
200 void Player_draw ( OBJECT *obj, MATRIX4 r )
202 int p[32];
203 VECTOR4 tmp[16], rot_vert[16];
204 MATRIX4 tmp_mat, rot_mat;
205 VECTOR4 offset;
208 VECTOR4 player_vert [16] = { { -5.0f, 0.0f, 15.0f, 1.0f }, /*body*/
209 { -10.0f, 0.0f, -20.0f, 1.0f },
210 { 10.0f, 0.0f, -20.0f, 1.0f },
211 { 5.0f, 0.0f, 15.0f, 1.0f },
212 { -5.0f, 10.0f, -18.0f, 1.0f },
213 { 5.0f, 10.0f, -18.0f, 1.0f },
214 { -5.0f, 0.0f, 20.0f, 1.0f }, /* left e*/
215 { -10.0f, 0.0f, -15.0f, 1.0f },
216 { -12.0f, 0.0f, -12.0f, 1.0f },
217 { -10.0f, 0.0f, 25.0f, 1.0f },
218 { 5.0f, 0.0f, 20.0f, 1.0f }, /* re */
219 { 10.0f, 0.0f, -15.0f, 1.0f },
220 { 12.0f, 0.0f, -12.0f, 1.0f },
221 { 10.0f, 0.0f, 25.0f, 1.0f },
222 { -20.0f, -5.0f, 35.0f, 1.0f }, /*lw*/
223 { 20.0f, -5.0f, 35.0f, 1.0f } }; /*rw*/
227 VECTOR4 cross_hairs[4] = { { -15.0f, 0.0f, 0.0f, 1.0f },
228 { 0.0f, 15.0f, 0.0f, 1.0f },
229 { 15.0f, 0.0f, 0.0f, 1.0f },
230 { 0.0f, -15.0f, 0.0f, 1.0f } };
232 Matrix_vec_mult ( r, obj->pos, tmp[0] );
233 Matrix_copy ( r, tmp_mat );
234 Matrix_set_trans ( tmp_mat, tmp[0] );
236 Matrix_z_rot ( rot_mat, player->rot );
237 Matrix_vec_multn ( rot_mat, player_vert, rot_vert, 16 );
238 Matrix_vec_multn ( tmp_mat, rot_vert, tmp, 16 );
239 Camera_project_points ( tmp, p, 16 );
241 /* body bottom */
242 Draw_line ( p[0], p[1], p[2], p[3], pcolor );
243 Draw_line ( p[2], p[3], p[4], p[5], pcolor );
244 Draw_line ( p[4], p[5], p[6], p[7], pcolor );
245 Draw_line ( p[6], p[7], p[0], p[1], pcolor );
247 /* body top */
248 Draw_line ( p[0], p[1], p[8], p[9], pcolor );
249 Draw_line ( p[8], p[9], p[2], p[3], pcolor );
250 Draw_line ( p[4], p[5], p[10], p[11], pcolor );
251 Draw_line ( p[10], p[11], p[6], p[7], pcolor );
252 Draw_line ( p[8], p[9], p[10], p[11], pcolor );
254 /* left e*/
255 Draw_line ( p[12], p[13], p[14], p[15], pcolor );
256 Draw_line ( p[14], p[15], p[16], p[17], pcolor );
257 Draw_line ( p[16], p[17], p[18], p[19], pcolor );
258 Draw_line ( p[18], p[19], p[12], p[13], pcolor );
260 /* right e */
261 Draw_line ( p[20], p[21], p[22], p[23], pcolor );
262 Draw_line ( p[22], p[23], p[24], p[25], pcolor );
263 Draw_line ( p[24], p[25], p[26], p[27], pcolor );
264 Draw_line ( p[26], p[27], p[20], p[21], pcolor );
266 /* left wing */
267 Draw_line ( p[28], p[29], p[16], p[17], pcolor );
268 Draw_line ( p[28], p[29], p[18], p[19], pcolor );
270 /* right wing */
271 Draw_line ( p[30], p[31], p[24], p[25], pcolor );
272 Draw_line ( p[30], p[31], p[26], p[27], pcolor );
274 /* update cross-hairs */
275 Vector_copy ( obj->pos, tmp[0] );
276 Vector_init ( offset );
277 offset[ZPOS] = -((gv->formation_zone * 100.0f) + 50.0f);
279 Vector_addd ( tmp[0], offset );
280 Matrix_vec_mult ( r, tmp[0], tmp[1] );
281 Matrix_copy ( r, tmp_mat );
282 Matrix_set_trans ( tmp_mat, tmp[1] );
284 Matrix_vec_multn ( rot_mat, cross_hairs, rot_vert, 4 );
285 Matrix_vec_multn ( tmp_mat, rot_vert, tmp, 4 );
286 Camera_project_points ( tmp, p, 4 );
287 Draw_line ( p[0], p[1], p[2], p[3], WHITE );
288 Draw_line ( p[2], p[3], p[4], p[5], WHITE );
289 Draw_line ( p[4], p[5], p[6], p[7], WHITE );
290 Draw_line ( p[6], p[7], p[0], p[1], WHITE );
293 /*================================================================*/
295 void Player_missile_update ( OBJECT *obj )
297 Vector_copy ( obj->pos, obj->old_pos );
298 obj->pos[ZPOS] += missile_thrust[ZPOS] * gv->fadjust;
299 Object_update_zone ( obj );
301 if ( obj->zone > ZONE_9 )
302 obj->active = FALSE;
305 void Player_missile_draw ( OBJECT *obj, MATRIX4 r )
307 VECTOR4 tmp[4];
308 MATRIX4 tmp_mat;
309 int p[8];
311 VECTOR4 missile_vert[4] = { {-10.0f, 0.0f, -5.0f, 1.0f},
312 {0.0f, 0.0f, -10.0f, 1.0f},
313 {10.0f, 0.0f, -5.0f, 1.0f},
314 {0.0f, 0.0f, 20.0f, 1.0f}};
316 Matrix_vec_mult ( r, obj->pos, tmp[0] );
317 Matrix_copy ( r, tmp_mat );
318 Matrix_set_trans ( tmp_mat, tmp[0] );
320 Matrix_vec_multn ( tmp_mat, missile_vert, tmp, 4 );
322 Camera_project_points ( tmp, p, 4 );
324 Draw_line ( p[0], p[1], p[2], p[3], YELLOW );
325 Draw_line ( p[2], p[3], p[4], p[5], YELLOW );
326 Draw_line ( p[4], p[5], p[6], p[7], YELLOW );
327 Draw_line ( p[6], p[7], p[0], p[1], YELLOW );
330 /*================================================================*/