Track vulcan ammo explicitly

This commit is contained in:
Kp 2013-09-20 23:12:54 +00:00
parent 6e1d9f1f0c
commit f4b21088a0
20 changed files with 78 additions and 92 deletions

View file

@ -60,7 +60,7 @@ extern int multi_protocol; // set and determinate used protocol
#define MULTI_PROTO_UDP 1 // UDP protocol
// What version of the multiplayer protocol is this? Increment each time something drastic changes in Multiplayer without the version number changes. Can be reset to 0 each time the version of the game changes
#define MULTI_PROTO_VERSION 5
#define MULTI_PROTO_VERSION 6
// PROTOCOL VARIABLES AND DEFINES - END

View file

@ -108,7 +108,7 @@ typedef struct player {
ushort primary_weapon_flags; // bit set indicates the player has this weapon.
ushort secondary_weapon_flags; // bit set indicates the player has this weapon.
#endif
ushort primary_ammo[MAX_PRIMARY_WEAPONS]; // How much ammo of each type.
ushort vulcan_ammo;
ushort secondary_ammo[MAX_SECONDARY_WEAPONS]; // How much ammo of each type.
#if defined(DXX_BUILD_DESCENT_II)
@ -165,11 +165,15 @@ typedef struct player_rw {
#if defined(DXX_BUILD_DESCENT_I)
ubyte primary_weapon_flags; // bit set indicates the player has this weapon.
ubyte secondary_weapon_flags; // bit set indicates the player has this weapon.
ushort laser_ammo;
#elif defined(DXX_BUILD_DESCENT_II)
ushort primary_weapon_flags; // bit set indicates the player has this weapon.
ushort secondary_weapon_flags; // bit set indicates the player has this weapon.
#endif
ushort primary_ammo[MAX_PRIMARY_WEAPONS]; // How much ammo of each type.
ushort vulcan_ammo;
#if defined(DXX_BUILD_DESCENT_I)
ushort spreadfire_ammo, plasma_ammo, fusion_ammo;
#endif
ushort secondary_ammo[MAX_SECONDARY_WEAPONS]; // How much ammo of each type.
#if defined(DXX_BUILD_DESCENT_II)

View file

@ -1104,7 +1104,7 @@ void drop_player_eggs(object *playerobj)
call_object_create_egg(playerobj, 1, OBJ_POWERUP, POW_CLOAK);
//Drop the vulcan, gauss, and ammo
vulcan_ammo = Players[pnum].primary_ammo[VULCAN_INDEX];
vulcan_ammo = Players[pnum].vulcan_ammo;
if (vulcan_ammo < VULCAN_AMMO_AMOUNT)
vulcan_ammo = VULCAN_AMMO_AMOUNT; //make sure gun has at least as much as a powerup
objnum = maybe_drop_primary_weapon_egg(playerobj, VULCAN_INDEX);
@ -1130,7 +1130,7 @@ void drop_player_eggs(object *playerobj)
// If player has vulcan ammo, but no vulcan cannon, drop the ammo.
if (!(Players[playerobj->id].primary_weapon_flags & HAS_VULCAN_FLAG)) {
int amount = Players[playerobj->id].primary_ammo[VULCAN_INDEX];
int amount = Players[playerobj->id].vulcan_ammo;
if (amount > 200) {
amount = 200;
}

View file

@ -617,7 +617,7 @@ void maybe_replace_powerup_with_energy(object *del_obj)
}
// Don't drop vulcan ammo if player maxed out.
if ((weapon_index_uses_vulcan_ammo(weapon_index) || (del_obj->contains_id == POW_VULCAN_AMMO)) && (Players[Player_num].primary_ammo[VULCAN_INDEX] >= VULCAN_AMMO_MAX))
if ((weapon_index_uses_vulcan_ammo(weapon_index) || (del_obj->contains_id == POW_VULCAN_AMMO)) && (Players[Player_num].vulcan_ammo >= VULCAN_AMMO_MAX))
del_obj->contains_count = 0;
else if (weapon_index != -1) {
if ((player_has_weapon(weapon_index, 0) & HAS_WEAPON_FLAG) || weapon_nearby(del_obj, del_obj->contains_id)) {

View file

@ -267,10 +267,6 @@ void init_ammo_and_energy(void)
if (Players[Player_num].shields < StartingShields)
Players[Player_num].shields = StartingShields;
// for (i=0; i<MAX_PRIMARY_WEAPONS; i++)
// if (Players[Player_num].primary_ammo[i] < Default_primary_ammo_level[i])
// Players[Player_num].primary_ammo[i] = Default_primary_ammo_level[i];
// for (i=0; i<MAX_SECONDARY_WEAPONS; i++)
// if (Players[Player_num].secondary_ammo[i] < Default_secondary_ammo_level[i])
// Players[Player_num].secondary_ammo[i] = Default_secondary_ammo_level[i];
@ -354,8 +350,7 @@ void init_player_stats_new_ship(ubyte pnum)
Players[pnum].laser_level = 0;
Players[pnum].killer_objnum = -1;
Players[pnum].hostages_on_board = 0;
for (i=0; i<MAX_PRIMARY_WEAPONS; i++)
Players[pnum].primary_ammo[i] = 0;
Players[pnum].vulcan_ammo = 0;
for (i=1; i<MAX_SECONDARY_WEAPONS; i++)
Players[pnum].secondary_ammo[i] = 0;
Players[pnum].secondary_ammo[0] = 2 + NDL - Difficulty_level;

View file

@ -1028,7 +1028,7 @@ int do_laser_firing_player(void)
ammo_used = Weapon_info[weapon_index].ammo_usage;
while (Next_laser_fire_time <= GameTime64) {
if ((plp->energy >= energy_used) || (weapon_index_uses_vulcan_ammo(Primary_weapon) && (plp->primary_ammo[Primary_weapon] >= ammo_used)) ) {
if ((plp->energy >= energy_used) || (weapon_index_uses_vulcan_ammo(Primary_weapon) && (plp->vulcan_ammo >= ammo_used)) ) {
int laser_level, flags, fire_frame_overhead = 0;
if (GameTime64 - Next_laser_fire_time <= FrameTime) // if firing is prolonged by FrameTime overhead, let's try to fix that.
@ -1060,10 +1060,10 @@ int do_laser_firing_player(void)
if (plp->energy < 0)
plp->energy = 0;
if (ammo_used > plp->primary_ammo[Primary_weapon])
plp->primary_ammo[Primary_weapon] = 0;
if (ammo_used > plp->vulcan_ammo)
plp->vulcan_ammo = 0;
else
plp->primary_ammo[Primary_weapon] -= ammo_used;
plp->vulcan_ammo -= ammo_used;
auto_select_weapon(0); // Make sure the player can fire from this weapon.

View file

@ -134,15 +134,11 @@ void do_megawow_powerup(int quantity)
powerup_basic(30, 0, 30, 1, "MEGA-WOWIE-ZOWIE!");
Players[Player_num].primary_weapon_flags = 0xff;
Players[Player_num].secondary_weapon_flags = 0xff;
for (i=0; i<3; i++)
Players[Player_num].primary_ammo[i] = 200;
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].primary_ammo[i] = 200;
for (i=3; i<5; i++)
Players[Player_num].secondary_ammo[i] = quantity/5;

View file

@ -1874,7 +1874,7 @@ void drop_player_eggs(object *playerobj)
}
//Drop the vulcan, gauss, and ammo
vulcan_ammo = Players[pnum].primary_ammo[VULCAN_INDEX];
vulcan_ammo = Players[pnum].vulcan_ammo;
if ((Players[pnum].primary_weapon_flags & HAS_FLAG(VULCAN_INDEX)) && (Players[pnum].primary_weapon_flags & HAS_FLAG(GAUSS_INDEX)))
vulcan_ammo /= 2; //if both vulcan & gauss, each gets half
if (vulcan_ammo < VULCAN_AMMO_AMOUNT)
@ -1919,7 +1919,7 @@ void drop_player_eggs(object *playerobj)
// If player has vulcan ammo, but no vulcan cannon, drop the ammo.
if (!(Players[playerobj->id].primary_weapon_flags & HAS_VULCAN_FLAG)) {
int amount = Players[playerobj->id].primary_ammo[VULCAN_INDEX];
int amount = Players[playerobj->id].vulcan_ammo;
if (amount > 200) {
amount = 200;
}

View file

@ -1426,7 +1426,7 @@ int maybe_steal_secondary_weapon(int player_num, int weapon_num)
// ----------------------------------------------------------------------------
int maybe_steal_primary_weapon(int player_num, int weapon_num)
{
if ((Players[player_num].primary_weapon_flags & HAS_FLAG(weapon_num)) && Players[player_num].primary_ammo[weapon_num]) {
if ((Players[player_num].primary_weapon_flags & HAS_FLAG(weapon_num)) && (!weapon_index_uses_vulcan_ammo(weapon_num) || Players[player_num].vulcan_ammo)) {
if (d_rand() < THIEF_PROBABILITY) {
if (weapon_num == 0) {
if (Players[player_num].laser_level > 0) {

View file

@ -711,7 +711,7 @@ void maybe_replace_powerup_with_energy(object *del_obj)
}
// Don't drop vulcan ammo if player maxed out.
if ((weapon_index_uses_vulcan_ammo(weapon_index) || (del_obj->contains_id == POW_VULCAN_AMMO)) && (Players[Player_num].primary_ammo[VULCAN_INDEX] >= VULCAN_AMMO_MAX))
if ((weapon_index_uses_vulcan_ammo(weapon_index) || (del_obj->contains_id == POW_VULCAN_AMMO)) && (Players[Player_num].vulcan_ammo >= VULCAN_AMMO_MAX))
del_obj->contains_count = 0;
else if (weapon_index != -1) {
if ((player_has_weapon(weapon_index, 0) & HAS_WEAPON_FLAG) || weapon_nearby(del_obj, del_obj->contains_id)) {

View file

@ -290,10 +290,6 @@ void init_ammo_and_energy(void)
if (Players[Player_num].shields < StartingShields)
Players[Player_num].shields = StartingShields;
// for (i=0; i<MAX_PRIMARY_WEAPONS; i++)
// if (Players[Player_num].primary_ammo[i] < Default_primary_ammo_level[i])
// Players[Player_num].primary_ammo[i] = Default_primary_ammo_level[i];
// for (i=0; i<MAX_SECONDARY_WEAPONS; i++)
// if (Players[Player_num].secondary_ammo[i] < Default_secondary_ammo_level[i])
// Players[Player_num].secondary_ammo[i] = Default_secondary_ammo_level[i];
@ -402,8 +398,7 @@ void init_player_stats_new_ship(ubyte pnum)
Players[pnum].laser_level = 0;
Players[pnum].killer_objnum = -1;
Players[pnum].hostages_on_board = 0;
for (i=0; i<MAX_PRIMARY_WEAPONS; i++)
Players[pnum].primary_ammo[i] = 0;
Players[pnum].vulcan_ammo = 0;
for (i=1; i<MAX_SECONDARY_WEAPONS; i++)
Players[pnum].secondary_ammo[i] = 0;
Players[pnum].secondary_ammo[0] = 2 + NDL - Difficulty_level;

View file

@ -1526,7 +1526,7 @@ int do_laser_firing_player(void)
ammo_used = Weapon_info[weapon_index].ammo_usage;
primary_ammo = (weapon_index_uses_vulcan_ammo(Primary_weapon))?(plp->primary_ammo[VULCAN_INDEX]):(plp->primary_ammo[Primary_weapon]);
primary_ammo = (weapon_index_uses_vulcan_ammo(Primary_weapon))?(plp->vulcan_ammo):0;
if (!((plp->energy >= energy_used) && (primary_ammo >= ammo_used)))
auto_select_weapon(0); // Make sure the player can fire from this weapon.
@ -1570,10 +1570,10 @@ int do_laser_firing_player(void)
plp->energy = 0;
if (weapon_index_uses_vulcan_ammo(Primary_weapon)) {
if (ammo_used > plp->primary_ammo[VULCAN_INDEX])
plp->primary_ammo[VULCAN_INDEX] = 0;
if (ammo_used > plp->vulcan_ammo)
plp->vulcan_ammo = 0;
else
plp->primary_ammo[VULCAN_INDEX] -= ammo_used;
plp->vulcan_ammo -= ammo_used;
}
auto_select_weapon(0); // Make sure the player can fire from this weapon.

View file

@ -152,8 +152,7 @@ void do_megawow_powerup(int quantity)
Players[Player_num].primary_weapon_flags = 0xffff ^ HAS_FLAG(SUPER_LASER_INDEX); //no super laser
Players[Player_num].secondary_weapon_flags = 0xffff;
for (i=0; i<MAX_PRIMARY_WEAPONS; i++)
Players[Player_num].primary_ammo[i] = VULCAN_AMMO_MAX;
Players[Player_num].vulcan_ammo = VULCAN_AMMO_MAX;
for (i=0; i<3; i++)
Players[Player_num].secondary_ammo[i] = quantity;

View file

@ -1500,8 +1500,7 @@ int FinalCheats(int key)
Players[Player_num].primary_weapon_flags |= 0xff ^ (HAS_PLASMA_FLAG | HAS_FUSION_FLAG);
Players[Player_num].secondary_weapon_flags |= 0xff ^ (HAS_SMART_FLAG | HAS_MEGA_FLAG);
for (i=0; i<3; i++)
Players[Player_num].primary_ammo[i] = Primary_ammo_max[i];
Players[Player_num].vulcan_ammo = Primary_ammo_max[VULCAN_INDEX];
for (i=0; i<3; i++)
Players[Player_num].secondary_ammo[i] = Secondary_ammo_max[i];
@ -1521,8 +1520,7 @@ int FinalCheats(int key)
Players[Player_num].primary_weapon_flags = 0xff;
Players[Player_num].secondary_weapon_flags = 0xff;
for (i=0; i<MAX_PRIMARY_WEAPONS; i++)
Players[Player_num].primary_ammo[i] = Primary_ammo_max[i];
Players[Player_num].vulcan_ammo = Primary_ammo_max[VULCAN_INDEX];
for (i=0; i<MAX_SECONDARY_WEAPONS; i++)
Players[Player_num].secondary_ammo[i] = Secondary_ammo_max[i];
@ -1556,8 +1554,7 @@ int FinalCheats(int key)
Players[Player_num].secondary_weapon_flags = 0xffff;
}
for (i=0; i<MAX_PRIMARY_WEAPONS; i++)
Players[Player_num].primary_ammo[i] = Primary_ammo_max[i];
Players[Player_num].vulcan_ammo = Primary_ammo_max[VULCAN_INDEX];
for (i=0; i<MAX_SECONDARY_WEAPONS; i++)
Players[Player_num].secondary_ammo[i] = Secondary_ammo_max[i];

View file

@ -1180,7 +1180,7 @@ void hud_show_weapons_mode(int type,int vertical,int orig_x,int orig_y){
case 1:
#if defined(DXX_BUILD_DESCENT_I)
if (PlayerCfg.CockpitMode[1]==CM_FULL_SCREEN)
sprintf(weapon_str,"V%i", f2i(Players[Player_num].primary_ammo[1] * VULCAN_AMMO_SCALE));
sprintf(weapon_str,"V%i", f2i(Players[Player_num].vulcan_ammo * VULCAN_AMMO_SCALE));
else
#endif
sprintf(weapon_str,"V");
@ -1201,7 +1201,7 @@ void hud_show_weapons_mode(int type,int vertical,int orig_x,int orig_y){
gr_string(x, y, weapon_str);
#if defined(DXX_BUILD_DESCENT_II)
if (i == 1 && Primary_weapon == i && PlayerCfg.CockpitMode[1]==CM_FULL_SCREEN)
gr_printf(x,y-(LINE_SPACING*1),"V:%i",f2i((unsigned int)Players[Player_num].primary_ammo[1] * VULCAN_AMMO_SCALE));
gr_printf(x,y-(LINE_SPACING*1),"V:%i",f2i((unsigned int)Players[Player_num].vulcan_ammo * VULCAN_AMMO_SCALE));
#endif
}
} else {
@ -1273,7 +1273,7 @@ void hud_show_weapons_mode(int type,int vertical,int orig_x,int orig_y){
x-=w+FSPACX(3);
gr_string(x, y, weapon_str);
if (i == 6 && Primary_weapon == i && PlayerCfg.CockpitMode[1]==CM_FULL_SCREEN)
gr_printf(x+FSPACX(9),y-(LINE_SPACING*2),"G:%i",f2i((unsigned int)Players[Player_num].primary_ammo[1] * VULCAN_AMMO_SCALE));
gr_printf(x+FSPACX(9),y-(LINE_SPACING*2),"G:%i",f2i((unsigned int)Players[Player_num].vulcan_ammo * VULCAN_AMMO_SCALE));
}
} else {
for (i=9;i>=5;i--){
@ -1356,7 +1356,7 @@ void hud_show_weapons(void)
#if defined(DXX_BUILD_DESCENT_II)
case GAUSS_INDEX:
#endif
sprintf(weapon_str, "%s: %i", weapon_name, f2i((unsigned) Players[Player_num].primary_ammo[VULCAN_INDEX] * (unsigned) VULCAN_AMMO_SCALE));
sprintf(weapon_str, "%s: %i", weapon_name, f2i((unsigned) Players[Player_num].vulcan_ammo * (unsigned) VULCAN_AMMO_SCALE));
convert_1s(weapon_str);
disp_primary_weapon_name = weapon_str;
break;
@ -2197,8 +2197,8 @@ void draw_weapon_boxes()
if (is_vulcan_ammo_weapon)
{
if (Newdemo_state == ND_STATE_RECORDING)
newdemo_record_primary_ammo(Players[Player_num].primary_ammo[VULCAN_INDEX]);
draw_primary_ammo_info(f2i((unsigned) VULCAN_AMMO_SCALE * (unsigned) Players[Player_num].primary_ammo[VULCAN_INDEX]));
newdemo_record_primary_ammo(Players[Player_num].vulcan_ammo);
draw_primary_ammo_info(f2i((unsigned) VULCAN_AMMO_SCALE * (unsigned) Players[Player_num].vulcan_ammo));
}
#if defined(DXX_BUILD_DESCENT_II)
@ -2801,7 +2801,7 @@ void draw_hud()
if (Newdemo_state == ND_STATE_RECORDING)
{
if (Primary_weapon == VULCAN_INDEX)
newdemo_record_primary_ammo(Players[Player_num].primary_ammo[Primary_weapon]);
newdemo_record_primary_ammo(Players[Player_num].vulcan_ammo);
#if defined(DXX_BUILD_DESCENT_II)
if (Primary_weapon == OMEGA_INDEX)
newdemo_record_primary_ammo(Omega_charge);

View file

@ -1788,10 +1788,7 @@ multi_do_player_explode(const ubyte *buf)
Players[pnum].secondary_ammo[SMISSILE5_INDEX] = buf[count]; count++;
#endif
Players[pnum].primary_ammo[VULCAN_INDEX] = GET_INTEL_SHORT(buf + count); count += 2;
#if defined(DXX_BUILD_DESCENT_II)
Players[pnum].primary_ammo[GAUSS_INDEX] = GET_INTEL_SHORT(buf + count); count += 2;
#endif
Players[pnum].vulcan_ammo = GET_INTEL_SHORT(buf + count); count += 2;
Players[pnum].flags = GET_INTEL_INT(buf + count); count += 4;
multi_powcap_adjust_remote_cap (pnum);
@ -2667,12 +2664,8 @@ multi_send_player_explode(char type)
multibuf[count++] = (char)Players[Player_num].secondary_ammo[SMISSILE5_INDEX];
#endif
PUT_INTEL_SHORT(multibuf+count, Players[Player_num].primary_ammo[VULCAN_INDEX] );
PUT_INTEL_SHORT(multibuf+count, Players[Player_num].vulcan_ammo );
count += 2;
#if defined(DXX_BUILD_DESCENT_II)
PUT_INTEL_SHORT(multibuf+count, Players[Player_num].primary_ammo[GAUSS_INDEX] );
count += 2;
#endif
PUT_INTEL_INT(multibuf+count, Players[Player_num].flags );
count += 4;

View file

@ -917,7 +917,7 @@ void newdemo_record_start_demo()
nd_record_v_secondary_ammo = -1;
for (i = 0; i < MAX_PRIMARY_WEAPONS; i++)
nd_write_short((short)Players[Player_num].primary_ammo[i]);
nd_write_short(i == VULCAN_INDEX ? Players[Player_num].vulcan_ammo : 0);
for (i = 0; i < MAX_SECONDARY_WEAPONS; i++)
nd_write_short((short)Players[Player_num].secondary_ammo[i]);
@ -1718,9 +1718,12 @@ int newdemo_read_demo_start(enum purpose_type purpose)
for (i = 0; i < MAX_PRIMARY_WEAPONS; i++)
{
nd_read_short((short*)&(Players[Player_num].primary_ammo[i]));
short s;
nd_read_short(&s);
if (i == VULCAN_INDEX)
Players[Player_num].vulcan_ammo = s;
if (purpose == PURPOSE_REWRITE)
nd_write_short(Players[Player_num].primary_ammo[i]);
nd_write_short(s);
}
for (i = 0; i < MAX_SECONDARY_WEAPONS; i++)
@ -2791,21 +2794,21 @@ int newdemo_read_frame_information(int rewrite)
break;
}
unsigned short value;
// NOTE: Used (Primary_weapon==GAUSS_INDEX?VULCAN_INDEX:Primary_weapon) because game needs VULCAN_INDEX updated to show Gauss ammo
#if defined(DXX_BUILD_DESCENT_I)
if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))
Players[Player_num].primary_ammo[Primary_weapon] = old_ammo;
value = old_ammo;
else if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD))
Players[Player_num].primary_ammo[Primary_weapon] = new_ammo;
#elif defined(DXX_BUILD_DESCENT_II)
if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))
Players[Player_num].primary_ammo[(Primary_weapon==GAUSS_INDEX?VULCAN_INDEX:Primary_weapon)] = old_ammo;
else if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD))
Players[Player_num].primary_ammo[(Primary_weapon==GAUSS_INDEX?VULCAN_INDEX:Primary_weapon)] = new_ammo;
value = new_ammo;
else
break;
#if defined(DXX_BUILD_DESCENT_II)
if (Primary_weapon == OMEGA_INDEX) // If Omega cannon, we need to update Omega_charge - not stored in primary_ammo
Omega_charge = (Players[Player_num].primary_ammo[Primary_weapon]<=0?f1_0:Players[Player_num].primary_ammo[Primary_weapon]);
Omega_charge = (value<=0?f1_0:value);
else
#endif
if (weapon_index_uses_vulcan_ammo(Primary_weapon))
Players[Player_num].vulcan_ammo = value;
break;
}
@ -3190,7 +3193,12 @@ void newdemo_goto_end(int to_rewrite)
nd_read_byte((sbyte *)&Primary_weapon);
nd_read_byte((sbyte *)&Secondary_weapon);
for (i = 0; i < MAX_PRIMARY_WEAPONS; i++)
nd_read_short((short *)&(Players[Player_num].primary_ammo[i]));
{
short s;
nd_read_short(&s);
if (i == VULCAN_INDEX)
Players[Player_num].vulcan_ammo = s;
}
for (i = 0; i < MAX_SECONDARY_WEAPONS; i++)
nd_read_short((short *)&(Players[Player_num].secondary_ammo[i]));
nd_read_byte(&laser_level);
@ -3607,7 +3615,7 @@ void newdemo_write_end()
byte_count += 8;
for (i = 0; i < MAX_PRIMARY_WEAPONS; i++)
nd_write_short((short)Players[Player_num].primary_ammo[i]);
nd_write_short(i == VULCAN_INDEX ? Players[Player_num].vulcan_ammo : 0);
for (i = 0; i < MAX_SECONDARY_WEAPONS; i++)
nd_write_short((short)Players[Player_num].secondary_ammo[i]);

View file

@ -27,8 +27,7 @@ void player_rw_swap(player_rw *p, int swap)
p->primary_weapon_flags = SWAPSHORT(p->primary_weapon_flags);
p->secondary_weapon_flags = SWAPSHORT(p->secondary_weapon_flags);
#endif
for (i = 0; i < MAX_PRIMARY_WEAPONS; i++)
p->primary_ammo[i] = SWAPSHORT(p->primary_ammo[i]);
p->vulcan_ammo = SWAPSHORT(p->vulcan_ammo);
for (i = 0; i < MAX_SECONDARY_WEAPONS; i++)
p->secondary_ammo[i] = SWAPSHORT(p->secondary_ammo[i]);
p->last_score = SWAPINT(p->last_score);

View file

@ -476,8 +476,7 @@ void state_player_to_player_rw(player *pl, player_rw *pl_rw)
pl_rw->killer_objnum = pl->killer_objnum;
pl_rw->primary_weapon_flags = pl->primary_weapon_flags;
pl_rw->secondary_weapon_flags = pl->secondary_weapon_flags;
for (i = 0; i < MAX_PRIMARY_WEAPONS; i++)
pl_rw->primary_ammo[i] = pl->primary_ammo[i];
pl_rw->vulcan_ammo = pl->vulcan_ammo;
for (i = 0; i < MAX_SECONDARY_WEAPONS; i++)
pl_rw->secondary_ammo[i] = pl->secondary_ammo[i];
pl_rw->last_score = pl->last_score;
@ -530,8 +529,7 @@ void state_player_rw_to_player(player_rw *pl_rw, player *pl)
pl->killer_objnum = pl_rw->killer_objnum;
pl->primary_weapon_flags = pl_rw->primary_weapon_flags;
pl->secondary_weapon_flags = pl_rw->secondary_weapon_flags;
for (i = 0; i < MAX_PRIMARY_WEAPONS; i++)
pl->primary_ammo[i] = pl_rw->primary_ammo[i];
pl->vulcan_ammo = pl_rw->vulcan_ammo;
for (i = 0; i < MAX_SECONDARY_WEAPONS; i++)
pl->secondary_ammo[i] = pl_rw->secondary_ammo[i];
pl->last_score = pl_rw->last_score;

View file

@ -212,13 +212,15 @@ int player_has_weapon(int weapon_num, int secondary_flag)
// Special case: Gauss cannon uses vulcan ammo.
if (weapon_index_uses_vulcan_ammo(weapon_num)) {
if (Weapon_info[weapon_index].ammo_usage <= Players[Player_num].primary_ammo[VULCAN_INDEX])
return_value |= HAS_AMMO_FLAG;
} else
if (Weapon_info[weapon_index].ammo_usage <= Players[Player_num].primary_ammo[weapon_num])
if (Weapon_info[weapon_index].ammo_usage <= Players[Player_num].vulcan_ammo)
return_value |= HAS_AMMO_FLAG;
}
#if defined(DXX_BUILD_DESCENT_I)
/* Hack to work around check in do_weapon_select */
else
return_value |= HAS_AMMO_FLAG;
//added on 1/21/99 by Victor Rachels... yet another hack
//fusion has 0 energy usage, HAS_ENERGY_FLAG was always true
if(weapon_num==FUSION_INDEX)
@ -834,16 +836,16 @@ int pick_up_ammo(int class_flag,int weapon_index,int ammo_count)
max *= 2;
#endif
if (Players[Player_num].primary_ammo[weapon_index] == max)
if (Players[Player_num].vulcan_ammo == max)
return 0;
old_ammo = Players[Player_num].primary_ammo[weapon_index];
old_ammo = Players[Player_num].vulcan_ammo;
Players[Player_num].primary_ammo[weapon_index] += ammo_count;
Players[Player_num].vulcan_ammo += ammo_count;
if (Players[Player_num].primary_ammo[weapon_index] > max) {
ammo_count += (max - Players[Player_num].primary_ammo[weapon_index]);
Players[Player_num].primary_ammo[weapon_index] = max;
if (Players[Player_num].vulcan_ammo > max) {
ammo_count += (max - Players[Player_num].vulcan_ammo);
Players[Player_num].vulcan_ammo = max;
}
cutpoint=POrderList (255);
@ -1218,12 +1220,12 @@ void DropCurrentWeapon ()
//if it's one of these, drop some ammo with the weapon
ammo = Players[Player_num].primary_ammo[VULCAN_INDEX];
ammo = Players[Player_num].vulcan_ammo;
if ((Players[Player_num].primary_weapon_flags & HAS_FLAG(VULCAN_INDEX)) && (Players[Player_num].primary_weapon_flags & HAS_FLAG(GAUSS_INDEX)))
ammo /= 2; //if both vulcan & gauss, drop half
Players[Player_num].primary_ammo[VULCAN_INDEX] -= ammo;
Players[Player_num].vulcan_ammo -= ammo;
if (objnum!=-1)
Objects[objnum].ctype.powerup_info.count = ammo;