//called when a primary weapon is picked up //returns true if actually picked up int pick_up_primary(int weapon_index) { //ushort old_flags = Players[Player_num].primary_weapon_flags; ushort flag = 1<<weapon_index; int cutpoint, supposed_weapon=Primary_weapon; if (weapon_index!=LASER_INDEX && Players[Player_num].primary_weapon_flags & flag) { //already have HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %s!", TXT_ALREADY_HAVE_THE, PRIMARY_WEAPON_NAMES(weapon_index)); return 0; } Players[Player_num].primary_weapon_flags |= flag; cutpoint=POrderList (255); if (Primary_weapon==LASER_INDEX && Players[Player_num].laser_level>=4) supposed_weapon=SUPER_LASER_INDEX; // allotment for stupid way of doing super laser if (((Controls.fire_primary_state && PlayerCfg.NoFireAutoselect)?0:1) && POrderList(weapon_index)<cutpoint && POrderList(weapon_index)<POrderList(supposed_weapon)) select_weapon(weapon_index,0,0,1); PALETTE_FLASH_ADD(7,14,21); if (weapon_index!=LASER_INDEX) HUD_init_message(HM_DEFAULT, "%s!",PRIMARY_WEAPON_NAMES(weapon_index)); return 1; }
// ---------------------------------------------------------------------------------------- // Show tPlayer which weapons he has, how much ammo... // Looks like a debug screen now because it writes to mono screen, but that will change... void ShowWeaponStatus (void) { int i; #if TRACE for (i = 0; i < MAX_PRIMARY_WEAPONS; i++) { if (LOCALPLAYER.primaryWeaponFlags & (1 << i)) con_printf (CONDBG, "HAVE"); else con_printf (CONDBG, " "); con_printf (CONDBG, " Weapon: %20s, charges: %4i\n", PRIMARY_WEAPON_NAMES(i), LOCALPLAYER.primaryAmmo [i]); } con_printf (CONDBG, "\n"); for (i = 0; i < MAX_SECONDARY_WEAPONS; i++) { if (LOCALPLAYER.secondaryWeaponFlags & (1 << i)) con_printf (CONDBG, "HAVE"); else con_printf (CONDBG, " "); con_printf (CONDBG, " Weapon: %20s, charges: %4i\n", SECONDARY_WEAPON_NAMES(i), LOCALPLAYER.secondaryAmmo [i]); } con_printf (CONDBG, "\n"); con_printf (CONDBG, "\n"); #endif }
// ------------------------------------------------------------------------------------ // Select a weapon, primary or secondary. void do_weapon_select(int weapon_num, int secondary_flag) { int weapon_num_save=weapon_num; int weapon_status,current,has_flag; ubyte last_was_super; if (!secondary_flag) { current = Primary_weapon; last_was_super = Primary_last_was_super[weapon_num]; has_flag = HAS_WEAPON_FLAG; } else { current = Secondary_weapon; last_was_super = Secondary_last_was_super[weapon_num]; has_flag = HAS_WEAPON_FLAG+HAS_AMMO_FLAG; } if (current == weapon_num || current == weapon_num+SUPER_WEAPON) { //already have this selected, so toggle to other of normal/super version weapon_num += weapon_num+SUPER_WEAPON - current; weapon_status = player_has_weapon(weapon_num, secondary_flag); } else { //go to last-select version of requested missile if (last_was_super) weapon_num += SUPER_WEAPON; weapon_status = player_has_weapon(weapon_num, secondary_flag); //if don't have last-selected, try other version if ((weapon_status & has_flag) != has_flag) { weapon_num = 2*weapon_num_save+SUPER_WEAPON - weapon_num; weapon_status = player_has_weapon(weapon_num, secondary_flag); if ((weapon_status & has_flag) != has_flag) weapon_num = 2*weapon_num_save+SUPER_WEAPON - weapon_num; } } //if we don't have the weapon we're switching to, give error & bail if ((weapon_status & has_flag) != has_flag) { if (!secondary_flag) { if (weapon_num==SUPER_LASER_INDEX) return; //no such thing as super laser, so no error HUD_init_message(HM_DEFAULT, "%s %s!", TXT_DONT_HAVE, PRIMARY_WEAPON_NAMES(weapon_num)); } else HUD_init_message(HM_DEFAULT, "%s %s%s",TXT_HAVE_NO, SECONDARY_WEAPON_NAMES(weapon_num), TXT_SX); digi_play_sample( SOUND_BAD_SELECTION, F1_0 ); return; } //now actually select the weapon select_weapon(weapon_num, secondary_flag, 1, 1); }
void DropCurrentWeapon () { int ammo=0,seed; objnum_t objnum; if (num_objects >= MAX_USED_OBJECTS) return; if (Primary_weapon==0) { HUD_init_message(HM_DEFAULT, "You cannot drop your base weapon!"); return; } HUD_init_message(HM_DEFAULT, "%s dropped!",PRIMARY_WEAPON_NAMES(Primary_weapon)); digi_play_sample (SOUND_DROP_WEAPON,F1_0); seed = d_rand(); objnum = spit_powerup(ConsoleObject,Primary_weapon_to_powerup[Primary_weapon],seed); if (objnum==object_none) return; if (Primary_weapon == VULCAN_INDEX || Primary_weapon == GAUSS_INDEX) { //if it's one of these, drop some ammo with the weapon ammo = Players[Player_num].primary_ammo[VULCAN_INDEX]; 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; if (objnum!=object_none) Objects[objnum].ctype.powerup_info.count = ammo; } if (Primary_weapon == OMEGA_INDEX) { //dropped weapon has current energy if (objnum!=object_none) Objects[objnum].ctype.powerup_info.count = Omega_charge; } #ifdef NETWORK if ((Game_mode & GM_MULTI) && objnum!=object_none) multi_send_drop_weapon(objnum,seed); #endif Players[Player_num].primary_weapon_flags &= (~(1<<Primary_weapon)); auto_select_weapon (0); }
//called when a primary weapon is picked up //returns true if actually picked up int PickupPrimary (int nWeaponIndex, int nPlayer) { tPlayer *playerP = gameData.multiplayer.players + nPlayer; //ushort oldFlags = LOCALPLAYER.primaryWeaponFlags; ushort flag = 1 << nWeaponIndex; int nCutPoint; int nSupposedWeapon = gameData.weapons.nPrimary; int bTripleFusion = !gameData.multiplayer.weaponStates [nPlayer].bTripleFusion && (nWeaponIndex == FUSION_INDEX) && EGI_FLAG (bTripleFusion, 0, 0, 0); if ((nWeaponIndex != LASER_INDEX) && (playerP->primaryWeaponFlags & flag) && !bTripleFusion) { if (ISLOCALPLAYER (nPlayer)) HUDInitMessage ("%s %s!", TXT_ALREADY_HAVE_THE, PRIMARY_WEAPON_NAMES (nWeaponIndex)); return 0; } if (!(playerP->primaryWeaponFlags & flag)) playerP->primaryWeaponFlags |= flag; else if (bTripleFusion) { if (nPlayer == gameData.multiplayer.nLocalPlayer) gameData.weapons.bTripleFusion = 1; else gameData.multiplayer.weaponStates [nPlayer].bTripleFusion = 1; } if (ISLOCALPLAYER (nPlayer)) { nCutPoint = POrderList (255); if ((gameData.weapons.nPrimary == LASER_INDEX) && (playerP->laserLevel >= 4)) nSupposedWeapon = SUPER_LASER_INDEX; // allotment for stupid way of doing super laser if ((gameOpts->gameplay.nAutoSelectWeapon == 2) && (POrderList (nWeaponIndex) < nCutPoint) && (POrderList (nWeaponIndex) < POrderList (nSupposedWeapon))) SelectWeapon (nWeaponIndex, 0, 0, 1); PALETTE_FLASH_ADD (7,14,21); if (nWeaponIndex != LASER_INDEX) HUDInitMessage ("%s!", PRIMARY_WEAPON_NAMES (nWeaponIndex)); } return 1; }
//flags whether the last time we use this weapon, it was the 'super' version // ------------------------------------------------------------------------------------ // Select a weapon, primary or secondary. void DoSelectWeapon (int nWeapon, int bSecondary) { int nWeaponSave = nWeapon; int nWeaponStatus, nCurrent, hasFlag; ubyte bLastWasSuper; if (!bSecondary) { nCurrent = gameData.weapons.nPrimary; if ((nCurrent == LASER_INDEX) && (LOCALPLAYER.laserLevel > MAX_LASER_LEVEL)) nCurrent = SUPER_LASER_INDEX; bLastWasSuper = bLastPrimaryWasSuper [nWeapon]; if ((nWeapon == LASER_INDEX) && (LOCALPLAYER.laserLevel > MAX_LASER_LEVEL)) nWeapon = SUPER_LASER_INDEX; hasFlag = HAS_WEAPON_FLAG; LOCALPLAYER.energy += gameData.fusion.xCharge; gameData.fusion.xCharge = 0; } else if (nWeapon == 2) { ToggleBomb (); return; } else { nCurrent = gameData.weapons.nSecondary; bLastWasSuper = bLastSecondaryWasSuper [nWeapon % SUPER_WEAPON]; hasFlag = HAS_WEAPON_FLAG + HAS_AMMO_FLAG; } if ((nCurrent == nWeapon) || (nCurrent == nWeapon + SUPER_WEAPON)) { //already have this selected, so toggle to other of Normal/super version if (!bSecondary && (nCurrent == SUPER_LASER_INDEX)) return; nWeapon %= SUPER_WEAPON; if (!bLastWasSuper) nWeapon += SUPER_WEAPON; nWeaponStatus = PlayerHasWeapon (nWeapon, bSecondary, -1, 0); } else { //go to last-select version of requested missile if (bLastWasSuper && (nWeapon < SUPER_WEAPON)) nWeapon += SUPER_WEAPON; nWeaponStatus = PlayerHasWeapon (nWeapon, bSecondary, -1, 0); //if don't have last-selected, try other version if ((nWeaponStatus & hasFlag) != hasFlag) { nWeapon = 2 * nWeaponSave + SUPER_WEAPON - nWeapon; nWeaponStatus = PlayerHasWeapon (nWeapon, bSecondary, -1, 0); if ((nWeaponStatus & hasFlag) != hasFlag) nWeapon = 2 * nWeaponSave + SUPER_WEAPON - nWeapon; } } //if we don't have the weapon we're switching to, give error & bail if ((nWeaponStatus & hasFlag) != hasFlag) { if (!bSecondary) { if (nWeapon == SUPER_LASER_INDEX) return; //no such thing as super laser, so no error HUDInitMessage ("%s %s!", TXT_DONT_HAVE, PRIMARY_WEAPON_NAMES (nWeapon)); } else HUDInitMessage ("%s %s%s",TXT_HAVE_NO, SECONDARY_WEAPON_NAMES (nWeapon), TXT_SX); DigiPlaySample (SOUND_BAD_SELECTION, F1_0); return; } //now actually select the weapon SelectWeapon (nWeapon, bSecondary, 1, 1); }
// ------------------------------------------------------------------------------------ //if message flag set, print message saying selected void SelectWeapon (int nWeaponNum, int bSecondary, int bPrintMessage, int bWaitForRearm) { const char *szWeaponName; if (gameData.demo.nState == ND_STATE_RECORDING) NDRecordPlayerWeapon (bSecondary, nWeaponNum); if (!bSecondary) { if (gameData.weapons.nPrimary != nWeaponNum) { if (bWaitForRearm) DigiPlaySampleOnce (SOUND_GOOD_SELECTION_PRIMARY, F1_0); if (IsMultiGame) { if (bWaitForRearm) MultiSendPlaySound (SOUND_GOOD_SELECTION_PRIMARY, F1_0); } gameData.laser.xNextFireTime = bWaitForRearm ? gameData.time.xGame + (fix) (gameStates.gameplay.slowmo [1].fSpeed * REARM_TIME) : 0; gameData.laser.nGlobalFiringCount = 0; } else { // Select super version if available. if (bWaitForRearm) { if (!bCycling) ; // -- MK, only plays when can't fire weapon anyway, fixes bug -- DigiPlaySampleOnce(SOUND_ALREADY_SELECTED, F1_0); else DigiPlaySampleOnce(SOUND_BAD_SELECTION, F1_0); } } gameData.weapons.nOverridden = nWeaponNum; if (!bSecondary && extraGameInfo [IsMultiGame].bSmartWeaponSwitch && !gameStates.app.bD1Mission) { switch (nWeaponNum) { case 1: if (LOCALPLAYER.primaryWeaponFlags & (1 << 6)) nWeaponNum = 6; break; case 2: if (LOCALPLAYER.primaryWeaponFlags & (1 << 7)) nWeaponNum = 7; break; } } gameData.weapons.nPrimary = (!bSecondary && (nWeaponNum == SUPER_LASER_INDEX)) ? LASER_INDEX : nWeaponNum; StopPrimaryFire (); szWeaponName = PRIMARY_WEAPON_NAMES (nWeaponNum); #if defined (TACTILE) TactileSetButtonJolt(); #endif //save flag for whether was super version bLastPrimaryWasSuper [nWeaponNum % SUPER_WEAPON] = (nWeaponNum >= SUPER_WEAPON); } else { if (gameData.weapons.nSecondary != nWeaponNum) { if (bWaitForRearm) DigiPlaySampleOnce (SOUND_GOOD_SELECTION_SECONDARY, F1_0); if (IsMultiGame) { if (bWaitForRearm) MultiSendPlaySound (SOUND_GOOD_SELECTION_PRIMARY, F1_0); } gameData.missiles.xNextFireTime = bWaitForRearm ? gameData.time.xGame + REARM_TIME : 0; gameData.missiles.nGlobalFiringCount = 0; } else { if (bWaitForRearm) { if (!bCycling) DigiPlaySampleOnce (SOUND_ALREADY_SELECTED, F1_0); else DigiPlaySampleOnce (SOUND_BAD_SELECTION, F1_0); } } //if (nWeaponNum % SUPER_WEAPON != PROXMINE_INDEX) gameData.weapons.nSecondary = nWeaponNum; szWeaponName = SECONDARY_WEAPON_NAMES (nWeaponNum); //save flag for whether was super version bLastSecondaryWasSuper [nWeaponNum % SUPER_WEAPON] = (nWeaponNum >= SUPER_WEAPON); } if (bPrintMessage) { if (nWeaponNum == LASER_INDEX && !bSecondary) HUDInitMessage (TXT_WPN_LEVEL, szWeaponName, LOCALPLAYER.laserLevel + 1, TXT_SELECTED); else HUDInitMessage ("%s %s", szWeaponName, TXT_SELECTED); } }
void ReorderPrimary () { newmenu_item m[MAX_PRIMARY_WEAPONS+1]; int i; for (i=0;i<MAX_PRIMARY_WEAPONS+1;i++) { nm_set_item_menu(&m[i], (PlayerCfg.PrimaryOrder[i]==255) ? "--- Never Autoselect below ---" : PRIMARY_WEAPON_NAMES(PlayerCfg.PrimaryOrder[i])); m[i].value=PlayerCfg.PrimaryOrder[i]; } i = newmenu_doreorder("Reorder Primary","Shift+Up/Down arrow to move item", i, m, NULL, NULL); for (i=0;i<MAX_PRIMARY_WEAPONS+1;i++) PlayerCfg.PrimaryOrder[i]=m[i].value; }
// ------------------------------------------------------------------------------------ //if message flag set, print message saying selected void select_weapon(int weapon_num, int secondary_flag, int print_message, int wait_for_rearm) { const char *weapon_name; if (Newdemo_state==ND_STATE_RECORDING ) newdemo_record_player_weapon(secondary_flag, weapon_num); if (!secondary_flag) { if (Primary_weapon != weapon_num) { #ifndef FUSION_KEEPS_CHARGE //added 8/6/98 by Victor Rachels to fix fusion charge bug Fusion_charge=0; //end edit - Victor Rachels #endif if (wait_for_rearm) digi_play_sample_once( SOUND_GOOD_SELECTION_PRIMARY, F1_0 ); #ifdef NETWORK if (Game_mode & GM_MULTI) { if (wait_for_rearm) multi_send_play_sound(SOUND_GOOD_SELECTION_PRIMARY, F1_0); } #endif if (wait_for_rearm) Next_laser_fire_time = GameTime64 + REARM_TIME; else Next_laser_fire_time = 0; Global_laser_firing_count = 0; } Primary_weapon = weapon_num; weapon_name = PRIMARY_WEAPON_NAMES(weapon_num); //save flag for whether was super version Primary_last_was_super[weapon_num % SUPER_WEAPON] = (weapon_num >= SUPER_WEAPON); } else { if (Secondary_weapon != weapon_num) { if (wait_for_rearm) digi_play_sample_once( SOUND_GOOD_SELECTION_SECONDARY, F1_0 ); #ifdef NETWORK if (Game_mode & GM_MULTI) { if (wait_for_rearm) multi_send_play_sound(SOUND_GOOD_SELECTION_PRIMARY, F1_0); } #endif if (wait_for_rearm) Next_missile_fire_time = GameTime64 + REARM_TIME; else Next_missile_fire_time = 0; Global_missile_firing_count = 0; } else { if (wait_for_rearm) { digi_play_sample_once( SOUND_ALREADY_SELECTED, F1_0 ); } } Secondary_weapon = weapon_num; weapon_name = SECONDARY_WEAPON_NAMES(weapon_num); //save flag for whether was super version Secondary_last_was_super[weapon_num % SUPER_WEAPON] = (weapon_num >= SUPER_WEAPON); } if (print_message) { const player *const plr = &Players[Player_num]; if (weapon_num == LASER_INDEX && !secondary_flag) HUD_init_message(HM_DEFAULT, "%s Level %d selected (energy=%i)!", weapon_name, plr->laser_level+1, f2i(plr->energy)); else if (!secondary_flag && (weapon_num == 1 || weapon_num == 6)) HUD_init_message(HM_DEFAULT, "%s selected (ammo=%i/%i)!", weapon_name, PRINTABLE_VULCAN_AMMO(plr->primary_ammo[1]), PRINTABLE_VULCAN_AMMO(CURRENT_VULCAN_AMMO_CAPACITY(Player_num))); else if (!secondary_flag) HUD_init_message(HM_DEFAULT, "%s selected (energy=%i)!", weapon_name, f2i(plr->energy)); else HUD_init_message(HM_DEFAULT, "%s selected (count=%i)!", weapon_name, plr->secondary_ammo[weapon_num]); } }
void DropCurrentWeapon (void) { int nObject = -1, ammo = 0, seed; seed = d_rand (); if (gameData.weapons.nPrimary == 0) { //special laser drop handling if ((LOCALPLAYER.flags & PLAYER_FLAGS_QUAD_LASERS) && !IsBuiltInDevice (PLAYER_FLAGS_QUAD_LASERS)) { LOCALPLAYER.flags &= ~PLAYER_FLAGS_QUAD_LASERS; nObject = SpitPowerup (gameData.objs.consoleP, POW_QUADLASER, seed); if (nObject == -1) { LOCALPLAYER.flags |= PLAYER_FLAGS_QUAD_LASERS; return; } HUDInitMessage(TXT_DROP_QLASER); } else if ((LOCALPLAYER.laserLevel > MAX_LASER_LEVEL) && !IsBuiltInGun (SUPER_LASER_INDEX)) { LOCALPLAYER.laserLevel--; nObject = SpitPowerup (gameData.objs.consoleP, POW_SUPERLASER, seed); if (nObject == -1) { LOCALPLAYER.laserLevel++; return; } HUDInitMessage (TXT_DROP_SLASER); } } else { if ((gameData.weapons.nPrimary == 4) && gameData.weapons.bTripleFusion) gameData.weapons.bTripleFusion = 0; else if (gameData.weapons.nPrimary && !IsBuiltInGun (gameData.weapons.nPrimary)) {//if selected weapon was not the laser LOCALPLAYER.primaryWeaponFlags &= (~(1 << gameData.weapons.nPrimary)); nObject = SpitPowerup (gameData.objs.consoleP, primaryWeaponToPowerup [gameData.weapons.nPrimary], seed); } if (nObject == -1) { if (gameData.weapons.nPrimary) //if selected weapon was not the laser LOCALPLAYER.primaryWeaponFlags |= (1 << gameData.weapons.nPrimary); return; } HUDInitMessage (TXT_DROP_WEAPON, PRIMARY_WEAPON_NAMES (gameData.weapons.nPrimary)); } audio.PlaySound (SOUND_DROP_WEAPON); if ((gameData.weapons.nPrimary == VULCAN_INDEX) || (gameData.weapons.nPrimary == GAUSS_INDEX)) { //if it's one of these, drop some ammo with the weapon ammo = LOCALPLAYER.primaryAmmo [VULCAN_INDEX]; if ((LOCALPLAYER.primaryWeaponFlags & HAS_FLAG(VULCAN_INDEX)) && (gameData.weapons.nPrimary == GAUSS_INDEX)) ammo /= 2; //if both vulcan & gauss, drop half LOCALPLAYER.primaryAmmo [VULCAN_INDEX] -= ammo; if (nObject != -1) OBJECTS [nObject].cType.powerupInfo.nCount = ammo; } if (gameData.weapons.nPrimary == OMEGA_INDEX) { //dropped weapon has current energy if (nObject != -1) OBJECTS [nObject].cType.powerupInfo.nCount = gameData.omega.xCharge [IsMultiGame]; } if (IsMultiGame) { MultiSendDropWeapon (nObject, seed); MultiSendWeapons (1); } if (gameData.weapons.nPrimary) //if selected weapon was not the laser AutoSelectWeapon (0, 0); }