//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; }
//called when ammo (for the vulcan cannon) is picked up // Returns the amount picked up int PickupAmmo (int classFlag, int nWeaponIndex, int ammoCount, const char *pszMsg, int nPlayer) { int nMaxAmmo, nCutPoint, nSupposedWeapon = gameData.weapons.nPrimary; int nOldAmmo = classFlag; //kill warning tPlayer *playerP = gameData.multiplayer.players + nPlayer; Assert(classFlag==CLASS_PRIMARY && nWeaponIndex==VULCAN_INDEX); nMaxAmmo = nMaxPrimaryAmmo [nWeaponIndex]; if (playerP->flags & PLAYER_FLAGS_AMMO_RACK) nMaxAmmo *= 2; if (playerP->primaryAmmo [nWeaponIndex] == nMaxAmmo) return 0; nOldAmmo = playerP->primaryAmmo [nWeaponIndex]; playerP->primaryAmmo [nWeaponIndex] += ammoCount; if (playerP->primaryAmmo [nWeaponIndex] > nMaxAmmo) { ammoCount += (nMaxAmmo - playerP->primaryAmmo [nWeaponIndex]); playerP->primaryAmmo [nWeaponIndex] = nMaxAmmo; } if ((nPlayer = gameData.multiplayer.nLocalPlayer)) { 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 ((playerP->primaryWeaponFlags & (1<<nWeaponIndex)) && (nWeaponIndex > gameData.weapons.nPrimary) && (nOldAmmo == 0) && (POrderList (nWeaponIndex) < nCutPoint) && (POrderList (nWeaponIndex) < POrderList (nSupposedWeapon))) SelectWeapon (nWeaponIndex,0,0,1); } return ammoCount; //return amount used }
void check_to_use_primary(int weapon_index) { ushort old_flags = Players[Player_num].primary_weapon_flags; ushort flag = 1<<weapon_index; int cutpoint; cutpoint=POrderList (255); if (!(old_flags & flag) && POrderList(weapon_index)<cutpoint && POrderList(weapon_index)<POrderList(Primary_weapon)) { if (weapon_index==SUPER_LASER_INDEX) select_weapon(LASER_INDEX,0,0,1); else select_weapon(weapon_index,0,0,1); } PALETTE_FLASH_ADD(7,14,21); }
void CyclePrimary () { int cur_order_slot = POrderList(Primary_weapon), desired_weapon = Primary_weapon, loop=0; const int autoselect_order_slot = POrderList(255); const int use_restricted_autoselect = (cur_order_slot < autoselect_order_slot) && (1 < autoselect_order_slot); // some remapping for SUPER LASER which is not an actual weapon type at all if (Primary_weapon == LASER_INDEX && Players[Player_num].laser_level > MAX_LASER_LEVEL) cur_order_slot = POrderList(SUPER_LASER_INDEX); while (loop<(MAX_PRIMARY_WEAPONS+1)) { loop++; cur_order_slot++; // next slot if (cur_order_slot >= MAX_PRIMARY_WEAPONS+1) // loop if necessary cur_order_slot = 0; if (cur_order_slot == autoselect_order_slot) // ignore "do not autoselect" { if (use_restricted_autoselect) cur_order_slot = 0; else continue; } desired_weapon = PlayerCfg.PrimaryOrder[cur_order_slot]; // now that is the weapon next to our current one // some remapping for SUPER LASER which is not an actual weapon type at all if (desired_weapon == LASER_INDEX && Players[Player_num].laser_level > MAX_LASER_LEVEL) continue; if (desired_weapon == SUPER_LASER_INDEX) { if (Players[Player_num].laser_level <= MAX_LASER_LEVEL) continue; else desired_weapon = LASER_INDEX; } // select the weapon if we have it if (player_has_weapon(desired_weapon, 0) == HAS_ALL) { select_weapon(desired_weapon, 0, 1, 1); return; } } }
//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; }
//called when ammo (for the vulcan cannon) is picked up // Returns the amount picked up int pick_up_ammo(int class_flag,int weapon_index,int ammo_count) { int max,cutpoint,supposed_weapon=Primary_weapon; int old_ammo=class_flag; //kill warning Assert(class_flag==CLASS_PRIMARY && weapon_index==VULCAN_INDEX); max = Primary_ammo_max[weapon_index]; if (Players[Player_num].flags & PLAYER_FLAGS_AMMO_RACK) max *= 2; if (Players[Player_num].primary_ammo[weapon_index] == max) return 0; old_ammo = Players[Player_num].primary_ammo[weapon_index]; Players[Player_num].primary_ammo[weapon_index] += 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; } 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) && Players[Player_num].primary_weapon_flags&(1<<weapon_index) && weapon_index>Primary_weapon && old_ammo==0 && POrderList(weapon_index)<cutpoint && POrderList(weapon_index)<POrderList(supposed_weapon)) select_weapon(weapon_index,0,0,1); return ammo_count; //return amount used }
void AutoSelectWeapon (int nWeaponType, int bAutoSelect) { int r; int nCutPoint; int bLooped = 0; if (bAutoSelect && !gameOpts->gameplay.nAutoSelectWeapon) return; if (!nWeaponType) { r = PlayerHasWeapon (WeaponId (gameData.weapons.nPrimary), 0, -1, 0); if ((r != HAS_ALL) || bCycling) { int bTryAgain = 1; int iCurWeapon = POrderList (WeaponId (gameData.weapons.nOverridden)); int iNewWeapon = iCurWeapon; int nCurWeapon, nNewWeapon; nCurWeapon = primaryOrder [iCurWeapon]; nCutPoint = POrderList (255); while (bTryAgain) { if (++iNewWeapon >= nCutPoint) { if (bLooped) { if (bCycling) SelectWeapon (gameData.weapons.nPrimary, 0, 0, 1); else { HUDInitMessage (TXT_NO_PRIMARY); #ifdef TACTILE if (TactileStick) ButtonReflexClear(0); #endif SelectWeapon (0, 0, 0, 1); } return; } iNewWeapon = 0; bLooped = 1; } if (iNewWeapon == MAX_PRIMARY_WEAPONS) iNewWeapon = 0; // Hack alert! Because the fusion uses 0 energy at the end (it's got the weird chargeup) // it looks like it takes 0 to fire, but it doesn't, so never auto-select. // if (primaryOrder [iNewWeapon] == FUSION_INDEX) // continue; nNewWeapon = primaryOrder [iNewWeapon]; if (nNewWeapon == gameData.weapons.nPrimary) { if ((nCurWeapon == SUPER_LASER_INDEX) && (nNewWeapon == LASER_INDEX)) continue; else if (bCycling) SelectWeapon (gameData.weapons.nPrimary, 0, 0, 1); else { HUDInitMessage (TXT_NO_PRIMARY); #ifdef TACTILE if (TactileStick) ButtonReflexClear (0); #endif // if (POrderList(0)<POrderList(255)) SelectWeapon(0, 0, 0, 1); } return; // Tried all weapons! } else { if ((nNewWeapon != 255) && (PlayerHasWeapon (nNewWeapon, 0, -1, 0) == HAS_ALL)) { SelectWeapon ((nNewWeapon == SUPER_LASER_INDEX) ? LASER_INDEX : nNewWeapon, 0, 1, 1); bLastPrimaryWasSuper [nNewWeapon % SUPER_WEAPON] = (nNewWeapon >= SUPER_WEAPON); return; } } } } } else { Assert(nWeaponType==1); r = PlayerHasWeapon (gameData.weapons.nSecondary, 1, -1, 0); if (r != HAS_ALL || bCycling) { int bTryAgain = 1; int iCurWeapon = SOrderList (gameData.weapons.nSecondary); nCutPoint = SOrderList (255); while (bTryAgain) { if (++iCurWeapon >= nCutPoint) { if (bLooped) { if (bCycling) SelectWeapon (gameData.weapons.nSecondary, 1, 0, 1); else HUDInitMessage (TXT_NO_SECSELECT); return; } iCurWeapon = 0; bLooped = 1; } if (iCurWeapon == MAX_SECONDARY_WEAPONS) iCurWeapon = 0; if (secondaryOrder [iCurWeapon] == gameData.weapons.nSecondary) { if (bCycling) SelectWeapon (gameData.weapons.nSecondary, 1, 0, 1); else HUDInitMessage (TXT_NO_SECAVAIL); return; // Tried all weapons! } else if (PlayerHasWeapon (secondaryOrder [iCurWeapon], 1, -1, 0) == HAS_ALL) { SelectWeapon (secondaryOrder [iCurWeapon], 1, 1, 1); bTryAgain = 0; } } } } }
// ---------------------------------------------------------------------------------------- // Automatically select next best weapon if unable to fire current weapon. // Weapon type: 0==primary, 1==secondary void auto_select_weapon(int weapon_type) { int r; int cutpoint; int looped=0; if (weapon_type==0) { r = player_has_weapon(Primary_weapon, 0); if (r != HAS_ALL) { int cur_weapon; int try_again = 1; cur_weapon = POrderList(Primary_weapon); cutpoint = POrderList (255); while (try_again) { cur_weapon++; if (cur_weapon>=cutpoint) { if (looped) { HUD_init_message(HM_DEFAULT, "%s", TXT_NO_PRIMARY); select_weapon(0, 0, 0, 1); try_again = 0; continue; } cur_weapon=0; looped=1; } if (cur_weapon==MAX_PRIMARY_WEAPONS) cur_weapon = 0; // Hack alert! Because the fusion uses 0 energy at the end (it's got the weird chargeup) // it looks like it takes 0 to fire, but it doesn't, so never auto-select. // if (PlayerCfg.PrimaryOrder[cur_weapon] == FUSION_INDEX) // continue; if (PlayerCfg.PrimaryOrder[cur_weapon] == Primary_weapon) { HUD_init_message(HM_DEFAULT, "%s", TXT_NO_PRIMARY); select_weapon(0, 0, 0, 1); try_again = 0; // Tried all weapons! } else if (PlayerCfg.PrimaryOrder[cur_weapon]!=255 && player_has_weapon(PlayerCfg.PrimaryOrder[cur_weapon], 0) == HAS_ALL) { select_weapon(PlayerCfg.PrimaryOrder[cur_weapon], 0, 1, 1 ); try_again = 0; } } } } else { Assert(weapon_type==1); r = player_has_weapon(Secondary_weapon, 1); if (r != HAS_ALL) { int cur_weapon; int try_again = 1; cur_weapon = SOrderList(Secondary_weapon); cutpoint = SOrderList (255); while (try_again) { cur_weapon++; if (cur_weapon>=cutpoint) { if (looped) { HUD_init_message(HM_DEFAULT, "No secondary weapons selected!"); try_again = 0; continue; } cur_weapon=0; looped=1; } if (cur_weapon==MAX_SECONDARY_WEAPONS) cur_weapon = 0; if (PlayerCfg.SecondaryOrder[cur_weapon] == Secondary_weapon) { HUD_init_message(HM_DEFAULT, "No secondary weapons available!"); try_again = 0; // Tried all weapons! } else if (player_has_weapon(PlayerCfg.SecondaryOrder[cur_weapon], 1) == HAS_ALL) { select_weapon(PlayerCfg.SecondaryOrder[cur_weapon], 1, 1, 1 ); try_again = 0; } } } } }