void DoRobotSmoke (tObject *objP) { int h = -1, i, nShields = 0, nParts; float nScale; vmsVector pos; i = OBJ_IDX (objP); if (!(SHOW_SMOKE && gameOpts->render.smoke.bRobots)) { if (gameData.smoke.objects [i] >= 0) KillObjectSmoke (i); return; } if ((objP->shields < 0) || (objP->flags & (OF_SHOULD_BE_DEAD | OF_DESTROYED))) nParts = 0; else { nShields = f2ir (RobotDefaultShields (objP)); h = f2ir (objP->shields) * 100 / nShields; } if (h < 0) return; nParts = 10 - h / 5; if (nParts > 0) { if (nShields > 4000) nShields = 4000; else if (nShields < 1000) nShields = 1000; CreateDamageExplosion (nParts, i); //nParts *= nShields / 10; nParts = BOT_MAX_PARTS; nScale = (float) sqrt (8.0 / f2fl (objP->size)); nScale *= 1.0f + h / 25.0f; if (!gameOpts->render.smoke.bSyncSizes) { nParts = -MAX_PARTICLES (nParts, gameOpts->render.smoke.nDens [2]); nScale = PARTICLE_SIZE (gameOpts->render.smoke.nSize [2], nScale); } if (gameData.smoke.objects [i] < 0) { //PrintLog ("creating robot %d smoke\n", i); SetSmokeObject (i, CreateSmoke (&objP->position.vPos, NULL, NULL, objP->nSegment, 1, nParts, nScale, gameOpts->render.smoke.bSyncSizes ? -1 : gameOpts->render.smoke.nSize [2], 1, BOT_PART_LIFE, BOT_PART_SPEED, 0, i, NULL, 1, -1)); } else { SetSmokePartScale (gameData.smoke.objects [i], nScale); SetSmokeDensity (gameData.smoke.objects [i], nParts, gameOpts->render.smoke.bSyncSizes ? -1 : gameOpts->render.smoke.nSize [2]); SetSmokeSpeed (gameData.smoke.objects [i], (objP->mType.physInfo.velocity.p.x || objP->mType.physInfo.velocity.p.y || objP->mType.physInfo.velocity.p.z) ? BOT_PART_SPEED : BOT_PART_SPEED * 2 / 3); } VmVecScaleAdd (&pos, &objP->position.vPos, &objP->position.mOrient.fVec, -objP->size / 2); SetSmokePos (gameData.smoke.objects [i], &pos, NULL, objP->nSegment); } else KillObjectSmoke (i); }
void ElectroCheat (void) { if (BoostVal (&gameData.multi.players [gameData.multi.nLocalPlayer].energy, MAX_ENERGY)) PowerupBasic (15, 15, 7, ENERGY_SCORE, "%s %s %d", TXT_ENERGY, TXT_BOOSTED_TO, f2ir(gameData.multi.players [gameData.multi.nLocalPlayer].energy)); else HUDInitMessage(TXT_MAXED_OUT, TXT_SHIELD); }
void ElectroCheat (int bVerbose) { if (BoostVal (&LOCALPLAYER.energy, MAX_ENERGY)) PowerupBasic (15, 15, 7, ENERGY_SCORE, "%s %s %d", TXT_ENERGY, TXT_BOOSTED_TO, f2ir (LOCALPLAYER.energy)); else if (bVerbose) HUDInitMessage (TXT_MAXED_OUT, TXT_SHIELD); }
void BlueOrbCheat (void) { if (BoostVal (&gameData.multi.players [gameData.multi.nLocalPlayer].shields, MAX_SHIELDS)) { MultiSendShields (); PowerupBasic (0, 0, 15, SHIELD_SCORE, "%s %s %d", TXT_SHIELD, TXT_BOOSTED_TO, f2ir (gameData.multi.players [gameData.multi.nLocalPlayer].shields)); } else HUDInitMessage (TXT_MAXED_OUT, TXT_SHIELD); }
void BlueOrbCheat (int bVerbose) { if (BoostVal (&LOCALPLAYER.shields, MAX_SHIELDS)) { MultiSendShields (); PowerupBasic (0, 0, 15, SHIELD_SCORE, "%s %s %d", TXT_SHIELD, TXT_BOOSTED_TO, f2ir (LOCALPLAYER.shields)); } else if (bVerbose) HUDInitMessage (TXT_MAXED_OUT, TXT_SHIELD); }
void DoReactorSmoke (tObject *objP) { int h = -1, i, nShields = 0, nParts; vmsVector vDir, vPos; i = OBJ_IDX (objP); if (!(SHOW_SMOKE && gameOpts->render.smoke.bRobots)) { if (gameData.smoke.objects [i] >= 0) KillObjectSmoke (i); return; } if ((objP->shields < 0) || (objP->flags & (OF_SHOULD_BE_DEAD | OF_DESTROYED))) nParts = 0; else { nShields = f2ir (gameData.bots.info [gameStates.app.bD1Mission][objP->id].strength); h = nShields ? f2ir (objP->shields) * 100 / nShields : 0; } if (h < 0) h = 0; nParts = 10 - h / 10; if (nParts > 0) { nParts = REACTOR_MAX_PARTS; if (gameData.smoke.objects [i] < 0) { //PrintLog ("creating robot %d smoke\n", i); SetSmokeObject (i, CreateSmoke (&objP->position.vPos, NULL, NULL, objP->nSegment, 1, nParts, fl2f (-4.0), -1, 1, BOT_PART_LIFE * 2, BOT_PART_SPEED, 0, i, NULL, 1, -1)); } else { SetSmokePartScale (gameData.smoke.objects [i], fl2f (-4.0)); SetSmokeDensity (gameData.smoke.objects [i], nParts, -1); vDir.p.x = d_rand () - F1_0 / 4; vDir.p.y = d_rand () - F1_0 / 4; vDir.p.z = d_rand () - F1_0 / 4; VmVecNormalize (&vDir); VmVecScaleAdd (&vPos, &objP->position.vPos, &vDir, -objP->size / 2); SetSmokePos (gameData.smoke.objects [i], &vPos, NULL, objP->nSegment); } } else KillObjectSmoke (i); }
// Draws invulnerable ship, or maybe the flashing ship, depending on invulnerability time left. void SBDrawInvulnerableShip (void) { fix tInvul = LOCALPLAYER.invulnerableTime + INVULNERABLE_TIME_MAX - gameData.time.xGame; GrSetCurrentCanvas (GetCurrentGameScreen ()); if (tInvul <= 0) SBDrawShieldBar (f2ir (LOCALPLAYER.shields)); else if ((tInvul > F1_0 * 4) || (gameData.time.xGame & 0x8000)) { PAGE_IN_GAUGE (GAUGE_INVULNERABLE + nInvulnerableFrame); HUDBitBlt (SB_SHIELD_GAUGE_X, SB_SHIELD_GAUGE_Y, &gameData.pig.tex.bitmaps [0][GET_GAUGE_INDEX (GAUGE_INVULNERABLE + nInvulnerableFrame)], F1_0, 0); } }
int pick_up_energy(void) { int used=0; if (Players[Player_num].energy < ENERGY_MAX) { Players[Player_num].energy += 3*F1_0 + 3*F1_0*(NDL - Difficulty_level); if (Players[Player_num].energy > ENERGY_MAX) Players[Player_num].energy = ENERGY_MAX; powerup_basic(15,15,7, ENERGY_SCORE, "%s %s %d",TXT_ENERGY,TXT_BOOSTED_TO,f2ir(Players[Player_num].energy)); used=1; } else HUD_init_message(TXT_MAXED_OUT,TXT_ENERGY); return used; }
static int pick_up_energy(void) { int used=0; if (Players[Player_num].energy < MAX_ENERGY) { fix boost; boost = 3*F1_0 + 3*F1_0*(NDL - Difficulty_level); if (Difficulty_level == 0) boost += boost/2; Players[Player_num].energy += boost; if (Players[Player_num].energy > MAX_ENERGY) Players[Player_num].energy = MAX_ENERGY; powerup_basic(15,15,7, ENERGY_SCORE, "%s %s %d",TXT_ENERGY,TXT_BOOSTED_TO,f2ir(Players[Player_num].energy)); used=1; } else HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, TXT_MAXED_OUT,TXT_ENERGY); return used; }
int PickupEnergy (int nPlayer) { player *playerP = gameData.multi.players + nPlayer; if (playerP->energy < MAX_ENERGY) { fix boost = 3 * F1_0 * (NDL - gameStates.app.nDifficultyLevel + 1); if (gameStates.app.nDifficultyLevel == 0) boost += boost / 2; playerP->energy += boost; if (playerP->energy > MAX_ENERGY) playerP->energy = MAX_ENERGY; if (LOCALPLAYER (nPlayer)) PowerupBasic (15,15,7, ENERGY_SCORE, "%s %s %d", TXT_ENERGY, TXT_BOOSTED_TO, f2ir (playerP->energy)); return 1; } else if (LOCALPLAYER (nPlayer)) HUDInitMessage (TXT_MAXED_OUT, TXT_ENERGY); return 0; }
int PickupShield (int nPlayer) { player *playerP = gameData.multi.players + nPlayer; if (playerP->shields < MAX_SHIELDS) { fix boost = 3 * F1_0 * (NDL - gameStates.app.nDifficultyLevel + 1); if (gameStates.app.nDifficultyLevel == 0) boost += boost / 2; playerP->shields += boost; if (playerP->shields > MAX_SHIELDS) playerP->shields = MAX_SHIELDS; if (LOCALPLAYER (nPlayer)) { PowerupBasic (0, 0, 15, SHIELD_SCORE, "%s %s %d", TXT_SHIELD, TXT_BOOSTED_TO, f2ir (playerP->shields)); MultiSendShields (); } return 1; } else if (LOCALPLAYER (nPlayer)) HUDInitMessage (TXT_MAXED_OUT, TXT_SHIELD); return 0; }
// returns true if powerup consumed int do_powerup(object *obj) { int used=0; int vulcan_ammo_to_add_with_cannon; if ((Player_is_dead) || (ConsoleObject->type == OBJ_GHOST)) return 0; switch (obj->id) { case POW_EXTRA_LIFE: Players[Player_num].lives++; powerup_basic(15, 15, 15, 0, TXT_EXTRA_LIFE); used=1; break; case POW_ENERGY: used = pick_up_energy(); break; case POW_SHIELD_BOOST: if (Players[Player_num].shields < SHIELD_MAX) { Players[Player_num].shields += 3*F1_0 + 3*F1_0*(NDL - Difficulty_level); if (Players[Player_num].shields > SHIELD_MAX) Players[Player_num].shields = SHIELD_MAX; powerup_basic(0, 0, 15, SHIELD_SCORE, "%s %s %d",TXT_SHIELD,TXT_BOOSTED_TO,f2ir(Players[Player_num].shields)); used=1; } else HUD_init_message(TXT_MAXED_OUT,TXT_SHIELD); break; case POW_LASER: if (Players[Player_num].laser_level >= MAX_LASER_LEVEL) { Players[Player_num].laser_level = MAX_LASER_LEVEL; HUD_init_message(TXT_MAXED_OUT,TXT_LASER); } else { if (Newdemo_state == ND_STATE_RECORDING) newdemo_record_laser_level(Players[Player_num].laser_level, Players[Player_num].laser_level + 1); Players[Player_num].laser_level++; powerup_basic(10, 0, 10, LASER_SCORE, "%s %s %d",TXT_LASER,TXT_BOOSTED_TO, Players[Player_num].laser_level+1); update_laser_weapon_info(); used=1; } if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_MISSILE_1: used=pick_up_secondary(CONCUSSION_INDEX,1); break; case POW_MISSILE_4: used=pick_up_secondary(CONCUSSION_INDEX,4); break; case POW_KEY_BLUE: if (Players[Player_num].flags & PLAYER_FLAGS_BLUE_KEY) break; #ifdef NETWORK multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); #endif digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); Players[Player_num].flags |= PLAYER_FLAGS_BLUE_KEY; powerup_basic(0, 0, 15, KEY_SCORE, "%s %s",TXT_BLUE,TXT_ACCESS_GRANTED); if (Game_mode & GM_MULTI) used=0; else used=1; break; case POW_KEY_RED: if (Players[Player_num].flags & PLAYER_FLAGS_RED_KEY) break; #ifdef NETWORK multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); #endif digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); Players[Player_num].flags |= PLAYER_FLAGS_RED_KEY; powerup_basic(15, 0, 0, KEY_SCORE, "%s %s",TXT_RED,TXT_ACCESS_GRANTED); if (Game_mode & GM_MULTI) used=0; else used=1; break; case POW_KEY_GOLD: if (Players[Player_num].flags & PLAYER_FLAGS_GOLD_KEY) break; #ifdef NETWORK multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); #endif digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); Players[Player_num].flags |= PLAYER_FLAGS_GOLD_KEY; powerup_basic(15, 15, 7, KEY_SCORE, "%s %s",TXT_YELLOW,TXT_ACCESS_GRANTED); if (Game_mode & GM_MULTI) used=0; else used=1; break; case POW_QUAD_FIRE: if (!(Players[Player_num].flags & PLAYER_FLAGS_QUAD_LASERS)) { Players[Player_num].flags |= PLAYER_FLAGS_QUAD_LASERS; powerup_basic(15, 15, 7, QUAD_FIRE_SCORE, "%s!",TXT_QUAD_LASERS); update_laser_weapon_info(); used=1; } else HUD_init_message("%s %s!",TXT_ALREADY_HAVE,TXT_QUAD_LASERS); if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_VULCAN_WEAPON: if ((used = pick_up_primary(VULCAN_INDEX)) != 0) { vulcan_ammo_to_add_with_cannon = obj->ctype.powerup_info.count; if (vulcan_ammo_to_add_with_cannon < VULCAN_WEAPON_AMMO_AMOUNT) vulcan_ammo_to_add_with_cannon = VULCAN_WEAPON_AMMO_AMOUNT; pick_up_ammo(CLASS_PRIMARY, VULCAN_INDEX, vulcan_ammo_to_add_with_cannon); } if (!used) used = pick_up_vulcan_ammo(); break; case POW_SPREADFIRE_WEAPON: used = pick_up_primary(SPREADFIRE_INDEX); if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_PLASMA_WEAPON: used = pick_up_primary(PLASMA_INDEX); if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_FUSION_WEAPON: used = pick_up_primary(FUSION_INDEX); if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_PROXIMITY_WEAPON: used=pick_up_secondary(PROXIMITY_INDEX,4); break; case POW_SMARTBOMB_WEAPON: used=pick_up_secondary(SMART_INDEX,1); break; case POW_MEGA_WEAPON: used=pick_up_secondary(MEGA_INDEX,1); break; case POW_VULCAN_AMMO: { used = pick_up_vulcan_ammo(); if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_vulcan_ammo(); break; } break; case POW_HOMING_AMMO_1: used=pick_up_secondary(HOMING_INDEX,1); break; case POW_HOMING_AMMO_4: used=pick_up_secondary(HOMING_INDEX,4); break; case POW_CLOAK: if (Players[Player_num].flags & PLAYER_FLAGS_CLOAKED) { HUD_init_message("%s %s!",TXT_ALREADY_ARE,TXT_CLOAKED); break; } else { Players[Player_num].cloak_time = GameTime; // Not! changed by awareness events (like player fires laser). Players[Player_num].flags |= PLAYER_FLAGS_CLOAKED; ai_do_cloak_stuff(); #ifdef NETWORK if (Game_mode & GM_MULTI) multi_send_cloak(); #endif powerup_basic(-10,-10,-10, CLOAK_SCORE, "%s!",TXT_CLOAKING_DEVICE); used = 1; break; } case POW_INVULNERABILITY: if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE) { HUD_init_message("%s %s!",TXT_ALREADY_ARE,TXT_INVULNERABLE); break; } else { Players[Player_num].invulnerable_time = GameTime; Players[Player_num].flags |= PLAYER_FLAGS_INVULNERABLE; powerup_basic(7, 14, 21, INVULNERABILITY_SCORE, "%s!",TXT_INVULNERABILITY); used = 1; break; } #ifndef RELEASE case POW_MEGAWOW: do_megawow_powerup(50); used = 1; break; #endif default: break; } //always say used, until physics problem (getting stuck on unused powerup) //is solved. Note also the break statements above that are commented out //!! used=1; if (used && Powerup_info[obj->id].hit_sound > -1 ) { #ifdef NETWORK if (Game_mode & GM_MULTI) // Added by Rob, take this out if it turns out to be not good for net games! multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); #endif digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); } return used; }
//print out some tPlayer statistics void SBRenderGauges (void) { int nEnergy = f2ir (LOCALPLAYER.energy); int nShields = f2ir (LOCALPLAYER.shields); int bCloak = ((LOCALPLAYER.flags & PLAYER_FLAGS_CLOAKED) != 0); if (nEnergy != oldEnergy [gameStates.render.vr.nCurrentPage]) { if (gameData.demo.nState==ND_STATE_RECORDING) { NDRecordPlayerEnergy (oldEnergy [gameStates.render.vr.nCurrentPage], nEnergy); } SBDrawEnergyBar (nEnergy); oldEnergy [gameStates.render.vr.nCurrentPage] = nEnergy; } if (gameData.physics.xAfterburnerCharge != oldAfterburner [gameStates.render.vr.nCurrentPage]) { if (gameData.demo.nState == ND_STATE_RECORDING) { NDRecordPlayerAfterburner (oldAfterburner [gameStates.render.vr.nCurrentPage], gameData.physics.xAfterburnerCharge); } SBDrawAfterburner (); oldAfterburner [gameStates.render.vr.nCurrentPage] = gameData.physics.xAfterburnerCharge; } if (LOCALPLAYER.flags & PLAYER_FLAGS_INVULNERABLE) { DrawInvulnerableShip (); oldShields [gameStates.render.vr.nCurrentPage] = nShields ^ 1; SBDrawShieldNum (nShields); } else { if (nShields != oldShields [gameStates.render.vr.nCurrentPage]) { // Draw the shield gauge if (gameData.demo.nState == ND_STATE_RECORDING) { NDRecordPlayerShields (oldShields [gameStates.render.vr.nCurrentPage], nShields); } SBDrawShieldBar (nShields); oldShields [gameStates.render.vr.nCurrentPage] = nShields; SBDrawShieldNum (nShields); } } if (LOCALPLAYER.flags != oldFlags [gameStates.render.vr.nCurrentPage]) { if (gameData.demo.nState == ND_STATE_RECORDING) NDRecordPlayerFlags (oldFlags [gameStates.render.vr.nCurrentPage], LOCALPLAYER.flags); SBDrawKeys (); oldFlags [gameStates.render.vr.nCurrentPage] = LOCALPLAYER.flags; } if (IsMultiGame && !IsCoopGame) { if (LOCALPLAYER.netKilledTotal != oldLives [gameStates.render.vr.nCurrentPage]) { SBShowLives (); oldLives [gameStates.render.vr.nCurrentPage] = LOCALPLAYER.netKilledTotal; } } else { if (LOCALPLAYER.lives != oldLives [gameStates.render.vr.nCurrentPage]) { SBShowLives (); oldLives [gameStates.render.vr.nCurrentPage] = LOCALPLAYER.lives; } } if (IsMultiGame && !IsCoopGame) { if (LOCALPLAYER.netKillsTotal != oldScore [gameStates.render.vr.nCurrentPage]) { SBShowScore (); oldScore [gameStates.render.vr.nCurrentPage] = LOCALPLAYER.netKillsTotal; } } else { if (LOCALPLAYER.score != oldScore [gameStates.render.vr.nCurrentPage]) { SBShowScore (); oldScore [gameStates.render.vr.nCurrentPage] = LOCALPLAYER.score; } //if (scoreTime) SBShowScoreAdded (); } ShowBombCount (SB_BOMB_COUNT_X, SB_BOMB_COUNT_Y, BLACK_RGBA, 0); DrawPlayerShip (bCloak, bOldCloak [gameStates.render.vr.nCurrentPage], SB_SHIP_GAUGE_X, SB_SHIP_GAUGE_Y); }
// returns true if powerup consumed int do_powerup(dxxobject *obj) { int used=0; int special_used=0; //for when hitting vulcan cannon gets vulcan ammo int id=obj->id; if ((Player_is_dead) || (ConsoleObject->type == OBJ_GHOST) || (Players[Player_num].shields < 0)) return 0; if ((obj->ctype.powerup_info.flags & PF_SPAT_BY_PLAYER) && obj->ctype.powerup_info.creation_time>0 && GameTime64<obj->ctype.powerup_info.creation_time+i2f(2)) return 0; //not enough time elapsed if (Game_mode & GM_MULTI) { /* * The fact: Collecting a powerup is decided Client-side and due to PING it takes time for other players to know if one collected a powerup actually. This may lead to the case two players collect the same powerup! * The solution: Let us check if someone else is closer to a powerup and if so, do not collect it. * NOTE: Player positions computed by 'shortpos' and PING can still cause a small margin of error. */ int i = 0; vms_vector tvec; fix mydist = vm_vec_normalized_dir(&tvec, &obj->pos, &ConsoleObject->pos); for (i = 0; i < MAX_PLAYERS; i++) { if (i == Player_num || Players[i].connected != CONNECT_PLAYING) continue; if (Objects[Players[i].objnum].type == OBJ_GHOST || Players[i].shields < 0) continue; if (mydist > vm_vec_normalized_dir(&tvec, &obj->pos, &Objects[Players[i].objnum].pos)) return 0; } } switch (obj->id) { case POW_EXTRA_LIFE: Players[Player_num].lives++; powerup_basic(15, 15, 15, 0, TXT_EXTRA_LIFE); used=1; break; case POW_ENERGY: used = pick_up_energy(); break; case POW_SHIELD_BOOST: if (Players[Player_num].shields < MAX_SHIELDS) { fix boost = 3*F1_0 + 3*F1_0*(NDL - Difficulty_level); if (Difficulty_level == 0) boost += boost/2; Players[Player_num].shields += boost; if (Players[Player_num].shields > MAX_SHIELDS) Players[Player_num].shields = MAX_SHIELDS; powerup_basic(0, 0, 15, SHIELD_SCORE, "%s %s %d",TXT_SHIELD,TXT_BOOSTED_TO,f2ir(Players[Player_num].shields)); used=1; } else HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, TXT_MAXED_OUT,TXT_SHIELD); break; case POW_LASER: if (Players[Player_num].laser_level >= MAX_LASER_LEVEL) { //Players[Player_num].laser_level = MAX_LASER_LEVEL; HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, TXT_MAXED_OUT,TXT_LASER); } else { if (Newdemo_state == ND_STATE_RECORDING) newdemo_record_laser_level(Players[Player_num].laser_level, Players[Player_num].laser_level + 1); Players[Player_num].laser_level++; powerup_basic(10, 0, 10, LASER_SCORE, "%s %s %d",TXT_LASER,TXT_BOOSTED_TO, Players[Player_num].laser_level+1); update_laser_weapon_info(); pick_up_primary (LASER_INDEX); used=1; } if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_MISSILE_1: used=pick_up_secondary(CONCUSSION_INDEX,1); break; case POW_MISSILE_4: used=pick_up_secondary(CONCUSSION_INDEX,4); break; case POW_KEY_BLUE: if (Players[Player_num].flags & PLAYER_FLAGS_BLUE_KEY) break; #ifdef NETWORK multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); #endif digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); Players[Player_num].flags |= PLAYER_FLAGS_BLUE_KEY; powerup_basic(0, 0, 15, KEY_SCORE, "%s %s",TXT_BLUE,TXT_ACCESS_GRANTED); if (Game_mode & GM_MULTI) used=0; else used=1; invalidate_escort_goal(); break; case POW_KEY_RED: if (Players[Player_num].flags & PLAYER_FLAGS_RED_KEY) break; #ifdef NETWORK multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); #endif digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); Players[Player_num].flags |= PLAYER_FLAGS_RED_KEY; powerup_basic(15, 0, 0, KEY_SCORE, "%s %s",TXT_RED,TXT_ACCESS_GRANTED); if (Game_mode & GM_MULTI) used=0; else used=1; invalidate_escort_goal(); break; case POW_KEY_GOLD: if (Players[Player_num].flags & PLAYER_FLAGS_GOLD_KEY) break; #ifdef NETWORK multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); #endif digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); Players[Player_num].flags |= PLAYER_FLAGS_GOLD_KEY; powerup_basic(15, 15, 7, KEY_SCORE, "%s %s",TXT_YELLOW,TXT_ACCESS_GRANTED); if (Game_mode & GM_MULTI) used=0; else used=1; invalidate_escort_goal(); break; case POW_QUAD_FIRE: if (!(Players[Player_num].flags & PLAYER_FLAGS_QUAD_LASERS)) { Players[Player_num].flags |= PLAYER_FLAGS_QUAD_LASERS; powerup_basic(15, 15, 7, QUAD_FIRE_SCORE, "%s!",TXT_QUAD_LASERS); update_laser_weapon_info(); used=1; } else HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %s!",TXT_ALREADY_HAVE,TXT_QUAD_LASERS); if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_VULCAN_WEAPON: case POW_GAUSS_WEAPON: { int ammo = obj->ctype.powerup_info.count; used = pick_up_primary((obj->id==POW_VULCAN_WEAPON)?VULCAN_INDEX:GAUSS_INDEX); //didn't get the weapon (because we already have it), but //maybe snag some of the ammo. if single-player, grab all the ammo //and remove the powerup. If multi-player take ammo in excess of //the amount in a powerup, and leave the rest. if (! used) if ((Game_mode & GM_MULTI) ) ammo -= VULCAN_AMMO_AMOUNT; //don't let take all ammo if (ammo > 0) { int ammo_used; ammo_used = pick_up_ammo(CLASS_PRIMARY, VULCAN_INDEX, ammo); obj->ctype.powerup_info.count -= ammo_used; if (!used && ammo_used) { powerup_basic(7, 14, 21, VULCAN_AMMO_SCORE, "%s (now ammo=%i/%i)!", TXT_VULCAN_AMMO, PRINTABLE_VULCAN_AMMO(Players[Player_num].primary_ammo[1]), PRINTABLE_VULCAN_AMMO(CURRENT_VULCAN_AMMO_CAPACITY(Player_num))); special_used = 1; id = POW_VULCAN_AMMO; //set new id for making sound at end of this function if (obj->ctype.powerup_info.count == 0) used = 1; //say used if all ammo taken } } break; } case POW_SPREADFIRE_WEAPON: used = pick_up_primary(SPREADFIRE_INDEX); if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_PLASMA_WEAPON: used = pick_up_primary(PLASMA_INDEX); if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_FUSION_WEAPON: used = pick_up_primary(FUSION_INDEX); if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_HELIX_WEAPON: used = pick_up_primary(HELIX_INDEX); if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_PHOENIX_WEAPON: used = pick_up_primary(PHOENIX_INDEX); if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_OMEGA_WEAPON: used = pick_up_primary(OMEGA_INDEX); if (used) Omega_charge = obj->ctype.powerup_info.count; if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_PROXIMITY_WEAPON: used=pick_up_secondary(PROXIMITY_INDEX,4); break; case POW_SMARTBOMB_WEAPON: used=pick_up_secondary(SMART_INDEX,1); break; case POW_MEGA_WEAPON: used=pick_up_secondary(MEGA_INDEX,1); break; case POW_SMISSILE1_1: used=pick_up_secondary(SMISSILE1_INDEX,1); break; case POW_SMISSILE1_4: used=pick_up_secondary(SMISSILE1_INDEX,4); break; case POW_GUIDED_MISSILE_1: used=pick_up_secondary(GUIDED_INDEX,1); break; case POW_GUIDED_MISSILE_4: used=pick_up_secondary(GUIDED_INDEX,4); break; case POW_SMART_MINE: used=pick_up_secondary(SMART_MINE_INDEX,4); break; case POW_MERCURY_MISSILE_1: used=pick_up_secondary(SMISSILE4_INDEX,1); break; case POW_MERCURY_MISSILE_4: used=pick_up_secondary(SMISSILE4_INDEX,4); break; case POW_EARTHSHAKER_MISSILE: used=pick_up_secondary(SMISSILE5_INDEX,1); break; case POW_VULCAN_AMMO: used = pick_up_vulcan_ammo(); break; case POW_HOMING_AMMO_1: used=pick_up_secondary(HOMING_INDEX,1); break; case POW_HOMING_AMMO_4: used=pick_up_secondary(HOMING_INDEX,4); break; case POW_CLOAK: if (Players[Player_num].flags & PLAYER_FLAGS_CLOAKED) { HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %s!",TXT_ALREADY_ARE,TXT_CLOAKED); break; } else { Players[Player_num].cloak_time = GameTime64; // Not! changed by awareness events (like player fires laser). Players[Player_num].flags |= PLAYER_FLAGS_CLOAKED; ai_do_cloak_stuff(); #ifdef NETWORK if (Game_mode & GM_MULTI) multi_send_cloak(); #endif powerup_basic(-10,-10,-10, CLOAK_SCORE, "%s!",TXT_CLOAKING_DEVICE); used = 1; break; } case POW_INVULNERABILITY: if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE) { HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %s!",TXT_ALREADY_ARE,TXT_INVULNERABLE); break; } else { Players[Player_num].invulnerable_time = GameTime64; Players[Player_num].flags |= PLAYER_FLAGS_INVULNERABLE; powerup_basic(7, 14, 21, INVULNERABILITY_SCORE, "%s!",TXT_INVULNERABILITY); used = 1; break; } #ifndef RELEASE case POW_MEGAWOW: do_megawow_powerup(50); used = 1; break; #endif case POW_FULL_MAP: if (Players[Player_num].flags & PLAYER_FLAGS_MAP_ALL) { HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %s!",TXT_ALREADY_HAVE,"the FULL MAP"); if (!(Game_mode & GM_MULTI) ) used = pick_up_energy(); } else { Players[Player_num].flags |= PLAYER_FLAGS_MAP_ALL; powerup_basic(15, 0, 15, 0, "FULL MAP!"); used=1; } break; case POW_CONVERTER: if (Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) { HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %s!",TXT_ALREADY_HAVE,"the Converter"); if (!(Game_mode & GM_MULTI) ) used = pick_up_energy(); } else { Players[Player_num].flags |= PLAYER_FLAGS_CONVERTER; powerup_basic(15, 0, 15, 0, "Energy -> shield converter!"); used=1; } break; case POW_SUPER_LASER: if (Players[Player_num].laser_level >= MAX_SUPER_LASER_LEVEL) { Players[Player_num].laser_level = MAX_SUPER_LASER_LEVEL; HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "SUPER LASER MAXED OUT!"); } else { int old_level=Players[Player_num].laser_level; if (Players[Player_num].laser_level <= MAX_LASER_LEVEL) Players[Player_num].laser_level = MAX_LASER_LEVEL; Players[Player_num].laser_level++; if (Newdemo_state == ND_STATE_RECORDING) newdemo_record_laser_level(old_level, Players[Player_num].laser_level); powerup_basic(10, 0, 10, LASER_SCORE, "Super Boost to Laser level %d",Players[Player_num].laser_level+1); update_laser_weapon_info(); if (Primary_weapon!=LASER_INDEX) check_to_use_primary (SUPER_LASER_INDEX); used=1; } if (!used && !(Game_mode & GM_MULTI) ) used = pick_up_energy(); break; case POW_AMMO_RACK: if (Players[Player_num].flags & PLAYER_FLAGS_AMMO_RACK) { HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %s!",TXT_ALREADY_HAVE,"the Ammo rack"); if (!(Game_mode & GM_MULTI) ) used = pick_up_energy(); } else { Players[Player_num].flags |= PLAYER_FLAGS_AMMO_RACK; #ifdef NETWORK multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); #endif digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); powerup_basic(15, 0, 15, 0, "AMMO RACK!"); used=1; } break; case POW_AFTERBURNER: if (Players[Player_num].flags & PLAYER_FLAGS_AFTERBURNER) { HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %s!",TXT_ALREADY_HAVE,"the Afterburner"); if (!(Game_mode & GM_MULTI) ) used = pick_up_energy(); } else { Players[Player_num].flags |= PLAYER_FLAGS_AFTERBURNER; #ifdef NETWORK multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); #endif digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); powerup_basic(15, 15, 15, 0, "AFTERBURNER!"); Afterburner_charge = f1_0; used=1; } break; case POW_HEADLIGHT: if (Players[Player_num].flags & PLAYER_FLAGS_HEADLIGHT) { HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %s!",TXT_ALREADY_HAVE,"the Headlight boost"); if (!(Game_mode & GM_MULTI) ) used = pick_up_energy(); } else { Players[Player_num].flags |= PLAYER_FLAGS_HEADLIGHT; #ifdef NETWORK multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0); #endif digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 ); powerup_basic(15, 0, 15, 0, "HEADLIGHT BOOST! (Headlight is %s)",PlayerCfg.HeadlightActiveDefault?"ON":"OFF"); if (PlayerCfg.HeadlightActiveDefault) Players[Player_num].flags |= PLAYER_FLAGS_HEADLIGHT_ON; used=1; #ifdef NETWORK if (Game_mode & GM_MULTI) multi_send_flags (Player_num); #endif } break; #ifdef NETWORK case POW_FLAG_BLUE: if (Game_mode & GM_CAPTURE) if (get_team(Player_num) == TEAM_RED) { powerup_basic(15, 0, 15, 0, "BLUE FLAG!"); Players[Player_num].flags |= PLAYER_FLAGS_FLAG; used=1; multi_send_got_flag (Player_num); } break; case POW_HOARD_ORB: if (Game_mode & GM_HOARD) if (Players[Player_num].secondary_ammo[PROXIMITY_INDEX]<12) { powerup_basic(15, 0, 15, 0, "Orb!!!"); Players[Player_num].secondary_ammo[PROXIMITY_INDEX]++; Players[Player_num].flags |= PLAYER_FLAGS_FLAG; used=1; multi_send_got_orb (Player_num); } break; case POW_FLAG_RED: if (Game_mode & GM_CAPTURE) if (get_team(Player_num) == TEAM_BLUE) { powerup_basic(15, 0, 15, 0, "RED FLAG!"); Players[Player_num].flags |= PLAYER_FLAGS_FLAG; used=1; multi_send_got_flag (Player_num); } break; #endif // case POW_HOARD_ORB: default: break; } //always say used, until physics problem (getting stuck on unused powerup) //is solved. Note also the break statements above that are commented out //!! used=1; if ((used || special_used) && Powerup_info[id].hit_sound > -1 ) { #ifdef NETWORK if (Game_mode & GM_MULTI) // Added by Rob, take this out if it turns out to be not good for net games! multi_send_play_sound(Powerup_info[id].hit_sound, F1_0); #endif digi_play_sample( Powerup_info[id].hit_sound, F1_0 ); detect_escort_goal_accomplished(obj-Objects); } return used; }
void DoPlayerSmoke (tObject *objP, int i) { int h, j, d, nParts, nType; float nScale; tCloud *pCloud; vmsVector fn, mn; tThrusterInfo ti; static int bForward = 1; if (i < 0) i = objP->id; if ((gameData.multiplayer.players [i].flags & PLAYER_FLAGS_CLOAKED) || (gameStates.render.automap.bDisplay && IsMultiGame && !AM_SHOW_PLAYERS)) { KillObjectSmoke (i); return; } j = OBJ_IDX (objP); if (gameOpts->render.smoke.bDecreaseLag && (i == gameData.multiplayer.nLocalPlayer)) { fn = objP->position.mOrient.fVec; VmVecSub (&mn, &objP->position.vPos, &objP->vLastPos); VmVecNormalize (&fn); VmVecNormalize (&mn); d = VmVecDot (&fn, &mn); if (d >= -F1_0 / 2) bForward = 1; else { if (bForward) { if ((h = gameData.smoke.objects [j]) >= 0) { KillObjectSmoke (i); DestroySmoke (h); } bForward = 0; nScale = 0; return; } } } #if 0 if (EGI_FLAG (bThrusterFlames, 1, 1, 0)) { if ((a <= F1_0 / 4) && (a || !gameStates.input.bControlsSkipFrame)) //no thruster flames if moving backward DropAfterburnerBlobs (objP, 2, i2f (1), -1, gameData.objs.console, 1); //F1_0 / 4); } #endif if ((gameData.app.nGameMode & GM_NETWORK) && !gameData.multiplayer.players [i].connected) nParts = 0; else if (objP->flags & (OF_SHOULD_BE_DEAD | OF_DESTROYED)) nParts = 0; else if ((i == gameData.multiplayer.nLocalPlayer) && (gameStates.app.bPlayerIsDead || (gameData.multiplayer.players [i].shields < 0))) nParts = 0; else { h = f2ir (gameData.multiplayer.players [i].shields); nParts = 10 - h / 5; nScale = f2fl (objP->size); if (h <= 25) nScale /= 1.5; else if (h <= 50) nScale /= 2; else nScale /= 3; if (nParts <= 0) { nType = 2; //nParts = (gameStates.entropy.nTimeLastMoved < 0) ? 250 : 125; } else { CreateDamageExplosion (nParts, j); nType = (h > 25); nParts *= 25; nParts += 75; } nParts = (gameStates.entropy.nTimeLastMoved < 0) ? SHIP_MAX_PARTS * 2 : SHIP_MAX_PARTS; if (SHOW_SMOKE && nParts && gameOpts->render.smoke.bPlayers) { if (gameOpts->render.smoke.bSyncSizes) { nParts = -MAX_PARTICLES (nParts, gameOpts->render.smoke.nDens [0]); nScale = PARTICLE_SIZE (gameOpts->render.smoke.nSize [0], nScale); } else { nParts = -MAX_PARTICLES (nParts, gameOpts->render.smoke.nDens [1]); nScale = PARTICLE_SIZE (gameOpts->render.smoke.nSize [1], nScale); } if (!(objP->mType.physInfo.thrust.p.x || objP->mType.physInfo.thrust.p.y || objP->mType.physInfo.thrust.p.z)) { nParts /= 2; nScale /= 2; } if (0 > (h = gameData.smoke.objects [j])) { //PrintLog ("creating tPlayer smoke\n"); h = SetSmokeObject (j, CreateSmoke (&objP->position.vPos, NULL, NULL, objP->nSegment, 2, nParts, nScale, gameOpts->render.smoke.nSize [1], 2, PLR_PART_LIFE / (nType + 1), PLR_PART_SPEED, nType, j, NULL, 1, -1)); } else { SetSmokeType (h, nType); SetSmokePartScale (h, -nScale); SetSmokeDensity (h, nParts, gameOpts->render.smoke.bSyncSizes ? -1 : gameOpts->render.smoke.nSize [1]); SetSmokeSpeed (gameData.smoke.objects [i], (objP->mType.physInfo.velocity.p.x || objP->mType.physInfo.velocity.p.y || objP->mType.physInfo.velocity.p.z) ? PLR_PART_SPEED : PLR_PART_SPEED * 2); } CalcThrusterPos (objP, &ti, 0); for (j = 0; j < 2; j++) if ((pCloud = GetCloud (h, j))) SetCloudPos (pCloud, ti.vPos + j, NULL, objP->nSegment); return; } } KillObjectSmoke (i); }