diff --git a/SConstruct b/SConstruct index 1b999cc94..fc71fc4aa 100644 --- a/SConstruct +++ b/SConstruct @@ -788,6 +788,7 @@ class DXXProgram(DXXCommon): 'main/physics.c', 'main/player.c', 'main/polyobj.c', +'main/powerup.c', 'main/render.c', 'main/robot.c', 'main/scores.c', @@ -1036,7 +1037,6 @@ class D1XProgram(DXXProgram): 'main/gameseq.c', 'main/piggy.c', 'main/playsave.c', -'main/powerup.c', 'main/snddecom.c', #'tracker/client/tracker_client.c' ] @@ -1102,7 +1102,6 @@ class D2XProgram(DXXProgram): 'main/movie.c', 'main/piggy.c', 'main/playsave.c', -'main/powerup.c', 'main/segment.c', 'misc/physfsrwops.c', ] diff --git a/common/main/weapon.h b/common/main/weapon.h index 27f66e3c4..f893338a7 100644 --- a/common/main/weapon.h +++ b/common/main/weapon.h @@ -312,6 +312,7 @@ static inline int weapon_index_is_player_bomb(unsigned id) } #elif defined(DXX_BUILD_DESCENT_II) int which_bomb(void); +int check_to_use_primary(int weapon_index); static inline int weapon_index_uses_vulcan_ammo(unsigned id) { diff --git a/d1x-rebirth/main/powerup.c b/d1x-rebirth/main/powerup.c deleted file mode 100644 index 3c77b0fa2..000000000 --- a/d1x-rebirth/main/powerup.c +++ /dev/null @@ -1,439 +0,0 @@ -/* -THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX -SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO -END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A -ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS -IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS -SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE -FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE -CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS -AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. -COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. -*/ - -/* - * - * Code for powerup objects. - * - */ - - - -#include -#include -#include - -#include "3d.h" -#include "inferno.h" -#include "object.h" -#include "game.h" -#include "fireball.h" -#include "powerup.h" -#include "gauges.h" -#include "sounds.h" -#include "player.h" -#include "wall.h" -#include "text.h" -#include "weapon.h" -#include "laser.h" -#include "scores.h" -#include "multi.h" -#include "newdemo.h" -#ifdef EDITOR -#include "gr.h" // for powerup outline drawing -#include "editor/editor.h" -#endif - -int N_powerup_types = 0; -powerup_type_info Powerup_info[MAX_POWERUP_TYPES]; - -int powerup_start_level[MAX_POWERUP_TYPES]; - -//process this powerup for this frame -void do_powerup_frame(object *obj) -{ - vclip_info *vci = &obj->rtype.vclip_info; - vclip *vc = &Vclip[vci->vclip_num]; - - vci->frametime -= FrameTime; - - while (vci->frametime < 0 ) { - - vci->frametime += vc->frame_time; - - vci->framenum++; - if (vci->framenum >= vc->num_frames) - vci->framenum=0; - } - - if (obj->lifeleft <= 0) { - object_create_explosion(obj->segnum, &obj->pos, fl2f(3.5), VCLIP_POWERUP_DISAPPEARANCE ); - - if ( Vclip[VCLIP_POWERUP_DISAPPEARANCE].sound_num > -1 ) - digi_link_sound_to_object( Vclip[VCLIP_POWERUP_DISAPPEARANCE].sound_num, obj-Objects, 0, F1_0); - } -} - -#ifdef EDITOR -extern fix blob_vertices[]; - -// blob_vertices has 3 vertices in it, 4th must be computed -void draw_blob_outline(void) -{ - fix v3x, v3y; - - v3x = blob_vertices[4] - blob_vertices[2] + blob_vertices[0]; - v3y = blob_vertices[5] - blob_vertices[3] + blob_vertices[1]; - - gr_setcolor(BM_XRGB(63, 63, 63)); - - gr_line(blob_vertices[0], blob_vertices[1], blob_vertices[2], blob_vertices[3]); - gr_line(blob_vertices[2], blob_vertices[3], blob_vertices[4], blob_vertices[5]); - gr_line(blob_vertices[4], blob_vertices[5], v3x, v3y); - - gr_line(v3x, v3y, blob_vertices[0], blob_vertices[1]); -} -#endif - -void draw_powerup(object *obj) -{ - #ifdef EDITOR - blob_vertices[0] = 0x80000; - #endif - - draw_object_blob(obj, Vclip[obj->rtype.vclip_info.vclip_num].frames[obj->rtype.vclip_info.framenum] ); - - #ifdef EDITOR - if (EditorWindow && (Cur_object_index == obj-Objects)) - if (blob_vertices[0] != 0x80000) - draw_blob_outline(); - #endif - -} - -void powerup_basic(int redadd, int greenadd, int blueadd, int score, const char *format, ...) -{ - va_list args; - - va_start(args, format ); - HUD_init_message_va(HM_DEFAULT, format, args); - va_end(args); - - PALETTE_FLASH_ADD(redadd,greenadd,blueadd); - - add_points_to_score(score); - -} - -//#ifndef RELEASE -// Give the megawow powerup! -void do_megawow_powerup(int quantity) -{ - int i; - - powerup_basic(30, 0, 30, 1, "MEGA-WOWIE-ZOWIE!"); - Players[Player_num].primary_weapon_flags = 0xff; - Players[Player_num].secondary_weapon_flags = 0xff; - Players[Player_num].vulcan_ammo = 200; - - for (i=0; i<3; i++) - Players[Player_num].secondary_ammo[i] = quantity; - - for (i=3; i<5; i++) - Players[Player_num].secondary_ammo[i] = quantity/5; - - if (Newdemo_state == ND_STATE_RECORDING) - newdemo_record_laser_level(Players[Player_num].laser_level, MAX_LASER_LEVEL); - - Players[Player_num].energy = F1_0*200; - Players[Player_num].shields = F1_0*200; - Players[Player_num].flags |= PLAYER_FLAGS_QUAD_LASERS; - Players[Player_num].laser_level = MAX_LASER_LEVEL; - update_laser_weapon_info(); - -} -//#endif - -int pick_up_energy(void) -{ - int used=0; - - if (Players[Player_num].energy < MAX_ENERGY) { - Players[Player_num].energy += 3*F1_0 + 3*F1_0*(NDL - Difficulty_level); - if (Players[Player_num].energy > MAX_ENERGY) - Players[Player_num].energy = MAX_ENERGY; - powerup_basic(15,15,7, ENERGY_SCORE, "%s %s %d",TXT_ENERGY,TXT_BOOSTED_TO,f2ir(Players[Player_num].energy)); - used=1; - } else - HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, TXT_MAXED_OUT,TXT_ENERGY); - - return used; -} - -int pick_up_vulcan_ammo(void) -{ - int used=0; - -//added/killed on 1/21/99 by Victor Rachels ... how is this wrong? -//-killed- int pwsave = Primary_weapon; // Ugh, save selected primary weapon around the picking up of the ammo. I apologize for this code. Matthew A. Toschlog - if (pick_up_ammo(CLASS_PRIMARY, VULCAN_INDEX, VULCAN_AMMO_AMOUNT)) { - powerup_basic(7, 14, 21, VULCAN_AMMO_SCORE, "%s!", TXT_VULCAN_AMMO); - used = 1; - } else { - HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %d %s!",TXT_ALREADY_HAVE,f2i(VULCAN_AMMO_SCALE * Primary_ammo_max[VULCAN_INDEX]),TXT_VULCAN_ROUNDS); - used = 0; - } -//-killed- Primary_weapon = pwsave; -//end this section kill - VR - - return used; -} - -// returns true if powerup consumed -int do_powerup(object *obj) -{ - int used=0; - int vulcan_ammo_to_add_with_cannon; - - if ((Player_is_dead) || (ConsoleObject->type == OBJ_GHOST) || (Players[Player_num].shields < 0)) - return 0; - - if (Game_mode & GM_MULTI) - { - /* - * The fact: Collecting a powerup is decided Client-side and due to PING it takes time for other players to know if one collected a powerup actually. This may lead to the case two players collect the same powerup! - * The solution: Let us check if someone else is closer to a powerup and if so, do not collect it. - * NOTE: Player positions computed by 'shortpos' and PING can still cause a small margin of error. - */ - int i = 0; - vms_vector tvec; - fix mydist = vm_vec_normalized_dir(&tvec, &obj->pos, &ConsoleObject->pos); - - for (i = 0; i < MAX_PLAYERS; i++) - { - if (i == Player_num || Players[i].connected != CONNECT_PLAYING) - continue; - if (Objects[Players[i].objnum].type == OBJ_GHOST || Players[i].shields < 0) - continue; - if (mydist > vm_vec_normalized_dir(&tvec, &obj->pos, &Objects[Players[i].objnum].pos)) - return 0; - } - } - - switch (obj->id) { - case POW_EXTRA_LIFE: - Players[Player_num].lives++; - powerup_basic(15, 15, 15, 0, "%s", TXT_EXTRA_LIFE); - used=1; - break; - case POW_ENERGY: - used = pick_up_energy(); - break; - case POW_SHIELD_BOOST: - if (Players[Player_num].shields < MAX_SHIELDS) { - Players[Player_num].shields += 3*F1_0 + 3*F1_0*(NDL - Difficulty_level); - if (Players[Player_num].shields > MAX_SHIELDS) - Players[Player_num].shields = MAX_SHIELDS; - powerup_basic(0, 0, 15, SHIELD_SCORE, "%s %s %d",TXT_SHIELD,TXT_BOOSTED_TO,f2ir(Players[Player_num].shields)); - used=1; - } else - HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, TXT_MAXED_OUT,TXT_SHIELD); - break; - case POW_LASER: - if (Players[Player_num].laser_level >= MAX_LASER_LEVEL) { - Players[Player_num].laser_level = MAX_LASER_LEVEL; - HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, TXT_MAXED_OUT,TXT_LASER); - } else { - if (Newdemo_state == ND_STATE_RECORDING) - newdemo_record_laser_level(Players[Player_num].laser_level, Players[Player_num].laser_level + 1); - Players[Player_num].laser_level++; - powerup_basic(10, 0, 10, LASER_SCORE, "%s %s %d",TXT_LASER,TXT_BOOSTED_TO, Players[Player_num].laser_level+1); - update_laser_weapon_info(); - pick_up_primary (LASER_INDEX); - used=1; - } - if (!used && !(Game_mode & GM_MULTI) ) - used = pick_up_energy(); - break; - case POW_MISSILE_1: - used=pick_up_secondary(CONCUSSION_INDEX,1); - break; - case POW_MISSILE_4: - used=pick_up_secondary(CONCUSSION_INDEX,4); - break; - - case POW_KEY_BLUE: - if (Players[Player_num].flags & PLAYER_FLAGS_BLUE_KEY) - break; - multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); - digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); - Players[Player_num].flags |= PLAYER_FLAGS_BLUE_KEY; - powerup_basic(0, 0, 15, KEY_SCORE, "%s %s",TXT_BLUE,TXT_ACCESS_GRANTED); - if (Game_mode & GM_MULTI) - used=0; - else - used=1; - break; - case POW_KEY_RED: - if (Players[Player_num].flags & PLAYER_FLAGS_RED_KEY) - break; - multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); - digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); - Players[Player_num].flags |= PLAYER_FLAGS_RED_KEY; - powerup_basic(15, 0, 0, KEY_SCORE, "%s %s",TXT_RED,TXT_ACCESS_GRANTED); - if (Game_mode & GM_MULTI) - used=0; - else - used=1; - break; - case POW_KEY_GOLD: - if (Players[Player_num].flags & PLAYER_FLAGS_GOLD_KEY) - break; - multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); - digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); - Players[Player_num].flags |= PLAYER_FLAGS_GOLD_KEY; - powerup_basic(15, 15, 7, KEY_SCORE, "%s %s",TXT_YELLOW,TXT_ACCESS_GRANTED); - if (Game_mode & GM_MULTI) - used=0; - else - used=1; - break; - case POW_QUAD_FIRE: - if (!(Players[Player_num].flags & PLAYER_FLAGS_QUAD_LASERS)) { - Players[Player_num].flags |= PLAYER_FLAGS_QUAD_LASERS; - powerup_basic(15, 15, 7, QUAD_FIRE_SCORE, "%s!",TXT_QUAD_LASERS); - update_laser_weapon_info(); - used=1; - } else - HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %s!",TXT_ALREADY_HAVE,TXT_QUAD_LASERS); - if (!used && !(Game_mode & GM_MULTI) ) - used = pick_up_energy(); - break; - case POW_VULCAN_WEAPON: - if ((used = pick_up_primary(VULCAN_INDEX)) != 0) { - vulcan_ammo_to_add_with_cannon = obj->ctype.powerup_info.count; - if (vulcan_ammo_to_add_with_cannon < VULCAN_WEAPON_AMMO_AMOUNT) vulcan_ammo_to_add_with_cannon = VULCAN_WEAPON_AMMO_AMOUNT; - pick_up_ammo(CLASS_PRIMARY, VULCAN_INDEX, vulcan_ammo_to_add_with_cannon); - } - -//added/edited 8/3/98 by Victor Rachels to fix vulcan multi bug -//check if multi, if so, pick up ammo w/o using, set ammo left. else, normal - -//killed 8/27/98 by Victor Rachels to fix vulcan ammo multiplying. new way -// is by spewing the current held ammo when dead. -//-killed if (!used && (Game_mode & GM_MULTI)) -//-killed { -//-killed int tempcount; -//-killed tempcount=Players[Player_num].primary_ammo[VULCAN_INDEX]; -//-killed if (pick_up_ammo(CLASS_PRIMARY, VULCAN_INDEX, obj->ctype.powerup_info.count)) -//-killed obj->ctype.powerup_info.count -= Players[Player_num].primary_ammo[VULCAN_INDEX]-tempcount; -//-killed } -//end kill - Victor Rachels - - if (!used && !(Game_mode & GM_MULTI) ) -//end addition/edit - Victor Rachels - used = pick_up_vulcan_ammo(); - break; - case POW_SPREADFIRE_WEAPON: - used = pick_up_primary(SPREADFIRE_INDEX); - if (!used && !(Game_mode & GM_MULTI) ) - used = pick_up_energy(); - break; - case POW_PLASMA_WEAPON: - used = pick_up_primary(PLASMA_INDEX); - if (!used && !(Game_mode & GM_MULTI) ) - used = pick_up_energy(); - break; - case POW_FUSION_WEAPON: - used = pick_up_primary(FUSION_INDEX); - if (!used && !(Game_mode & GM_MULTI) ) - used = pick_up_energy(); - break; - - case POW_PROXIMITY_WEAPON: - used=pick_up_secondary(PROXIMITY_INDEX,4); - break; - case POW_SMARTBOMB_WEAPON: - used=pick_up_secondary(SMART_INDEX,1); - break; - case POW_MEGA_WEAPON: - used=pick_up_secondary(MEGA_INDEX,1); - break; - case POW_VULCAN_AMMO: { - used = pick_up_vulcan_ammo(); - if (!used && !(Game_mode & GM_MULTI) ) - used = pick_up_vulcan_ammo(); - break; - } - break; - case POW_HOMING_AMMO_1: - used=pick_up_secondary(HOMING_INDEX,1); - break; - case POW_HOMING_AMMO_4: - used=pick_up_secondary(HOMING_INDEX,4); - break; - case POW_CLOAK: - if (Players[Player_num].flags & PLAYER_FLAGS_CLOAKED) { - HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %s!",TXT_ALREADY_ARE,TXT_CLOAKED); - break; - } else { - Players[Player_num].cloak_time = GameTime64; - Players[Player_num].flags |= PLAYER_FLAGS_CLOAKED; - ai_do_cloak_stuff(); - if (Game_mode & GM_MULTI) - multi_send_cloak(); - powerup_basic(-10,-10,-10, CLOAK_SCORE, "%s!",TXT_CLOAKING_DEVICE); - used = 1; - break; - } - case POW_INVULNERABILITY: - if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE) { - HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %s!",TXT_ALREADY_ARE,TXT_INVULNERABLE); - break; - } else { - Players[Player_num].invulnerable_time = GameTime64; - Players[Player_num].flags |= PLAYER_FLAGS_INVULNERABLE; - powerup_basic(7, 14, 21, INVULNERABILITY_SCORE, "%s!",TXT_INVULNERABILITY); - used = 1; - break; - } - #ifndef RELEASE - case POW_MEGAWOW: - do_megawow_powerup(50); - used = 1; - break; - #endif - - default: - break; - } - -//always say used, until physics problem (getting stuck on unused powerup) -//is solved. Note also the break statements above that are commented out -//!! used=1; - - if (used && Powerup_info[obj->id].hit_sound > -1 ) { - if (Game_mode & GM_MULTI) // Added by Rob, take this out if it turns out to be not good for net games! - multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); - digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); - } - - return used; - -} - -/* - * reads n powerup_type_info structs from a PHYSFS_file - */ -int powerup_type_info_read_n(powerup_type_info *pti, int n, PHYSFS_file *fp) -{ - int i; - - for (i = 0; i < n; i++) { - pti[i].vclip_num = PHYSFSX_readInt(fp); - pti[i].hit_sound = PHYSFSX_readInt(fp); - pti[i].size = PHYSFSX_readFix(fp); - pti[i].light = PHYSFSX_readFix(fp); - } - return i; -} diff --git a/d2x-rebirth/main/powerup.c b/similar/main/powerup.c similarity index 88% rename from d2x-rebirth/main/powerup.c rename to similar/main/powerup.c index c2fe37580..cc0d34a3b 100644 --- a/d2x-rebirth/main/powerup.c +++ b/similar/main/powerup.c @@ -63,7 +63,11 @@ void do_powerup_frame(object *obj) vclip_info *vci = &obj->rtype.vclip_info; vclip *vc = &Vclip[vci->vclip_num]; +#if defined(DXX_BUILD_DESCENT_I) + fudge = 0; +#elif defined(DXX_BUILD_DESCENT_II) fudge = (FrameTime * ((obj-Objects)&3)) >> 4; +#endif vci->frametime -= FrameTime+fudge; @@ -71,16 +75,20 @@ void do_powerup_frame(object *obj) vci->frametime += vc->frame_time; +#if defined(DXX_BUILD_DESCENT_II) if ((obj-Objects)&1) vci->framenum--; else +#endif vci->framenum++; if (vci->framenum >= vc->num_frames) vci->framenum=0; +#if defined(DXX_BUILD_DESCENT_II) if (vci->framenum < 0) vci->framenum = vc->num_frames-1; +#endif } if (obj->lifeleft <= 0) { @@ -149,9 +157,13 @@ void do_megawow_powerup(int quantity) int i; powerup_basic(30, 0, 30, 1, "MEGA-WOWIE-ZOWIE!"); +#if defined(DXX_BUILD_DESCENT_I) + Players[Player_num].primary_weapon_flags = 0xff; + Players[Player_num].secondary_weapon_flags = 0xff; +#elif defined(DXX_BUILD_DESCENT_II) Players[Player_num].primary_weapon_flags = 0xffff ^ HAS_FLAG(SUPER_LASER_INDEX); //no super laser Players[Player_num].secondary_weapon_flags = 0xffff; - +#endif Players[Player_num].vulcan_ammo = VULCAN_AMMO_MAX; for (i=0; i<3; i++) @@ -166,10 +178,14 @@ void do_megawow_powerup(int quantity) Players[Player_num].energy = F1_0*200; Players[Player_num].shields = F1_0*200; Players[Player_num].flags |= PLAYER_FLAGS_QUAD_LASERS; +#if defined(DXX_BUILD_DESCENT_I) + Players[Player_num].laser_level = MAX_LASER_LEVEL; +#elif defined(DXX_BUILD_DESCENT_II) Players[Player_num].laser_level = MAX_SUPER_LASER_LEVEL; if (game_mode_hoard()) Players[Player_num].secondary_ammo[PROXIMITY_INDEX] = 12; +#endif update_laser_weapon_info(); @@ -184,8 +200,10 @@ int pick_up_energy(void) if (Players[Player_num].energy < MAX_ENERGY) { fix boost; boost = 3*F1_0 + 3*F1_0*(NDL - Difficulty_level); +#if defined(DXX_BUILD_DESCENT_II) if (Difficulty_level == 0) boost += boost/2; +#endif Players[Player_num].energy += boost; if (Players[Player_num].energy > MAX_ENERGY) Players[Player_num].energy = MAX_ENERGY; @@ -207,8 +225,10 @@ int pick_up_vulcan_ammo(void) used = 1; } else { max = Primary_ammo_max[VULCAN_INDEX]; +#if defined(DXX_BUILD_DESCENT_II) if (Players[Player_num].flags & PLAYER_FLAGS_AMMO_RACK) max *= 2; +#endif HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %d %s!",TXT_ALREADY_HAVE,f2i((unsigned) VULCAN_AMMO_SCALE * (unsigned) max),TXT_VULCAN_ROUNDS); used = 0; } @@ -217,21 +237,23 @@ int pick_up_vulcan_ammo(void) return used; } -extern char GetKeyValue(char); -extern void check_to_use_primary(int); - // returns true if powerup consumed int do_powerup(object *obj) { int used=0; +#if defined(DXX_BUILD_DESCENT_I) + int vulcan_ammo_to_add_with_cannon; +#endif int special_used=0; //for when hitting vulcan cannon gets vulcan ammo int id=obj->id; if ((Player_is_dead) || (ConsoleObject->type == OBJ_GHOST) || (Players[Player_num].shields < 0)) return 0; +#if defined(DXX_BUILD_DESCENT_II) if ((obj->ctype.powerup_info.flags & PF_SPAT_BY_PLAYER) && obj->ctype.powerup_info.creation_time>0 && GameTime64ctype.powerup_info.creation_time+i2f(2)) return 0; //not enough time elapsed +#endif if (Game_mode & GM_MULTI) { @@ -267,8 +289,10 @@ int do_powerup(object *obj) case POW_SHIELD_BOOST: if (Players[Player_num].shields < MAX_SHIELDS) { fix boost = 3*F1_0 + 3*F1_0*(NDL - Difficulty_level); +#if defined(DXX_BUILD_DESCENT_II) if (Difficulty_level == 0) boost += boost/2; +#endif Players[Player_num].shields += boost; if (Players[Player_num].shields > MAX_SHIELDS) Players[Player_num].shields = MAX_SHIELDS; @@ -279,7 +303,9 @@ int do_powerup(object *obj) break; case POW_LASER: if (Players[Player_num].laser_level >= MAX_LASER_LEVEL) { - //Players[Player_num].laser_level = MAX_LASER_LEVEL; +#if defined(DXX_BUILD_DESCENT_I) + Players[Player_num].laser_level = MAX_LASER_LEVEL; +#endif HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, TXT_MAXED_OUT,TXT_LASER); } else { if (Newdemo_state == ND_STATE_RECORDING) @@ -352,6 +378,32 @@ int do_powerup(object *obj) break; case POW_VULCAN_WEAPON: +#if defined(DXX_BUILD_DESCENT_I) + if ((used = pick_up_primary(VULCAN_INDEX)) != 0) { + vulcan_ammo_to_add_with_cannon = obj->ctype.powerup_info.count; + if (vulcan_ammo_to_add_with_cannon < VULCAN_WEAPON_AMMO_AMOUNT) vulcan_ammo_to_add_with_cannon = VULCAN_WEAPON_AMMO_AMOUNT; + pick_up_ammo(CLASS_PRIMARY, VULCAN_INDEX, vulcan_ammo_to_add_with_cannon); + } + +//added/edited 8/3/98 by Victor Rachels to fix vulcan multi bug +//check if multi, if so, pick up ammo w/o using, set ammo left. else, normal + +//killed 8/27/98 by Victor Rachels to fix vulcan ammo multiplying. new way +// is by spewing the current held ammo when dead. +//-killed if (!used && (Game_mode & GM_MULTI)) +//-killed { +//-killed int tempcount; +//-killed tempcount=Players[Player_num].primary_ammo[VULCAN_INDEX]; +//-killed if (pick_up_ammo(CLASS_PRIMARY, VULCAN_INDEX, obj->ctype.powerup_info.count)) +//-killed obj->ctype.powerup_info.count -= Players[Player_num].primary_ammo[VULCAN_INDEX]-tempcount; +//-killed } +//end kill - Victor Rachels + + if (!used && !(Game_mode & GM_MULTI) ) +//end addition/edit - Victor Rachels + used = pick_up_vulcan_ammo(); + break; +#elif defined(DXX_BUILD_DESCENT_II) case POW_GAUSS_WEAPON: { int ammo = obj->ctype.powerup_info.count; @@ -380,6 +432,7 @@ int do_powerup(object *obj) break; } +#endif case POW_SPREADFIRE_WEAPON: used = pick_up_primary(SPREADFIRE_INDEX); @@ -397,6 +450,7 @@ int do_powerup(object *obj) used = pick_up_energy(); break; +#if defined(DXX_BUILD_DESCENT_II) case POW_HELIX_WEAPON: used = pick_up_primary(HELIX_INDEX); if (!used && !(Game_mode & GM_MULTI) ) @@ -416,6 +470,7 @@ int do_powerup(object *obj) if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; +#endif case POW_PROXIMITY_WEAPON: used=pick_up_secondary(PROXIMITY_INDEX,4); @@ -426,6 +481,7 @@ int do_powerup(object *obj) case POW_MEGA_WEAPON: used=pick_up_secondary(MEGA_INDEX,1); break; +#if defined(DXX_BUILD_DESCENT_II) case POW_SMISSILE1_1: used=pick_up_secondary(SMISSILE1_INDEX,1); break; @@ -450,8 +506,13 @@ int do_powerup(object *obj) case POW_EARTHSHAKER_MISSILE: used=pick_up_secondary(SMISSILE5_INDEX,1); break; +#endif case POW_VULCAN_AMMO: used = pick_up_vulcan_ammo(); +#if defined(DXX_BUILD_DESCENT_I) + if (!used && !(Game_mode & GM_MULTI) ) + used = pick_up_vulcan_ammo(); +#endif break; case POW_HOMING_AMMO_1: used=pick_up_secondary(HOMING_INDEX,1); @@ -491,6 +552,7 @@ int do_powerup(object *obj) break; #endif +#if defined(DXX_BUILD_DESCENT_II) case POW_FULL_MAP: if (Players[Player_num].flags & PLAYER_FLAGS_MAP_ALL) { HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %s!",TXT_ALREADY_HAVE,"the FULL MAP"); @@ -622,7 +684,7 @@ int do_powerup(object *obj) // case POW_HOARD_ORB: - +#endif default: break; } @@ -645,7 +707,7 @@ int do_powerup(object *obj) /* * reads n powerup_type_info structs from a PHYSFS_file */ -extern int powerup_type_info_read_n(powerup_type_info *pti, int n, PHYSFS_file *fp) +int powerup_type_info_read_n(powerup_type_info *pti, int n, PHYSFS_file *fp) { int i;