//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; }
// ------------------------------------------------------------------------------------ // Select a weapon, primary or secondary. void do_weapon_select(int weapon_num, int secondary_flag) { int weapon_num_save=weapon_num; int weapon_status,current,has_flag; ubyte last_was_super; if (!secondary_flag) { current = Primary_weapon; last_was_super = Primary_last_was_super[weapon_num]; has_flag = HAS_WEAPON_FLAG; } else { current = Secondary_weapon; last_was_super = Secondary_last_was_super[weapon_num]; has_flag = HAS_WEAPON_FLAG+HAS_AMMO_FLAG; } if (current == weapon_num || current == weapon_num+SUPER_WEAPON) { //already have this selected, so toggle to other of normal/super version weapon_num += weapon_num+SUPER_WEAPON - current; weapon_status = player_has_weapon(weapon_num, secondary_flag); } else { //go to last-select version of requested missile if (last_was_super) weapon_num += SUPER_WEAPON; weapon_status = player_has_weapon(weapon_num, secondary_flag); //if don't have last-selected, try other version if ((weapon_status & has_flag) != has_flag) { weapon_num = 2*weapon_num_save+SUPER_WEAPON - weapon_num; weapon_status = player_has_weapon(weapon_num, secondary_flag); if ((weapon_status & has_flag) != has_flag) weapon_num = 2*weapon_num_save+SUPER_WEAPON - weapon_num; } } //if we don't have the weapon we're switching to, give error & bail if ((weapon_status & has_flag) != has_flag) { if (!secondary_flag) { if (weapon_num==SUPER_LASER_INDEX) return; //no such thing as super laser, so no error HUD_init_message(HM_DEFAULT, "%s %s!", TXT_DONT_HAVE, PRIMARY_WEAPON_NAMES(weapon_num)); } else HUD_init_message(HM_DEFAULT, "%s %s%s",TXT_HAVE_NO, SECONDARY_WEAPON_NAMES(weapon_num), TXT_SX); digi_play_sample( SOUND_BAD_SELECTION, F1_0 ); return; } //now actually select the weapon select_weapon(weapon_num, secondary_flag, 1, 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 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; }
void DropCurrentWeapon () { int ammo=0,seed; objnum_t objnum; if (num_objects >= MAX_USED_OBJECTS) return; if (Primary_weapon==0) { HUD_init_message(HM_DEFAULT, "You cannot drop your base weapon!"); return; } HUD_init_message(HM_DEFAULT, "%s dropped!",PRIMARY_WEAPON_NAMES(Primary_weapon)); digi_play_sample (SOUND_DROP_WEAPON,F1_0); seed = d_rand(); objnum = spit_powerup(ConsoleObject,Primary_weapon_to_powerup[Primary_weapon],seed); if (objnum==object_none) return; if (Primary_weapon == VULCAN_INDEX || Primary_weapon == GAUSS_INDEX) { //if it's one of these, drop some ammo with the weapon ammo = Players[Player_num].primary_ammo[VULCAN_INDEX]; if ((Players[Player_num].primary_weapon_flags & HAS_FLAG(VULCAN_INDEX)) && (Players[Player_num].primary_weapon_flags & HAS_FLAG(GAUSS_INDEX))) ammo /= 2; //if both vulcan & gauss, drop half Players[Player_num].primary_ammo[VULCAN_INDEX] -= ammo; if (objnum!=object_none) Objects[objnum].ctype.powerup_info.count = ammo; } if (Primary_weapon == OMEGA_INDEX) { //dropped weapon has current energy if (objnum!=object_none) Objects[objnum].ctype.powerup_info.count = Omega_charge; } #ifdef NETWORK if ((Game_mode & GM_MULTI) && objnum!=object_none) multi_send_drop_weapon(objnum,seed); #endif Players[Player_num].primary_weapon_flags &= (~(1<<Primary_weapon)); auto_select_weapon (0); }
int state_save_all(int between_levels) { char filename[128], desc[DESC_LENGTH+1]; if ( Game_mode & GM_MULTI ) { #ifdef MULTI_SAVE if ( FindArg( "-multisave" ) ) multi_initiate_save_game(); else #endif HUD_init_message( "Can't save in a multiplayer game!" ); return 0; } mprintf(( 0, "CL=%d, NL=%d\n", Current_level_num, Next_level_num )); stop_time(); if (!state_get_save_file(filename,desc,0)) { start_time(); return 0; } return state_save_all_sub(filename, desc, between_levels); }
void save_screen_shot(int automap_flag) { static int savenum=0; char savename[13+sizeof(SCRNS_DIR)]; unsigned char *buf; if (!GameArg.DbgGlReadPixelsOk){ if (!automap_flag) HUD_init_message_literal(HM_DEFAULT, "glReadPixels not supported on your configuration"); return; } stop_time(); if (!PHYSFSX_exists(SCRNS_DIR,0)) PHYSFS_mkdir(SCRNS_DIR); //try making directory do { sprintf(savename, "%sscrn%04d.tga",SCRNS_DIR, savenum++); } while (PHYSFSX_exists(savename,0)); if (!automap_flag) HUD_init_message(HM_DEFAULT, "%s 'scrn%04d.tga'", TXT_DUMPING_SCREEN, savenum-1 ); #ifndef OGLES glReadBuffer(GL_FRONT); #endif buf = d_malloc(grd_curscreen->sc_w*grd_curscreen->sc_h*3); write_bmp(savename,grd_curscreen->sc_w,grd_curscreen->sc_h,buf); d_free(buf); start_time(); }
void transfer_energy_to_shield() { fix e; //how much energy gets transfered static fix64 last_play_time=0; e = min(min(FrameTime*CONVERTER_RATE,Players[Player_num].energy - INITIAL_ENERGY),(MAX_SHIELDS-Players[Player_num].shields)*CONVERTER_SCALE); if (e <= 0) { if (Players[Player_num].energy <= INITIAL_ENERGY) { HUD_init_message(HM_DEFAULT, "Need more than %i energy to enable transfer", f2i(INITIAL_ENERGY)); } else if (Players[Player_num].shields >= MAX_SHIELDS) { HUD_init_message_literal(HM_DEFAULT, "No transfer: Shields already at max"); } return; } Players[Player_num].energy -= e; Players[Player_num].shields += e/CONVERTER_SCALE; if (last_play_time > GameTime64) last_play_time = 0; if (GameTime64 > last_play_time+CONVERTER_SOUND_DELAY) { digi_play_sample_once(SOUND_CONVERT_ENERGY, F1_0); last_play_time = GameTime64; } }
//------------- 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(HM_DEFAULT, TXT_HOSTAGE_RESCUED); }
//------------- Called once when a hostage is rescued ------------------------------------------ void hostage_rescue() { //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); }
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; }
// Play tracks from Jukebox directory. Play track specified in GameCfg.CMLevelMusicTrack[0] and loop depending on GameCfg.CMLevelMusicPlayOrder int jukebox_play() { const char *music_filename; uint_fast32_t size_full_filename = 0; if (!JukeboxSongs.list) return 0; if (CGameCfg.CMLevelMusicTrack[0] < 0 || CGameCfg.CMLevelMusicTrack[0] + 1 > CGameCfg.CMLevelMusicTrack[1]) return 0; music_filename = JukeboxSongs.list[CGameCfg.CMLevelMusicTrack[0]]; if (!music_filename) return 0; size_t size_music_filename = strlen(music_filename); auto &cfgpath = CGameCfg.CMLevelMusicPath; size_t musiclen = strlen(cfgpath.data()); size_full_filename = musiclen + size_music_filename + 1; RAIIdmem<char[]> full_filename; CALLOC(full_filename, char[], size_full_filename); const char *LevelMusicPath; if (musiclen > 4 && !d_stricmp(&cfgpath[musiclen - 4], ".m3u")) // if it's from an M3U playlist LevelMusicPath = ""; else // if it's from a specified path LevelMusicPath = cfgpath.data(); snprintf(full_filename.get(), size_full_filename, "%s%s", LevelMusicPath, music_filename); int played = songs_play_file(full_filename.get(), (GameCfg.CMLevelMusicPlayOrder == MUSIC_CM_PLAYORDER_LEVEL ? 1 : 0), (GameCfg.CMLevelMusicPlayOrder == MUSIC_CM_PLAYORDER_LEVEL ? nullptr : jukebox_hook_next)); full_filename.reset(); if (!played) { return 0; // whoops, got an error } // Formatting a pretty message const char *prefix = "..."; if (size_music_filename >= MUSIC_HUDMSG_MAXLEN) { music_filename += size_music_filename - MUSIC_HUDMSG_MAXLEN; } else { prefix += 3; } HUD_init_message(HM_DEFAULT, "%s %s%s", JUKEBOX_HUDMSG_PLAYING, prefix, music_filename); return 1; }
int pick_up_vulcan_ammo(void) { int used=0; int pwsave = Primary_weapon; // Ugh, save selected primary weapon around the picking up of the ammo. I apologize for this code. Matthew A. Toschlog if (pick_up_ammo(CLASS_PRIMARY, VULCAN_INDEX, VULCAN_AMMO_AMOUNT)) { powerup_basic(7, 14, 21, VULCAN_AMMO_SCORE, "%s!", TXT_VULCAN_AMMO); used = 1; } else { HUD_init_message("%s %d %s!",TXT_ALREADY_HAVE,f2i(VULCAN_AMMO_SCALE * Primary_ammo_max[VULCAN_INDEX]),TXT_VULCAN_ROUNDS); used = 0; } Primary_weapon = pwsave; return used; }
static int pick_up_vulcan_ammo(void) { int used=0,max; int pwsave = Primary_weapon; // Ugh, save selected primary weapon around the picking up of the ammo. I apologize for this code. Matthew A. Toschlog max = CURRENT_VULCAN_AMMO_CAPACITY(Player_num); if (pick_up_ammo(CLASS_PRIMARY, VULCAN_INDEX, VULCAN_AMMO_AMOUNT)) { powerup_basic(7, 14, 21, VULCAN_AMMO_SCORE, "%s (ammo=%i/%i)!", TXT_VULCAN_AMMO, PRINTABLE_VULCAN_AMMO(Players[Player_num].primary_ammo[1]), PRINTABLE_VULCAN_AMMO(max)); used = 1; } else { HUD_init_message(HM_DEFAULT|HM_REDUNDANT|HM_MAYDUPL, "%s %d %s!",TXT_ALREADY_HAVE,PRINTABLE_VULCAN_AMMO(max),TXT_VULCAN_ROUNDS); used = 0; } Primary_weapon = pwsave; return used; }
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); }
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 state_restore_all(int in_game) { char filename[128]; if ( Game_mode & GM_MULTI ) { #ifdef MULTI_SAVE if ( FindArg( "-multisave" ) ) multi_initiate_restore_game(); else #endif HUD_init_message( "Can't restore in a multiplayer game!" ); return 0; } if ( Newdemo_state == ND_STATE_RECORDING ) newdemo_stop_recording(); if ( Newdemo_state != ND_STATE_NORMAL ) return 0; stop_time(); if (!state_get_restore_file(filename,0)) { start_time(); return 0; } if ( in_game ) { int choice; choice = nm_messagebox( NULL, 2, "Yes", "No", "Restore Game?" ); if ( choice != 0 ) { start_time(); return 0; } } start_time(); return state_restore_all_sub(filename, 0); }
//------------- 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 }
int HandleDemoKey(int key) { switch (key) { KEY_MAC(case KEY_COMMAND+KEY_1:) case KEY_F1: show_newdemo_help(); break; KEY_MAC(case KEY_COMMAND+KEY_2:) case KEY_F2: do_options_menu(); break; KEY_MAC(case KEY_COMMAND+KEY_3:) case KEY_F3: if (Viewer->type == OBJ_PLAYER) toggle_cockpit(); break; KEY_MAC(case KEY_COMMAND+KEY_4:) case KEY_F4: Newdemo_show_percentage = !Newdemo_show_percentage; break; case KEY_F6: Show_network_stats = ! Show_network_stats; break; KEY_MAC(case KEY_COMMAND+KEY_7:) case KEY_F7: #ifdef NETWORK Show_kill_list = (Show_kill_list+1) % ((Newdemo_game_mode & GM_TEAM) ? 4 : 3); #endif break; case KEY_ESC: if (GameArg.SysAutoDemo) { int choice; choice = nm_messagebox( NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_AUTODEMO ); if (choice == 0) GameArg.SysAutoDemo = 0; else break; } newdemo_stop_playback(); break; case KEY_UP: Newdemo_vcr_state = ND_STATE_PLAYBACK; break; case KEY_DOWN: Newdemo_vcr_state = ND_STATE_PAUSED; break; case KEY_LEFT: newdemo_single_frame_time = GameTime64; Newdemo_vcr_state = ND_STATE_ONEFRAMEBACKWARD; break; case KEY_RIGHT: newdemo_single_frame_time = GameTime64; Newdemo_vcr_state = ND_STATE_ONEFRAMEFORWARD; break; case KEY_CTRLED + KEY_RIGHT: newdemo_goto_end(0); break; case KEY_CTRLED + KEY_LEFT: newdemo_goto_beginning(); break; KEY_MAC(case KEY_COMMAND+KEY_P:) case KEY_PAUSE: do_game_pause(); break; #ifdef macintosh case KEY_COMMAND + KEY_SHIFTED + KEY_3: #endif case KEY_PRINT_SCREEN: { if (PlayerCfg.PRShot) { gr_set_current_canvas(NULL); render_frame(0, 0); //gr_set_curfont(MEDIUM2_FONT); //gr_printf(SWIDTH-FSPACX(92),SHEIGHT-LINE_SPACING,"DXX-Rebirth\n"); gr_flip(); save_screen_shot(0); } else { int old_state; old_state = Newdemo_show_percentage; Newdemo_show_percentage = 0; game_render_frame_mono(0); if (GameArg.DbgUseDoubleBuffer) gr_flip(); save_screen_shot(0); Newdemo_show_percentage = old_state; } break; } #ifndef NDEBUG case KEY_DEBUGGED + KEY_I: Newdemo_do_interpolate = !Newdemo_do_interpolate; HUD_init_message(HM_DEFAULT, "Demo playback interpolation %s", Newdemo_do_interpolate?"ON":"OFF"); break; case KEY_DEBUGGED + KEY_K: { int how_many, c; char filename[FILENAME_LEN], num[16]; newmenu_item m[6]; filename[0] = '\0'; m[ 0].type = NM_TYPE_TEXT; m[ 0].text = "output file name"; m[ 1].type = NM_TYPE_INPUT;m[ 1].text_len = 8; m[1].text = filename; c = newmenu_do( NULL, NULL, 2, m, NULL, NULL ); if (c == -2) break; strcat(filename, DEMO_EXT); num[0] = '\0'; m[ 0].type = NM_TYPE_TEXT; m[ 0].text = "strip how many bytes"; m[ 1].type = NM_TYPE_INPUT;m[ 1].text_len = 16; m[1].text = num; c = newmenu_do( NULL, NULL, 2, m, NULL, NULL ); if (c == -2) break; how_many = atoi(num); if (how_many <= 0) break; newdemo_strip_frames(filename, how_many); break; } #endif default: return 0; } return 1; }
void do_weapon_n_item_stuff() { int i; if (Controls.fire_flare_count > 0) { Controls.fire_flare_count = 0; if (allowed_to_fire_flare()) Flare_create(ConsoleObject); } //Turkey Begin if (!((Game_mode & GM_MULTI) && (Game_mode & GM_TURKEY) && get_team(Player_num))) { //Turkey End if (allowed_to_fire_missile() && Controls.fire_secondary_state) Global_missile_firing_count += Weapon_info[Secondary_weapon_to_weapon_info[Secondary_weapon]].fire_count; if (Global_missile_firing_count) { do_missile_firing(0); Global_missile_firing_count--; } if (Controls.cycle_primary_count > 0) { for (i=0;i<Controls.cycle_primary_count;i++) CyclePrimary (); Controls.cycle_primary_count = 0; } if (Controls.cycle_secondary_count > 0) { for (i=0;i<Controls.cycle_secondary_count;i++) CycleSecondary (); Controls.cycle_secondary_count = 0; } if (Controls.select_weapon_count > 0) { Controls.select_weapon_count--; do_weapon_select(Controls.select_weapon_count>4?Controls.select_weapon_count-5:Controls.select_weapon_count,Controls.select_weapon_count>4?1:0); Controls.select_weapon_count = 0; } if (Controls.headlight_count > 0) { for (i=0;i<Controls.headlight_count;i++) toggle_headlight_active (); Controls.headlight_count = 0; } if (Global_missile_firing_count < 0) Global_missile_firing_count = 0; //Turkey Begin //should we allow turkey to poop? } //Turkey End // Drop proximity bombs. while (Controls.drop_bomb_count > 0) { do_missile_firing(1); Controls.drop_bomb_count--; } if (Controls.toggle_bomb_count > 0) { int bomb = Secondary_last_was_super[PROXIMITY_INDEX]?PROXIMITY_INDEX:SMART_MINE_INDEX; if (!Players[Player_num].secondary_ammo[PROXIMITY_INDEX] && !Players[Player_num].secondary_ammo[SMART_MINE_INDEX]) { digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 ); HUD_init_message_literal(HM_DEFAULT, "No bombs available!"); } else { if (Players[Player_num].secondary_ammo[bomb]==0) { digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 ); HUD_init_message(HM_DEFAULT, "No %s available!",(bomb==SMART_MINE_INDEX)?"Smart mines":"Proximity bombs"); } else { Secondary_last_was_super[PROXIMITY_INDEX]=!Secondary_last_was_super[PROXIMITY_INDEX]; digi_play_sample_once( SOUND_GOOD_SELECTION_SECONDARY, F1_0 ); } } Controls.toggle_bomb_count = 0; } //Turkey Begin //or maybe we shouldnt allow turkey to poop //} //Turkey End if (Controls.energy_to_shield_state && (Players[Player_num].flags & PLAYER_FLAGS_CONVERTER)) transfer_energy_to_shield(); }
// 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; }
// 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; }
void DropSecondaryWeapon () { objnum_t objnum; int seed; ubyte weapon_drop_id=(ubyte)-1; ushort sub_ammo=0; if (num_objects >= MAX_USED_OBJECTS) return; if (Players[Player_num].secondary_ammo[Secondary_weapon] ==0) { HUD_init_message(HM_DEFAULT, "No secondary weapon to drop!"); return; } weapon_drop_id = Secondary_weapon_to_powerup[Secondary_weapon]; // see if we drop single or 4-pack switch (Secondary_weapon_to_powerup[Secondary_weapon]) { case POW_MISSILE_1: case POW_HOMING_AMMO_1: case POW_SMISSILE1_1: case POW_GUIDED_MISSILE_1: case POW_MERCURY_MISSILE_1: if (Players[Player_num].secondary_ammo[Secondary_weapon]%4) { sub_ammo = 1; } else { sub_ammo = 4; weapon_drop_id++; //4-pack always is next index } break; case POW_PROXIMITY_WEAPON: case POW_SMART_MINE: if (Players[Player_num].secondary_ammo[Secondary_weapon]<4) { HUD_init_message(HM_DEFAULT, "You need at least 4 to drop!"); return; } else { sub_ammo = 4; } break; case POW_SMARTBOMB_WEAPON: case POW_MEGA_WEAPON: case POW_EARTHSHAKER_MISSILE: sub_ammo = 1; break; } HUD_init_message(HM_DEFAULT, "%s dropped!",SECONDARY_WEAPON_NAMES(Secondary_weapon)); digi_play_sample (SOUND_DROP_WEAPON,F1_0); seed = d_rand(); objnum = spit_powerup(ConsoleObject,weapon_drop_id,seed); if (objnum==object_none) return; #ifdef NETWORK if ((Game_mode & GM_MULTI) && objnum!=object_none) multi_send_drop_weapon(objnum,seed); #endif Players[Player_num].secondary_ammo[Secondary_weapon]-=sub_ammo; if (Players[Player_num].secondary_ammo[Secondary_weapon]==0) { Players[Player_num].secondary_weapon_flags &= (~(1<<Secondary_weapon)); auto_select_weapon (1); } }
// ------------------------------------------------------------------------------------ //if message flag set, print message saying selected void select_weapon(int weapon_num, int secondary_flag, int print_message, int wait_for_rearm) { const char *weapon_name; if (Newdemo_state==ND_STATE_RECORDING ) newdemo_record_player_weapon(secondary_flag, weapon_num); if (!secondary_flag) { if (Primary_weapon != weapon_num) { #ifndef FUSION_KEEPS_CHARGE //added 8/6/98 by Victor Rachels to fix fusion charge bug Fusion_charge=0; //end edit - Victor Rachels #endif if (wait_for_rearm) digi_play_sample_once( SOUND_GOOD_SELECTION_PRIMARY, F1_0 ); #ifdef NETWORK if (Game_mode & GM_MULTI) { if (wait_for_rearm) multi_send_play_sound(SOUND_GOOD_SELECTION_PRIMARY, F1_0); } #endif if (wait_for_rearm) Next_laser_fire_time = GameTime64 + REARM_TIME; else Next_laser_fire_time = 0; Global_laser_firing_count = 0; } Primary_weapon = weapon_num; weapon_name = PRIMARY_WEAPON_NAMES(weapon_num); //save flag for whether was super version Primary_last_was_super[weapon_num % SUPER_WEAPON] = (weapon_num >= SUPER_WEAPON); } else { if (Secondary_weapon != weapon_num) { if (wait_for_rearm) digi_play_sample_once( SOUND_GOOD_SELECTION_SECONDARY, F1_0 ); #ifdef NETWORK if (Game_mode & GM_MULTI) { if (wait_for_rearm) multi_send_play_sound(SOUND_GOOD_SELECTION_PRIMARY, F1_0); } #endif if (wait_for_rearm) Next_missile_fire_time = GameTime64 + REARM_TIME; else Next_missile_fire_time = 0; Global_missile_firing_count = 0; } else { if (wait_for_rearm) { digi_play_sample_once( SOUND_ALREADY_SELECTED, F1_0 ); } } Secondary_weapon = weapon_num; weapon_name = SECONDARY_WEAPON_NAMES(weapon_num); //save flag for whether was super version Secondary_last_was_super[weapon_num % SUPER_WEAPON] = (weapon_num >= SUPER_WEAPON); } if (print_message) { const player *const plr = &Players[Player_num]; if (weapon_num == LASER_INDEX && !secondary_flag) HUD_init_message(HM_DEFAULT, "%s Level %d selected (energy=%i)!", weapon_name, plr->laser_level+1, f2i(plr->energy)); else if (!secondary_flag && (weapon_num == 1 || weapon_num == 6)) HUD_init_message(HM_DEFAULT, "%s selected (ammo=%i/%i)!", weapon_name, PRINTABLE_VULCAN_AMMO(plr->primary_ammo[1]), PRINTABLE_VULCAN_AMMO(CURRENT_VULCAN_AMMO_CAPACITY(Player_num))); else if (!secondary_flag) HUD_init_message(HM_DEFAULT, "%s selected (energy=%i)!", weapon_name, f2i(plr->energy)); else HUD_init_message(HM_DEFAULT, "%s selected (count=%i)!", weapon_name, plr->secondary_ammo[weapon_num]); } }
// ---------------------------------------------------------------------------------------- // 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; } } } } }
start_endlevel_sequence() { int last_segnum,exit_side,tunnel_length; if (Newdemo_state == ND_STATE_RECORDING) // stop demo recording Newdemo_state = ND_STATE_PAUSED; if (Newdemo_state == ND_STATE_PLAYBACK) // don't do this if in playback mode return; if (Player_is_dead || ConsoleObject->flags&OF_SHOULD_BE_DEAD) return; //don't start if dead! Players[Player_num].homing_object_dist = -F1_0; // Turn off homing sound. reset_rear_view(); //turn off rear view if set if (!endlevel_data_loaded) { #ifdef NETWORK if (Game_mode & GM_MULTI) { multi_send_endlevel_start(0); #ifdef NETWORK network_do_frame(1, 1); #endif } #endif gr_palette_fade_out(gr_palette, 32, 0); PlayerFinishedLevel(0); //don't do special sequence return; } { int segnum,old_segnum,entry_side,i; //count segments in exit tunnel old_segnum = ConsoleObject->segnum; exit_side = find_exit_side(ConsoleObject); segnum = Segments[old_segnum].children[exit_side]; tunnel_length = 0; do { entry_side = matt_find_connect_side(segnum,old_segnum); exit_side = Side_opposite[entry_side]; old_segnum = segnum; segnum = Segments[segnum].children[exit_side]; tunnel_length++; } while (segnum >= 0); if (segnum != -2) { PlayerFinishedLevel(0); //don't do special sequence return; } last_segnum = old_segnum; //now pick transition segnum 1/3 of the way in old_segnum = ConsoleObject->segnum; exit_side = find_exit_side(ConsoleObject); segnum = Segments[old_segnum].children[exit_side]; i=tunnel_length/3; while (i--) { entry_side = matt_find_connect_side(segnum,old_segnum); exit_side = Side_opposite[entry_side]; old_segnum = segnum; segnum = Segments[segnum].children[exit_side]; } transition_segnum = segnum; } Assert(last_segnum == exit_segnum); cockpit_mode_save = Cockpit_mode; #ifdef NETWORK if (Game_mode & GM_MULTI) { multi_send_endlevel_start(0); network_do_frame(1, 1); } #endif songs_play_song( SONG_ENDLEVEL, 0 ); Endlevel_sequence = EL_FLYTHROUGH; ConsoleObject->movement_type = MT_NONE; //movement handled by flythrough ConsoleObject->control_type = CT_NONE; Game_suspended |= SUSP_ROBOTS; //robots don't move cur_fly_speed = desired_fly_speed = FLY_SPEED; start_endlevel_flythrough(0,ConsoleObject,cur_fly_speed); //initialize HUD_init_message( TXT_EXIT_SEQUENCE ); outside_mine = ext_expl_playing = 0; flash_scale = f1_0; //init_endlevel(); mine_destroyed=0; }
// ----------------------------------------------------------------------------------- // blind_save means don't prompt user for any info. int state_save_all(int between_levels, int secret_save, char *filename_override, int blind_save) { int rval, filenum = -1; char filename[128], desc[DESC_LENGTH+1]; Assert(between_levels == 0); //between levels save ripped out #ifdef NETWORK if ( Game_mode & GM_MULTI ) { multi_initiate_save_game(); return 0; } #endif if ((Current_level_num < 0) && (secret_save == 0)) { HUD_init_message( "Can't save in secret level!" ); return 0; } if (Final_boss_is_dead) //don't allow save while final boss is dying return 0; mprintf(( 0, "CL=%d, NL=%d\n", Current_level_num, Next_level_num )); // If this is a secret save and the control center has been destroyed, don't allow // return to the base level. if (secret_save && (Control_center_destroyed)) { mprintf((0, "Deleting secret.sgb so player can't return to base level.\n")); PHYSFS_delete(PLAYER_DIR "secret.sgb"); return 0; } stop_time(); if (secret_save == 1) { filename_override = filename; sprintf(filename_override, PLAYER_DIR "secret.sgb"); } else if (secret_save == 2) { filename_override = filename; sprintf(filename_override, PLAYER_DIR "secret.sgc"); } else { if (filename_override) { strcpy( filename, filename_override); sprintf(desc, "[autosave backup]"); } else if (!(filenum = state_get_save_file(filename, desc, 0, blind_save))) { start_time(); return 0; } } // MK, 1/1/96 // If not in multiplayer, do special secret level stuff. // If secret.sgc exists, then copy it to Nsecret.sgc (where N = filenum). // If it doesn't exist, then delete Nsecret.sgc if (!secret_save && !(Game_mode & GM_MULTI)) { int rval; char temp_fname[32], fc; if (filenum != -1) { if (filenum >= 10) fc = (filenum-10) + 'a'; else fc = '0' + filenum; sprintf(temp_fname, PLAYER_DIR "%csecret.sgc", fc); mprintf((0, "Trying to copy secret.sgc to %s.\n", temp_fname)); if (PHYSFS_exists(temp_fname)) { mprintf((0, "Deleting file %s\n", temp_fname)); if (!PHYSFS_delete(temp_fname)) Error("Cannot delete file <%s>: %s", temp_fname, PHYSFS_getLastError()); } if (PHYSFS_exists(PLAYER_DIR "secret.sgc")) { mprintf((0, "Copying secret.sgc to %s.\n", temp_fname)); rval = copy_file(PLAYER_DIR "secret.sgc", temp_fname); Assert(rval == 0); // Oops, error copying secret.sgc to temp_fname! } } } // Save file we're going to save over in last slot and call "[autosave backup]" if (!filename_override) { PHYSFS_file *tfp; tfp = PHYSFSX_openWriteBuffered(filename); if ( tfp ) { char newname[128]; sprintf( newname, PLAYER_DIR "%s.sg%x", Players[Player_num].callsign, NUM_SAVES ); PHYSFS_seek(tfp, DESC_OFFSET); PHYSFS_write(tfp, "[autosave backup]", sizeof(char) * DESC_LENGTH, 1); PHYSFS_close(tfp); PHYSFS_delete(newname); PHYSFSX_rename(filename, newname); } } rval = state_save_all_sub(filename, desc, between_levels); if (rval && !secret_save) HUD_init_message("Game saved."); return rval; }
//----------------------------------------------------------------- // Determines what happens when a wall is shot //returns info about wall. see wall.h for codes //obj is the object that hit...either a weapon or the player himself //playernum is the number the player who hit the wall or fired the weapon, //or -1 if a robot fired the weapon int wall_hit_process(segment *seg, int side, fix damage, int playernum, object *obj ) { wall *w; fix show_message; Assert (seg-Segments != -1); // If it is not a "wall" then just return. if ( seg->sides[side].wall_num < 0 ) return WHP_NOT_SPECIAL; w = &Walls[seg->sides[side].wall_num]; if ( Newdemo_state == ND_STATE_RECORDING ) newdemo_record_wall_hit_process( seg-Segments, side, damage, playernum ); if (w->type == WALL_BLASTABLE) { if (obj->ctype.laser_info.parent_type == OBJ_PLAYER) wall_damage(seg, side, damage); return WHP_BLASTABLE; } if (playernum != Player_num) //return if was robot fire return WHP_NOT_SPECIAL; Assert( playernum > -1 ); // Determine whether player is moving forward. If not, don't say negative // messages because he probably didn't intentionally hit the door. if (obj->type == OBJ_PLAYER) show_message = (vm_vec_dot(&obj->orient.fvec, &obj->mtype.phys_info.velocity) > 0); else if (obj->type == OBJ_ROBOT) show_message = 0; else if ((obj->type == OBJ_WEAPON) && (obj->ctype.laser_info.parent_type == OBJ_ROBOT)) show_message = 0; else show_message = 1; if (w->keys == KEY_BLUE) if (!(Players[playernum].flags & PLAYER_FLAGS_BLUE_KEY)) { if ( playernum==Player_num ) if (show_message) HUD_init_message("%s %s",TXT_BLUE,TXT_ACCESS_DENIED); return WHP_NO_KEY; } if (w->keys == KEY_RED) if (!(Players[playernum].flags & PLAYER_FLAGS_RED_KEY)) { if ( playernum==Player_num ) if (show_message) HUD_init_message("%s %s",TXT_RED,TXT_ACCESS_DENIED); return WHP_NO_KEY; } if (w->keys == KEY_GOLD) if (!(Players[playernum].flags & PLAYER_FLAGS_GOLD_KEY)) { if ( playernum==Player_num ) if (show_message) HUD_init_message("%s %s",TXT_YELLOW,TXT_ACCESS_DENIED); return WHP_NO_KEY; } if (w->type == WALL_DOOR) { if ((w->flags & WALL_DOOR_LOCKED ) && !(special_boss_opening_allowed(seg-Segments, side)) ) { if ( playernum==Player_num ) if (show_message) HUD_init_message(TXT_CANT_OPEN_DOOR); return WHP_NO_KEY; } else { if (w->state != WALL_DOOR_OPENING) { wall_open_door(seg, side); #ifdef NETWORK if (Game_mode & GM_MULTI) multi_send_door_open(seg-Segments, side,w->flags); #endif } return WHP_DOOR; } } return WHP_NOT_SPECIAL; //default is treat like normal wall }
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; }
// ----------------------------------------------------------------------------------- int state_restore_all(int in_game, int secret_restore, char *filename_override) { char filename[128]; int filenum = -1; #ifdef NETWORK if ( Game_mode & GM_MULTI ) { #ifdef MULTI_SAVE multi_initiate_restore_game(); #endif return 0; } #endif if (in_game && (Current_level_num < 0) && (secret_restore == 0)) { HUD_init_message( "Can't restore in secret level!" ); return 0; } if ( Newdemo_state == ND_STATE_RECORDING ) newdemo_stop_recording(); if ( Newdemo_state != ND_STATE_NORMAL ) return 0; stop_time(); if (filename_override) { strcpy(filename, filename_override); filenum = NUM_SAVES+1; // So we don't trigger autosave } else if (!(filenum = state_get_restore_file(filename, 0))) { start_time(); return 0; } // MK, 1/1/96 // If not in multiplayer, do special secret level stuff. // If Nsecret.sgc (where N = filenum) exists, then copy it to secret.sgc. // If it doesn't exist, then delete secret.sgc if (!secret_restore && !(Game_mode & GM_MULTI)) { int rval; char temp_fname[32], fc; if (filenum != -1) { if (filenum >= 10) fc = (filenum-10) + 'a'; else fc = '0' + filenum; sprintf(temp_fname, PLAYER_DIR "%csecret.sgc", fc); mprintf((0, "Trying to copy %s to secret.sgc.\n", temp_fname)); if (PHYSFS_exists(temp_fname)) { mprintf((0, "Copying %s to secret.sgc\n", temp_fname)); rval = copy_file(temp_fname, PLAYER_DIR "secret.sgc"); Assert(rval == 0); // Oops, error copying temp_fname to secret.sgc! } else PHYSFS_delete(PLAYER_DIR "secret.sgc"); } } // Changed, 11/15/95, MK, don't to autosave if restoring from main menu. if ((filenum != (NUM_SAVES+1)) && in_game) { char temp_filename[128]; mprintf((0, "Doing autosave, filenum = %i, != %i!\n", filenum, NUM_SAVES+1)); sprintf( temp_filename, PLAYER_DIR "%s.sg%x", Players[Player_num].callsign, NUM_SAVES ); state_save_all(!in_game, secret_restore, temp_filename, 0); } if ( !secret_restore && in_game ) { int choice; choice = nm_messagebox( NULL, 2, "Yes", "No", "Restore Game?" ); if ( choice != 0 ) { start_time(); return 0; } } start_time(); return state_restore_all_sub(filename, 0, secret_restore); }