1 /* $Id: powerup.c,v 1.7 2003-10-10 09:36:35 btb Exp $ */
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
17 * Code for powerup objects.
20 * Revision 1.2 1995/10/31 10:18:55 allender
23 * Revision 1.1 1995/05/16 15:30:16 allender
26 * Revision 2.2 1995/03/24 13:50:36 john
27 * Added mega-wowie zowie to release.
29 * Revision 2.1 1995/03/21 14:38:39 john
30 * Ifdef'd out the NETWORK code.
32 * Revision 2.0 1995/02/27 11:27:15 john
33 * New version 2.0, which has no anonymous unions, builds with
34 * Watcom 10.0, and doesn't require parsing BITMAPS.TBL.
36 * Revision 1.94 1995/02/22 13:46:03 allender
37 * remove anonymous unions from object structure
39 * Revision 1.93 1995/02/06 15:52:51 mike
40 * add mini megawow powerup for giving reasonable weapons.
42 * Revision 1.92 1995/01/23 22:49:59 mike
43 * drop energy instead of primary weapon if you have primary weapon
44 * (drop nothing if want to drop vulcan ammo and you are maxed out)
45 * if you have primary weapon and primary weapon there, get energy instead.
47 * Revision 1.91 1995/01/19 09:42:22 allender
48 * record laser levels for demos
50 * Revision 1.90 1994/12/31 12:28:01 rob
51 * Added sound for coop key grabs.
53 * Revision 1.89 1994/12/19 19:55:17 rob
54 * Fixing key semantics for coop game.
56 * Revision 1.88 1994/12/07 12:55:21 mike
57 * tweak vulcan amounts.
59 * Revision 1.87 1994/12/06 13:55:36 matt
60 * Made shield & energy powerup messages round to match HUD message
62 * Revision 1.86 1994/12/03 19:03:57 matt
63 * Fixed vulcan ammo HUD message
65 * Revision 1.85 1994/11/29 11:35:41 rob
66 * Added sound casting for grabbing powerups.
68 * Revision 1.84 1994/11/28 11:26:38 matt
69 * Cleaned up hud message printing for picking up weapons
71 * Revision 1.83 1994/11/27 23:14:01 matt
72 * Made changes for new mprintf calling convention
74 * Revision 1.82 1994/11/21 16:02:51 mike
75 * comment out unused powerups.
77 * Revision 1.81 1994/11/20 18:25:47 john
78 * Fixed some #ifndef RELEASE inconsistancies.
80 * Revision 1.80 1994/11/19 23:54:13 mike
81 * limit megawowiezowie to shareware powerups if in shareware version.
83 * Revision 1.79 1994/11/14 16:06:16 yuan
84 * Made cloak and invulnerability only picked up once.
86 * Revision 1.78 1994/11/07 17:41:06 mike
87 * messages for when you're fully stocked with missiles.
89 * Revision 1.77 1994/10/28 14:42:50 john
90 * Added sound volumes to all sound calls.
92 * Revision 1.76 1994/10/26 15:55:23 yuan
93 * Made vulcan cannon give 100 ammo if it has less than that.
95 * Revision 1.75 1994/10/26 15:54:57 yuan
96 * *** empty log message ***
98 * Revision 1.74 1994/10/25 14:31:25 allender
99 * Fixed bug where getting cloak powerup while cloaked resulted in
100 * player being cloaked forever.
102 * Revision 1.73 1994/10/25 10:51:21 matt
103 * Vulcan cannon powerups now contain ammo count
105 * Revision 1.72 1994/10/21 20:41:32 mike
106 * Fix silly backwards (- instead of +) bug in invulnerability powerup.
108 * Revision 1.71 1994/10/20 09:49:23 mike
109 * Fix up powerups in some way.
111 * Revision 1.70 1994/10/19 11:16:25 mike
112 * Limit amount of each type of ammo player can hold.
114 * Revision 1.69 1994/10/17 14:12:11 matt
115 * Added sound for powerup disappearance effect
117 * Revision 1.68 1994/10/17 14:07:04 mike
118 * Make shields and energy max out at 200.
120 * Revision 1.67 1994/10/16 12:43:37 mike
121 * Don't allow you to pick up a primary weapon, or invulnerability, you already have.
122 * Make cloak time additive.
124 * Revision 1.66 1994/10/15 19:05:30 mike
125 * Define constants for vulcan ammo amounts.
127 * Revision 1.65 1994/10/14 15:57:28 mike
128 * When you pick up a laser boost or quad_laser powerup, update weapon display.
130 * Revision 1.64 1994/10/13 10:57:51 adam
131 * fiddled with powerup disappearance
133 * Revision 1.63 1994/10/12 13:07:33 mike
134 * Make powerup play vclip when it goes away.
136 * Revision 1.62 1994/10/12 08:04:42 mike
137 * Make proximity powerup worth 4 bombs.
139 * Revision 1.61 1994/10/08 23:37:33 matt
140 * Don't pick up weapons you already have; also fixed auto_select bug
141 * for seconary weapons
143 * Revision 1.60 1994/10/08 15:41:00 mike
144 * Diminish palette effect due to powerups.
146 * Revision 1.59 1994/10/07 23:37:45 matt
147 * Made weapons select when pick up better one
149 * Revision 1.58 1994/10/07 22:09:20 rob
150 * Added network hook for grabbing the cloaking device.
175 #include "fireball.h"
188 #include "lighting.h"
189 #include "controls.h"
196 #include "gr.h" // for powerup outline drawing
197 #include "editor/editor.h"
200 int N_powerup_types = 0;
201 powerup_type_info Powerup_info[MAX_POWERUP_TYPES];
203 //process this powerup for this frame
204 void do_powerup_frame(object *obj)
207 vclip_info *vci = &obj->rtype.vclip_info;
208 vclip *vc = &Vclip[vci->vclip_num];
210 fudge = (FrameTime * ((obj-Objects)&3)) >> 4;
212 vci->frametime -= FrameTime+fudge;
214 while (vci->frametime < 0 ) {
216 vci->frametime += vc->frame_time;
223 if (vci->framenum >= vc->num_frames)
226 if (vci->framenum < 0)
227 vci->framenum = vc->num_frames-1;
230 if (obj->lifeleft <= 0) {
231 object_create_explosion(obj->segnum, &obj->pos, F1_0*7/2, VCLIP_POWERUP_DISAPPEARANCE );
233 if ( Vclip[VCLIP_POWERUP_DISAPPEARANCE].sound_num > -1 )
234 digi_link_sound_to_object( Vclip[VCLIP_POWERUP_DISAPPEARANCE].sound_num, obj-Objects, 0, F1_0);
239 extern fix blob_vertices[];
241 // blob_vertices has 3 vertices in it, 4th must be computed
242 void draw_blob_outline(void)
246 v3x = blob_vertices[4] - blob_vertices[2] + blob_vertices[0];
247 v3y = blob_vertices[5] - blob_vertices[3] + blob_vertices[1];
249 gr_setcolor(BM_XRGB(63, 63, 63));
251 mprintf((0, "[%7.3f %7.3f] [%7.3f %7.3f] [%7.3f %7.3f]\n", f2fl(blob_vertices[0]), f2fl(blob_vertices[1]), f2fl(blob_vertices[2]), f2fl(blob_vertices[3]), f2fl(blob_vertices[4]), f2fl(blob_vertices[5]) ));
253 gr_line(blob_vertices[0], blob_vertices[1], blob_vertices[2], blob_vertices[3]);
254 gr_line(blob_vertices[2], blob_vertices[3], blob_vertices[4], blob_vertices[5]);
255 gr_line(blob_vertices[4], blob_vertices[5], v3x, v3y);
257 gr_line(v3x, v3y, blob_vertices[0], blob_vertices[1]);
261 void draw_powerup(object *obj)
264 blob_vertices[0] = 0x80000;
267 draw_object_blob(obj, Vclip[obj->rtype.vclip_info.vclip_num].frames[obj->rtype.vclip_info.framenum] );
270 if ((Function_mode == FMODE_EDITOR) && (Cur_object_index == obj-Objects))
271 if (blob_vertices[0] != 0x80000)
277 //void mprintf_powerup_info(void)
280 //mprintf((0, "Powerup: %s\n", text));
281 //for (i=0; i<5; i++) {
282 // char has_text[12];
284 // if (Players[Player_num].primary_weapon_flags & (1 << i))
285 // strcpy(has_text,"PRESENT");
287 // strcpy(has_text,"NOPE ");
290 // mprintf((0, "Weapon %i = %s, ammo = %6i, name = %s\n", i, has_text, Players[Player_num].primary_ammo[i], Primary_weapon_names[i]));
293 //for (i=0; i<5; i++) {
294 // char has_text[12];
296 // if (Players[Player_num].secondary_weapon_flags & (1 << i))
297 // strcpy(has_text,"PRESENT");
299 // strcpy(has_text,"NOPE ");
301 // mprintf((0, "Weapon %i = %s, ammo = %6i, name = %s\n", i, has_text, Players[Player_num].secondary_ammo[i], Secondary_weapon_names[i]));
305 void powerup_basic(int redadd, int greenadd, int blueadd, int score, char *format, ...)
310 va_start(args, format );
311 vsprintf(text, format, args);
314 PALETTE_FLASH_ADD(redadd,greenadd,blueadd);
316 HUD_init_message(text);
318 //mprintf_powerup_info();
320 add_points_to_score(score);
325 // Give the megawow powerup!
326 void do_megawow_powerup(int quantity)
330 powerup_basic(30, 0, 30, 1, "MEGA-WOWIE-ZOWIE!");
331 Players[Player_num].primary_weapon_flags = 0xffff ^ HAS_FLAG(SUPER_LASER_INDEX); //no super laser
332 Players[Player_num].secondary_weapon_flags = 0xffff;
334 for (i=0; i<MAX_PRIMARY_WEAPONS; i++)
335 Players[Player_num].primary_ammo[i] = VULCAN_AMMO_MAX;
338 Players[Player_num].secondary_ammo[i] = quantity;
340 for (i=3; i<MAX_SECONDARY_WEAPONS; i++)
341 Players[Player_num].secondary_ammo[i] = quantity/5;
343 if (Newdemo_state == ND_STATE_RECORDING)
344 newdemo_record_laser_level(Players[Player_num].laser_level, MAX_LASER_LEVEL);
346 Players[Player_num].energy = F1_0*200;
347 Players[Player_num].shields = F1_0*200;
348 Players[Player_num].flags |= PLAYER_FLAGS_QUAD_LASERS;
349 Players[Player_num].laser_level = MAX_SUPER_LASER_LEVEL;
351 if (Game_mode & GM_HOARD)
352 Players[Player_num].secondary_ammo[PROXIMITY_INDEX] = 12;
355 update_laser_weapon_info();
360 int pick_up_energy(void)
364 if (Players[Player_num].energy < MAX_ENERGY) {
366 boost = 3*F1_0 + 3*F1_0*(NDL - Difficulty_level);
367 if (Difficulty_level == 0)
369 Players[Player_num].energy += boost;
370 if (Players[Player_num].energy > MAX_ENERGY)
371 Players[Player_num].energy = MAX_ENERGY;
372 powerup_basic(15,15,7, ENERGY_SCORE, "%s %s %d",TXT_ENERGY,TXT_BOOSTED_TO,f2ir(Players[Player_num].energy));
375 HUD_init_message(TXT_MAXED_OUT,TXT_ENERGY);
380 int pick_up_vulcan_ammo(void)
384 int pwsave = Primary_weapon; // Ugh, save selected primary weapon around the picking up of the ammo. I apologize for this code. Matthew A. Toschlog
385 if (pick_up_ammo(CLASS_PRIMARY, VULCAN_INDEX, VULCAN_AMMO_AMOUNT)) {
386 powerup_basic(7, 14, 21, VULCAN_AMMO_SCORE, "%s!", TXT_VULCAN_AMMO);
389 max = Primary_ammo_max[VULCAN_INDEX];
390 if (Players[Player_num].flags & PLAYER_FLAGS_AMMO_RACK)
392 HUD_init_message("%s %d %s!",TXT_ALREADY_HAVE,f2i((unsigned) VULCAN_AMMO_SCALE * (unsigned) max),TXT_VULCAN_ROUNDS);
395 Primary_weapon = pwsave;
400 extern void invalidate_escort_goal(void);
401 extern char GetKeyValue(char);
402 extern void check_to_use_primary(int);
403 extern void multi_send_got_flag (char);
405 int Headlight_active_default=1; //is headlight on when picked up?
406 extern int PlayerMessage;
408 // returns true if powerup consumed
409 int do_powerup(object *obj)
412 int special_used=0; //for when hitting vulcan cannon gets vulcan ammo
413 char temp_string[50];
416 if ((Player_is_dead) || (ConsoleObject->type == OBJ_GHOST) || (Players[Player_num].shields < 0))
419 if (obj->ctype.powerup_info.creation_time > GameTime) //gametime wrapped!
420 obj->ctype.powerup_info.creation_time = 0; //allow player to pick up
422 if ((obj->ctype.powerup_info.flags & PF_SPAT_BY_PLAYER) && obj->ctype.powerup_info.creation_time>0 && GameTime<obj->ctype.powerup_info.creation_time+i2f(2))
423 return 0; //not enough time elapsed
425 PlayerMessage=0; // Prevent messages from going to HUD if -PlayerMessages switch is set
429 Players[Player_num].lives++;
430 powerup_basic(15, 15, 15, 0, TXT_EXTRA_LIFE);
434 used = pick_up_energy();
436 case POW_SHIELD_BOOST:
437 if (Players[Player_num].shields < MAX_SHIELDS) {
438 fix boost = 3*F1_0 + 3*F1_0*(NDL - Difficulty_level);
439 if (Difficulty_level == 0)
441 Players[Player_num].shields += boost;
442 if (Players[Player_num].shields > MAX_SHIELDS)
443 Players[Player_num].shields = MAX_SHIELDS;
444 powerup_basic(0, 0, 15, SHIELD_SCORE, "%s %s %d",TXT_SHIELD,TXT_BOOSTED_TO,f2ir(Players[Player_num].shields));
447 HUD_init_message(TXT_MAXED_OUT,TXT_SHIELD);
450 if (Players[Player_num].laser_level >= MAX_LASER_LEVEL) {
451 //Players[Player_num].laser_level = MAX_LASER_LEVEL;
452 HUD_init_message(TXT_MAXED_OUT,TXT_LASER);
454 if (Newdemo_state == ND_STATE_RECORDING)
455 newdemo_record_laser_level(Players[Player_num].laser_level, Players[Player_num].laser_level + 1);
456 Players[Player_num].laser_level++;
457 powerup_basic(10, 0, 10, LASER_SCORE, "%s %s %d",TXT_LASER,TXT_BOOSTED_TO, Players[Player_num].laser_level+1);
458 update_laser_weapon_info();
459 pick_up_primary (LASER_INDEX);
462 if (!used && !(Game_mode & GM_MULTI) )
463 used = pick_up_energy();
466 used=pick_up_secondary(CONCUSSION_INDEX,1);
469 used=pick_up_secondary(CONCUSSION_INDEX,4);
473 if (Players[Player_num].flags & PLAYER_FLAGS_BLUE_KEY)
476 multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0);
478 digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 );
479 Players[Player_num].flags |= PLAYER_FLAGS_BLUE_KEY;
480 powerup_basic(0, 0, 15, KEY_SCORE, "%s %s",TXT_BLUE,TXT_ACCESS_GRANTED);
481 if (Game_mode & GM_MULTI)
485 invalidate_escort_goal();
488 if (Players[Player_num].flags & PLAYER_FLAGS_RED_KEY)
491 multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0);
493 digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 );
494 Players[Player_num].flags |= PLAYER_FLAGS_RED_KEY;
495 powerup_basic(15, 0, 0, KEY_SCORE, "%s %s",TXT_RED,TXT_ACCESS_GRANTED);
496 if (Game_mode & GM_MULTI)
500 invalidate_escort_goal();
503 if (Players[Player_num].flags & PLAYER_FLAGS_GOLD_KEY)
506 multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0);
508 digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 );
509 Players[Player_num].flags |= PLAYER_FLAGS_GOLD_KEY;
510 powerup_basic(15, 15, 7, KEY_SCORE, "%s %s",TXT_YELLOW,TXT_ACCESS_GRANTED);
511 if (Game_mode & GM_MULTI)
515 invalidate_escort_goal();
518 if (!(Players[Player_num].flags & PLAYER_FLAGS_QUAD_LASERS)) {
519 Players[Player_num].flags |= PLAYER_FLAGS_QUAD_LASERS;
520 powerup_basic(15, 15, 7, QUAD_FIRE_SCORE, "%s!",TXT_QUAD_LASERS);
521 update_laser_weapon_info();
524 HUD_init_message("%s %s!",TXT_ALREADY_HAVE,TXT_QUAD_LASERS);
525 if (!used && !(Game_mode & GM_MULTI) )
526 used = pick_up_energy();
529 case POW_VULCAN_WEAPON:
530 case POW_GAUSS_WEAPON: {
531 int ammo = obj->ctype.powerup_info.count;
533 used = pick_up_primary((obj->id==POW_VULCAN_WEAPON)?VULCAN_INDEX:GAUSS_INDEX);
535 //didn't get the weapon (because we already have it), but
536 //maybe snag some of the ammo. if single-player, grab all the ammo
537 //and remove the powerup. If multi-player take ammo in excess of
538 //the amount in a powerup, and leave the rest.
540 if ((Game_mode & GM_MULTI) )
541 ammo -= VULCAN_AMMO_AMOUNT; //don't let take all ammo
545 ammo_used = pick_up_ammo(CLASS_PRIMARY, VULCAN_INDEX, ammo);
546 obj->ctype.powerup_info.count -= ammo_used;
547 if (!used && ammo_used) {
548 powerup_basic(7, 14, 21, VULCAN_AMMO_SCORE, "%s!", TXT_VULCAN_AMMO);
550 id = POW_VULCAN_AMMO; //set new id for making sound at end of this function
551 if (obj->ctype.powerup_info.count == 0)
552 used = 1; //say used if all ammo taken
559 case POW_SPREADFIRE_WEAPON:
560 used = pick_up_primary(SPREADFIRE_INDEX);
561 if (!used && !(Game_mode & GM_MULTI) )
562 used = pick_up_energy();
564 case POW_PLASMA_WEAPON:
565 used = pick_up_primary(PLASMA_INDEX);
566 if (!used && !(Game_mode & GM_MULTI) )
567 used = pick_up_energy();
569 case POW_FUSION_WEAPON:
570 used = pick_up_primary(FUSION_INDEX);
571 if (!used && !(Game_mode & GM_MULTI) )
572 used = pick_up_energy();
575 case POW_HELIX_WEAPON:
576 used = pick_up_primary(HELIX_INDEX);
577 if (!used && !(Game_mode & GM_MULTI) )
578 used = pick_up_energy();
581 case POW_PHOENIX_WEAPON:
582 used = pick_up_primary(PHOENIX_INDEX);
583 if (!used && !(Game_mode & GM_MULTI) )
584 used = pick_up_energy();
587 case POW_OMEGA_WEAPON:
588 used = pick_up_primary(OMEGA_INDEX);
590 Omega_charge = obj->ctype.powerup_info.count;
591 if (!used && !(Game_mode & GM_MULTI) )
592 used = pick_up_energy();
595 case POW_PROXIMITY_WEAPON:
596 used=pick_up_secondary(PROXIMITY_INDEX,4);
598 case POW_SMARTBOMB_WEAPON:
599 used=pick_up_secondary(SMART_INDEX,1);
601 case POW_MEGA_WEAPON:
602 used=pick_up_secondary(MEGA_INDEX,1);
604 case POW_SMISSILE1_1:
605 used=pick_up_secondary(SMISSILE1_INDEX,1);
607 case POW_SMISSILE1_4:
608 used=pick_up_secondary(SMISSILE1_INDEX,4);
610 case POW_GUIDED_MISSILE_1:
611 used=pick_up_secondary(GUIDED_INDEX,1);
613 case POW_GUIDED_MISSILE_4:
614 used=pick_up_secondary(GUIDED_INDEX,4);
617 used=pick_up_secondary(SMART_MINE_INDEX,4);
619 case POW_MERCURY_MISSILE_1:
620 used=pick_up_secondary(SMISSILE4_INDEX,1);
622 case POW_MERCURY_MISSILE_4:
623 used=pick_up_secondary(SMISSILE4_INDEX,4);
625 case POW_EARTHSHAKER_MISSILE:
626 used=pick_up_secondary(SMISSILE5_INDEX,1);
628 case POW_VULCAN_AMMO:
629 used = pick_up_vulcan_ammo();
631 case POW_HOMING_AMMO_1:
632 used=pick_up_secondary(HOMING_INDEX,1);
634 case POW_HOMING_AMMO_4:
635 used=pick_up_secondary(HOMING_INDEX,4);
638 if (Players[Player_num].flags & PLAYER_FLAGS_CLOAKED) {
639 HUD_init_message("%s %s!",TXT_ALREADY_ARE,TXT_CLOAKED);
642 Players[Player_num].cloak_time = GameTime; // Not! changed by awareness events (like player fires laser).
643 Players[Player_num].flags |= PLAYER_FLAGS_CLOAKED;
646 if (Game_mode & GM_MULTI)
649 powerup_basic(-10,-10,-10, CLOAK_SCORE, "%s!",TXT_CLOAKING_DEVICE);
653 case POW_INVULNERABILITY:
654 if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE) {
655 HUD_init_message("%s %s!",TXT_ALREADY_ARE,TXT_INVULNERABLE);
658 Players[Player_num].invulnerable_time = GameTime;
659 Players[Player_num].flags |= PLAYER_FLAGS_INVULNERABLE;
660 powerup_basic(7, 14, 21, INVULNERABILITY_SCORE, "%s!",TXT_INVULNERABILITY);
666 do_megawow_powerup(50);
672 if (Players[Player_num].flags & PLAYER_FLAGS_MAP_ALL) {
673 HUD_init_message("%s %s!",TXT_ALREADY_HAVE,"the FULL MAP");
674 if (!(Game_mode & GM_MULTI) )
675 used = pick_up_energy();
677 Players[Player_num].flags |= PLAYER_FLAGS_MAP_ALL;
678 powerup_basic(15, 0, 15, 0, "FULL MAP!");
684 if (Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) {
685 HUD_init_message("%s %s!",TXT_ALREADY_HAVE,"the Converter");
686 if (!(Game_mode & GM_MULTI) )
687 used = pick_up_energy();
689 Players[Player_num].flags |= PLAYER_FLAGS_CONVERTER;
690 // DPH: anyone know what the hell this is supposed to do? it's always true =)
691 /* if ((GetKeyValue(54))<255)
693 sprintf (temp_string,"Energy->Shield converter! (Press %c to use)",key_to_ascii(GetKeyValue(54)));
694 powerup_basic(15, 0, 15, 0, temp_string);
697 powerup_basic(15, 0, 15, 0, "Energy -> shield converter!"); */
704 case POW_SUPER_LASER:
705 if (Players[Player_num].laser_level >= MAX_SUPER_LASER_LEVEL) {
706 Players[Player_num].laser_level = MAX_SUPER_LASER_LEVEL;
707 HUD_init_message("SUPER LASER MAXED OUT!");
709 int old_level=Players[Player_num].laser_level;
711 if (Players[Player_num].laser_level <= MAX_LASER_LEVEL)
712 Players[Player_num].laser_level = MAX_LASER_LEVEL;
713 Players[Player_num].laser_level++;
714 if (Newdemo_state == ND_STATE_RECORDING)
715 newdemo_record_laser_level(old_level, Players[Player_num].laser_level);
716 powerup_basic(10, 0, 10, LASER_SCORE, "Super Boost to Laser level %d",Players[Player_num].laser_level+1);
717 update_laser_weapon_info();
718 if (Primary_weapon!=LASER_INDEX)
719 check_to_use_primary (SUPER_LASER_INDEX);
722 if (!used && !(Game_mode & GM_MULTI) )
723 used = pick_up_energy();
727 if (Players[Player_num].flags & PLAYER_FLAGS_AMMO_RACK) {
728 HUD_init_message("%s %s!",TXT_ALREADY_HAVE,"the Ammo rack");
729 if (!(Game_mode & GM_MULTI) )
730 used = pick_up_energy();
733 Players[Player_num].flags |= PLAYER_FLAGS_AMMO_RACK;
735 multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0);
737 digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 );
738 powerup_basic(15, 0, 15, 0, "AMMO RACK!");
743 case POW_AFTERBURNER:
744 if (Players[Player_num].flags & PLAYER_FLAGS_AFTERBURNER) {
745 HUD_init_message("%s %s!",TXT_ALREADY_HAVE,"the Afterburner");
746 if (!(Game_mode & GM_MULTI) )
747 used = pick_up_energy();
750 Players[Player_num].flags |= PLAYER_FLAGS_AFTERBURNER;
752 multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0);
754 digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 );
755 powerup_basic(15, 15, 15, 0, "AFTERBURNER!");
756 Afterburner_charge = f1_0;
762 if (Players[Player_num].flags & PLAYER_FLAGS_HEADLIGHT) {
763 HUD_init_message("%s %s!",TXT_ALREADY_HAVE,"the Headlight boost");
764 if (!(Game_mode & GM_MULTI) )
765 used = pick_up_energy();
769 Players[Player_num].flags |= PLAYER_FLAGS_HEADLIGHT;
771 multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0);
773 digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 );
774 sprintf(msg,"HEADLIGHT BOOST! (Headlight is %s)",Headlight_active_default?"ON":"OFF");
775 powerup_basic(15, 0, 15, 0, msg );
776 if (Headlight_active_default)
777 Players[Player_num].flags |= PLAYER_FLAGS_HEADLIGHT_ON;
780 if (Game_mode & GM_MULTI)
781 multi_send_flags (Player_num);
788 if (Game_mode & GM_CAPTURE)
789 if (get_team(Player_num) == TEAM_RED) {
790 powerup_basic(15, 0, 15, 0, "BLUE FLAG!");
791 Players[Player_num].flags |= PLAYER_FLAGS_FLAG;
793 multi_send_got_flag (Player_num);
798 if (Game_mode & GM_HOARD)
799 if (Players[Player_num].secondary_ammo[PROXIMITY_INDEX]<12) {
800 powerup_basic(15, 0, 15, 0, "Orb!!!");
801 Players[Player_num].secondary_ammo[PROXIMITY_INDEX]++;
802 Players[Player_num].flags |= PLAYER_FLAGS_FLAG;
804 multi_send_got_orb (Player_num);
809 if (Game_mode & GM_CAPTURE)
810 if (get_team(Player_num) == TEAM_BLUE) {
811 powerup_basic(15, 0, 15, 0, "RED FLAG!");
812 Players[Player_num].flags |= PLAYER_FLAGS_FLAG;
814 multi_send_got_flag (Player_num);
819 // case POW_HOARD_ORB:
826 //always say used, until physics problem (getting stuck on unused powerup)
827 //is solved. Note also the break statements above that are commented out
830 if ((used || special_used) && Powerup_info[id].hit_sound > -1 ) {
832 if (Game_mode & GM_MULTI) // Added by Rob, take this out if it turns out to be not good for net games!
833 multi_send_play_sound(Powerup_info[id].hit_sound, F1_0);
835 digi_play_sample( Powerup_info[id].hit_sound, F1_0 );
836 detect_escort_goal_accomplished(obj-Objects);
847 * reads n powerup_type_info structs from a CFILE
849 extern int powerup_type_info_read_n(powerup_type_info *pti, int n, CFILE *fp)
853 for (i = 0; i < n; i++) {
854 pti[i].vclip_num = cfile_read_int(fp);
855 pti[i].hit_sound = cfile_read_int(fp);
856 pti[i].size = cfile_read_fix(fp);
857 pti[i].light = cfile_read_fix(fp);