//reads a binary file containing a 3d model polymodel *read_model_file(polymodel *pm,char *filename,robot_info *r) { PHYSFS_file *ifile; short version; int id,len, next_chunk; ubyte model_buf[MODEL_BUF_SIZE]; if ((ifile=PHYSFSX_openReadBuffered(filename))==NULL) Error("Can't open file <%s>",filename); Assert(PHYSFS_fileLength(ifile) <= MODEL_BUF_SIZE); Pof_addr = 0; Pof_file_end = PHYSFS_read(ifile, model_buf, 1, PHYSFS_fileLength(ifile)); PHYSFS_close(ifile); id = pof_read_int(model_buf); if (id!=0x4f505350) /* 'OPSP' */ Error("Bad ID in model file <%s>",filename); version = pof_read_short(model_buf); if (version < PM_COMPATIBLE_VERSION || version > PM_OBJFILE_VERSION) Error("Bad version (%d) in model file <%s>",version,filename); while (new_pof_read_int(id,model_buf) == 1) { id = INTEL_INT(id); //id = pof_read_int(model_buf); len = pof_read_int(model_buf); next_chunk = Pof_addr + len; switch (id) { case ID_OHDR: { //Object header vms_vector pmmin,pmmax; pm->n_models = pof_read_int(model_buf); pm->rad = pof_read_int(model_buf); Assert(pm->n_models <= MAX_SUBMODELS); pof_read_vecs(&pmmin,1,model_buf); pof_read_vecs(&pmmax,1,model_buf); break; } case ID_SOBJ: { //Subobject header int n; n = pof_read_short(model_buf); Assert(n < MAX_SUBMODELS); pm->submodel_parents[n] = pof_read_short(model_buf); pof_read_vecs(&pm->submodel_norms[n],1,model_buf); pof_read_vecs(&pm->submodel_pnts[n],1,model_buf); pof_read_vecs(&pm->submodel_offsets[n],1,model_buf); pm->submodel_rads[n] = pof_read_int(model_buf); //radius pm->submodel_ptrs[n] = pof_read_int(model_buf); //offset break; } #ifndef DRIVE case ID_GUNS: { //List of guns on this object if (r) { int i; vms_vector gun_dir; r->n_guns = pof_read_int(model_buf); Assert(r->n_guns <= MAX_GUNS); for (i=0;i<r->n_guns;i++) { int id; id = pof_read_short(model_buf); r->gun_submodels[id] = pof_read_short(model_buf); Assert(r->gun_submodels[id] != 0xff); pof_read_vecs(&r->gun_points[id],1,model_buf); if (version >= 7) pof_read_vecs(&gun_dir,1,model_buf); } } else pof_cfseek(model_buf,len,SEEK_CUR); break; } case ID_ANIM: //Animation data if (r) { int n_frames,f,m; n_frames = pof_read_short(model_buf); Assert(n_frames == N_ANIM_STATES); for (m=0;m<pm->n_models;m++) for (f=0;f<n_frames;f++) pof_read_angvecs(&anim_angs[f][m], 1, model_buf); robot_set_angles(r,pm,anim_angs); } else pof_cfseek(model_buf,len,SEEK_CUR); break; #endif case ID_TXTR: { //Texture filename list int n; char name_buf[128]; n = pof_read_short(model_buf); while (n--) { pof_read_string(name_buf,128,model_buf); } break; } case ID_IDTA: //Interpreter data pm->model_data = d_malloc(len); pm->model_data_size = len; pof_cfread(pm->model_data,1,len,model_buf); break; default: pof_cfseek(model_buf,len,SEEK_CUR); break; } if ( version >= 8 ) // Version 8 needs 4-byte alignment!!! pof_cfseek(model_buf,next_chunk,SEEK_SET); } #ifdef WORDS_NEED_ALIGNMENT align_polygon_model_data(pm); #endif #ifdef WORDS_BIGENDIAN swap_polygon_model_data(pm->model_data); #endif return pm; }
//reads the gun information for a model //fills in arrays gun_points & gun_dirs, returns the number of guns read int read_model_guns(char *filename,vms_vector *gun_points, vms_vector *gun_dirs, int *gun_submodels) { PHYSFS_file *ifile; short version; int id,len; int n_guns=0; ubyte model_buf[MODEL_BUF_SIZE]; if ((ifile=PHYSFSX_openReadBuffered(filename))==NULL) Error("Can't open file <%s>",filename); Assert(PHYSFS_fileLength(ifile) <= MODEL_BUF_SIZE); Pof_addr = 0; Pof_file_end = PHYSFS_read(ifile, model_buf, 1, PHYSFS_fileLength(ifile)); PHYSFS_close(ifile); id = pof_read_int(model_buf); if (id!=0x4f505350) /* 'OPSP' */ Error("Bad ID in model file <%s>",filename); version = pof_read_short(model_buf); Assert(version >= 7); //must be 7 or higher for this data if (version < PM_COMPATIBLE_VERSION || version > PM_OBJFILE_VERSION) Error("Bad version (%d) in model file <%s>",version,filename); while (new_pof_read_int(id,model_buf) == 1) { id = INTEL_INT(id); //id = pof_read_int(model_buf); len = pof_read_int(model_buf); if (id == ID_GUNS) { //List of guns on this object int i; n_guns = pof_read_int(model_buf); for (i=0;i<n_guns;i++) { int id,sm; id = pof_read_short(model_buf); sm = pof_read_short(model_buf); if (gun_submodels) gun_submodels[id] = sm; else if (sm!=0) Error("Invalid gun submodel in file <%s>",filename); pof_read_vecs(&gun_points[id],1,model_buf); pof_read_vecs(&gun_dirs[id],1,model_buf); } } else pof_cfseek(model_buf,len,SEEK_CUR); } return n_guns; }
int state_restore_all_sub(char *filename, int multi, int secret_restore) { int ObjectStartLocation; int version,i, j, segnum; object * obj; PHYSFS_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]; #ifdef NETWORK int found; int nplayers = 0; //,playid[12],mynum; player restore_players[MAX_PLAYERS]; #endif fix old_gametime = GameTime; short TempTmapNum[MAX_SEGMENTS][MAX_SIDES_PER_SEGMENT]; short TempTmapNum2[MAX_SEGMENTS][MAX_SIDES_PER_SEGMENT]; #if defined(MACINTOSH) && !defined(NDEBUG) if (strncmp(filename, PLAYER_DIR, 9)) Int3(); #endif fp = PHYSFSX_openReadBuffered(filename); if ( !fp ) return 0; //Read id //FIXME: check for swapped file, react accordingly... PHYSFS_read(fp, id, sizeof(char) * 4, 1); if ( memcmp( id, dgss_id, 4 )) { PHYSFS_close(fp); return 0; } //Read version PHYSFS_read(fp, &version, sizeof(int), 1); if (version < STATE_COMPATIBLE_VERSION) { PHYSFS_close(fp); return 0; } // Read description PHYSFS_read(fp, desc, sizeof(char) * DESC_LENGTH, 1); // Skip the current screen shot... PHYSFS_seek(fp, PHYSFS_tell(fp) + THUMBNAIL_W * THUMBNAIL_H); // And now...skip the goddamn palette stuff that somebody forgot to add PHYSFS_seek(fp, PHYSFS_tell(fp) + 768); // Read the Between levels flag... PHYSFS_read(fp, &between_levels, sizeof(int), 1); Assert(between_levels == 0); //between levels save ripped out // Read the mission info... PHYSFS_read(fp, mission, sizeof(char) * 9, 1); mprintf ((0,"Missionname to load = %s\n",mission)); if (!load_mission_by_name( mission )) { nm_messagebox( NULL, 1, "Ok", "Error!\nUnable to load mission\n'%s'\n", mission ); PHYSFS_close(fp); return 0; } //Read level info PHYSFS_read(fp, ¤t_level, sizeof(int), 1); PHYSFS_read(fp, &next_level, sizeof(int), 1); //Restore GameTime PHYSFS_read(fp, &GameTime, sizeof(fix), 1); // 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; if (!secret_restore) { InitPlayerObject(); //make sure player's object set up init_player_stats_game(); //clear all stats } } else { strcpy( org_callsign, Players[Player_num].callsign ); } #ifdef NETWORK if (Game_mode & GM_MULTI) { PHYSFS_read(fp, &state_game_id, sizeof(int), 1); PHYSFS_read(fp, &Netgame, sizeof(netgame_info), 1); PHYSFS_read(fp, &NetPlayers, sizeof(AllNetPlayers_info), 1); PHYSFS_read(fp, &nplayers, sizeof(N_players), 1); PHYSFS_read(fp, &Player_num, sizeof(Player_num), 1); for (i=0;i<nplayers;i++) PHYSFS_read(fp, &restore_players[i], sizeof(player), 1); #ifdef RISKY_PROPOSITION PHYSFS_read(fp, &robot_controlled[0], 4 * MAX_ROBOTS_CONTROLLED, 1); PHYSFS_read(fp, &robot_agitation[0], 4 * MAX_ROBOTS_CONTROLLED, 1); PHYSFS_read(fp, &robot_controlled_time[0], 4 * MAX_ROBOTS_CONTROLLED, 1); PHYSFS_read(fp, &robot_last_send_time[0], 4 * MAX_ROBOTS_CONTROLLED, 1); PHYSFS_read(fp, &robot_last_message_time[0], 4 * MAX_ROBOTS_CONTROLLED, 1); PHYSFS_read(fp, &robot_send_pending[0], 4 * MAX_ROBOTS_CONTROLLED, 1); PHYSFS_read(fp, &robot_fired[0], 4 * MAX_ROBOTS_CONTROLLED, 1); for (i=0;i<MAX_ROBOTS_CONTROLLED;i++) PHYSFS_read(fp, &robot_fire_buf[i][0],21,1); #endif for (i=0;i<nplayers;i++) { found=0; for (j=0;j<nplayers;j++) { if ((!strcmp (restore_players[i].callsign,Players[j].callsign)) && Players[j].connected==1) found=1; } restore_players[i].connected=found; } memcpy (&Players,&restore_players,sizeof(player)*nplayers); N_players=nplayers; if (network_i_am_master()) { for (i=0;i<N_players;i++) { if (i==Player_num) continue; Players[i].connected=0; } } //Viewer = ConsoleObject = &Objects[Players[Player_num].objnum]; } #endif //Read player info { StartNewLevelSub(current_level, 1, secret_restore); if (secret_restore) { player dummy_player; PHYSFS_read(fp, &dummy_player, sizeof(player), 1); if (secret_restore == 1) { // This means he didn't die, so he keeps what he got in the secret level. Players[Player_num].level = dummy_player.level; Players[Player_num].last_score = dummy_player.last_score; Players[Player_num].time_level = dummy_player.time_level; Players[Player_num].num_robots_level = dummy_player.num_robots_level; Players[Player_num].num_robots_total = dummy_player.num_robots_total; Players[Player_num].hostages_rescued_total = dummy_player.hostages_rescued_total; Players[Player_num].hostages_total = dummy_player.hostages_total; Players[Player_num].hostages_on_board = dummy_player.hostages_on_board; Players[Player_num].hostages_level = dummy_player.hostages_level; Players[Player_num].homing_object_dist = dummy_player.homing_object_dist; Players[Player_num].hours_level = dummy_player.hours_level; Players[Player_num].hours_total = dummy_player.hours_total; do_cloak_invul_secret_stuff(old_gametime); } else { Players[Player_num] = dummy_player; } } else { PHYSFS_read(fp, &Players[Player_num], sizeof(player), 1); } } strcpy( Players[Player_num].callsign, org_callsign ); // Set the right level if ( between_levels ) Players[Player_num].level = next_level; // Restore the weapon states PHYSFS_read(fp, &Primary_weapon, sizeof(sbyte), 1); PHYSFS_read(fp, &Secondary_weapon, sizeof(sbyte), 1); select_weapon(Primary_weapon, 0, 0, 0); select_weapon(Secondary_weapon, 1, 0, 0); // Restore the difficulty level PHYSFS_read(fp, &Difficulty_level, sizeof(int), 1); // Restore the cheats enabled flag { int cheats_enabled; PHYSFS_read(fp, &cheats_enabled, sizeof(int), 1); cvar_setint(&Cheats_enabled, cheats_enabled); } if ( !between_levels ) { Do_appearance_effect = 0; // Don't do this for middle o' game stuff. ObjectStartLocation = (int)PHYSFS_tell(fp); //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. PHYSFS_read(fp, &i, sizeof(int), 1); Highest_object_index = i-1; PHYSFS_read(fp, Objects, sizeof(object) * i, 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 ) { obj_link(i,segnum); if ( obj->signature > Object_next_signature ) Object_next_signature = obj->signature; } //look for, and fix, boss with bogus shields if (obj->type == OBJ_ROBOT && Robot_info[obj->id].boss_flag) { fix save_shields = obj->shields; copy_defaults_to_robot(obj); //calculate starting shields //if in valid range, use loaded shield value if (save_shields > 0 && save_shields <= obj->shields) obj->shields = save_shields; else obj->shields /= 2; //give player a break } } special_reset_objects(); Object_next_signature++; // 1 = Didn't die on secret level. // 2 = Died on secret level. if (secret_restore && (Current_level_num >= 0)) { set_pos_from_return_segment(); if (secret_restore == 2) init_player_stats_new_ship(); } //Restore wall info PHYSFS_read(fp, &i, sizeof(int), 1); Num_walls = i; PHYSFS_read(fp, Walls, sizeof(wall), Num_walls); //now that we have the walls, check if any sounds are linked to //walls that are now open for (i=0;i<Num_walls;i++) { if (Walls[i].type == WALL_OPEN) digi_kill_sound_linked_to_segment(Walls[i].segnum,Walls[i].sidenum,-1); //-1 means kill any sound } //Restore exploding wall info if (version >= 10) { PHYSFS_read(fp, &i, sizeof(int), 1); PHYSFS_read(fp, expl_wall_list, sizeof(*expl_wall_list), i); } //Restore door info PHYSFS_read(fp, &i, sizeof(int), 1); Num_open_doors = i; PHYSFS_read(fp, ActiveDoors, sizeof(active_door), Num_open_doors); if (version >= 14) { //Restore cloaking wall info PHYSFS_read(fp, &i, sizeof(int), 1); Num_cloaking_walls = i; PHYSFS_read(fp, CloakingWalls, sizeof(cloaking_wall), Num_cloaking_walls); } //Restore trigger info PHYSFS_read(fp, &Num_triggers, sizeof(int), 1); PHYSFS_read(fp, Triggers, sizeof(trigger), Num_triggers); //Restore tmap info (to temp values so we can use compiled-in tmap info to compute static_light) for (i=0; i<=Highest_segment_index; i++ ) { for (j=0; j<6; j++ ) { PHYSFS_read(fp, &Segments[i].sides[j].wall_num, sizeof(short), 1); PHYSFS_read(fp, &TempTmapNum[i][j], sizeof(short), 1); PHYSFS_read(fp, &TempTmapNum2[i][j], sizeof(short), 1); } } //Restore the fuelcen info PHYSFS_read(fp, &Control_center_destroyed, sizeof(int), 1); PHYSFS_read(fp, &Countdown_timer, sizeof(int), 1); PHYSFS_read(fp, &Num_robot_centers, sizeof(int), 1); PHYSFS_read(fp, RobotCenters, sizeof(matcen_info), Num_robot_centers); PHYSFS_read(fp, &ControlCenterTriggers, sizeof(control_center_triggers), 1); PHYSFS_read(fp, &Num_fuelcenters, sizeof(int), 1); PHYSFS_read(fp, Station, sizeof(FuelCenter), Num_fuelcenters); // Restore the control cen info PHYSFS_read(fp, &Control_center_been_hit, sizeof(int), 1); PHYSFS_read(fp, &Control_center_player_been_seen, sizeof(int), 1); PHYSFS_read(fp, &Control_center_next_fire_time, sizeof(int), 1); PHYSFS_read(fp, &Control_center_present, sizeof(int), 1); PHYSFS_read(fp, &Dead_controlcen_object_num, sizeof(int), 1); // Restore the AI state ai_restore_state( fp, version ); // Restore the automap visited info PHYSFS_read(fp, Automap_visited, sizeof(ubyte), MAX_SEGMENTS); // 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 ) { PHYSFS_read(fp, &state_game_id, sizeof(uint), 1); PHYSFS_read(fp, &Laser_rapid_fire, sizeof(int), 1); PHYSFS_read(fp, &Lunacy, sizeof(int), 1); // Yes, writing this twice. Removed the Ugly robot system, but didn't want to change savegame format. PHYSFS_read(fp, &Lunacy, sizeof(int), 1); if ( Lunacy ) do_lunacy_on(); } if (version >= 17) { PHYSFS_read(fp, MarkerObject, sizeof(MarkerObject), 1); PHYSFS_read(fp, MarkerOwner, sizeof(MarkerOwner), 1); PHYSFS_read(fp, MarkerMessage, sizeof(MarkerMessage), 1); } else { int num,dummy; // skip dummy info PHYSFS_read(fp, &num,sizeof(int), 1); // was NumOfMarkers PHYSFS_read(fp, &dummy,sizeof(int), 1); // was CurMarker PHYSFS_seek(fp, PHYSFS_tell(fp) + num * (sizeof(vms_vector) + 40)); for (num=0;num<NUM_MARKERS;num++) MarkerObject[num] = -1; } if (version>=11) { if (secret_restore != 1) PHYSFS_read(fp, &Afterburner_charge, sizeof(fix), 1); else { fix dummy_fix; PHYSFS_read(fp, &dummy_fix, sizeof(fix), 1); } } if (version>=12) { //read last was super information PHYSFS_read(fp, &Primary_last_was_super, sizeof(Primary_last_was_super), 1); PHYSFS_read(fp, &Secondary_last_was_super, sizeof(Secondary_last_was_super), 1); } if (version >= 12) { PHYSFS_read(fp, &Flash_effect, sizeof(int), 1); PHYSFS_read(fp, &Time_flash_last_played, sizeof(int), 1); PHYSFS_read(fp, &PaletteRedAdd, sizeof(int), 1); PHYSFS_read(fp, &PaletteGreenAdd, sizeof(int), 1); PHYSFS_read(fp, &PaletteBlueAdd, sizeof(int), 1); } else { Flash_effect = 0; Time_flash_last_played = 0; PaletteRedAdd = 0; PaletteGreenAdd = 0; PaletteBlueAdd = 0; } // Load Light_subtracted if (version >= 16) { PHYSFS_read(fp, Light_subtracted, sizeof(Light_subtracted[0]), MAX_SEGMENTS); apply_all_changed_light(); } else { int i; for (i=0; i<=Highest_segment_index; i++) Light_subtracted[i] = 0; } // static_light should now be computed - now actually set tmap info for (i=0; i<=Highest_segment_index; i++ ) { for (j=0; j<6; j++ ) { Segments[i].sides[j].tmap_num=TempTmapNum[i][j]; Segments[i].sides[j].tmap_num2=TempTmapNum2[i][j]; } } if (!secret_restore) { if (version >= 20) { PHYSFS_read(fp, &First_secret_visit, sizeof(First_secret_visit), 1); mprintf((0, "File: [%s] Read First_secret_visit: New value = %i\n", filename, First_secret_visit)); } else First_secret_visit = 1; } else First_secret_visit = 0; if (version >= 22) { if (secret_restore != 1) PHYSFS_read(fp, &Omega_charge, sizeof(fix), 1); else { fix dummy_fix; PHYSFS_read(fp, &dummy_fix, sizeof(fix), 1); } } PHYSFS_close(fp); #ifdef NETWORK if (Game_mode & GM_MULTI) // Get rid of ships that aren't { // connected in the restored game for (i=0;i<nplayers;i++) { mprintf ((0,"Testing %s = %d\n",Players[i].callsign,Players[i].connected)); if (Players[i].connected!=1) { network_disconnect_player (i); create_player_appearance_effect(&Objects[Players[i].objnum]); mprintf ((0,"Killing player ship %s!\n",Players[i].callsign)); } } } #endif // Load in bitmaps, etc.. //!! piggy_load_level_data(); //already done by StartNewLevelSub() return 1; }
static int read_mission_file(mission_list_type &mission_list, mission_candidate_search_path &pathname) { if (auto mfile = PHYSFSX_openReadBuffered(pathname.data())) { char *p; char *ext; p = strrchr(pathname.data(), '/'); if (!p) p = pathname.data(); if ((ext = strchr(p, '.')) == NULL) return 0; //missing extension mission_list.emplace_back(); mle *mission = &mission_list.back(); mission->path.assign(pathname.data(), ext); #if defined(DXX_BUILD_DESCENT_II) // look if it's .mn2 or .msn mission->descent_version = (ext[3] == MISSION_EXTENSION_DESCENT_II[3]) ? Mission::descent_version_type::descent2 : Mission::descent_version_type::descent1; #endif mission->anarchy_only_flag = 0; mission->filename = next(begin(mission->path), mission->path.find_last_of('/') + 1); PHYSFSX_gets_line_t<80> buf; p = get_parm_value(buf, "name",mfile); #if defined(DXX_BUILD_DESCENT_II) if (!p) { //try enhanced mission PHYSFSX_fseek(mfile,0,SEEK_SET); p = get_parm_value(buf, "xname",mfile); } if (!p) { //try super-enhanced mission! PHYSFSX_fseek(mfile,0,SEEK_SET); p = get_parm_value(buf, "zname",mfile); } if (!p) { //try extensible-enhanced mission! PHYSFSX_fseek(mfile,0,SEEK_SET); p = get_parm_value(buf, "!name",mfile); } #endif if (p) { char *t; if ((t=strchr(p,';'))!=NULL) *t=0; t = p + strlen(p)-1; while (isspace(*t)) *t-- = 0; // remove trailing whitespace mission->mission_name.copy_if(p, mission->mission_name.size() - 1); } else { mission_list.pop_back(); return 0; } { PHYSFSX_gets_line_t<4096> temp; if (PHYSFSX_fgets(temp,mfile)) { if (istok(temp,"type")) { p = get_value(temp); //get mission type if (p) mission->anarchy_only_flag = istok(p,"anarchy"); } } } return 1; } return 0; }
void credits_show(const char *const filename) { if (auto &&file = PHYSFSX_openReadBuffered(filename)) credits_show_common(std::move(file), 1); }
int state_get_restore_file(char * fname, int multi) { PHYSFS_file *fp; int i, choice, version, nsaves; newmenu_item m[NUM_SAVES+2]; char filename[NUM_SAVES+1][30]; char desc[NUM_SAVES+1][DESC_LENGTH + 16]; char id[5]; int valid; nsaves=0; m[0].type = NM_TYPE_TEXT; m[0].text = "\n\n\n\n"; for (i=0;i<NUM_SAVES+1; i++ ) { sc_bmp[i] = NULL; if (!multi) sprintf( filename[i], PLAYER_DIR "%s.sg%x", Players[Player_num].callsign, i ); else sprintf( filename[i], PLAYER_DIR "%s.mg%x", Players[Player_num].callsign, i ); valid = 0; fp = PHYSFSX_openReadBuffered(filename[i]); if ( fp ) { //Read id //FIXME: check for swapped file, react accordingly... PHYSFS_read(fp, id, sizeof(char) * 4, 1); if ( !memcmp( id, dgss_id, 4 )) { //Read version PHYSFS_read(fp, &version, sizeof(int), 1); if (version >= STATE_COMPATIBLE_VERSION) { // Read description PHYSFS_read(fp, desc[i], sizeof(char) * DESC_LENGTH, 1); //rpad_string( desc[i], DESC_LENGTH-1 ); m[i+1].type = NM_TYPE_MENU; m[i+1].text = desc[i]; // Read thumbnail sc_bmp[i] = gr_create_bitmap(THUMBNAIL_W,THUMBNAIL_H ); PHYSFS_read(fp, sc_bmp[i]->bm_data, THUMBNAIL_W * THUMBNAIL_H, 1); if (version >= 9) { ubyte pal[256*3]; PHYSFS_read(fp, pal, 3, 256); gr_remap_bitmap_good( sc_bmp[i], pal, -1, -1 ); } nsaves++; valid = 1; } } PHYSFS_close(fp); } if (!valid) { strcpy( desc[i], TXT_EMPTY ); //rpad_string( desc[i], DESC_LENGTH-1 ); m[i+1].type = NM_TYPE_TEXT; m[i+1].text = desc[i]; } } if ( nsaves < 1 ) { nm_messagebox( NULL, 1, "Ok", "No saved games were found!" ); return 0; } if (Current_display_mode == SM(640,400)) //restore menu won't fit on 640x400 VR_screen_flags ^= VRF_COMPATIBLE_MENUS; sc_last_item = -1; #ifdef NEWMENU_MOUSE Hack_DblClick_MenuMode = 1; #endif RestoringMenu=1; choice = newmenu_do3( NULL, "Select Game to Restore", NUM_SAVES+2, m, state_callback, state_default_item+1, NULL, 190, -1 ); RestoringMenu=0; #ifdef NEWMENU_MOUSE Hack_DblClick_MenuMode = 0; #endif if (Current_display_mode == SM(640,400)) //set flag back VR_screen_flags ^= VRF_COMPATIBLE_MENUS; for (i=0; i<NUM_SAVES+1; i++ ) { if ( sc_bmp[i] ) gr_free_bitmap( sc_bmp[i] ); } if (choice > 0) { strcpy( fname, filename[choice-1] ); if (choice != NUM_SAVES+1) //no new default when restore from autosave state_default_item = choice - 1; return choice; } return 0; }
//returns 1 if file read ok, else 0 int read_mission_file(mle *mission, char *filename, int location) { char filename2[100]; PHYSFS_file *mfile; switch (location) { case ML_MISSIONDIR: strcpy(filename2,MISSION_DIR); break; default: Int3(); //fall through case ML_CURDIR: strcpy(filename2,""); break; } strcat(filename2,filename); mfile = PHYSFSX_openReadBuffered(filename2); if (mfile) { char *p; char temp[PATH_MAX], *ext; strcpy(temp,filename); p = strrchr(temp, '/'); // get the filename at the end of the path if (!p) p = temp; else p++; if ((ext = strchr(p, '.')) == NULL) return 0; //missing extension *ext = 0; //kill extension mission->path = d_strdup(temp); mission->anarchy_only_flag = 0; mission->filename = mission->path + (p - temp); mission->location = location; p = get_parm_value("name",mfile); if (p) { char *t; if ((t=strchr(p,';'))!=NULL) *t=0; t = p + strlen(p)-1; while (isspace(*t)) *t-- = 0; // remove trailing whitespace if (strlen(p) > MISSION_NAME_LEN) p[MISSION_NAME_LEN] = 0; strncpy(mission->mission_name, p, MISSION_NAME_LEN + 1); } else { PHYSFS_close(mfile); d_free(mission->path); return 0; } p = get_parm_value("type",mfile); //get mission type if (p) mission->anarchy_only_flag = istok(p,"anarchy"); PHYSFS_close(mfile); return 1; } return 0; }
int do_ipc(int qid, struct msgbuf *buf, int flags) { int ipc_read; PHYSFS_file *fptr = NULL; float last_volume = volume; int l=0; ipc_read = msgrcv(qid,buf,16,0,flags | MSG_NOERROR); switch (ipc_read) { case -1: if (errno == ENOMSG) break; perror("IPC trouble"); break; case 0: break; default: con_printf(CON_DEBUG,"do_ipc %s\n", buf->mtext);//##########3 switch (buf->mtext[0]) { case 'v': volume = (double)(atof(buf->mtext + 1) / 128.0); con_printf(CON_DEBUG,"vol %f->%f\n", last_volume, volume); if (last_volume <= 0 && volume > 0) { buf->mtext[0] = 'p'; // start playing again if volume raised above 0 strcpy(buf->mtext + 1, digi_last_midi_song); // fall through to case 'p' } else if (last_volume > 0 && volume <= 0) { strcpy(buf->mtext, "s"); // stop playing if volume reduced to 0 stop = 2; break; } else break; case 'p': if (buf->mtext[1]) { strcpy(digi_last_midi_song, buf->mtext + 1); if (volume > 0) fptr = PHYSFSX_openReadBuffered((buf->mtext + 1)); } if(fptr != NULL) { l = PHYSFS_fileLength(fptr); data=realloc(data,(size_t) l); PHYSFS_read(fptr, data, l, 1); PHYSFS_close(fptr); con_printf(CON_DEBUG,"good. fpr=%p l=%i data=%p\n", fptr, l, data);//##########3 stop = 0; } else { strcpy(buf->mtext, "s"); // not playing, thus "stop". stop = 2; } break; case 's': stop = 2; break; case 'q': break; } } return ipc_read; }
void load_robot_replacements(char *level_name) { PHYSFS_file *fp; int t,i,j; char ifile_name[FILENAME_LEN]; change_filename_extension(ifile_name, level_name, ".HXM" ); fp = PHYSFSX_openReadBuffered(ifile_name); if (!fp) //no robot replacement file return; t = PHYSFSX_readInt(fp); //read id "HXM!" if (t!= 0x21584d48) Error("ID of HXM! file incorrect"); t = PHYSFSX_readInt(fp); //read version if (t<1) Error("HXM! version too old (%d)",t); t = PHYSFSX_readInt(fp); //read number of robots for (j=0;j<t;j++) { i = PHYSFSX_readInt(fp); //read robot number if (i<0 || i>=N_robot_types) Error("Robots number (%d) out of range in (%s). Range = [0..%d].",i,level_name,N_robot_types-1); robot_info_read_n(&Robot_info[i], 1, fp); } t = PHYSFSX_readInt(fp); //read number of joints for (j=0;j<t;j++) { i = PHYSFSX_readInt(fp); //read joint number if (i<0 || i>=N_robot_joints) Error("Robots joint (%d) out of range in (%s). Range = [0..%d].",i,level_name,N_robot_joints-1); jointpos_read_n(&Robot_joints[i], 1, fp); } t = PHYSFSX_readInt(fp); //read number of polygon models for (j=0;j<t;j++) { i = PHYSFSX_readInt(fp); //read model number if (i<0 || i>=N_polygon_models) Error("Polygon model (%d) out of range in (%s). Range = [0..%d].",i,level_name,N_polygon_models-1); free_model(&Polygon_models[i]); polymodel_read(&Polygon_models[i], fp); polygon_model_data_read(&Polygon_models[i], fp); Dying_modelnums[i] = PHYSFSX_readInt(fp); Dead_modelnums[i] = PHYSFSX_readInt(fp); } t = PHYSFSX_readInt(fp); //read number of objbitmaps for (j=0;j<t;j++) { i = PHYSFSX_readInt(fp); //read objbitmap number if (i<0 || i>=MAX_OBJ_BITMAPS) Error("Object bitmap number (%d) out of range in (%s). Range = [0..%d].",i,level_name,MAX_OBJ_BITMAPS-1); bitmap_index_read(&ObjBitmaps[i], fp); } t = PHYSFSX_readInt(fp); //read number of objbitmapptrs for (j=0;j<t;j++) { i = PHYSFSX_readInt(fp); //read objbitmapptr number if (i<0 || i>=MAX_OBJ_BITMAPS) Error("Object bitmap pointer (%d) out of range in (%s). Range = [0..%d].",i,level_name,MAX_OBJ_BITMAPS-1); ObjBitmapPtrs[i] = PHYSFSX_readShort(fp); } PHYSFS_close(fp); Robot_replacements_loaded = 1; }
int load_exit_models() { PHYSFS_file *exit_hamfile; int start_num; bm_free_extra_models(); bm_free_extra_objbitmaps(); start_num = N_ObjBitmaps; if (!bm_load_extra_objbitmap("steel1.bbm") || !bm_load_extra_objbitmap("rbot061.bbm") || !bm_load_extra_objbitmap("rbot062.bbm") || !bm_load_extra_objbitmap("steel1.bbm") || !bm_load_extra_objbitmap("rbot061.bbm") || !bm_load_extra_objbitmap("rbot063.bbm")) { con_printf(CON_NORMAL, "Can't load exit models!\n"); return 0; } exit_hamfile = PHYSFSX_openReadBuffered("exit.ham"); if (exit_hamfile) { exit_modelnum = N_polygon_models++; destroyed_exit_modelnum = N_polygon_models++; polymodel_read(&Polygon_models[exit_modelnum], exit_hamfile); polymodel_read(&Polygon_models[destroyed_exit_modelnum], exit_hamfile); Polygon_models[exit_modelnum].first_texture = start_num; Polygon_models[destroyed_exit_modelnum].first_texture = start_num+3; polygon_model_data_read(&Polygon_models[exit_modelnum], exit_hamfile); polygon_model_data_read(&Polygon_models[destroyed_exit_modelnum], exit_hamfile); PHYSFS_close(exit_hamfile); } else if (PHYSFSX_exists("exit01.pof",1) && PHYSFSX_exists("exit01d.pof",1)) { exit_modelnum = load_polygon_model("exit01.pof", 3, start_num, NULL); destroyed_exit_modelnum = load_polygon_model("exit01d.pof", 3, start_num + 3, NULL); #ifdef OGL ogl_cache_polymodel_textures(exit_modelnum); ogl_cache_polymodel_textures(destroyed_exit_modelnum); #endif } else if (PHYSFSX_exists(D1_PIGFILE,1)) { int offset, offset2; int hamsize; exit_hamfile = PHYSFSX_openReadBuffered(D1_PIGFILE); hamsize = (PHYSFSX_UNSAFE_TRUNCATE_TO_32BIT_INT)PHYSFS_fileLength(exit_hamfile); switch (hamsize) { //total hack for loading models case D1_PIGSIZE: offset = 91848; /* and 92582 */ offset2 = 383390; /* and 394022 */ break; default: case D1_SHARE_BIG_PIGSIZE: case D1_SHARE_10_PIGSIZE: case D1_SHARE_PIGSIZE: case D1_10_BIG_PIGSIZE: case D1_10_PIGSIZE: Int3(); /* exit models should be in .pofs */ case D1_OEM_PIGSIZE: case D1_MAC_PIGSIZE: case D1_MAC_SHARE_PIGSIZE: con_printf(CON_NORMAL, "Can't load exit models!\n"); return 0; } PHYSFSX_fseek(exit_hamfile, offset, SEEK_SET); exit_modelnum = N_polygon_models++; destroyed_exit_modelnum = N_polygon_models++; polymodel_read(&Polygon_models[exit_modelnum], exit_hamfile); polymodel_read(&Polygon_models[destroyed_exit_modelnum], exit_hamfile); Polygon_models[exit_modelnum].first_texture = start_num; Polygon_models[destroyed_exit_modelnum].first_texture = start_num+3; PHYSFSX_fseek(exit_hamfile, offset2, SEEK_SET); polygon_model_data_read(&Polygon_models[exit_modelnum], exit_hamfile); polygon_model_data_read(&Polygon_models[destroyed_exit_modelnum], exit_hamfile); PHYSFS_close(exit_hamfile); } else { con_printf(CON_NORMAL, "Can't load exit models!\n"); return 0; } return 1; }
//type==1 means 1.1, type==2 means 1.2 (with weapons) void bm_read_extra_robots(char *fname,int type) { PHYSFS_file *fp; int t,i,version; fp = PHYSFSX_openReadBuffered(fname); if (!fp) { Error("Failed to open HAM file \"%s\"", fname); return; } if (type == 2) { int sig; sig = PHYSFSX_readInt(fp); if (sig != MAKE_SIG('X','H','A','M')) return; version = PHYSFSX_readInt(fp); } else version = 0; (void)version; // NOTE: we do not need it, but keep it for possible further use bm_free_extra_models(); bm_free_extra_objbitmaps(); //read extra weapons t = PHYSFSX_readInt(fp); N_weapon_types = N_D2_WEAPON_TYPES+t; if (N_weapon_types >= MAX_WEAPON_TYPES) Error("Too many weapons (%d) in <%s>. Max is %d.",t,fname,MAX_WEAPON_TYPES-N_D2_WEAPON_TYPES); weapon_info_read_n(&Weapon_info[N_D2_WEAPON_TYPES], t, fp, 3); //now read robot info t = PHYSFSX_readInt(fp); N_robot_types = N_D2_ROBOT_TYPES+t; if (N_robot_types >= MAX_ROBOT_TYPES) Error("Too many robots (%d) in <%s>. Max is %d.",t,fname,MAX_ROBOT_TYPES-N_D2_ROBOT_TYPES); robot_info_read_n(&Robot_info[N_D2_ROBOT_TYPES], t, fp); t = PHYSFSX_readInt(fp); N_robot_joints = N_D2_ROBOT_JOINTS+t; if (N_robot_joints >= MAX_ROBOT_JOINTS) Error("Too many robot joints (%d) in <%s>. Max is %d.",t,fname,MAX_ROBOT_JOINTS-N_D2_ROBOT_JOINTS); jointpos_read_n(&Robot_joints[N_D2_ROBOT_JOINTS], t, fp); t = PHYSFSX_readInt(fp); N_polygon_models = N_D2_POLYGON_MODELS+t; if (N_polygon_models >= MAX_POLYGON_MODELS) Error("Too many polygon models (%d) in <%s>. Max is %d.",t,fname,MAX_POLYGON_MODELS-N_D2_POLYGON_MODELS); polymodel_read_n(&Polygon_models[N_D2_POLYGON_MODELS], t, fp); for (i=N_D2_POLYGON_MODELS; i<N_polygon_models; i++ ) polygon_model_data_read(&Polygon_models[i], fp); for (i = N_D2_POLYGON_MODELS; i < N_polygon_models; i++) Dying_modelnums[i] = PHYSFSX_readInt(fp); for (i = N_D2_POLYGON_MODELS; i < N_polygon_models; i++) Dead_modelnums[i] = PHYSFSX_readInt(fp); t = PHYSFSX_readInt(fp); if (N_D2_OBJBITMAPS+t >= MAX_OBJ_BITMAPS) Error("Too many object bitmaps (%d) in <%s>. Max is %d.",t,fname,MAX_OBJ_BITMAPS-N_D2_OBJBITMAPS); bitmap_index_read_n(&ObjBitmaps[N_D2_OBJBITMAPS], t, fp); t = PHYSFSX_readInt(fp); if (N_D2_OBJBITMAPPTRS+t >= MAX_OBJ_BITMAPS) Error("Too many object bitmap pointers (%d) in <%s>. Max is %d.",t,fname,MAX_OBJ_BITMAPS-N_D2_OBJBITMAPPTRS); for (i = N_D2_OBJBITMAPPTRS; i < (N_D2_OBJBITMAPPTRS + t); i++) ObjBitmapPtrs[i] = PHYSFSX_readShort(fp); PHYSFS_close(fp); }
//if filename passed is NULL, show normal credits void credits_show(char *credits_filename) { credits *cr; window *wind; int i; int pcx_error; char * tempp; char filename[32]; ubyte backdrop_palette[768]; MALLOC(cr, credits, 1); if (!cr) return; cr->have_bin_file = 0; cr->buffer_line = 0; cr->first_line_offset = 0; cr->extra_inc = 0; cr->done = 0; cr->row = 0; // Clear out all tex buffer lines. for (i=0; i<NUM_LINES; i++ ) cr->buffer[i][0] = 0; sprintf(filename, "%s", CREDITS_FILE); cr->have_bin_file = 0; if (credits_filename) { strcpy(filename,credits_filename); cr->have_bin_file = 1; } cr->file = PHYSFSX_openReadBuffered( filename ); if (cr->file == NULL) { char nfile[32]; if (credits_filename) { d_free(cr); return; //ok to not find special filename } tempp = strchr(filename, '.'); *tempp = '\0'; sprintf(nfile, "%s.txb", filename); cr->file = PHYSFSX_openReadBuffered(nfile); if (cr->file == NULL) Error("Missing CREDITS.TEX and CREDITS.TXB file\n"); cr->have_bin_file = 1; } set_screen_mode(SCREEN_MENU); gr_use_palette_table( "credits.256" ); cr->backdrop.bm_data=NULL; pcx_error = pcx_read_bitmap(STARS_BACKGROUND,&cr->backdrop, BM_LINEAR,backdrop_palette); if (pcx_error != PCX_ERROR_NONE) { PHYSFS_close(cr->file); d_free(cr); return; } songs_play_song( SONG_CREDITS, 1 ); gr_remap_bitmap_good( &cr->backdrop,backdrop_palette, -1, -1 ); gr_set_current_canvas(NULL); show_fullscr(&cr->backdrop); gr_palette_load( gr_palette ); key_flush(); wind = window_create(&grd_curscreen->sc_canvas, 0, 0, SWIDTH, SHEIGHT, (int (*)(window *, d_event *, void *))credits_handler, cr); if (!wind) { d_event event = { EVENT_WINDOW_CLOSE }; credits_handler(NULL, &event, cr); return; } while (window_exists(wind)) event_process(); }
void menubar_init( char * file ) { int i,j, np; int aw, w, h; PHYSFS_file * infile; char buffer[200]; char buf1[200]; char buf2[200]; int menu, item; num_menus = state = 0; // This method should be faster than explicitly setting all the variables (I think) memset(Menu, 0, sizeof(Menu)); for (i=0; i < MAXMENUS; i++ ) for (j=0; j< MAXITEMS; j++ ) Menu[i].Item[j].Hotkey = -1; infile = PHYSFSX_openReadBuffered( file ); if (!infile) return; while ( PHYSFSX_fgets( buffer, 200, infile) != NULL ) { if ( buffer[0] == ';' ) continue; CommaParse( 0, buf1, buffer ); menu = atoi( buf1 ); if (menu >= MAXMENUS) Error("Too many menus (%d).",menu); CommaParse( 1, buf1, buffer ); item = atoi(buf1 ); if (item >= MAXITEMS) Error("Too many items (%d) in menu %d.",item+1,menu); CommaParse( 2, buf1, buffer ); ul_xlate(buf1); if (buf1[0] != '-' ) { sprintf( buf2, " %s ", buf1 ); Menu[menu].Item[item].Text = d_strdup(buf2); } else Menu[menu].Item[item].Text = d_strdup(buf1); Menu[menu].Item[item].InactiveText = d_strdup(Menu[menu].Item[item].Text); j= 0; for (i=0; i<=strlen(Menu[menu].Item[item].Text); i++ ) { np = Menu[menu].Item[item].Text[i]; if (np != CC_UNDERLINE) Menu[menu].Item[item].InactiveText[j++] = np; } CommaParse( 3, buf1, buffer ); if (buf1[0]=='{' && buf1[1] =='}') Menu[menu].Item[item].Hotkey = -1; else { i = DecodeKeyText(buf1); if (i<1) { Error("Unknown key, %s, in %s\n", buf1, file ); } else { Menu[menu].Item[item].Hotkey = i; } } CommaParse( 4, buf1, buffer ); if (strlen(buf1)) { Menu[menu].Item[item].user_function = func_get(buf1, &np); if (Menu[menu].Item[item].user_function==NULL) { Error( "Unknown function, %s, in %s\n", buf1, file ); //ui_messagebox( -2, -2, 1, buffer, "Ok" ); } } Menu[menu].Item[item].x = Menu[menu].x; Menu[menu].Item[item].y = Menu[menu].y; if ( Menu[menu].Item[item].Text[0] == '-' ) { w = 1; h = 3; } else { gr_get_string_size( Menu[menu].Item[item].Text, &w, &h, &aw ); w += 2; h += 2; } if (menu==0) { Menu[0].h = h; Menu[0].Item[item].x = Menu[0].x + Menu[0].w; Menu[0].Item[item].y = Menu[0].y; Menu[item+1].x = Menu[0].x + Menu[0].w; Menu[item+1].y = Menu[0].h - 2; Menu[0].Item[item].w = w; Menu[0].Item[item].h = h; Menu[0].w += w; }else { if ( w > Menu[menu].w ) { Menu[menu].w = w; for (i=0; i< Menu[menu].NumItems; i++ ) Menu[menu].Item[i].w = Menu[menu].w; } Menu[menu].Item[item].w = Menu[menu].w; Menu[menu].Item[item].x = Menu[menu].x; Menu[menu].Item[item].y = Menu[menu].y+Menu[menu].h; Menu[menu].Item[item].h = h; Menu[menu].h += h; } if ( item >= Menu[menu].NumItems ) { Menu[menu].NumItems = item+1; } if ( menu >= num_menus ) num_menus = menu+1; } Menu[0].w = 700; PHYSFS_close( infile ); }
int load_mine_data_compiled(PHYSFS_file *LoadFile) { int i, segnum, sidenum; ubyte compiled_version; short temp_short; ushort temp_ushort = 0; ubyte bit_mask; d1_pig_present = PHYSFSX_exists(D1_PIGFILE,1); #if 0 // the following will be deleted once reading old pigfiles works reliably if (d1_pig_present) { PHYSFS_file * d1_Piggy_fp = PHYSFSX_openReadBuffered( D1_PIGFILE ); switch (PHYSFS_fileLength(d1_Piggy_fp)) { case D1_SHARE_BIG_PIGSIZE: case D1_SHARE_10_PIGSIZE: case D1_SHARE_PIGSIZE: case D1_10_BIG_PIGSIZE: case D1_10_PIGSIZE: //d1_pig_present = 0; } PHYSFS_close (d1_Piggy_fp); } #endif if (!strcmp(strchr(Gamesave_current_filename, '.'), ".sdl")) New_file_format_load = 0; // descent 1 shareware else New_file_format_load = 1; // For compiled levels, textures map to themselves, prevent tmap_override always being gray, // bug which Matt and John refused to acknowledge, so here is Mike, fixing it. #ifdef EDITOR for (i=0; i<MAX_TEXTURES; i++) tmap_xlate_table[i] = i; #endif // memset( Segments, 0, sizeof(segment)*MAX_SEGMENTS ); fuelcen_reset(); //=============================== Reading part ============================== compiled_version = PHYSFSX_readByte(LoadFile); (void)compiled_version; if (New_file_format_load) Num_vertices = PHYSFSX_readShort(LoadFile); else Num_vertices = PHYSFSX_readInt(LoadFile); Assert( Num_vertices <= MAX_VERTICES ); if (New_file_format_load) Num_segments = PHYSFSX_readShort(LoadFile); else Num_segments = PHYSFSX_readInt(LoadFile); Assert( Num_segments <= MAX_SEGMENTS ); for (i = 0; i < Num_vertices; i++) PHYSFSX_readVector( &(Vertices[i]), LoadFile); for (segnum=0; segnum<Num_segments; segnum++ ) { #ifdef EDITOR Segments[segnum].segnum = segnum; Segments[segnum].group = 0; #endif if (New_file_format_load) bit_mask = PHYSFSX_readByte(LoadFile); else bit_mask = 0x7f; // read all six children and special stuff... if (Gamesave_current_version == 5) { // d2 SHAREWARE level read_special(segnum,bit_mask,LoadFile); read_verts(segnum,LoadFile); read_children(segnum,bit_mask,LoadFile); } else { read_children(segnum,bit_mask,LoadFile); read_verts(segnum,LoadFile); if (Gamesave_current_version <= 1) { // descent 1 level read_special(segnum,bit_mask,LoadFile); } } Segments[segnum].objects = -1; if (Gamesave_current_version <= 5) { // descent 1 thru d2 SHAREWARE level // Read fix Segments[segnum].static_light (shift down 5 bits, write as short) temp_ushort = PHYSFSX_readShort(LoadFile); Segment2s[segnum].static_light = ((fix)temp_ushort) << 4; //PHYSFS_read( LoadFile, &Segments[segnum].static_light, sizeof(fix), 1 ); } // Read the walls as a 6 byte array for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++ ) { Segments[segnum].sides[sidenum].pad = 0; } if (New_file_format_load) bit_mask = PHYSFSX_readByte(LoadFile); else bit_mask = 0x3f; // read all six sides for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++) { ubyte byte_wallnum; if (bit_mask & (1 << sidenum)) { byte_wallnum = PHYSFSX_readByte(LoadFile); if ( byte_wallnum == 255 ) Segments[segnum].sides[sidenum].wall_num = -1; else Segments[segnum].sides[sidenum].wall_num = byte_wallnum; } else Segments[segnum].sides[sidenum].wall_num = -1; } for (sidenum=0; sidenum<MAX_SIDES_PER_SEGMENT; sidenum++ ) { if ( (Segments[segnum].children[sidenum]==-1) || (Segments[segnum].sides[sidenum].wall_num!=-1) ) { // Read short Segments[segnum].sides[sidenum].tmap_num; if (New_file_format_load) { temp_ushort = PHYSFSX_readShort(LoadFile); Segments[segnum].sides[sidenum].tmap_num = temp_ushort & 0x7fff; } else Segments[segnum].sides[sidenum].tmap_num = PHYSFSX_readShort(LoadFile); if (Gamesave_current_version <= 1) Segments[segnum].sides[sidenum].tmap_num = convert_d1_tmap_num(Segments[segnum].sides[sidenum].tmap_num); if (New_file_format_load && !(temp_ushort & 0x8000)) Segments[segnum].sides[sidenum].tmap_num2 = 0; else { // Read short Segments[segnum].sides[sidenum].tmap_num2; Segments[segnum].sides[sidenum].tmap_num2 = PHYSFSX_readShort(LoadFile); if (Gamesave_current_version <= 1 && Segments[segnum].sides[sidenum].tmap_num2 != 0) Segments[segnum].sides[sidenum].tmap_num2 = convert_d1_tmap_num(Segments[segnum].sides[sidenum].tmap_num2); } // Read uvl Segments[segnum].sides[sidenum].uvls[4] (u,v>>5, write as short, l>>1 write as short) for (i=0; i<4; i++ ) { temp_short = PHYSFSX_readShort(LoadFile); Segments[segnum].sides[sidenum].uvls[i].u = ((fix)temp_short) << 5; temp_short = PHYSFSX_readShort(LoadFile); Segments[segnum].sides[sidenum].uvls[i].v = ((fix)temp_short) << 5; temp_ushort = PHYSFSX_readShort(LoadFile); Segments[segnum].sides[sidenum].uvls[i].l = ((fix)temp_ushort) << 1; //PHYSFS_read( LoadFile, &Segments[segnum].sides[sidenum].uvls[i].l, sizeof(fix), 1 ); } } else { Segments[segnum].sides[sidenum].tmap_num = 0; Segments[segnum].sides[sidenum].tmap_num2 = 0; for (i=0; i<4; i++ ) { Segments[segnum].sides[sidenum].uvls[i].u = 0; Segments[segnum].sides[sidenum].uvls[i].v = 0; Segments[segnum].sides[sidenum].uvls[i].l = 0; } } } } #if 0 { FILE *fp; fp = fopen("segments.out", "wt"); for (i = 0; i <= Highest_segment_index; i++) { side sides[MAX_SIDES_PER_SEGMENT]; // 6 sides short children[MAX_SIDES_PER_SEGMENT]; // indices of 6 children segments, front, left, top, right, bottom, back short verts[MAX_VERTICES_PER_SEGMENT]; // vertex ids of 4 front and 4 back vertices int objects; // pointer to objects in this segment for (j = 0; j < MAX_SIDES_PER_SEGMENT; j++) { sbyte type; // replaces num_faces and tri_edge, 1 = quad, 2 = 0:2 triangulation, 3 = 1:3 triangulation ubyte pad; //keep us longword alligned short wall_num; short tmap_num; short tmap_num2; uvl uvls[4]; vms_vector normals[2]; // 2 normals, if quadrilateral, both the same. fprintf(fp, "%d\n", Segments[i].sides[j].type); fprintf(fp, "%d\n", Segments[i].sides[j].pad); fprintf(fp, "%d\n", Segments[i].sides[j].wall_num); fprintf(fp, "%d\n", Segments[i].tmap_num); } fclose(fp); } } #endif Highest_vertex_index = Num_vertices-1; Highest_segment_index = Num_segments-1; validate_segment_all(); // Fill in side type and normals. for (i=0; i<Num_segments; i++) { if (Gamesave_current_version > 5) segment2_read(&Segment2s[i], LoadFile); fuelcen_activate( &Segments[i], Segment2s[i].special ); } reset_objects(1); //one object, the player return 0; }
//loads the specfied mission from the mission list. //build_mission_list() must have been called. //Returns true if mission loaded ok, else false. int load_mission(mle *mission) { PHYSFS_file *mfile; char buf[PATH_MAX], *v; if (Current_mission) free_mission(); Current_mission = d_malloc(sizeof(Mission)); if (!Current_mission) return 0; *(mle *) Current_mission = *mission; Current_mission->path = d_strdup(mission->path); Current_mission->filename = Current_mission->path + (mission->filename - mission->path); Current_mission->n_secret_levels = 0; //init vars Last_level = 0; Last_secret_level = 0; memset(&Briefing_text_filename, '\0', sizeof(Briefing_text_filename)); memset(&Ending_text_filename, '\0', sizeof(Ending_text_filename)); Secret_level_table = NULL; Level_names = NULL; Secret_level_names = NULL; // for Descent 1 missions, load descent.hog if (!PHYSFSX_contfile_init("descent.hog", 1)) Error("descent.hog not available!\n"); if (!d_stricmp(Current_mission_filename, D1_MISSION_FILENAME)) return load_mission_d1(); //read mission from file switch (mission->location) { case ML_MISSIONDIR: strcpy(buf,MISSION_DIR); break; default: Int3(); //fall through case ML_CURDIR: strcpy(buf,""); break; } strcat(buf, mission->path); strcat(buf,".msn"); PHYSFSEXT_locateCorrectCase(buf); mfile = PHYSFSX_openReadBuffered(buf); if (mfile == NULL) { free_mission(); return 0; //error! } //for non-builtin missions, load HOG strcpy(buf+strlen(buf)-4,".hog"); //change extension PHYSFSEXT_locateCorrectCase(buf); if (PHYSFSX_exists(buf,1)) PHYSFSX_contfile_init(buf, 0); snprintf(Briefing_text_filename, sizeof(Briefing_text_filename), "%s.tex",Current_mission_filename); if (!PHYSFSX_exists(Briefing_text_filename,1)) snprintf(Briefing_text_filename, sizeof(Briefing_text_filename), "%s.txb",Current_mission_filename); snprintf(Ending_text_filename, sizeof(Ending_text_filename), "%s.tex",Current_mission_filename); if (!PHYSFSX_exists(Ending_text_filename,1)) snprintf(Ending_text_filename, sizeof(Ending_text_filename), "%s.txb",Current_mission_filename); while (PHYSFSX_fgets(buf,sizeof(buf),mfile)) { if (istok(buf,"type")) continue; //already have name, go to next line else if (istok(buf,"briefing")) { if ((v = get_value(buf)) != NULL) { add_term(v); if (strlen(v) < FILENAME_LEN && strlen(v) > 0) { char *tmp, *ptr; MALLOC(tmp, char, FILENAME_LEN); snprintf(tmp, FILENAME_LEN, "%s", v); if ((ptr = strrchr(tmp, '.'))) // if there's a filename extension, kill it. No one knows it's the right one. *ptr = '\0'; strncat(tmp, ".tex", sizeof(char)*FILENAME_LEN); // apply tex-extenstion if (PHYSFSX_exists(tmp,1)) // check if this file exists ... snprintf(Briefing_text_filename, FILENAME_LEN, "%s", tmp); // ... and apply ... else // ... otherwise ... { if ((ptr = strrchr(tmp, '.'))) *ptr = '\0'; strncat(tmp, ".txb", sizeof(char)*FILENAME_LEN); // apply txb extension if (PHYSFSX_exists(tmp,1)) // check if this file exists ... snprintf(Briefing_text_filename, FILENAME_LEN, "%s", tmp); // ... and apply ... } d_free(tmp); } } } else if (istok(buf,"ending")) { if ((v = get_value(buf)) != NULL) { add_term(v); if (strlen(v) < FILENAME_LEN && strlen(v) > 0) { char *tmp, *ptr; MALLOC(tmp, char, FILENAME_LEN); snprintf(tmp, FILENAME_LEN, "%s", v); if ((ptr = strrchr(tmp, '.'))) // if there's a filename extension, kill it. No one knows it's the right one. *ptr = '\0'; strncat(tmp, ".tex", sizeof(char)*FILENAME_LEN); // apply tex-extenstion if (PHYSFSX_exists(tmp,1)) // check if this file exists ... snprintf(Briefing_text_filename, FILENAME_LEN, "%s", tmp); // ... and apply ... else // ... otherwise ... { if ((ptr = strrchr(tmp, '.'))) *ptr = '\0'; strncat(tmp, ".txb", sizeof(char)*FILENAME_LEN); // apply txb extension if (PHYSFSX_exists(tmp,1)) // check if this file exists ... snprintf(Ending_text_filename, FILENAME_LEN, "%s", tmp); // ... and apply ... } d_free(tmp); } } } else if (istok(buf,"num_levels")) { if ((v=get_value(buf))!=NULL) { int n_levels,i; n_levels = atoi(v); Assert(n_levels <= MAX_LEVELS_PER_MISSION); n_levels = min(n_levels, MAX_LEVELS_PER_MISSION); MALLOC(Level_names, d_fname, n_levels); if (!Level_names) { free_mission(); return 0; } for (i=0;i<n_levels;i++) { PHYSFSX_fgets(buf,sizeof(buf),mfile); add_term(buf); if (strlen(buf) <= 12) { strcpy(Level_names[i],buf); Last_level++; } else break; } } } else if (istok(buf,"num_secrets")) { if ((v=get_value(buf))!=NULL) { int i; N_secret_levels = atoi(v); Assert(N_secret_levels <= MAX_SECRET_LEVELS_PER_MISSION); N_secret_levels = min(N_secret_levels, MAX_SECRET_LEVELS_PER_MISSION); MALLOC(Secret_level_names, d_fname, N_secret_levels); if (!Secret_level_names) { free_mission(); return 0; } MALLOC(Secret_level_table, ubyte, N_secret_levels); if (!Secret_level_table) { free_mission(); return 0; } for (i=0;i<N_secret_levels;i++) { char *t; PHYSFSX_fgets(buf,sizeof(buf),mfile); if ((t=strchr(buf,','))!=NULL) *t++=0; else break; add_term(buf); if (strlen(buf) <= 12) { strcpy(Secret_level_names[i],buf); Secret_level_table[i] = atoi(t); if (Secret_level_table[i]<1 || Secret_level_table[i]>Last_level) break; Last_secret_level--; } else break; } } } } PHYSFS_close(mfile); if (Last_level <= 0) { free_mission(); //no valid mission loaded return 0; } return 1; }
//loads a level (.LVL) file from disk //returns 0 if success, else error code int load_level(const char * filename_passed) { #ifdef EDITOR int use_compiled_level=1; #endif PHYSFS_file * LoadFile; char filename[PATH_MAX]; int sig, minedata_offset, gamedata_offset, hostagetext_offset; int mine_err, game_err; #ifdef NETWORK int i; #endif #ifdef NETWORK if (Game_mode & GM_NETWORK) { for (i=0;i<MAX_POWERUP_TYPES;i++) { MaxPowerupsAllowed[i]=0; PowerupsInMine[i]=0; } } #endif #ifdef COMPACT_SEGS ncache_flush(); #endif #ifndef RELEASE Level_being_loaded = filename_passed; #endif strcpy(filename,filename_passed); #ifdef EDITOR //if we have the editor, try the LVL first, no matter what was passed. //if we don't have an LVL, try what was passed or SDL/RDL //if we don't have the editor, we just use what was passed change_filename_extension(filename,filename_passed,".lvl"); use_compiled_level = 0; if (!PHYSFSX_exists(filename,1)) { char *p = strrchr(filename_passed, '.'); if (d_stricmp(p, ".lvl")) strcpy(filename, filename_passed); // set to what was passed else change_filename_extension(filename, filename, ".rdl"); use_compiled_level = 1; } #endif if (!PHYSFSX_exists(filename,1)) sprintf(filename,"%s%s",MISSION_DIR,filename_passed); LoadFile = PHYSFSX_openReadBuffered( filename ); if (!LoadFile) { #ifdef EDITOR return 1; #else Error("Can't open file <%s>\n",filename); #endif } strcpy( Gamesave_current_filename, filename ); sig = PHYSFSX_readInt(LoadFile); Gamesave_current_version = PHYSFSX_readInt(LoadFile); minedata_offset = PHYSFSX_readInt(LoadFile); gamedata_offset = PHYSFSX_readInt(LoadFile); Assert(sig == MAKE_SIG('P','L','V','L')); (void)sig; if (Gamesave_current_version < 5) hostagetext_offset = PHYSFSX_readInt(LoadFile); PHYSFSX_fseek(LoadFile,minedata_offset,SEEK_SET); #ifdef EDITOR if (!use_compiled_level) mine_err = load_mine_data(LoadFile); else #endif //NOTE LINK TO ABOVE!! mine_err = load_mine_data_compiled(LoadFile); /* !!!HACK!!! * Descent 1 - Level 19: OBERON MINE has some ugly overlapping rooms (segment 484). * HACK to make this issue less visible by moving one vertex a little. */ if (Current_mission && !d_stricmp("Descent: First Strike",Current_mission_longname) && !d_stricmp("level19.rdl",filename) && PHYSFS_fileLength(LoadFile) == 136706) Vertices[1905].z =-385*F1_0; if (mine_err == -1) { //error!! PHYSFS_close(LoadFile); return 2; } PHYSFSX_fseek(LoadFile,gamedata_offset,SEEK_SET); game_err = load_game_data(LoadFile); if (game_err == -1) { //error!! PHYSFS_close(LoadFile); return 3; } (void)hostagetext_offset; //======================== CLOSE FILE ============================= PHYSFS_close( LoadFile ); #if 0 //def EDITOR #ifndef RELEASE write_game_text_file(filename); if (Errors_in_mine) { if (is_real_level(filename)) { char ErrorMessage[200]; sprintf( ErrorMessage, "Warning: %i errors in %s!\n", Errors_in_mine, Level_being_loaded ); stop_time(); gr_palette_load(gr_palette); nm_messagebox( NULL, 1, "Continue", ErrorMessage ); start_time(); } } #endif #endif #ifdef EDITOR //If an old version, ask the use if he wants to save as new version if (((LEVEL_FILE_VERSION>1) && Gamesave_current_version<LEVEL_FILE_VERSION) || mine_err==1 || game_err==1) { char ErrorMessage[200]; sprintf( ErrorMessage, "You just loaded a old version level. Would\n" "you like to save it as a current version level?"); gr_palette_load(gr_palette); if (nm_messagebox( NULL, 2, "Don't Save", "Save", ErrorMessage )==1) save_level(filename); } #endif #ifdef EDITOR if (EditorWindow) editor_status_fmt("Loaded NEW mine %s, \"%s\"",filename,Current_level_name); #endif #if !defined(NDEBUG) && !defined(COMPACT_SEGS) if (check_segment_connections()) nm_messagebox( "ERROR", 1, "Ok", "Connectivity errors detected in\n" "mine. See monochrome screen for\n" "details, and contact Matt or Mike." ); #endif return 0; }
int state_get_save_file(char * fname, char * dsc, int multi, int blind_save) { PHYSFS_file *fp; int i, choice, version; newmenu_item m[NUM_SAVES+2]; char filename[NUM_SAVES+1][30]; char desc[NUM_SAVES+1][DESC_LENGTH+16]; char id[5]; int valid=0; for (i=0;i<NUM_SAVES; i++ ) { sc_bmp[i] = NULL; if ( !multi ) sprintf( filename[i], PLAYER_DIR "%s.sg%x", Players[Player_num].callsign, i ); else sprintf( filename[i], PLAYER_DIR "%s.mg%x", Players[Player_num].callsign, i ); valid = 0; fp = PHYSFSX_openReadBuffered(filename[i]); if ( fp ) { //Read id //FIXME: check for swapped file, react accordingly... PHYSFS_read(fp, id, sizeof(char) * 4, 1); if ( !memcmp( id, dgss_id, 4 )) { //Read version PHYSFS_read(fp, &version, sizeof(int), 1); if (version >= STATE_COMPATIBLE_VERSION) { // Read description PHYSFS_read(fp, desc[i], sizeof(char) * DESC_LENGTH, 1); //rpad_string( desc[i], DESC_LENGTH-1 ); // Read thumbnail //sc_bmp[i] = gr_create_bitmap(THUMBNAIL_W,THUMBNAIL_H ); //PHYSFS_read(fp, sc_bmp[i]->bm_data, THUMBNAIL_W * THUMBNAIL_H, 1); valid = 1; } } PHYSFS_close(fp); } if (!valid) { strcpy( desc[i], TXT_EMPTY ); //rpad_string( desc[i], DESC_LENGTH-1 ); } m[i].type = NM_TYPE_INPUT_MENU; m[i].text = desc[i]; m[i].text_len = DESC_LENGTH-1; } sc_last_item = -1; if (blind_save && state_default_item >= 0) choice = state_default_item; else choice = newmenu_do1(NULL, "Save Game", NUM_SAVES, m, NULL, state_default_item); for (i=0; i<NUM_SAVES; i++ ) { if ( sc_bmp[i] ) gr_free_bitmap( sc_bmp[i] ); } if (choice > -1) { strcpy( fname, filename[choice] ); strcpy( dsc, desc[choice] ); state_default_item = choice; return choice+1; } return 0; }
int ReadConfigFile() { PHYSFS_file *infile; char *line, *token, *value, *ptr; // set defaults GameCfg.DigiVolume = 8; GameCfg.MusicVolume = 8; GameCfg.ReverseStereo = 0; GameCfg.OrigTrackOrder = 0; #if defined(__APPLE__) && defined(__MACH__) GameCfg.MusicType = MUSIC_TYPE_REDBOOK; #else GameCfg.MusicType = MUSIC_TYPE_BUILTIN; #endif GameCfg.CMLevelMusicPlayOrder = MUSIC_CM_PLAYORDER_CONT; GameCfg.CMLevelMusicTrack[0] = -1; GameCfg.CMLevelMusicTrack[1] = -1; memset(GameCfg.CMLevelMusicPath,0,PATH_MAX+1); memset(GameCfg.CMMiscMusic[SONG_TITLE],0,PATH_MAX+1); memset(GameCfg.CMMiscMusic[SONG_BRIEFING],0,PATH_MAX+1); memset(GameCfg.CMMiscMusic[SONG_ENDLEVEL],0,PATH_MAX+1); memset(GameCfg.CMMiscMusic[SONG_ENDGAME],0,PATH_MAX+1); memset(GameCfg.CMMiscMusic[SONG_CREDITS],0,PATH_MAX+1); #if defined(__APPLE__) && defined(__MACH__) GameCfg.OrigTrackOrder = 1; GameCfg.CMLevelMusicPlayOrder = MUSIC_CM_PLAYORDER_LEVEL; snprintf(GameCfg.CMLevelMusicPath, PATH_MAX, "%s", "descent.m3u"); snprintf(GameCfg.CMMiscMusic[SONG_TITLE], PATH_MAX, "%s%s", PHYSFS_getUserDir(), "Music/iTunes/iTunes Music/Insanity/Descent/02 Primitive Rage.mp3"); snprintf(GameCfg.CMMiscMusic[SONG_BRIEFING], PATH_MAX, "%s%s", PHYSFS_getUserDir(), "Music/iTunes/iTunes Music/Insanity/Descent/03 Outerlimits.mp3"); snprintf(GameCfg.CMMiscMusic[SONG_ENDLEVEL], PATH_MAX, "%s%s", PHYSFS_getUserDir(), "Music/iTunes/iTunes Music/Insanity/Descent/04 Close Call.mp3"); snprintf(GameCfg.CMMiscMusic[SONG_ENDGAME], PATH_MAX, "%s%s", PHYSFS_getUserDir(), "Music/iTunes/iTunes Music/Insanity/Descent/14 Insanity.mp3"); snprintf(GameCfg.CMMiscMusic[SONG_CREDITS], PATH_MAX, "%s%s", PHYSFS_getUserDir(), "Music/iTunes/iTunes Music/Insanity/Descent/05 The Darkness Of Space.mp3"); #endif GameCfg.GammaLevel = 0; memset(GameCfg.LastPlayer,0,CALLSIGN_LEN+1); memset(GameCfg.LastMission,0,MISSION_NAME_LEN+1); GameCfg.ResolutionX = 640; GameCfg.ResolutionY = 480; GameCfg.AspectX = 3; GameCfg.AspectY = 4; GameCfg.WindowMode = 0; GameCfg.TexFilt = 0; GameCfg.VSync = 0; GameCfg.Multisample = 0; GameCfg.FPSIndicator = 0; GameCfg.Grabinput = 1; infile = PHYSFSX_openReadBuffered("descent.cfg"); if (infile == NULL) { return 1; } while (!PHYSFS_eof(infile)) { int max_len = PHYSFS_fileLength(infile); // to be fully safe, assume the whole cfg consists of one big line MALLOC(line, char, max_len); memset(line, 0, max_len); PHYSFSX_gets(infile, line); ptr = &(line[0]); while (isspace(*ptr)) ptr++; if (*ptr != '\0') { token = strtok(ptr, "="); value = strtok(NULL, "="); if (!value) value = ""; if (!strcmp(token, DigiVolumeStr)) GameCfg.DigiVolume = strtol(value, NULL, 10); else if (!strcmp(token, MusicVolumeStr)) GameCfg.MusicVolume = strtol(value, NULL, 10); else if (!strcmp(token, ReverseStereoStr)) GameCfg.ReverseStereo = strtol(value, NULL, 10); else if (!strcmp(token, OrigTrackOrderStr)) GameCfg.OrigTrackOrder = strtol(value, NULL, 10); else if (!strcmp(token, MusicTypeStr)) GameCfg.MusicType = strtol(value, NULL, 10); else if (!strcmp(token, CMLevelMusicPlayOrderStr)) GameCfg.CMLevelMusicPlayOrder = strtol(value, NULL, 10); else if (!strcmp(token, CMLevelMusicTrack0Str)) GameCfg.CMLevelMusicTrack[0] = strtol(value, NULL, 10); else if (!strcmp(token, CMLevelMusicTrack1Str)) GameCfg.CMLevelMusicTrack[1] = strtol(value, NULL, 10); else if (!strcmp(token, CMLevelMusicPathStr)) { char * p; strncpy( GameCfg.CMLevelMusicPath, value, PATH_MAX ); p = strchr( GameCfg.CMLevelMusicPath, '\n'); if ( p ) *p = 0; } else if (!strcmp(token, CMMiscMusic0Str)) { char * p; strncpy( GameCfg.CMMiscMusic[SONG_TITLE], value, PATH_MAX ); p = strchr( GameCfg.CMMiscMusic[SONG_TITLE], '\n'); if ( p ) *p = 0; } else if (!strcmp(token, CMMiscMusic1Str)) { char * p; strncpy( GameCfg.CMMiscMusic[SONG_BRIEFING], value, PATH_MAX ); p = strchr( GameCfg.CMMiscMusic[SONG_BRIEFING], '\n'); if ( p ) *p = 0; } else if (!strcmp(token, CMMiscMusic2Str)) { char * p; strncpy( GameCfg.CMMiscMusic[SONG_ENDLEVEL], value, PATH_MAX ); p = strchr( GameCfg.CMMiscMusic[SONG_ENDLEVEL], '\n'); if ( p ) *p = 0; } else if (!strcmp(token, CMMiscMusic3Str)) { char * p; strncpy( GameCfg.CMMiscMusic[SONG_ENDGAME], value, PATH_MAX ); p = strchr( GameCfg.CMMiscMusic[SONG_ENDGAME], '\n'); if ( p ) *p = 0; } else if (!strcmp(token, CMMiscMusic4Str)) { char * p; strncpy( GameCfg.CMMiscMusic[SONG_CREDITS], value, PATH_MAX ); p = strchr( GameCfg.CMMiscMusic[SONG_CREDITS], '\n'); if ( p ) *p = 0; } else if (!strcmp(token, GammaLevelStr)) { GameCfg.GammaLevel = strtol(value, NULL, 10); gr_palette_set_gamma( GameCfg.GammaLevel ); } else if (!strcmp(token, LastPlayerStr)) { char * p; strncpy( GameCfg.LastPlayer, value, CALLSIGN_LEN ); p = strchr( GameCfg.LastPlayer, '\n'); if ( p ) *p = 0; } else if (!strcmp(token, LastMissionStr)) { char * p; strncpy( GameCfg.LastMission, value, MISSION_NAME_LEN ); p = strchr( GameCfg.LastMission, '\n'); if ( p ) *p = 0; } else if (!strcmp(token, ResolutionXStr)) GameCfg.ResolutionX = strtol(value, NULL, 10); else if (!strcmp(token, ResolutionYStr)) GameCfg.ResolutionY = strtol(value, NULL, 10); else if (!strcmp(token, AspectXStr)) GameCfg.AspectX = strtol(value, NULL, 10); else if (!strcmp(token, AspectYStr)) GameCfg.AspectY = strtol(value, NULL, 10); else if (!strcmp(token, WindowModeStr)) GameCfg.WindowMode = strtol(value, NULL, 10); else if (!strcmp(token, TexFiltStr)) GameCfg.TexFilt = strtol(value, NULL, 10); else if (!strcmp(token, VSyncStr)) GameCfg.VSync = strtol(value, NULL, 10); else if (!strcmp(token, MultisampleStr)) GameCfg.Multisample = strtol(value, NULL, 10); else if (!strcmp(token, FPSIndicatorStr)) GameCfg.FPSIndicator = strtol(value, NULL, 10); else if (!strcmp(token, GrabinputStr)) GameCfg.Grabinput = strtol(value, NULL, 10); } d_free(line); } PHYSFS_close(infile); if ( GameCfg.DigiVolume > 8 ) GameCfg.DigiVolume = 8; if ( GameCfg.MusicVolume > 8 ) GameCfg.MusicVolume = 8; if (GameCfg.ResolutionX >= 320 && GameCfg.ResolutionY >= 200) Game_screen_mode = SM(GameCfg.ResolutionX,GameCfg.ResolutionY); return 0; }
void ui_pad_read( int n, char * filename ) { char * ptr; char buffer[100]; char text[100]; char line_buffer[200]; PHYSFS_file * infile; int linenumber = 0; int i; int keycode, functionnumber; infile = PHYSFSX_openReadBuffered( filename ); if (!infile) { Warning( "Couldn't find %s\n", filename ); return; } MALLOC( KeyPad[n], UI_KEYPAD, 1 ); for (i=0; i < 17; i++ ) { MALLOC( KeyPad[n]->buttontext[i], char, 100 ); } KeyPad[n]->numkeys = 0; for (i=0; i<100; i++ ) { KeyPad[n]->keycode[i] = -1; KeyPad[n]->function_number[i] = 0; } while ( linenumber < 22) { PHYSFSX_fgets( buffer, 100, infile ); switch( linenumber+1 ) { case 1: strncpy( KeyPad[n]->description, buffer, 100 ); break; //===================== ROW 0 ============================== case 3: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[0], "%s\n", text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[1], "%s\n", text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[2], "%s\n", text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[3], "%s\n", text ); break; case 4: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[0], "%s%s\n", KeyPad[n]->buttontext[0],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[1], "%s%s\n", KeyPad[n]->buttontext[1],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[2], "%s%s\n", KeyPad[n]->buttontext[2],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[3], "%s%s\n", KeyPad[n]->buttontext[3],text ); break; case 5: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[0], "%s%s", KeyPad[n]->buttontext[0],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[1], "%s%s", KeyPad[n]->buttontext[1],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[2], "%s%s", KeyPad[n]->buttontext[2],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[3], "%s%s", KeyPad[n]->buttontext[3],text ); break; //===================== ROW 1 ============================== case 7: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[4], "%s\n", text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[5], "%s\n", text ); LineParse( 3, text, buffer); sprintf( KeyPad[n]->buttontext[6], "%s\n", text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[7], "%s\n", text ); break; case 8: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[4], "%s%s\n", KeyPad[n]->buttontext[4],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[5], "%s%s\n", KeyPad[n]->buttontext[5],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[6], "%s%s\n", KeyPad[n]->buttontext[6],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[7], "%s%s\n", KeyPad[n]->buttontext[7],text ); break; case 9: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[4], "%s%s", KeyPad[n]->buttontext[4],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[5], "%s%s", KeyPad[n]->buttontext[5],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[6], "%s%s", KeyPad[n]->buttontext[6],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[7], "%s%s\n", KeyPad[n]->buttontext[7],text ); break; case 10: ptr = strrchr( buffer, (char) 179 ); *ptr = 0; ptr = strrchr( buffer, (char) 180 ); ptr++; sprintf( KeyPad[n]->buttontext[7], "%s%s\n", KeyPad[n]->buttontext[7],ptr ); break; //======================= ROW 2 ============================== case 11: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[8], "%s\n", text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[9], "%s\n", text ); LineParse( 3, text, buffer); sprintf( KeyPad[n]->buttontext[10], "%s\n", text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[7], "%s%s\n", KeyPad[n]->buttontext[7],text ); break; case 12: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[8], "%s%s\n", KeyPad[n]->buttontext[8],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[9], "%s%s\n", KeyPad[n]->buttontext[9],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[10], "%s%s\n", KeyPad[n]->buttontext[10],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[7], "%s%s\n", KeyPad[n]->buttontext[7],text ); break; case 13: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[8], "%s%s", KeyPad[n]->buttontext[8],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[9], "%s%s", KeyPad[n]->buttontext[9],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[10], "%s%s", KeyPad[n]->buttontext[10],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[7], "%s%s", KeyPad[n]->buttontext[7],text ); break; // ====================== ROW 3 ========================= case 15: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[11], "%s\n", text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[12], "%s\n", text ); LineParse( 3, text, buffer); sprintf( KeyPad[n]->buttontext[13], "%s\n", text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[14], "%s\n", text ); break; case 16: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[11], "%s%s\n", KeyPad[n]->buttontext[11],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[12], "%s%s\n", KeyPad[n]->buttontext[12],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[13], "%s%s\n", KeyPad[n]->buttontext[13],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[14], "%s%s\n", KeyPad[n]->buttontext[14],text ); break; case 17: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[11], "%s%s", KeyPad[n]->buttontext[11],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[12], "%s%s", KeyPad[n]->buttontext[12],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[13], "%s%s", KeyPad[n]->buttontext[13],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[14], "%s%s\n", KeyPad[n]->buttontext[14],text ); break; case 18: ptr = strrchr( buffer, (char) 179 ); *ptr = 0; ptr = strrchr( buffer, (char) 180 ); ptr++; sprintf( KeyPad[n]->buttontext[14], "%s%s\n", KeyPad[n]->buttontext[14], ptr ); break; //======================= ROW 4 ========================= case 19: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[15], "%s\n", text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[16], "%s\n", text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[14], "%s%s\n", KeyPad[n]->buttontext[14],text ); break; case 20: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[15], "%s%s\n", KeyPad[n]->buttontext[15],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[16], "%s%s\n", KeyPad[n]->buttontext[16],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[14], "%s%s\n", KeyPad[n]->buttontext[14],text ); break; case 21: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[15], "%s%s", KeyPad[n]->buttontext[15],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[16], "%s%s", KeyPad[n]->buttontext[16],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[14], "%s%s", KeyPad[n]->buttontext[14],text ); break; } linenumber++; } // Get the keycodes... while (PHYSFSX_fgets(line_buffer, 200, infile)) { sscanf(line_buffer, " %s %s ", text, buffer); keycode = DecodeKeyText(text); functionnumber = func_get_index(buffer); if (functionnumber==-1) { Error( "Unknown function, %s, in %s\n", buffer, filename ); } else if (keycode==-1) { Error( "Unknown keystroke, %s, in %s\n", text, filename ); //ui_messagebox( -2, -2, 1, buffer, "Ok" ); } else { KeyPad[n]->keycode[KeyPad[n]->numkeys] = keycode; KeyPad[n]->function_number[KeyPad[n]->numkeys] = functionnumber; KeyPad[n]->numkeys++; } } PHYSFS_close(infile); }