//called when the player is starting a new level for normal game model StartNewLevel(int level_num) { if (!(Game_mode & GM_MULTI)) { do_briefing_screens(level_num); } StartNewLevelSub(level_num, 1 ); }
//called when the player is starting a new level for normal game model void StartNewLevel(int level_num) { GameTime = FrameTime; load_custom_data(get_level_file(level_num)); if (!(Game_mode & GM_MULTI)) { do_briefing_screens(level_num); } StartNewLevelSub(level_num, 1 ); }
//called when the player is starting a new level for normal game model void StartNewLevel(int level_num) { hide_menus(); GameTime64 = 0; ThisLevelTime=0; if (!(Game_mode & GM_MULTI)) { do_briefing_screens(Briefing_text_filename, level_num); } StartNewLevelSub(level_num, 1, 0 ); }
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_sub(char *filename, int multi) { int ObjectStartLocation; int BogusSaturnShit = 0; int version,i, j, segnum; object * obj; FILE *fp; int current_level, next_level; int between_levels; char mission[16]; char desc[DESC_LENGTH+1]; char id[5]; char org_callsign[CALLSIGN_LEN+16]; if ( Game_mode & GM_MULTI ) { #ifdef MULTI_SAVE if ( !FindArg( "-multisave" ) ) #endif return 0; } fp = fopen( filename, "rb" ); if ( !fp ) return 0; //Read id fread( id, sizeof(char)*4, 1, fp ); if ( memcmp( id, dgss_id, 4 )) { fclose(fp); return 0; } //Read version fread( &version, sizeof(int), 1, fp ); if (version < STATE_COMPATIBLE_VERSION) { fclose(fp); return 0; } // Read description fread( desc, sizeof(char)*DESC_LENGTH, 1, fp ); // Skip the current screen shot... fseek( fp, THUMBNAIL_W*THUMBNAIL_H, SEEK_CUR ); // Read the Between levels flag... fread( &between_levels, sizeof(int), 1, fp ); // Read the mission info... fread( mission, sizeof(char)*9, 1, fp ); #ifdef MAC_SHAREWARE if (strcmp(mission, "") ) { nm_messagebox( NULL, 1, "Ok", "Error!\nUnable to load mission\n'%s'\n", mission ); fclose(fp); return 0; } #else if (!load_mission_by_name( mission )) { nm_messagebox( NULL, 1, "Ok", "Error!\nUnable to load mission\n'%s'\n", mission ); fclose(fp); return 0; } #endif //Read level info fread( ¤t_level, sizeof(int), 1, fp ); fread( &next_level, sizeof(int), 1, fp ); //Restore GameTime fread( &GameTime, sizeof(fix), 1, fp ); // Start new game.... if (!multi) { Game_mode = GM_NORMAL; Function_mode = FMODE_GAME; #ifdef NETWORK change_playernum_to(0); #endif strcpy( org_callsign, Players[0].callsign ); N_players = 1; InitPlayerObject(); //make sure player's object set up init_player_stats_game(); //clear all stats } else { strcpy( org_callsign, Players[Player_num].callsign ); } //Read player info if ( between_levels ) { int saved_offset; fread( &Players[Player_num], sizeof(player), 1, fp ); saved_offset = ftell(fp); fclose( fp ); do_briefing_screens(next_level); fp = fopen( filename, "rb" ); fseek( fp, saved_offset, SEEK_SET ); StartNewLevelSub( next_level, 0 ); } else { StartNewLevelSub(current_level, 0); fread( &Players[Player_num], sizeof(player), 1, fp ); } strcpy( Players[Player_num].callsign, org_callsign ); // Set the right level if ( between_levels ) Players[Player_num].level = next_level; // Restore the weapon states fread( &Primary_weapon, sizeof(byte), 1, fp ); fread( &Secondary_weapon, sizeof(byte), 1, fp ); select_weapon(Primary_weapon, 0, 0, 0); select_weapon(Secondary_weapon, 1, 0, 0); // Restore the difficulty level fread( &Difficulty_level, sizeof(int), 1, fp ); // Restore the cheats enabled flag fread( &Cheats_enabled, sizeof(int), 1, fp ); fread( &Game_turbo_mode, sizeof(int), 1, fp ); if ( !between_levels ) { Do_appearance_effect = 0; // Don't do this for middle o' game stuff. ObjectStartLocation = ftell( fp ); RetryObjectLoading: //Clear out all the objects from the lvl file for (segnum=0; segnum <= Highest_segment_index; segnum++) Segments[segnum].objects = -1; reset_objects(1); //Read objects, and pop 'em into their respective segments. fread( &i, sizeof(int), 1, fp ); Highest_object_index = i-1; if ( !BogusSaturnShit ) fread( Objects, sizeof(object)*i, 1, fp ); else { ubyte tmp_object[sizeof(object)]; for (i=0; i<=Highest_object_index; i++ ) { fread( tmp_object, sizeof(object)-3, 1, fp ); // Insert 3 bytes after the read in obj->rtype.pobj_info.alt_textures field. memcpy( &Objects[i], tmp_object, sizeof(object)-3 ); Objects[i].rtype.pobj_info.alt_textures = -1; } } Object_next_signature = 0; for (i=0; i<=Highest_object_index; i++ ) { obj = &Objects[i]; obj->rtype.pobj_info.alt_textures = -1; segnum = obj->segnum; obj->next = obj->prev = obj->segnum = -1; if ( obj->type != OBJ_NONE ) { // Check for a bogus Saturn version!!!! if (!BogusSaturnShit ) { if ( (segnum<0) || (segnum>Highest_segment_index) ) { BogusSaturnShit = 1; mprintf(( 1, "READING BOGUS SATURN VERSION OBJECTS!!! (Object:%d)\n", i )); fseek( fp, ObjectStartLocation, SEEK_SET ); goto RetryObjectLoading; } } obj_link(i,segnum); if ( obj->signature > Object_next_signature ) Object_next_signature = obj->signature; } } special_reset_objects(); Object_next_signature++; //Restore wall info fread( &i, sizeof(int), 1, fp ); Num_walls = i; // Check for a bogus Saturn version!!!! if (!BogusSaturnShit ) { if ( (Num_walls<0) || (Num_walls>MAX_WALLS) ) { BogusSaturnShit = 1; mprintf(( 1, "READING BOGUS SATURN VERSION OBJECTS!!! (Num_walls)\n" )); fseek( fp, ObjectStartLocation, SEEK_SET ); goto RetryObjectLoading; } } fread( Walls, sizeof(wall)*Num_walls, 1, fp ); // Check for a bogus Saturn version!!!! if (!BogusSaturnShit ) { for (i=0; i<Num_walls; i++ ) { if ( (Walls[i].segnum<0) || (Walls[i].segnum>Highest_segment_index) || (Walls[i].sidenum<-1) || (Walls[i].sidenum>5) ) { BogusSaturnShit = 1; mprintf(( 1, "READING BOGUS SATURN VERSION OBJECTS!!! (Wall %d)\n", i )); fseek( fp, ObjectStartLocation, SEEK_SET ); goto RetryObjectLoading; } } } //Restore door info fread( &i, sizeof(int), 1, fp ); Num_open_doors = i; fread( ActiveDoors, sizeof(active_door)*Num_open_doors, 1, fp ); //Restore trigger info fread( &Num_triggers, sizeof(int), 1, fp ); fread( Triggers, sizeof(trigger)*Num_triggers, 1, fp ); //Restore tmap info for (i=0; i<=Highest_segment_index; i++ ) { for (j=0; j<6; j++ ) { fread( &Segments[i].sides[j].wall_num, sizeof(short), 1, fp ); fread( &Segments[i].sides[j].tmap_num, sizeof(short), 1, fp ); fread( &Segments[i].sides[j].tmap_num2, sizeof(short), 1, fp ); } } //Restore the fuelcen info fread( &Fuelcen_control_center_destroyed, sizeof(int), 1, fp ); fread( &Fuelcen_seconds_left, sizeof(int), 1, fp ); fread( &Num_robot_centers, sizeof(int), 1, fp ); fread( RobotCenters, sizeof(matcen_info)*Num_robot_centers, 1, fp ); fread( &ControlCenterTriggers, sizeof(control_center_triggers), 1, fp ); fread( &Num_fuelcenters, sizeof(int), 1, fp ); fread( Station, sizeof(FuelCenter)*Num_fuelcenters, 1, fp ); // Restore the control cen info fread( &Control_center_been_hit, sizeof(int), 1, fp ); fread( &Control_center_player_been_seen, sizeof(int), 1, fp ); fread( &Control_center_next_fire_time, sizeof(int), 1, fp ); fread( &Control_center_present, sizeof(int), 1, fp ); fread( &Dead_controlcen_object_num, sizeof(int), 1, fp ); // Restore the AI state ai_restore_state( fp ); // Restore the automap visited info fread( Automap_visited, sizeof(ubyte)*MAX_SEGMENTS, 1, fp ); // Restore hacked up weapon system stuff. Fusion_next_sound_time = GameTime; Auto_fire_fusion_cannon_time = 0; Next_laser_fire_time = GameTime; Next_missile_fire_time = GameTime; Last_laser_fired_time = GameTime; } state_game_id = 0; if ( version >= 7 ) { int tmp_Lunacy; fread( &state_game_id, sizeof(uint), 1, fp ); fread( &Laser_rapid_fire, sizeof(int), 1, fp ); fread( &Ugly_robot_cheat, sizeof(int), 1, fp ); fread( &Ugly_robot_texture, sizeof(int), 1, fp ); fread( &Physics_cheat_flag, sizeof(int), 1, fp ); fread( &tmp_Lunacy, sizeof(int), 1, fp ); if ( tmp_Lunacy ) do_lunacy_on(); } fclose(fp); // Load in bitmaps, etc.. piggy_load_level_data(); return 1; }