// --------------------------------------------------------------------- //called when one of these weapons is picked up //when you pick up a secondary, you always get the weapon & ammo for it // Returns true if powerup picked up, else returns false. int pick_up_secondary(int weapon_index,int count) { int max; int num_picked_up; int cutpoint; max = Secondary_ammo_max[weapon_index]; if (Players[Player_num].flags & PLAYER_FLAGS_AMMO_RACK) max *= 2; if (Players[Player_num].secondary_ammo[weapon_index] >= max) { HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %i %ss!", TXT_ALREADY_HAVE, Players[Player_num].secondary_ammo[weapon_index],SECONDARY_WEAPON_NAMES(weapon_index)); return 0; } Players[Player_num].secondary_weapon_flags |= (1<<weapon_index); Players[Player_num].secondary_ammo[weapon_index] += count; num_picked_up = count; if (Players[Player_num].secondary_ammo[weapon_index] > max) { num_picked_up = count - (Players[Player_num].secondary_ammo[weapon_index] - max); Players[Player_num].secondary_ammo[weapon_index] = max; } if (Players[Player_num].secondary_ammo[weapon_index] == count) // only autoselect if player didn't have any { cutpoint=SOrderList (255); if (((Controls.fire_secondary_state && PlayerCfg.NoFireAutoselect)?0:1) && SOrderList (weapon_index)<cutpoint && ((SOrderList (weapon_index) < SOrderList(Secondary_weapon)) || (Players[Player_num].secondary_ammo[Secondary_weapon] == 0)) ) select_weapon(weapon_index,1, 0, 1); else { //if we don't auto-select this weapon, but it's a proxbomb or smart mine, //we want to do a mini-auto-selection that applies to the drop bomb key if ((weapon_index == PROXIMITY_INDEX || weapon_index == SMART_MINE_INDEX) && !(Secondary_weapon == PROXIMITY_INDEX || Secondary_weapon == SMART_MINE_INDEX)) { int cur; cur = Secondary_last_was_super[PROXIMITY_INDEX]?SMART_MINE_INDEX:PROXIMITY_INDEX; if (SOrderList (weapon_index) < SOrderList(cur)) Secondary_last_was_super[PROXIMITY_INDEX] = (weapon_index == SMART_MINE_INDEX); } } } //note: flash for all but concussion was 7,14,21 if (num_picked_up>1) { PALETTE_FLASH_ADD(15,15,15); HUD_init_message(HM_DEFAULT, "%d %ss (count=%i)!",num_picked_up,SECONDARY_WEAPON_NAMES(weapon_index), Players[Player_num].secondary_ammo[weapon_index]); } else { PALETTE_FLASH_ADD(10,10,10); HUD_init_message(HM_DEFAULT, "%s (count=%i)!",SECONDARY_WEAPON_NAMES(weapon_index), Players[Player_num].secondary_ammo[weapon_index]); } return 1; }
//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; }
void RescueHostage (int nHostage) { PALETTE_FLASH_ADD(0, 0, 25); //small blue flash LOCALPLAYER.hostages.nOnBoard++; // Do an audio effect if (gameData.demo.nState != ND_STATE_PLAYBACK) DigiPlaySample (SOUND_HOSTAGE_RESCUED, F1_0); HUDInitMessage (TXT_HOSTAGE_RESCUED); }
//------------- Called once when a hostage is rescued ------------------------- void hostage_rescue(int blah) { PALETTE_FLASH_ADD(0, 0, 25); //small blue flash Players[Player_num].hostages_on_board++; // Do an audio effect if (Newdemo_state != ND_STATE_PLAYBACK) digi_play_sample(SOUND_HOSTAGE_RESCUED, F1_0); HUD_init_message_literal(HM_DEFAULT, TXT_HOSTAGE_RESCUED); }
void _CDECL_ PowerupBasic (int redAdd, int greenAdd, int blueAdd, int score, char *format, ...) { char text[120]; va_list args; va_start (args, format); vsprintf (text, format, args); va_end (args); PALETTE_FLASH_ADD (redAdd, greenAdd, blueAdd); HUDInitMessage (text); //mprintf_gameData.objs.pwrUp.Info (); AddPointsToScore (score); }
void powerup_basic(int redadd, int greenadd, int blueadd, int score, const char *format, ...) { va_list args; PALETTE_FLASH_ADD(redadd,greenadd,blueadd); va_start(args, format ); HUD_init_message_va(HM_DEFAULT, format, args); va_end(args); add_points_to_score(score); }
//------------- Called once when a hostage is rescued ------------------------------------------ void hostage_rescue(int blah) { //mprintf( (0, "Rescued hostage %d", hostage_number )); PALETTE_FLASH_ADD(0,0,25); //small blue flash Players[Player_num].hostages_on_board++; // Do an audio effect if ( Newdemo_state != ND_STATE_PLAYBACK ) digi_play_sample( SOUND_HOSTAGE_RESCUED, F1_0 ); HUD_init_message(TXT_HOSTAGE_RESCUED); }
void powerup_basic(int redadd, int greenadd, int blueadd, int score, char *format, ...) { char text[120]; va_list args; va_start(args, format ); vsprintf(text, format, args); va_end(args); PALETTE_FLASH_ADD(redadd,greenadd,blueadd); HUD_init_message(text); //mprintf_powerup_info(); add_points_to_score(score); }
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); }
//------------- Called once when a hostage is rescued ------------------------------------------ void hostage_rescue( int hostage_number ) { if ( (hostage_number<0) || (hostage_number>=MAX_HOSTAGES) ) { Int3(); // Get John! return; } PALETTE_FLASH_ADD(0,0,25); //small blue flash Players[Player_num].hostages_on_board++; // Do an audio effect if ( Newdemo_state != ND_STATE_PLAYBACK ) digi_play_sample( SOUND_HOSTAGE_RESCUED, F1_0 ); #ifndef HOSTAGE_FACES HUD_init_message(HM_DEFAULT, TXT_HOSTAGE_RESCUED); #else // Show the text message if ( strlen(Hostages[hostage_number].text) ) gauge_message("%s", Hostages[hostage_number].text ); else { if ( Hostage_num_globals > 0 ) { int mn; mn = (d_rand()*Hostage_num_globals)/D_RAND_MAX; if ( mn>=0 && mn < Hostage_num_globals ) gauge_message("%s", &Hostage_global_message[mn][0] ); } } if ( Newdemo_state == ND_STATE_RECORDING ) newdemo_record_hostage_rescued( hostage_number ); queue_hostage_clip(hostage_number); #endif }
//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 one of these weapons is picked up //when you pick up a secondary, you always get the weapon & ammo for it // Returns true if powerup picked up, else returns false. int PickupSecondary (tObject *objP, int nWeaponIndex, int nAmount, int nPlayer) { int nMaxAmount; int nPickedUp; int nCutPoint, bEmpty = 0, bSmokeGrens; tPlayer *playerP = gameData.multiplayer.players + nPlayer; if ((nWeaponIndex == PROXMINE_INDEX) && !COMPETITION && EGI_FLAG (bSmokeGrenades, 0, 0, 0)) { bSmokeGrens = 1; nMaxAmount = 4; } else { bSmokeGrens = 0; nMaxAmount = nMaxSecondaryAmmo [nWeaponIndex]; if (playerP->flags & PLAYER_FLAGS_AMMO_RACK) nMaxAmount *= 2; } if (playerP->secondaryAmmo [nWeaponIndex] >= nMaxAmount) { if (ISLOCALPLAYER (nPlayer)) HUDInitMessage("%s %i %ss!", TXT_ALREADY_HAVE, playerP->secondaryAmmo [nWeaponIndex], bSmokeGrens ? TXT_SMOKE_GRENADE : SECONDARY_WEAPON_NAMES (nWeaponIndex)); return 0; } playerP->secondaryWeaponFlags |= (1 << nWeaponIndex); playerP->secondaryAmmo [nWeaponIndex] += nAmount; nPickedUp = nAmount; if (playerP->secondaryAmmo [nWeaponIndex] > nMaxAmount) { nPickedUp = nAmount - (playerP->secondaryAmmo [nWeaponIndex] - nMaxAmount); playerP->secondaryAmmo [nWeaponIndex] = nMaxAmount; if ((nPickedUp < nAmount) && (nWeaponIndex != PROXMINE_INDEX) && (nWeaponIndex != SMARTMINE_INDEX)) { short nObject = OBJ_IDX (objP); gameData.multiplayer.leftoverPowerups [nObject].nCount = nAmount - nPickedUp; gameData.multiplayer.leftoverPowerups [nObject].nType = secondaryWeaponToPowerup [nWeaponIndex]; gameData.multiplayer.leftoverPowerups [nObject].spitterP = OBJECTS + playerP->nObject; } } if (ISLOCALPLAYER (nPlayer)) { nCutPoint = SOrderList (255); bEmpty = playerP->secondaryAmmo [gameData.weapons.nSecondary] == 0; if (gameOpts->gameplay.nAutoSelectWeapon) { if (gameOpts->gameplay.nAutoSelectWeapon == 1) { if (bEmpty) SelectWeapon (nWeaponIndex, 1, 0, 1); } else if ((SOrderList (nWeaponIndex) < nCutPoint) && (bEmpty || (SOrderList (nWeaponIndex) < SOrderList (gameData.weapons.nSecondary)))) SelectWeapon (nWeaponIndex,1, 0, 1); else { //if we don't auto-select this weapon, but it's a proxbomb or smart mine, //we want to do a mini-auto-selection that applies to the drop bomb key if ((nWeaponIndex == PROXMINE_INDEX || nWeaponIndex == SMARTMINE_INDEX) && !(gameData.weapons.nSecondary == PROXMINE_INDEX || gameData.weapons.nSecondary == SMARTMINE_INDEX)) { int cur = bLastSecondaryWasSuper [PROXMINE_INDEX] ? PROXMINE_INDEX : SMARTMINE_INDEX; if (SOrderList (nWeaponIndex) < SOrderList (cur)) bLastSecondaryWasSuper[PROXMINE_INDEX] = (nWeaponIndex == SMARTMINE_INDEX); } } } //note: flash for all but concussion was 7,14,21 if (nAmount>1) { PALETTE_FLASH_ADD (15,15,15); HUDInitMessage("%d %s%s", nPickedUp, bSmokeGrens ? TXT_SMOKE_GRENADES : SECONDARY_WEAPON_NAMES (nWeaponIndex), TXT_SX); } else { PALETTE_FLASH_ADD (10,10,10); HUDInitMessage("%s!", bSmokeGrens ? TXT_SMOKE_GRENADE : SECONDARY_WEAPON_NAMES (nWeaponIndex)); } } return 1; }
tObject *ObjectCreateExplosionSub (tObject *objP, short nSegment, vmsVector *vPos, fix xSize, ubyte nVClip, fix xMaxDamage, fix xMaxDistance, fix xMaxForce, short nParent) { short nObject; tObject *explObjP, *obj0P; fix dist, force, damage; vmsVector pos_hit, vForce; int i, t, id; nObject = CreateObject (OBJ_FIREBALL, nVClip, -1, nSegment, vPos, &vmdIdentityMatrix, xSize, CT_EXPLOSION, MT_NONE, RT_FIREBALL, 1); if (nObject < 0) { #if TRACE con_printf (1, "Can't create tObject in ObjectCreateExplosionSub.\n"); #endif return NULL; } explObjP = gameData.objs.objects + nObject; //now set explosion-specific data explObjP->lifeleft = gameData.eff.vClips [0][nVClip].xTotalTime; explObjP->cType.explInfo.nSpawnTime = -1; explObjP->cType.explInfo.nDeleteObj = -1; explObjP->cType.explInfo.nDeleteTime = -1; if (xMaxDamage <= 0) return explObjP; // -- now legal for xBadAss explosions on a tWall. Assert (objP != NULL); for (i = 0, obj0P = gameData.objs.objects; i <= gameData.objs.nLastObject; i++, obj0P++) { t = obj0P->nType; id = obj0P->id; // Weapons used to be affected by xBadAss explosions, but this introduces serious problems. // When a smart bomb blows up, if one of its children goes right towards a nearby tWall, it will // blow up, blowing up all the children. So I remove it. MK, 09/11/94 if (obj0P == objP) continue; if (obj0P->flags & OF_SHOULD_BE_DEAD) continue; if (t == OBJ_WEAPON) { if (!WeaponIsMine (obj0P->id)) continue; } else if (t == OBJ_ROBOT) { if (nParent < 0) continue; if ((gameData.objs.objects [nParent].nType == OBJ_ROBOT) && (gameData.objs.objects [nParent].id == id)) continue; } else if ((t != OBJ_REACTOR) && (t != OBJ_PLAYER)) continue; dist = VmVecDistQuick (&obj0P->position.vPos, &explObjP->position.vPos); // Make damage be from 'xMaxDamage' to 0.0, where 0.0 is 'xMaxDistance' away; if (dist >= xMaxDistance) continue; if (!ObjectToObjectVisibility (explObjP, obj0P, FQ_TRANSWALL)) continue; damage = xMaxDamage - FixMulDiv (dist, xMaxDamage, xMaxDistance); force = xMaxForce - FixMulDiv (dist, xMaxForce, xMaxDistance); // Find the force vector on the tObject VmVecNormalizedDirQuick (&vForce, &obj0P->position.vPos, &explObjP->position.vPos); VmVecScale (&vForce, force); // Find where the point of impact is... (pos_hit) VmVecSub (&pos_hit, &explObjP->position.vPos, &obj0P->position.vPos); VmVecScale (&pos_hit, FixDiv (obj0P->size, obj0P->size + dist)); if (t == OBJ_WEAPON) { PhysApplyForce (obj0P, &vForce); if (WeaponIsMine (obj0P->id) && (FixMul (dist, force) > i2f (8000))) { //prox bombs have chance of blowing up KillObject (obj0P); ExplodeBadassWeapon (obj0P, &obj0P->position.vPos); } } else if (t == OBJ_ROBOT) { vmsVector vNegForce; fix xScale = -2 * (7 - gameStates.app.nDifficultyLevel) / 8; PhysApplyForce (obj0P, &vForce); // If not a boss, stun for 2 seconds at 32 force, 1 second at 16 force if (objP && (!ROBOTINFO (obj0P->id).bossFlag) && (gameData.weapons.info [objP->id].flash)) { tAIStatic *aip = &obj0P->cType.aiInfo; int force_val = f2i (FixDiv (VmVecMagQuick (&vForce) * gameData.weapons.info [objP->id].flash, gameData.time.xFrame)/128) + 2; if (explObjP->cType.aiInfo.SKIP_AI_COUNT * gameData.time.xFrame >= F1_0) aip->SKIP_AI_COUNT--; else { aip->SKIP_AI_COUNT += force_val; obj0P->mType.physInfo.rotThrust.p.x = ((d_rand () - 16384) * force_val)/16; obj0P->mType.physInfo.rotThrust.p.y = ((d_rand () - 16384) * force_val)/16; obj0P->mType.physInfo.rotThrust.p.z = ((d_rand () - 16384) * force_val)/16; obj0P->mType.physInfo.flags |= PF_USES_THRUST; } } vNegForce.p.x = vForce.p.x * xScale; vNegForce.p.y = vForce.p.y * xScale; vNegForce.p.z = vForce.p.z * xScale; PhysApplyRot (obj0P, &vNegForce); if (obj0P->shields >= 0) { if (ROBOTINFO (obj0P->id).bossFlag && bossProps [gameStates.app.bD1Mission][ROBOTINFO (obj0P->id).bossFlag-BOSS_D2].bInvulKinetic) damage /= 4; if (ApplyDamageToRobot (obj0P, damage, nParent) && objP && (nParent == LOCALPLAYER.nObject)) AddPointsToScore (ROBOTINFO (obj0P->id).scoreValue); } if (objP && (ROBOTINFO (obj0P->id).companion) && !gameData.weapons.info [objP->id].flash) { int i, count; char szOuch [6*4 + 2]; count = f2i (damage / 8); if (count > 4) count = 4; else if (count <= 0) count = 1; szOuch [0] = 0; for (i = 0; i < count; i++) { strcat (szOuch, TXT_BUDDY_OUCH); strcat (szOuch, " "); } BuddyMessage (szOuch); } } else if (t == OBJ_REACTOR) { if (obj0P->shields >= 0) ApplyDamageToReactor (obj0P, damage, nParent); } else if (t == OBJ_PLAYER) { tObject *killerP = NULL; vmsVector vForce2; // Hack!Warning!Test code! if (objP && gameData.weapons.info [objP->id].flash && obj0P->id==gameData.multiplayer.nLocalPlayer) { int fe = min (F1_0*4, force*gameData.weapons.info [objP->id].flash/32); // For four seconds or less if (objP->cType.laserInfo.nParentSig == gameData.objs.console->nSignature) { fe /= 2; force /= 2; } if (force > F1_0) { gameData.render.xFlashEffect = fe; PALETTE_FLASH_ADD (PK1 + f2i (PK2*force), PK1 + f2i (PK2*force), PK1 + f2i (PK2*force)); #if TRACE con_printf (CONDBG, "force = %7.3f, adding %i\n", f2fl (force), PK1 + f2i (PK2*force)); #endif } } if (objP && IsMultiGame && (objP->nType == OBJ_PLAYER)) killerP = objP; vForce2 = vForce; if (nParent > -1) { killerP = gameData.objs.objects + nParent; if (killerP != gameData.objs.console) // if someone else whacks you, cut force by 2x vForce2.p.x /= 2; vForce2.p.y /= 2; vForce2.p.z /= 2; } vForce2.p.x /= 2; vForce2.p.y /= 2; vForce2.p.z /= 2; PhysApplyForce (obj0P, &vForce); PhysApplyRot (obj0P, &vForce2); if (gameStates.app.nDifficultyLevel == 0) damage /= 4; if (obj0P->shields >= 0) ApplyDamageToPlayer (obj0P, killerP, damage); } } return explObjP; }