1 /*------------------------------------------------------------------
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 ------------------------------------------------------------------*/
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
36 #define ROT_Z 0.087266463 /* 5 degrees per frame */
37 #define MAX_ROT 0.785398163 /* max of 45 degrees */
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 )
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
;
80 Object_update_zone ( player
);
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
)
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
;
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
;
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
;
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 )
149 if ( player
->rot
> 0.03 )
151 player
->rot
-= ROT_Z
* gv
->fadjust
;
152 if ( player
->rot
< 0.0 )
159 if ( gv
->key_FIRE
&& !pm
->active
)
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;
187 pcolor
= RED
- ( color
* 15 );
189 obj
->frame
+= gv
->msec
;
190 if ( obj
->frame
> PLAYER_BLINK_TIME
)
193 gv
->pblinking
= FALSE
;
194 Object_set_drawfn ( obj
, Player_draw
);
197 Player_draw ( obj
, r
);
200 void Player_draw ( OBJECT
*obj
, MATRIX4 r
)
203 VECTOR4 tmp
[16], rot_vert
[16];
204 MATRIX4 tmp_mat
, rot_mat
;
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 );
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
);
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
);
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
);
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
);
267 Draw_line ( p
[28], p
[29], p
[16], p
[17], pcolor
);
268 Draw_line ( p
[28], p
[29], p
[18], p
[19], pcolor
);
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
)
305 void Player_missile_draw ( OBJECT
*obj
, MATRIX4 r
)
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 /*================================================================*/