// ------------------------------------------------------------------------------------ //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); } }
int LocalPlayerFireGun (void) { CPlayerData* playerP = gameData.multiplayer.players + gameData.multiplayer.nLocalPlayer; fix xEnergyUsed; int nAmmoUsed, nPrimaryAmmo; int nWeaponIndex; int rVal = 0; int nRoundsPerShot = 1; int bGatling = (gameData.weapons.nPrimary == GAUSS_INDEX) ? 2 : (gameData.weapons.nPrimary == VULCAN_INDEX) ? 1 : 0; fix addval; static int nSpreadfireToggle = 0; static int nHelixOrient = 0; if (gameStates.app.bPlayerIsDead) return 0; if (gameStates.app.bD2XLevel && (SEGMENTS [OBJECTS [playerP->nObject].info.nSegment].m_nType == SEGMENT_IS_NODAMAGE)) return 0; nWeaponIndex = primaryWeaponToWeaponInfo [gameData.weapons.nPrimary]; xEnergyUsed = WI_energy_usage (nWeaponIndex); if (gameData.weapons.nPrimary == OMEGA_INDEX) xEnergyUsed = 0; // Omega consumes energy when recharging, not when firing. if (gameStates.app.nDifficultyLevel < 2) xEnergyUsed = FixMul (xEnergyUsed, I2X (gameStates.app.nDifficultyLevel + 2) / 4); // MK, 01/26/96, Helix use 2x energy in multiplayer. bitmaps.tbl parm should have been reduced for single player. if (nWeaponIndex == HELIX_INDEX) if (IsMultiGame) xEnergyUsed *= 2; nAmmoUsed = WI_ammo_usage (nWeaponIndex); addval = 2 * gameData.time.xFrame; if (addval > I2X (1)) addval = I2X (1); if (!bGatling) nPrimaryAmmo = playerP->primaryAmmo [gameData.weapons.nPrimary]; else { if ((gameOpts->sound.bHires [0] == 2) && gameOpts->sound.bGatling && gameStates.app.bHaveExtraGameInfo [IsMultiGame] && EGI_FLAG (bGatlingSpeedUp, 1, 0, 0) && (gameData.weapons.firing [0].nDuration < GATLING_DELAY)) return 0; nPrimaryAmmo = playerP->primaryAmmo [VULCAN_INDEX]; } if ((playerP->energy < xEnergyUsed) || (nPrimaryAmmo < nAmmoUsed)) AutoSelectWeapon (0, 1); // Make sure the CPlayerData can fire from this weapon. if ((gameData.laser.xLastFiredTime + 2 * gameData.time.xFrame < gameData.time.xGame) || (gameData.time.xGame < gameData.laser.xLastFiredTime)) gameData.laser.xNextFireTime = gameData.time.xGame; gameData.laser.xLastFiredTime = gameData.time.xGame; while (gameData.laser.xNextFireTime <= gameData.time.xGame) { if ((playerP->energy >= xEnergyUsed) && (nPrimaryAmmo >= nAmmoUsed)) { int nLaserLevel, flags = 0; if (gameStates.app.cheats.bLaserRapidFire == 0xBADA55) gameData.laser.xNextFireTime += I2X (1) / 25; else gameData.laser.xNextFireTime += WI_fire_wait (nWeaponIndex); nLaserLevel = LOCALPLAYER.laserLevel; if (gameData.weapons.nPrimary == SPREADFIRE_INDEX) { if (nSpreadfireToggle) flags |= LASER_SPREADFIRE_TOGGLED; nSpreadfireToggle = !nSpreadfireToggle; } if (gameData.weapons.nPrimary == HELIX_INDEX) { nHelixOrient++; flags |= ((nHelixOrient & LASER_HELIX_MASK) << LASER_HELIX_SHIFT); } if (LOCALPLAYER.flags & PLAYER_FLAGS_QUAD_LASERS) flags |= LASER_QUAD; #if 1 int fired = FireWeapon ((short) LOCALPLAYER.nObject, (ubyte) gameData.weapons.nPrimary, nLaserLevel, flags, nRoundsPerShot); if (fired) { rVal += fired; if (bGatling) { if (nAmmoUsed > playerP->primaryAmmo [VULCAN_INDEX]) nAmmoUsed = playerP->primaryAmmo [VULCAN_INDEX]; playerP->primaryAmmo [VULCAN_INDEX] -= nAmmoUsed; gameData.multiplayer.weaponStates [gameData.multiplayer.nLocalPlayer].nAmmoUsed += nAmmoUsed; if (gameData.multiplayer.weaponStates [gameData.multiplayer.nLocalPlayer].nAmmoUsed >= VULCAN_AMMO_AMOUNT) { if (gameStates.app.bHaveExtraGameInfo [IsMultiGame]) MaybeDropNetPowerup (-1, POW_VULCAN_AMMO, FORCE_DROP); gameData.multiplayer.weaponStates [gameData.multiplayer.nLocalPlayer].nAmmoUsed -= VULCAN_AMMO_AMOUNT; } MultiSendAmmo (); } else { playerP->energy -= (xEnergyUsed * fired) / gameData.weapons.info [nWeaponIndex].fireCount; if (playerP->energy < 0) playerP->energy = 0; } } #else rVal += FireWeapon ((short) LOCALPLAYER.nObject, (ubyte) gameData.weapons.nPrimary, nLaserLevel, flags, nRoundsPerShot); playerP->energy -= (xEnergyUsed * rVal) / gameData.weapons.info [nWeaponIndex].fireCount; if (playerP->energy < 0) playerP->energy = 0; if (rVal && ((gameData.weapons.nPrimary == VULCAN_INDEX) || (gameData.weapons.nPrimary == GAUSS_INDEX))) { if (nAmmoUsed > playerP->primaryAmmo [VULCAN_INDEX]) playerP->primaryAmmo [VULCAN_INDEX] = 0; else playerP->primaryAmmo [VULCAN_INDEX] -= nAmmoUsed; } #endif AutoSelectWeapon (0, 1); // Make sure the CPlayerData can fire from this weapon. } else { AutoSelectWeapon (0, 1); // Make sure the CPlayerData can fire from this weapon. StopPrimaryFire (); break; // Couldn't fire weapon, so abort. } } gameData.laser.nGlobalFiringCount = 0; return rVal; }