void do_cheat_menu() { int mmn; newmenu_item mm[16]; char score_text[21]; sprintf( score_text, "%d", Players[Player_num].score ); mm[0].type=NM_TYPE_CHECK; mm[0].value=Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE; mm[0].text="Invulnerability"; mm[1].type=NM_TYPE_CHECK; mm[1].value=Players[Player_num].flags & PLAYER_FLAGS_CLOAKED; mm[1].text="Cloaked"; mm[2].type=NM_TYPE_CHECK; mm[2].value=0; mm[2].text="All keys"; mm[3].type=NM_TYPE_NUMBER; mm[3].value=f2i(Players[Player_num].energy); mm[3].text="% Energy"; mm[3].min_value=0; mm[3].max_value=200; mm[4].type=NM_TYPE_NUMBER; mm[4].value=f2i(Players[Player_num].shields); mm[4].text="% Shields"; mm[4].min_value=0; mm[4].max_value=200; mm[5].type=NM_TYPE_TEXT; mm[5].text = "Score:"; mm[6].type=NM_TYPE_INPUT; mm[6].text_len = 10; mm[6].text = score_text; mm[7].type=NM_TYPE_RADIO; mm[7].value=(Players[Player_num].laser_level==0); mm[7].group=0; mm[7].text="Laser level 1"; mm[8].type=NM_TYPE_RADIO; mm[8].value=(Players[Player_num].laser_level==1); mm[8].group=0; mm[8].text="Laser level 2"; mm[9].type=NM_TYPE_RADIO; mm[9].value=(Players[Player_num].laser_level==2); mm[9].group=0; mm[9].text="Laser level 3"; mm[10].type=NM_TYPE_RADIO; mm[10].value=(Players[Player_num].laser_level==3); mm[10].group=0; mm[10].text="Laser level 4"; mm[11].type=NM_TYPE_NUMBER; mm[11].value=Players[Player_num].secondary_ammo[CONCUSSION_INDEX]; mm[11].text="Missiles"; mm[11].min_value=0; mm[11].max_value=200; mmn = newmenu_do("Wimp Menu",NULL,12, mm, NULL, NULL ); if (mmn > -1 ) { if ( mm[0].value ) { Players[Player_num].flags |= PLAYER_FLAGS_INVULNERABLE; Players[Player_num].invulnerable_time = GameTime64+i2f(1000); } else Players[Player_num].flags &= ~PLAYER_FLAGS_INVULNERABLE; if ( mm[1].value ) { Players[Player_num].flags |= PLAYER_FLAGS_CLOAKED; #ifdef NETWORK if (Game_mode & GM_MULTI) multi_send_cloak(); #endif ai_do_cloak_stuff(); Players[Player_num].cloak_time = GameTime64; } else Players[Player_num].flags &= ~PLAYER_FLAGS_CLOAKED; if (mm[2].value) Players[Player_num].flags |= PLAYER_FLAGS_BLUE_KEY | PLAYER_FLAGS_RED_KEY | PLAYER_FLAGS_GOLD_KEY; Players[Player_num].energy=i2f(mm[3].value); Players[Player_num].shields=i2f(mm[4].value); Players[Player_num].score = atoi(mm[6].text); if (mm[7].value) Players[Player_num].laser_level=0; if (mm[8].value) Players[Player_num].laser_level=1; if (mm[9].value) Players[Player_num].laser_level=2; if (mm[10].value) Players[Player_num].laser_level=3; Players[Player_num].secondary_ammo[CONCUSSION_INDEX] = mm[11].value; init_gauges(); } }
// 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; }
int FinalCheats(int key) { static char cheat_buffer[CHEAT_MAX_LEN] = "AAAAAAAAAAAAAAA"; int i = 0, gotcha = 0; if (Game_mode & GM_MULTI) return 0; for (i = 1; i < CHEAT_MAX_LEN; i++) cheat_buffer[i-1] = cheat_buffer[i]; cheat_buffer[CHEAT_MAX_LEN-1] = key_ascii(); for (i = 0; i < NUM_CHEATS; i++) { int cheatlen = strlen(cheat_codes[i].string); Assert(cheatlen <= CHEAT_MAX_LEN); if (d_strnicmp(cheat_codes[i].string, cheat_buffer+CHEAT_MAX_LEN-cheatlen, cheatlen)==0) { if (!cheats.enabled && *cheat_codes[i].stateptr != cheats.enabled) break; if (!cheats.enabled) HUD_init_message(HM_DEFAULT, TXT_CHEATS_ENABLED); *cheat_codes[i].stateptr = !*cheat_codes[i].stateptr; cheats.enabled = 1; digi_play_sample( SOUND_CHEATER, F1_0); Players[Player_num].score = 0; gotcha = i; break; } } if (!gotcha) return 0; if (cheat_codes[gotcha].stateptr == &cheats.wowie) { HUD_init_message_literal(HM_DEFAULT, TXT_WOWIE_ZOWIE); Players[Player_num].primary_weapon_flags |= 0xff ^ (HAS_PLASMA_FLAG | HAS_FUSION_FLAG); Players[Player_num].secondary_weapon_flags |= 0xff ^ (HAS_SMART_FLAG | HAS_MEGA_FLAG); for (i=0; i<3; i++) Players[Player_num].primary_ammo[i] = Primary_ammo_max[i]; for (i=0; i<3; i++) Players[Player_num].secondary_ammo[i] = Secondary_ammo_max[i]; if (Newdemo_state == ND_STATE_RECORDING) newdemo_record_laser_level(Players[Player_num].laser_level, MAX_LASER_LEVEL); Players[Player_num].energy = MAX_ENERGY; Players[Player_num].laser_level = MAX_LASER_LEVEL; Players[Player_num].flags |= PLAYER_FLAGS_QUAD_LASERS; update_laser_weapon_info(); } if (cheat_codes[gotcha].stateptr == &cheats.wowie2) { HUD_init_message(HM_DEFAULT, "SUPER %s",TXT_WOWIE_ZOWIE); Players[Player_num].primary_weapon_flags = 0xff; Players[Player_num].secondary_weapon_flags = 0xff; for (i=0; i<MAX_PRIMARY_WEAPONS; i++) Players[Player_num].primary_ammo[i] = Primary_ammo_max[i]; for (i=0; i<MAX_SECONDARY_WEAPONS; i++) Players[Player_num].secondary_ammo[i] = Secondary_ammo_max[i]; if (Newdemo_state == ND_STATE_RECORDING) newdemo_record_laser_level(Players[Player_num].laser_level, MAX_LASER_LEVEL); Players[Player_num].energy = MAX_ENERGY; Players[Player_num].laser_level = MAX_LASER_LEVEL; Players[Player_num].flags |= PLAYER_FLAGS_QUAD_LASERS; update_laser_weapon_info(); } if (cheat_codes[gotcha].stateptr == &cheats.allkeys) { HUD_init_message_literal(HM_DEFAULT, TXT_ALL_KEYS); Players[Player_num].flags |= PLAYER_FLAGS_BLUE_KEY | PLAYER_FLAGS_RED_KEY | PLAYER_FLAGS_GOLD_KEY; } if (cheat_codes[gotcha].stateptr == &cheats.invul) { Players[Player_num].flags ^= PLAYER_FLAGS_INVULNERABLE; HUD_init_message(HM_DEFAULT, "%s %s!", TXT_INVULNERABILITY, (Players[Player_num].flags&PLAYER_FLAGS_INVULNERABLE)?TXT_ON:TXT_OFF); Players[Player_num].invulnerable_time = GameTime64+i2f(1000); } if (cheat_codes[gotcha].stateptr == &cheats.cloak) { Players[Player_num].flags ^= PLAYER_FLAGS_CLOAKED; HUD_init_message(HM_DEFAULT, "%s %s!", TXT_CLOAK, (Players[Player_num].flags&PLAYER_FLAGS_CLOAKED)?TXT_ON:TXT_OFF); if (Players[Player_num].flags & PLAYER_FLAGS_CLOAKED) { ai_do_cloak_stuff(); Players[Player_num].cloak_time = GameTime64; } } if (cheat_codes[gotcha].stateptr == &cheats.shields) { HUD_init_message_literal(HM_DEFAULT, TXT_FULL_SHIELDS); Players[Player_num].shields = MAX_SHIELDS; } if (cheat_codes[gotcha].stateptr == &cheats.extralife) { if (Players[Player_num].lives<50) { Players[Player_num].lives++; HUD_init_message_literal(HM_DEFAULT, "Extra life!"); } } if (cheat_codes[gotcha].stateptr == &cheats.killreactor) { kill_and_so_forth(); } if (cheat_codes[gotcha].stateptr == &cheats.exitpath) { #ifdef SHOW_EXIT_PATH if (create_special_path()) HUD_init_message_literal(HM_DEFAULT, "Exit path illuminated!"); #endif } if (cheat_codes[gotcha].stateptr == &cheats.levelwarp) { newmenu_item m; char text[10]=""; int new_level_num; int item; *cheat_codes[gotcha].stateptr = 0; m.type=NM_TYPE_INPUT; m.text_len = 10; m.text = text; item = newmenu_do( NULL, TXT_WARP_TO_LEVEL, 1, &m, NULL, NULL ); if (item != -1) { new_level_num = atoi(m.text); if (new_level_num!=0 && new_level_num>=0 && new_level_num<=Last_level) { window_set_visible(Game_wind, 0); StartNewLevel(new_level_num); window_set_visible(Game_wind, 1); } } } if (cheat_codes[gotcha].stateptr == &cheats.ghostphysics) { HUD_init_message(HM_DEFAULT, "%s %s!", "Ghosty mode", cheats.ghostphysics?TXT_ON:TXT_OFF); } if (cheat_codes[gotcha].stateptr == &cheats.rapidfire) { do_megawow_powerup(200); } if (cheat_codes[gotcha].stateptr == &cheats.turbo) { HUD_init_message(HM_DEFAULT, "%s %s!", "Turbo mode", cheats.turbo?TXT_ON:TXT_OFF); } if (cheat_codes[gotcha].stateptr == &cheats.robotfiringsuspended) { HUD_init_message(HM_DEFAULT, "Robot firing %s!", cheats.robotfiringsuspended?TXT_OFF:TXT_ON); } if (cheat_codes[gotcha].stateptr == &cheats.acid) { HUD_init_message_literal(HM_DEFAULT, cheats.acid?"Going up!":"Coming down!"); } return 1; }
int HandleTestKey(int key) { switch (key) { #ifdef SHOW_EXIT_PATH case KEY_DEBUGGED+KEY_1: create_special_path(); break; #endif case KEY_DEBUGGED+KEY_Y: do_controlcen_destroyed_stuff(NULL); break; case KEY_BACKSP: case KEY_CTRLED+KEY_BACKSP: case KEY_ALTED+KEY_BACKSP: case KEY_SHIFTED+KEY_BACKSP: case KEY_SHIFTED+KEY_ALTED+KEY_BACKSP: case KEY_CTRLED+KEY_ALTED+KEY_BACKSP: case KEY_SHIFTED+KEY_CTRLED+KEY_BACKSP: case KEY_SHIFTED+KEY_CTRLED+KEY_ALTED+KEY_BACKSP: Int3(); break; case KEY_DEBUGGED+KEY_S: digi_reset(); break; case KEY_DEBUGGED+KEY_P: if (Game_suspended & SUSP_ROBOTS) Game_suspended &= ~SUSP_ROBOTS; //robots move else Game_suspended |= SUSP_ROBOTS; //robots don't move break; case KEY_DEBUGGED+KEY_K: Players[Player_num].shields = 1; break; // a virtual kill case KEY_DEBUGGED+KEY_SHIFTED + KEY_K: Players[Player_num].shields = -1; break; // an actual kill case KEY_DEBUGGED+KEY_X: Players[Player_num].lives++; break; // Extra life cheat key. case KEY_DEBUGGED+KEY_H: if (Player_is_dead) return 0; Players[Player_num].flags ^= PLAYER_FLAGS_CLOAKED; if (Players[Player_num].flags & PLAYER_FLAGS_CLOAKED) { #ifdef NETWORK if (Game_mode & GM_MULTI) multi_send_cloak(); #endif ai_do_cloak_stuff(); Players[Player_num].cloak_time = GameTime64; } break; case KEY_DEBUGGED+KEY_R: cheats.robotfiringsuspended = !cheats.robotfiringsuspended; break; #ifdef EDITOR //editor-specific functions case KEY_E + KEY_DEBUGGED: window_set_visible(Game_wind, 0); // don't let the game do anything while we set the editor up init_editor(); window_close(Game_wind); break; case KEY_C + KEY_SHIFTED + KEY_DEBUGGED: if (!Player_is_dead && !( Game_mode & GM_MULTI )) move_player_2_segment(Cursegp,Curside); break; //move eye to curseg case KEY_DEBUGGED+KEY_W: draw_world_from_game(); break; #endif //#ifdef EDITOR case KEY_DEBUGGED+KEY_LAPOSTRO: Show_view_text_timer = 0x30000; object_goto_next_viewer(); break; case KEY_DEBUGGED+KEY_SHIFTED+KEY_LAPOSTRO: Viewer=ConsoleObject; break; case KEY_DEBUGGED+KEY_O: toggle_outline_mode(); break; case KEY_DEBUGGED+KEY_T: *Toggle_var = !*Toggle_var; break; case KEY_DEBUGGED + KEY_L: if (++Lighting_on >= 2) Lighting_on = 0; break; case KEY_DEBUGGED + KEY_SHIFTED + KEY_L: Beam_brightness=0x38000-Beam_brightness; break; case KEY_PAD5: slew_stop(); break; #ifndef NDEBUG case KEY_DEBUGGED + KEY_F11: play_test_sound(); break; case KEY_DEBUGGED + KEY_SHIFTED+KEY_F11: advance_sound(); play_test_sound(); break; #endif case KEY_DEBUGGED + KEY_M: Debug_spew = !Debug_spew; if (Debug_spew) { HUD_init_message_literal(HM_DEFAULT, "Debug Spew: ON" ); } else { HUD_init_message_literal(HM_DEFAULT, "Debug Spew: OFF" ); } break; case KEY_DEBUGGED + KEY_C: do_cheat_menu(); break; case KEY_DEBUGGED + KEY_SHIFTED + KEY_A: do_megawow_powerup(10); break; case KEY_DEBUGGED + KEY_A: { do_megawow_powerup(200); break; } case KEY_DEBUGGED+KEY_SPACEBAR: //KEY_F7: // Toggle physics flying slew_stop(); game_flush_inputs(); if ( ConsoleObject->control_type != CT_FLYING ) { fly_init(ConsoleObject); Game_suspended &= ~SUSP_ROBOTS; //robots move } else { slew_init(ConsoleObject); //start player slewing Game_suspended |= SUSP_ROBOTS; //robots don't move } break; case KEY_DEBUGGED+KEY_COMMA: Render_zoom = fixmul(Render_zoom,62259); break; case KEY_DEBUGGED+KEY_PERIOD: Render_zoom = fixmul(Render_zoom,68985); break; #ifndef NDEBUG case KEY_DEBUGGED+KEY_D: if ((GameArg.DbgUseDoubleBuffer = !GameArg.DbgUseDoubleBuffer)!=0) init_cockpit(); break; #endif #ifdef EDITOR case KEY_DEBUGGED+KEY_Q: stop_time(); dump_used_textures_all(); start_time(); break; #endif case KEY_DEBUGGED+KEY_B: { newmenu_item m; char text[FILENAME_LEN]=""; int item; m.type=NM_TYPE_INPUT; m.text_len = FILENAME_LEN; m.text = text; item = newmenu_do( NULL, "Briefing to play?", 1, &m, NULL, NULL ); if (item != -1) { do_briefing_screens(text,1); } break; } case KEY_DEBUGGED+KEY_SHIFTED+KEY_B: if (Player_is_dead) return 0; kill_and_so_forth(); break; case KEY_DEBUGGED+KEY_G: GameTime64 = (0x7fffffffffffffffLL) - (F1_0*10); HUD_init_message(HM_DEFAULT, "GameTime %li - Reset in 10 seconds!", GameTime64); break; default: return 0; break; } return 1; }
// 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; }