AWeapon *FWeaponSlot::PickWeapon(player_t *player, bool checkammo) { int i, j; if (player->mo == NULL) { return NULL; } // Does this slot even have any weapons? if (Weapons.Size() == 0) { return player->ReadyWeapon; } if (player->ReadyWeapon != NULL) { for (i = 0; (unsigned)i < Weapons.Size(); i++) { if (Weapons[i].Type == player->ReadyWeapon->GetClass() || (player->ReadyWeapon->WeaponFlags & WIF_POWERED_UP && player->ReadyWeapon->SisterWeapon != NULL && player->ReadyWeapon->SisterWeapon->GetClass() == Weapons[i].Type)) { for (j = (i == 0 ? Weapons.Size() - 1 : i - 1); j != i; j = (j == 0 ? Weapons.Size() - 1 : j - 1)) { AWeapon *weap = static_cast<AWeapon *> (player->mo->FindInventory(Weapons[j].Type)); if (weap != NULL && weap->IsKindOf(RUNTIME_CLASS(AWeapon))) { if (!checkammo || weap->CheckAmmo(AWeapon::EitherFire, false)) { return weap; } } } } } } for (i = Weapons.Size() - 1; i >= 0; i--) { AWeapon *weap = static_cast<AWeapon *> (player->mo->FindInventory(Weapons[i].Type)); if (weap != NULL && weap->IsKindOf(RUNTIME_CLASS(AWeapon))) { if (!checkammo || weap->CheckAmmo(AWeapon::EitherFire, false)) { return weap; } } } return player->ReadyWeapon; }
void P_FireWeaponAlt (player_t *player, FState *state) { AWeapon *weapon; // [SO] 9/2/02: People were able to do an awful lot of damage // when they were observers... if (player->Bot == nullptr && bot_observer) { return; } weapon = player->ReadyWeapon; if (weapon == nullptr || weapon->FindState(NAME_AltFire) == nullptr || !weapon->CheckAmmo (AWeapon::AltFire, true)) { return; } player->mo->PlayAttacking (); weapon->bAltFire = true; if (state == nullptr) { state = weapon->GetAltAtkState(!!player->refire); } P_SetPsprite(player, PSP_WEAPON, state); if (!(weapon->WeaponFlags & WIF_NOALERT)) { P_NoiseAlert (player->mo, player->mo, false); } }
void P_FireWeapon (player_t *player, FState *state) { AWeapon *weapon; // [SO] 9/2/02: People were able to do an awful lot of damage // when they were observers... if (!player->isbot && bot_observer) { return; } weapon = player->ReadyWeapon; if (weapon == NULL || !weapon->CheckAmmo (AWeapon::PrimaryFire, true)) { return; } player->mo->PlayAttacking (); weapon->bAltFire = false; if (state == NULL) { state = weapon->GetAtkState(!!player->refire); } P_SetPsprite (player, ps_weapon, state); if (!(weapon->WeaponFlags & WIF_NOALERT)) { P_NoiseAlert (player->mo, player->mo, false); } }
AWeapon *FWeaponSlots::PickPrevWeapon (player_t *player) { int startslot, startindex; int slotschecked = 0; if (player->mo == NULL) { return NULL; } if (player->ReadyWeapon == NULL || FindMostRecentWeapon (player, &startslot, &startindex)) { int slot; int index; if (player->ReadyWeapon == NULL) { startslot = 0; startindex = 0; } slot = startslot; index = startindex; do { if (--index < 0) { slotschecked++; if (--slot < 0) { slot = NUM_WEAPON_SLOTS - 1; } index = Slots[slot].Size() - 1; } PClassWeapon *type = Slots[slot].GetWeapon(index); AWeapon *weap = static_cast<AWeapon *>(player->mo->FindInventory(type)); if (weap != NULL && weap->CheckAmmo(AWeapon::EitherFire, false)) { return weap; } } while ((slot != startslot || index != startindex) && slotschecked <= NUM_WEAPON_SLOTS); } return player->ReadyWeapon; }