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; }
void load_robot_replacements(const d_fname &level_name) { int t,i,j; char ifile_name[FILENAME_LEN]; change_filename_extension(ifile_name, level_name, ".HXM" ); auto 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,static_cast<const char *>(level_name),N_robot_types-1); robot_info_read(fp, Robot_info[i]); } 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,static_cast<const char *>(level_name),N_robot_joints-1); jointpos_read(fp, Robot_joints[i]); } 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,static_cast<const char *>(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 >= ObjBitmaps.size()) Error("Object bitmap number (%d) out of range in (%s). Range = [0..%" DXX_PRI_size_type "].", i, static_cast<const char *>(level_name), ObjBitmaps.size() - 1); bitmap_index_read(fp, ObjBitmaps[i]); } 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 >= ObjBitmapPtrs.size()) Error("Object bitmap pointer (%d) out of range in (%s). Range = [0..%" DXX_PRI_size_type "].", i, static_cast<const char *>(level_name), ObjBitmapPtrs.size() - 1); ObjBitmapPtrs[i] = PHYSFSX_readShort(fp); } Robot_replacements_loaded = 1; }
/* * reads n weapon_info structs from a PHYSFS_file */ int weapon_info_read_n(weapon_info *wi, int n, PHYSFS_file *fp, int file_version) { int i, j; for (i = 0; i < n; i++) { wi[i].render_type = PHYSFSX_readByte(fp); wi[i].persistent = PHYSFSX_readByte(fp); wi[i].model_num = PHYSFSX_readShort(fp); wi[i].model_num_inner = PHYSFSX_readShort(fp); wi[i].flash_vclip = PHYSFSX_readByte(fp); wi[i].robot_hit_vclip = PHYSFSX_readByte(fp); wi[i].flash_sound = PHYSFSX_readShort(fp); wi[i].wall_hit_vclip = PHYSFSX_readByte(fp); wi[i].fire_count = PHYSFSX_readByte(fp); wi[i].robot_hit_sound = PHYSFSX_readShort(fp); wi[i].ammo_usage = PHYSFSX_readByte(fp); wi[i].weapon_vclip = PHYSFSX_readByte(fp); wi[i].wall_hit_sound = PHYSFSX_readShort(fp); wi[i].destroyable = PHYSFSX_readByte(fp); wi[i].matter = PHYSFSX_readByte(fp); wi[i].bounce = PHYSFSX_readByte(fp); wi[i].homing_flag = PHYSFSX_readByte(fp); wi[i].speedvar = PHYSFSX_readByte(fp); wi[i].flags = PHYSFSX_readByte(fp); wi[i].flash = PHYSFSX_readByte(fp); wi[i].afterburner_size = PHYSFSX_readByte(fp); if (file_version >= 3) wi[i].children = PHYSFSX_readByte(fp); else /* Set the type of children correctly when using old * datafiles. In earlier descent versions this was simply * hard-coded in create_smart_children(). */ switch (i) { case SMART_ID: wi[i].children = PLAYER_SMART_HOMING_ID; break; case SUPERPROX_ID: wi[i].children = SMART_MINE_HOMING_ID; break; #if 0 /* not present in shareware */ case ROBOT_SUPERPROX_ID: wi[i].children = ROBOT_SMART_MINE_HOMING_ID; break; case EARTHSHAKER_ID: wi[i].children = EARTHSHAKER_MEGA_ID; break; #endif default: wi[i].children = -1; break; } wi[i].energy_usage = PHYSFSX_readFix(fp); wi[i].fire_wait = PHYSFSX_readFix(fp); if (file_version >= 3) wi[i].multi_damage_scale = PHYSFSX_readFix(fp); else /* FIXME: hack this to set the real values */ wi[i].multi_damage_scale = F1_0; bitmap_index_read(&wi[i].bitmap, fp); wi[i].blob_size = PHYSFSX_readFix(fp); wi[i].flash_size = PHYSFSX_readFix(fp); wi[i].impact_size = PHYSFSX_readFix(fp); for (j = 0; j < NDL; j++) wi[i].strength[j] = PHYSFSX_readFix(fp); for (j = 0; j < NDL; j++) wi[i].speed[j] = PHYSFSX_readFix(fp); wi[i].mass = PHYSFSX_readFix(fp); wi[i].drag = PHYSFSX_readFix(fp); wi[i].thrust = PHYSFSX_readFix(fp); wi[i].po_len_to_width_ratio = PHYSFSX_readFix(fp); wi[i].light = PHYSFSX_readFix(fp); wi[i].lifetime = PHYSFSX_readFix(fp); wi[i].damage_radius = PHYSFSX_readFix(fp); bitmap_index_read(&wi[i].picture, fp); if (file_version >= 3) bitmap_index_read(&wi[i].hires_picture, fp); else wi[i].hires_picture.index = wi[i].picture.index; } return i; }