Exemple #1
0
void iface_read_settings_singleplayer(iface_type *iface)
{
	int							singleplayer_head_tag,
								settings_tag,options_head_tag,option_tag;
	char						path[1024];
	iface_sp_option_type		*sp_option;

		// get xml file
		
	file_paths_data(&file_path_setup,path,"Settings","Singleplayer","xml");
	if (!xml_open_file(path)) return;
	
	singleplayer_head_tag=xml_findrootchild("Singleplayer");		
    if (singleplayer_head_tag==-1) {
		xml_close_file();
		return;
	}

		// settings
		
    settings_tag=xml_findfirstchild("Settings",singleplayer_head_tag);
    if (settings_tag!=-1) {
		iface->singleplayer.skill=xml_get_attribute_boolean(settings_tag,"skill");
		iface->singleplayer.map_pick=xml_get_attribute_boolean(settings_tag,"map_pick");
		iface->singleplayer.map_pick_ss_reveal_id=xml_get_attribute_int_default(settings_tag,"map_pick_ss_reveal_id",-1);
	}

		// options

	options_head_tag=xml_findfirstchild("Options",singleplayer_head_tag);
	if (options_head_tag!=-1) {
		
		iface->singleplayer.option_list.noption=0;
		
		option_tag=xml_findfirstchild("Option",options_head_tag);
		while (option_tag!=-1) {
			
			sp_option=&iface->singleplayer.option_list.options[iface->singleplayer.option_list.noption];
	
			xml_get_attribute_text(option_tag,"name",sp_option->name,name_str_len);
			xml_get_attribute_text(option_tag,"description",sp_option->descript,64);
			sp_option->ss_reveal_id=xml_get_attribute_int_default(option_tag,"ss_reveal_id",-1);
			
			iface->singleplayer.option_list.noption++;
			if (iface->singleplayer.option_list.noption==max_net_option) break;

			option_tag=xml_findnextchild(option_tag);
		}
	}
	

	xml_close_file();
}
Exemple #2
0
bool write_mesh_xml(model_type *model)
{
    char					path[1024];
    bool					ok;

    // start

    xml_new_file();

    xml_add_tagstart("Model");
    xml_add_attribute_int("version",2);
    xml_add_tagend(FALSE);

    // encode

    encode_mesh_v2_xml(model);

    // save model

    xml_add_tagclose("Model");

    sprintf(path,"%s/mesh.xml",model->load_base_path);
    ok=xml_save_file(path);

    xml_close_file();

    return(ok);
}
Exemple #3
0
bool iface_write_settings_singleplayer(iface_type *iface,char *err_str)
{
	int							n;
	char						path[1024];
	bool						ok;
	iface_sp_option_type		*sp_option;
	
		// start new file
		
	xml_new_file();

		// singleplayer

	xml_add_tagstart("Singleplayer");
	xml_add_tagend(FALSE);

		// settings
		
	xml_add_tagstart("Settings");
	xml_add_attribute_boolean("skill",iface->singleplayer.skill);
	xml_add_attribute_boolean("map_pick",iface->singleplayer.map_pick);
	xml_add_attribute_int("map_pick_ss_reveal_id",iface->singleplayer.map_pick_ss_reveal_id);
	xml_add_tagend(TRUE);

		// options

	xml_add_tagstart("Options");
	xml_add_tagend(FALSE);

	sp_option=iface->singleplayer.option_list.options;

	for (n=0;n!=iface->singleplayer.option_list.noption;n++) {
		xml_add_tagstart("Option");
		xml_add_attribute_text("name",sp_option->name);
		xml_add_attribute_text("description",sp_option->descript);
		xml_add_attribute_int("ss_reveal_id",sp_option->ss_reveal_id);
		xml_add_tagend(TRUE);

		sp_option++;
	}

	xml_add_tagclose("Options");

	xml_add_tagclose("Singleplayer");

        // write the xml
		
	file_paths_data(&file_path_setup,path,"Settings","Singleplayer","xml");
		
	ok=xml_save_file(path,err_str);
    xml_close_file();
	
	return(ok);
}
Exemple #4
0
bool read_mesh_xml(model_type *model)
{
    int						version,model_head;
    char					sub_path[1024],path[1024];

    // load the model xml

    sprintf(sub_path,"Models/%s",model->name);
    file_paths_data(&modelutility_settings.file_path_setup,path,sub_path,"mesh","xml");

    if (!xml_open_file(path)) return(FALSE);

    model_head=xml_findrootchild("Model");
    if (model_head==-1) {
        xml_close_file();
        return(FALSE);
    }

    // get the version

    version=xml_get_attribute_int_default(model_head,"version",1);

    // decode

    switch (version) {
    case 1:
        decode_mesh_v1_xml(model,model_head);
        break;
    case 2:
        decode_mesh_v2_xml(model,model_head);
        break;
    }

    xml_close_file();

    return(TRUE);
}
Exemple #5
0
GNode *xml_parse_file(const gchar *path)
{
	XMLFile *file;
	GNode *node;

	file = xml_open_file(path);
	if (file == NULL)
		return NULL;

	xml_get_dtd(file);

	node = xml_build_tree(file, NULL, file->level);

	xml_close_file(file);

#if defined(SPARSE_MEMORY)
	if (debug_get_mode())
		string_table_get_stats(xml_string_table);
#endif

	return node;
}
Exemple #6
0
void read_settings_action(void)
{
	int					n,actions_head_tag,action_tag,idx;
	char				name[name_str_len],path[1024];
						
		// default actions
		
	for (n=0;n!=ncontrol;n++) {
		strcpy(action_display[n].display_name,control_names_str[n]);
		action_display[n].show=TRUE;
	}
	
		// read in actions from setting files
		
	file_paths_data(&setup.file_path_setup,path,"Settings","Actions","xml");
	if (!xml_open_file(path)) return;
	
		// decode the file
      
    actions_head_tag=xml_findrootchild("Actions");
    if (actions_head_tag!=-1) {
	
		action_tag=xml_findfirstchild("Action",actions_head_tag);
		
		while (action_tag!=-1) {
			xml_get_attribute_text(action_tag,"name",name,name_str_len);
			
			idx=setup_find_control_for_name(name);
			if (idx!=-1) {
				xml_get_attribute_text(action_tag,"display",action_display[idx].display_name,name_str_len);
				action_display[idx].show=xml_get_attribute_boolean(action_tag,"show");
			}
			
			action_tag=xml_findnextchild(action_tag);
		}
	}
	
	xml_close_file();
}
Exemple #7
0
/*
 * Load properties from file.
 * return: Status code.
 */
gint xmlprops_load_file( XmlProperty *props ) {
	XMLFile *file = NULL;

	cm_return_val_if_fail( props != NULL, -1 );
	props->retVal = MGU_NO_FILE;
	file = xml_open_file( props->path );
	if( file == NULL ) {
		return props->retVal;
	}

	props->retVal = MGU_BAD_FORMAT;
	if( xml_get_dtd( file ) == 0 ) {
		if( xml_parse_next_tag( file ) == 0 ) {
			if( xml_compare_tag( file, XMLS_ELTAG_PROP_LIST ) ) {
				xmlprops_read_props( props, file );
				props->retVal = MGU_SUCCESS;
			}
		}
	}
	xml_close_file( file );

	return props->retVal;
}
Exemple #8
0
bool read_pose_xml(model_type *model)
{
	int						n,k,t,npose,pose_idx,cnt,
							tag,model_head,bone_tag,poses_tag,pose_tag,constraint_bone_idx;
	char					sub_path[1024],path[1024];
	model_tag				constraint_bone_tag;
    model_bone_move_type	*bone_move;
	model_pose_type			*pose;

        // load the pose xml
        
	sprintf(sub_path,"Models/%s",model->name);
	file_paths_data(&modelutility_settings.file_path_setup,path,sub_path,"pose","xml");

	if (!xml_open_file(path)) return(FALSE);

    model_head=xml_findrootchild("Model");
    if (model_head==-1) return(FALSE);
    
        // poses
        
    poses_tag=xml_findfirstchild("Poses",model_head);

    npose=xml_countchildren(poses_tag);
	pose_tag=xml_findfirstchild("Pose",poses_tag);
    
    for (n=0;n!=npose;n++) {

			// add new pose

		pose_idx=model_pose_add(model);
		if (pose_idx==-1) {
			xml_close_file();
			return(FALSE);
		}

		pose=&model->poses[pose_idx];

			// set pose data

        xml_get_attribute_text(pose_tag,"name",pose->name,64);
        
        bone_move=pose->bone_moves;
        for (k=0;k!=model->nbone;k++) {
            bone_move->rot.x=bone_move->rot.z=bone_move->rot.y=0.0f;
            bone_move->mov.x=bone_move->mov.z=bone_move->mov.y=1.0f;
			bone_move->acceleration=0;
			bone_move->skip_blended=FALSE;
			bone_move->constraint.bone_idx=-1;
			bone_move->constraint.offset.x=bone_move->constraint.offset.y=bone_move->constraint.offset.z=0;
			bone_move++;
        }
            
        bone_tag=xml_findfirstchild("Bones",pose_tag);
        
        cnt=xml_countchildren(bone_tag);
		tag=xml_findfirstchild("Bone",bone_tag);
        
        for (k=0;k!=cnt;k++) {
		
            t=model_find_bone(model,xml_get_attribute_model_tag(tag,"tag"));
            if (t!=-1) {
                bone_move=&pose->bone_moves[t];
                xml_get_attribute_3_coord_float(tag,"rot",&bone_move->rot.x,&bone_move->rot.y,&bone_move->rot.z);
				xml_get_attribute_3_coord_float(tag,"move",&bone_move->mov.x,&bone_move->mov.y,&bone_move->mov.z);
				
				bone_move->acceleration=xml_get_attribute_float(tag,"acceleration");
				bone_move->skip_blended=xml_get_attribute_boolean(tag,"skip_blended");
				
				bone_move->constraint.bone_idx=-1;
				bone_move->constraint.offset.x=bone_move->constraint.offset.y=bone_move->constraint.offset.z=0;
				
				constraint_bone_tag=xml_get_attribute_model_tag(tag,"constraint_bone");
				if (constraint_bone_tag!=model_null_tag) {
					constraint_bone_idx=model_find_bone(model,constraint_bone_tag);
					if (constraint_bone_idx!=-1) {
						bone_move->constraint.bone_idx=constraint_bone_idx;
						xml_get_attribute_3_coord_int(tag,"constraint_offset",&bone_move->constraint.offset.x,&bone_move->constraint.offset.y,&bone_move->constraint.offset.z);
					}
				}
			}
		  
			tag=xml_findnextchild(tag);
        }
    
		pose_tag=xml_findnextchild(pose_tag);
    }

    xml_close_file();
    
    return(TRUE);
}
Exemple #9
0
bool write_pose_xml(model_type *model)
{
	int						n,k;
	char					path[1024];
	bool					ok;
    model_bone_move_type	*bone_move;
	model_pose_type			*pose;
	
    xml_new_file();
    
    xml_add_tagstart("Model");
    xml_add_tagend(FALSE);
    
        // model info
    
    xml_add_tagstart("Creator");
    xml_add_attribute_text("name","dim3 Animator");
    xml_add_attribute_text("version","1.0");
    xml_add_tagend(TRUE);
    
        // poses
   
    xml_add_tagstart("Poses");
    xml_add_tagend(FALSE);
    
    pose=model->poses;
    
    for (n=0;n!=model->npose;n++) {
    
        xml_add_tagstart("Pose");
        xml_add_attribute_text("name",pose->name);
        xml_add_tagend(FALSE);
        
        xml_add_tagstart("Bones");
        xml_add_tagend(FALSE);
        
        bone_move=pose->bone_moves;
        
        for (k=0;k!=model->nbone;k++) {
        
            if (write_bone_move(bone_move)) {
                xml_add_tagstart("Bone");
                xml_add_attribute_model_tag("tag",model->bones[k].tag);
                xml_add_attribute_3_coord_float("rot",bone_move->rot.x,bone_move->rot.y,bone_move->rot.z);
                xml_add_attribute_3_coord_float("move",bone_move->mov.x,bone_move->mov.y,bone_move->mov.z);
				
				xml_add_attribute_float("acceleration",bone_move->acceleration);
				xml_add_attribute_boolean("skip_blended",bone_move->skip_blended);
				
				if (bone_move->constraint.bone_idx!=-1) {
					xml_add_attribute_model_tag("constraint_bone",model->bones[bone_move->constraint.bone_idx].tag);
					xml_add_attribute_3_coord_int("constraint_offset",bone_move->constraint.offset.x,bone_move->constraint.offset.y,bone_move->constraint.offset.z);
				}
				
				xml_add_tagend(TRUE);
            }
            
            bone_move++;
        }
            
        xml_add_tagclose("Bones");
        xml_add_tagclose("Pose");
    
        pose++;
    }
    
    xml_add_tagclose("Poses");

        // finish model
        
    xml_add_tagclose("Model");
    
	sprintf(path,"%s/pose.xml",model->load_base_path);
	ok=xml_save_file(path);

    xml_close_file();

	return(ok);
}
Exemple #10
0
void iface_read_settings_halo(iface_type *iface)
{
	int					nhalo,halos_head_tag,halo_tag,tag;
	char				path[1024];
	iface_halo_type		*halo;

		// read in interface from setting files
		
	file_paths_data(&file_path_setup,path,"Settings","Halos","xml");
	if (!xml_open_file(path)) return;
	
		// get counts
		
    halos_head_tag=xml_findrootchild("Halos");
    if (halos_head_tag==-1) {
		xml_close_file();
		return;
	}

	nhalo=xml_countchildren(halos_head_tag);

	if (nhalo==0) {
		xml_close_file();
		return;
	}

		// read the halos

	halo_tag=xml_findfirstchild("Halo",halos_head_tag);
	
	while (halo_tag!=-1) {
	
			// create a new halo

		if (iface->halo_list.nhalo>=max_iface_halo) {
			xml_close_file();
			return;
		}
			
		halo=&iface->halo_list.halos[iface->halo_list.nhalo];
		iface->halo_list.nhalo++;
			
			// read settings
			
		xml_get_attribute_text(halo_tag,"name",halo->name,name_str_len);
		
		tag=xml_findfirstchild("Image",halo_tag);
		if (tag!=-1) {
			xml_get_attribute_text(tag,"file",halo->bitmap_name,file_str_len);
		}
		
		halo->min_dist=3000;
		halo->max_dist=50000;
		halo->min_size=500;
		halo->max_size=200;
		halo->min_alpha=0.8f;
		halo->max_alpha=0.05f;
		halo->no_clip_object=FALSE;
		halo->no_clip_self=TRUE;

		tag=xml_findfirstchild("Distance",halo_tag);
		if (tag!=-1) {
			halo->min_dist=xml_get_attribute_int(tag,"min");
			halo->max_dist=xml_get_attribute_int(tag,"max");
		}

		tag=xml_findfirstchild("Size",halo_tag);
		if (tag!=-1) {
			halo->min_size=xml_get_attribute_int(tag,"min");
			halo->max_size=xml_get_attribute_int(tag,"max");
		}

		tag=xml_findfirstchild("Alpha",halo_tag);
		if (tag!=-1) {
			halo->min_alpha=xml_get_attribute_float(tag,"min");
			halo->max_alpha=xml_get_attribute_float(tag,"max");
		}

		tag=xml_findfirstchild("Option",halo_tag);
		if (tag!=-1) {
			halo->no_clip_object=xml_get_attribute_boolean(tag,"no_clip_object");
			halo->no_clip_self=xml_get_attribute_boolean(tag,"no_clip_self");
		}
		
			// move on to next halo
			
		halo_tag=xml_findnextchild(halo_tag);
	}
	
	xml_close_file();
}
Exemple #11
0
bool iface_write_settings_halo(iface_type *iface,char *err_str)
{
	int					n;
	char				path[1024];
	bool				ok;
	iface_halo_type		*halo;
	
		// start new file
		
	xml_new_file();

	xml_add_tagstart("Halos");
	xml_add_tagend(FALSE);

	halo=iface->halo_list.halos;

	for (n=0;n!=iface->halo_list.nhalo;n++) {

		xml_add_tagstart("Halo");
		xml_add_attribute_text("name",halo->name);
		xml_add_tagend(FALSE);

		xml_add_tagstart("Image");
		xml_add_attribute_text("file",halo->bitmap_name);
		xml_add_tagend(TRUE);

		xml_add_tagstart("Distance");
		xml_add_attribute_int("min",halo->min_dist);
		xml_add_attribute_int("max",halo->max_dist);
		xml_add_tagend(TRUE);

		xml_add_tagstart("Size");
		xml_add_attribute_int("min",halo->min_size);
		xml_add_attribute_int("max",halo->max_size);
		xml_add_tagend(TRUE);

		xml_add_tagstart("Alpha");
		xml_add_attribute_float("min",halo->min_alpha);
		xml_add_attribute_float("max",halo->max_alpha);
		xml_add_tagend(TRUE);

		xml_add_tagstart("Option");
		xml_add_attribute_boolean("no_clip_object",halo->no_clip_object);
		xml_add_attribute_boolean("no_clip_self",halo->no_clip_self);
		xml_add_tagend(TRUE);

		xml_add_tagclose("Halo");

		halo++;
	}

	xml_add_tagclose("Halos");

        // write the xml
		
	file_paths_data(&file_path_setup,path,"Settings","Halos","xml");
		
	ok=xml_save_file(path,err_str);
    xml_close_file();
	
	return(ok);
}
Exemple #12
0
void read_settings_ring(void)
{
	int					nring,ring_head_tag,ring_tag,tag;
	char				path[1024];
	ring_type			*ring;

		// no rings yet

	server.rings=NULL;
	server.count.ring=0;

		// read in rings from setting files
		
	file_paths_data(&setup.file_path_setup,path,"Settings","Rings","xml");
	if (!xml_open_file(path)) return;
	
		// get counts
       
    ring_head_tag=xml_findrootchild("Rings");
    if (ring_head_tag==-1) {
		xml_close_file();
		return;
	}

	nring=xml_countchildren(ring_head_tag);

	if (nring==0) {
		xml_close_file();
		return;
	}

	server.rings=(ring_type*)malloc(sizeof(ring_type)*nring);
	if (server.rings==NULL) {
		xml_close_file();
		return;
	}

		// read in the rings

	ring_tag=xml_findfirstchild("Ring",ring_head_tag);
    
	while (ring_tag!=-1) {
	
			// create a new ring
			
		ring=&server.rings[server.count.ring];
		
		xml_get_attribute_text(ring_tag,"name",ring->name,name_str_len);
		
		ring->life_msec=1000;
		ring->blend_add=FALSE;

        tag=xml_findfirstchild("Settings",ring_tag);
        if (tag!=-1) {
            ring->life_msec=xml_get_attribute_int(tag,"time");
            ring->blend_add=xml_get_attribute_boolean(tag,"additive");
        }
		
		ring->animate.image_count=1;
		ring->animate.image_per_row=1;
		ring->animate.msec=200;
		ring->animate.loop=TRUE;
		ring->animate.loop_back=FALSE;
		
        tag=xml_findfirstchild("Image",ring_tag);
        if (tag!=-1) {
            xml_get_attribute_text(tag,"file",ring->bitmap_name,file_str_len);
            ring->animate.image_count=xml_get_attribute_int(tag,"count");
			ring->animate.image_per_row=(int)sqrt((float)ring->animate.image_count);
			ring->animate.msec=xml_get_attribute_int(tag,"time");
            ring->animate.loop=xml_get_attribute_boolean(tag,"loop");
            ring->animate.loop_back=xml_get_attribute_boolean(tag,"loop_back");
		}
		
        tag=xml_findfirstchild("Outer",ring_tag);
        if (tag!=-1) {
            ring->start_outer_size=xml_get_attribute_int(tag,"start");
            ring->end_outer_size=xml_get_attribute_int(tag,"end");
        }

        tag=xml_findfirstchild("Inner",ring_tag);
        if (tag!=-1) {
            ring->start_inner_size=xml_get_attribute_int(tag,"start");
            ring->end_inner_size=xml_get_attribute_int(tag,"end");
        }

        tag=xml_findfirstchild("Rotate",ring_tag);
        if (tag!=-1) {
            ring->ang.x=xml_get_attribute_float(tag,"x");
            ring->ang.y=xml_get_attribute_float(tag,"y");
            ring->ang.z=xml_get_attribute_float(tag,"z");
            ring->rot.x=xml_get_attribute_float_default(tag,"x_add",0.0f);
            ring->rot.y=xml_get_attribute_float_default(tag,"y_add",0.0f);
            ring->rot.z=xml_get_attribute_float_default(tag,"z_add",0.0f);
            ring->rot_accel.x=xml_get_attribute_float_default(tag,"x_accel",0.0f);
            ring->rot_accel.y=xml_get_attribute_float_default(tag,"y_accel",0.0f);
            ring->rot_accel.z=xml_get_attribute_float_default(tag,"z_accel",0.0f);
		}

        tag=xml_findfirstchild("Move",ring_tag);
        if (tag!=-1) {
            ring->vct.x=xml_get_attribute_float(tag,"x");
            ring->vct.y=xml_get_attribute_float(tag,"y");
            ring->vct.z=xml_get_attribute_float(tag,"z");
        }
		
		ring->start_color.r=ring->start_color.g=ring->start_color.b=1.0f;
		ring->end_color.r=ring->end_color.g=ring->end_color.b=1.0f;
		ring->team_tint=FALSE;

        tag=xml_findfirstchild("Color",ring_tag);
        if (tag!=-1) {
			xml_get_attribute_color(tag,"start",&ring->start_color);
			xml_get_attribute_color(tag,"end",&ring->end_color);
			ring->team_tint=xml_get_attribute_boolean(tag,"team");
       }
		
        tag=xml_findfirstchild("Alpha",ring_tag);
        if (tag!=-1) {
            ring->start_alpha=xml_get_attribute_float(tag,"start");
            ring->end_alpha=xml_get_attribute_float(tag,"end");
        }
	
			// move on to next ring
			
		server.count.ring++;
		
		ring_tag=xml_findnextchild(ring_tag);
	}
	
	xml_close_file();
}
Exemple #13
0
void read_settings_crosshair(void)
{
	int					ncrosshair,crosshairs_head_tag,crosshair_tag,tag;
	char				path[1024];
	crosshair_type		*crosshair;

		// no crosshairs yet

	server.crosshairs=NULL;
	server.count.crosshair=0;
	
		// read in crosshairs from setting files
		
	file_paths_data(&setup.file_path_setup,path,"Settings","Crosshairs","xml");
	if (!xml_open_file(path)) return;
	
		// get counts
		
    crosshairs_head_tag=xml_findrootchild("Crosshairs");
    if (crosshairs_head_tag==-1) {
		xml_close_file();
		return;
	}

	ncrosshair=xml_countchildren(crosshairs_head_tag);

	if (ncrosshair==0) {
		xml_close_file();
		return;
	}

	server.crosshairs=(crosshair_type*)malloc(sizeof(crosshair_type)*ncrosshair);
	if (server.crosshairs==NULL) {
		xml_close_file();
		return;
	}

		// read the crosshairs
	
	crosshair_tag=xml_findfirstchild("Crosshair",crosshairs_head_tag);
	
	while (crosshair_tag!=-1) {
	
			// create a new crosshair
			
		crosshair=&server.crosshairs[server.count.crosshair];
		
		xml_get_attribute_text(crosshair_tag,"name",crosshair->name,name_str_len);
		
		tag=xml_findfirstchild("Image",crosshair_tag);
		if (tag!=-1) {
			xml_get_attribute_text(tag,"file",crosshair->bitmap_name,file_str_len);
		}
		
			// move on to next crosshair
			
		server.count.crosshair++;
		
		crosshair_tag=xml_findnextchild(crosshair_tag);
	}
	
	xml_close_file();
}
Exemple #14
0
bool setup_xml_write(void)
{
	int							n,k;
	char						path[1024],tag_name[32];
	bool						ok;
	setup_action_type			*action;
	setup_network_hosts_type	*host;
	setup_network_option_type	*option;
	
		// start the setup file
		
    xml_new_file();
    
    xml_add_tagstart("Setup");
    xml_add_tagend(FALSE);
	
		// keys

    xml_key_write_int("Screen_Width",setup.screen_wid);
    xml_key_write_int("Screen_Height",setup.screen_high);
    xml_key_write_boolean("Lock_FPS_Refresh",setup.lock_fps_refresh);
	xml_key_write_float("Gamma",setup.gamma);
	xml_key_write_int("Tint",setup.tint_color_idx);
	xml_key_write_boolean("Texture_Compression",setup.texture_compression);
	xml_key_write_int("Anisotropic_Mode",setup.anisotropic_mode);
    xml_key_write_int("Mipmap_Mode",setup.mipmap_mode);
	xml_key_write_int("FSAA_Mode",setup.fsaa_mode);
	xml_key_write_boolean("Decal_On",setup.decal_on);
	xml_key_write_boolean("Shadow_On",setup.shadow_on);
	xml_key_write_float("Sound_Volume",setup.sound_volume);
	xml_key_write_boolean("Music_On",setup.music_on);
	xml_key_write_float("Music_Volume",setup.music_volume);
	xml_key_write_boolean("Always_Run",setup.always_run);
	xml_key_write_boolean("Toggle_Run",setup.toggle_run);
	xml_key_write_boolean("Invert_Look",setup.invert_look);
	xml_key_write_boolean("Mouse_Smooth",setup.mouse_smooth);
	xml_key_write_float("Mouse_X_Speed",setup.mouse_x.speed);
	xml_key_write_float("Mouse_X_Speed_Min",setup.mouse_x.speed_min);
	xml_key_write_float("Mouse_X_Speed_Max",setup.mouse_x.speed_max);
	xml_key_write_float("Mouse_X_Acceleration",setup.mouse_x.acceleration);
	xml_key_write_float("Mouse_X_Acceleration_Min",setup.mouse_x.acceleration_min);
	xml_key_write_float("Mouse_X_Acceleration_Max",setup.mouse_x.acceleration_max);
	xml_key_write_float("Mouse_Y_Speed",setup.mouse_y.speed);
	xml_key_write_float("Mouse_Y_Speed_Min",setup.mouse_y.speed_min);
	xml_key_write_float("Mouse_Y_Speed_Max",setup.mouse_y.speed_max);
	xml_key_write_float("Mouse_Y_Acceleration",setup.mouse_y.acceleration);
	xml_key_write_float("Mouse_Y_Acceleration_Min",setup.mouse_y.acceleration_min);
	xml_key_write_float("Mouse_Y_Acceleration_Max",setup.mouse_y.acceleration_max);
	xml_key_write_float("Joystick_X_Speed",setup.joystick_x.speed);
	xml_key_write_float("Joystick_X_Speed_Min",setup.joystick_x.speed_min);
	xml_key_write_float("Joystick_X_Speed_Max",setup.joystick_x.speed_max);
	xml_key_write_float("Joystick_X_Acceleration",setup.joystick_x.acceleration);
	xml_key_write_float("Joystick_X_Acceleration_Min",setup.joystick_x.acceleration_min);
	xml_key_write_float("Joystick_X_Acceleration_Max",setup.joystick_x.acceleration_max);
	xml_key_write_float("Joystick_Y_Speed",setup.joystick_y.speed);
	xml_key_write_float("Joystick_Y_Speed_Min",setup.joystick_y.speed_min);
	xml_key_write_float("Joystick_Y_Speed_Max",setup.joystick_y.speed_max);
	xml_key_write_float("Joystick_Y_Acceleration",setup.joystick_y.acceleration);
	xml_key_write_float("Joystick_Y_Acceleration_Min",setup.joystick_y.acceleration_min);
	xml_key_write_float("Joystick_Y_Acceleration_Max",setup.joystick_y.acceleration_max);
	xml_key_write_int("Joystick_Mode",setup.joystick_mode);
	xml_key_write_text("Network_Name",setup.network.name);
	xml_key_write_text("Network_Last_Map",setup.network.last_map);
	xml_key_write_int("Host_Bot_Count",setup.network.bot.count);
	xml_key_write_int("Host_Bot_Skill",setup.network.bot.skill);
	xml_key_write_int("Host_Game_Type",setup.network.game_type);
	xml_key_write_int("Host_Score_Limit",setup.network.score_limit);
	xml_key_write_boolean("Network_Show_Names",setup.network.show_names);
	xml_key_write_boolean("Debug_Console",setup.debug_console);
	xml_key_write_boolean("Window",setup.window);
	xml_key_write_boolean("Window_Editor",setup.window_editor);
	
		// actions

    xml_add_tagstart("Actions");
    xml_add_tagend(FALSE);
	
	action=setup.action_list.actions;
		
	for (n=0;n!=setup.action_list.naction;n++) {
		xml_add_tagstart("Action");
		xml_add_attribute_text("name",action->name);
			
		for (k=0;k!=max_setup_action_attach;k++) {
			if (action->attach[k][0]!=0x0) {
				sprintf(tag_name,"attach_%d",k);
				xml_add_attribute_text(tag_name,action->attach[k]);
			}
		}
           
	    xml_add_tagend(TRUE);
		action++;
	}

    xml_add_tagclose("Actions");
	
		// hosts

    xml_add_tagstart("Hosts");
    xml_add_tagend(FALSE);
	
	host=setup.network.hosts;
		
	for (n=0;n!=setup.network.nhost;n++) {
		xml_add_tagstart("Host");
		xml_add_attribute_text("ip",host->ip);
	    xml_add_tagend(TRUE);
		host++;
	}

    xml_add_tagclose("Hosts");
	
		// options
		
    xml_add_tagstart("Options");
    xml_add_tagend(FALSE);
	
	option=setup.network.options;
		
	for (n=0;n!=setup.network.noption;n++) {
		xml_add_tagstart("Option");
		xml_add_attribute_text("name",option->name);
	    xml_add_tagend(TRUE);
		option++;
	}

    xml_add_tagclose("Options");
		
		// close setup
		
    xml_add_tagclose("Setup");

        // save the setup
		// always save to user specific data
		
	file_paths_documents(&setup.file_path_setup,path,"Settings","Setup","xml");
		
	ok=xml_save_file(path);
    xml_close_file();
	
	return(ok);
}
Exemple #15
0
bool setup_xml_read_path(char *path)
{
	int							n,k,naction,nhost,noption,
								setup_tag,actions_tag,hosts_tag,options_tag,tag;
	char						tag_name[32];
	setup_action_type			*action;
	setup_network_hosts_type	*host;
	setup_network_option_type	*option;
	
		// read file
		
	setup_xml_default();

	if (!xml_open_file(path)) return(FALSE);
    
		// decode the file
       
    setup_tag=xml_findrootchild("Setup");
    if (setup_tag==-1) {
		xml_close_file();
		return(FALSE);
    }
	
		// keys

    xml_key_read_int(setup_tag,"Screen_Width",&setup.screen_wid);
    xml_key_read_int(setup_tag,"Screen_Height",&setup.screen_high);
	xml_key_read_boolean(setup_tag,"Lock_FPS_Refresh",&setup.lock_fps_refresh);
	xml_key_read_float(setup_tag,"Gamma",&setup.gamma);
    xml_key_read_int(setup_tag,"Tint",&setup.tint_color_idx);
    xml_key_read_boolean(setup_tag,"Texture_Compression",&setup.texture_compression);
    xml_key_read_int(setup_tag,"Anisotropic_Mode",&setup.anisotropic_mode);
    xml_key_read_int(setup_tag,"Mipmap_Mode",&setup.mipmap_mode);
	xml_key_read_int(setup_tag,"FSAA_Mode",&setup.fsaa_mode);
	xml_key_read_boolean(setup_tag,"Decal_On",&setup.decal_on);
	xml_key_read_boolean(setup_tag,"Shadow_On",&setup.shadow_on);
	xml_key_read_float(setup_tag,"Sound_Volume",&setup.sound_volume);
	xml_key_read_boolean(setup_tag,"Music_On",&setup.music_on);
	xml_key_read_float(setup_tag,"Music_Volume",&setup.music_volume);
	xml_key_read_boolean(setup_tag,"Always_Run",&setup.always_run);
	xml_key_read_boolean(setup_tag,"Toggle_Run",&setup.toggle_run);
	xml_key_read_boolean(setup_tag,"Invert_Look",&setup.invert_look);
	xml_key_read_boolean(setup_tag,"Mouse_Smooth",&setup.mouse_smooth);
	xml_key_read_float(setup_tag,"Mouse_X_Speed",&setup.mouse_x.speed);
	xml_key_read_float(setup_tag,"Mouse_X_Speed_Min",&setup.mouse_x.speed_min);
	xml_key_read_float(setup_tag,"Mouse_X_Speed_Max",&setup.mouse_x.speed_max);
	xml_key_read_float(setup_tag,"Mouse_X_Acceleration",&setup.mouse_x.acceleration);
	xml_key_read_float(setup_tag,"Mouse_X_Acceleration_Min",&setup.mouse_x.acceleration_min);
	xml_key_read_float(setup_tag,"Mouse_X_Acceleration_Max",&setup.mouse_x.acceleration_max);
	xml_key_read_float(setup_tag,"Mouse_Y_Speed",&setup.mouse_y.speed);
	xml_key_read_float(setup_tag,"Mouse_Y_Speed_Min",&setup.mouse_y.speed_min);
	xml_key_read_float(setup_tag,"Mouse_Y_Speed_Max",&setup.mouse_y.speed_max);
	xml_key_read_float(setup_tag,"Mouse_Y_Acceleration",&setup.mouse_y.acceleration);
	xml_key_read_float(setup_tag,"Mouse_Y_Acceleration_Min",&setup.mouse_y.acceleration_min);
	xml_key_read_float(setup_tag,"Mouse_Y_Acceleration_Max",&setup.mouse_y.acceleration_max);
	xml_key_read_float(setup_tag,"Joystick_X_Speed",&setup.joystick_x.speed);
	xml_key_read_float(setup_tag,"Joystick_X_Speed_Min",&setup.joystick_x.speed_min);
	xml_key_read_float(setup_tag,"Joystick_X_Speed_Max",&setup.joystick_x.speed_max);
	xml_key_read_float(setup_tag,"Joystick_X_Acceleration",&setup.joystick_x.acceleration);
	xml_key_read_float(setup_tag,"Joystick_X_Acceleration_Min",&setup.joystick_x.acceleration_min);
	xml_key_read_float(setup_tag,"Joystick_X_Acceleration_Max",&setup.joystick_x.acceleration_max);
	xml_key_read_float(setup_tag,"Joystick_Y_Speed",&setup.joystick_y.speed);
	xml_key_read_float(setup_tag,"Joystick_Y_Speed_Min",&setup.joystick_y.speed_min);
	xml_key_read_float(setup_tag,"Joystick_Y_Speed_Max",&setup.joystick_y.speed_max);
	xml_key_read_float(setup_tag,"Joystick_Y_Acceleration",&setup.joystick_y.acceleration);
	xml_key_read_float(setup_tag,"Joystick_Y_Acceleration_Min",&setup.joystick_y.acceleration_min);
	xml_key_read_float(setup_tag,"Joystick_Y_Acceleration_Max",&setup.joystick_y.acceleration_max);
	xml_key_read_int(setup_tag,"Joystick_Mode",&setup.joystick_mode);
	xml_key_read_text(setup_tag,"Network_Name",setup.network.name,name_str_len);
	xml_key_read_text(setup_tag,"Network_Last_Map",setup.network.last_map,name_str_len);
	xml_key_read_int(setup_tag,"Host_Bot_Count",&setup.network.bot.count);
	xml_key_read_int(setup_tag,"Host_Bot_Skill",&setup.network.bot.skill);
	xml_key_read_int(setup_tag,"Host_Game_Type",&setup.network.game_type);
	xml_key_read_int(setup_tag,"Host_Score_Limit",&setup.network.score_limit);
	xml_key_read_boolean(setup_tag,"Network_Show_Names",&setup.network.show_names);
	xml_key_read_boolean(setup_tag,"Debug_Console",&setup.debug_console);
	xml_key_read_boolean(setup_tag,"Window",&setup.window);
	xml_key_read_boolean(setup_tag,"Window_Editor",&setup.window_editor);

		// fix some items

	setup_xml_fix_axis(&setup.mouse_x);
	setup_xml_fix_axis(&setup.mouse_y);
	
		// actions

    actions_tag=xml_findfirstchild("Actions",setup_tag);
    if (actions_tag!=-1) {
	
		naction=xml_countchildren(actions_tag);
		tag=xml_findfirstchild("Action",actions_tag);
		
		setup.action_list.naction=naction;
		action=setup.action_list.actions;
		
        for (n=0;n!=naction;n++) {
			xml_get_attribute_text(tag,"name",action->name,32);
			
			for (k=0;k!=max_setup_action_attach;k++) {
				sprintf(tag_name,"attach_%d",k);
				if (!xml_get_attribute_text(tag,tag_name,action->attach[k],32)) action->attach[k][0]=0x0;
			}
           
			tag=xml_findnextchild(tag);
			
			action++;
        }
	}

		// hosts

    hosts_tag=xml_findfirstchild("Hosts",setup_tag);
    if (hosts_tag!=-1) {
	
		nhost=xml_countchildren(hosts_tag);
		tag=xml_findfirstchild("Host",hosts_tag);
		
		setup.network.nhost=nhost;
		host=setup.network.hosts;
		
        for (n=0;n!=nhost;n++) {
			xml_get_attribute_text(tag,"ip",host->ip,256);

			tag=xml_findnextchild(tag);
			host++;
        }
	}
	
 		// options

    options_tag=xml_findfirstchild("Options",setup_tag);
    if (options_tag!=-1) {
	
		noption=xml_countchildren(options_tag);
		tag=xml_findfirstchild("Option",options_tag);

		setup.network.noption=noption;
		option=setup.network.options;
		
        for (n=0;n!=noption;n++) {
			xml_get_attribute_text(tag,"name",option->name,name_str_len);
			
			tag=xml_findnextchild(tag);
  			option++;
		}
	}
  
	xml_close_file();
	
	return(TRUE);
}
Exemple #16
0
bool setup_xml_read_path(char *path)
{
	int							n,k,naction,
								setup_tag,actions_tag,maps_tag,options_tag,tag;
	char						tag_name[32];
	setup_action_type			*action;
	
		// read file
		
	setup_xml_default();

	if (!xml_open_file(path)) return(FALSE);
    
		// decode the file
       
    setup_tag=xml_findrootchild("Setup");
    if (setup_tag==-1) {
		xml_close_file();
		return(FALSE);
    }
	
		// keys

	xml_key_read_int(setup_tag,"Screen_Width",&setup.screen_wid);
	xml_key_read_int(setup_tag,"Screen_Height",&setup.screen_high);
	xml_key_read_float(setup_tag,"Gamma",&setup.gamma);
	xml_key_read_int(setup_tag,"FSAA_Mode",&setup.fsaa_mode);
	xml_key_read_boolean(setup_tag,"Decal_On",&setup.decal_on);
	xml_key_read_boolean(setup_tag,"Shadow_On",&setup.shadow_on);
	xml_key_read_float(setup_tag,"Sound_Volume",&setup.sound_volume);
	xml_key_read_boolean(setup_tag,"Music_On",&setup.music_on);
	xml_key_read_float(setup_tag,"Music_Volume",&setup.music_volume);
	xml_key_read_boolean(setup_tag,"Always_Run",&setup.always_run);
	xml_key_read_boolean(setup_tag,"Toggle_Run",&setup.toggle_run);
	xml_key_read_boolean(setup_tag,"Invert_Look",&setup.invert_look);
	xml_key_read_boolean(setup_tag,"Auto_Aim",&setup.auto_aim);
	xml_key_read_boolean(setup_tag,"Mouse_Smooth",&setup.mouse_smooth);
	xml_key_read_float(setup_tag,"Mouse_Speed",&setup.mouse.speed);
	xml_key_read_float(setup_tag,"Mouse_Acceleration",&setup.mouse.acceleration);
	xml_key_read_float(setup_tag,"Joystick_Speed",&setup.joystick.speed);
	xml_key_read_float(setup_tag,"Joystick_Acceleration",&setup.joystick.acceleration);
	xml_key_read_text(setup_tag,"Network_Name",setup.network.name,name_str_len);
    xml_key_read_int(setup_tag,"Character",&setup.network.character_idx);
    xml_key_read_int(setup_tag,"Tint",&setup.network.tint_color_idx);
	xml_key_read_text(setup_tag,"Network_Custom_Host_IP",setup.network.custom_host_ip,64);
	xml_key_read_int(setup_tag,"Host_Bot_Count",&setup.network.bot.count);
	xml_key_read_int(setup_tag,"Host_Bot_Skill",&setup.network.bot.skill);
	xml_key_read_int(setup_tag,"Host_Game_Type",&setup.network.game_type);
	xml_key_read_int(setup_tag,"Host_Score_Limit",&setup.network.score_limit);
	xml_key_read_int(setup_tag,"Host_Game_Reset_Secs",&setup.network.game_reset_secs);
	xml_key_read_int(setup_tag,"Host_Respawn_Secs",&setup.network.respawn_secs);
	xml_key_read_boolean(setup_tag,"Network_Show_Names",&setup.network.show_names);
	xml_key_read_boolean(setup_tag,"Network_Map_Rotation",&setup.network.map_rotation);
	xml_key_read_boolean(setup_tag,"Window",&setup.window);
	xml_key_read_boolean(setup_tag,"Window_Editor",&setup.window_editor);
	xml_key_read_boolean(setup_tag,"No_HUD",&setup.no_hud);
	xml_key_read_boolean(setup_tag,"No_Draw_Weapon",&setup.no_draw_weapon);
	xml_key_read_boolean(setup_tag,"Metrics_On",&setup.metrics_on);
	xml_key_read_boolean(setup_tag,"Debug_On",&setup.debug_on);
	xml_key_read_boolean(setup_tag,"Ignore_FPS_Lock",&setup.ignore_fps_lock);
	xml_key_read_int(setup_tag,"Screen_dim3RTL_Width",&setup.screen_rtl_wid);
	xml_key_read_int(setup_tag,"Screen_dim3RTL_Height",&setup.screen_rtl_high);
	xml_key_read_boolean(setup_tag,"Screen_dim3RTL_Full_Window",&setup.screen_rtl_full_window);

		// actions

    actions_tag=xml_findfirstchild("Actions",setup_tag);
    if (actions_tag!=-1) {
	
		naction=xml_countchildren(actions_tag);
		tag=xml_findfirstchild("Action",actions_tag);
		
		setup.action_list.naction=naction;
		action=setup.action_list.actions;
		
        for (n=0;n!=naction;n++) {
			xml_get_attribute_text(tag,"name",action->name,32);
			
			for (k=0;k!=max_setup_action_attach;k++) {
				sprintf(tag_name,"attach_%d",k);
				xml_get_attribute_text(tag,tag_name,action->attach[k],32);
			}
           
			tag=xml_findnextchild(tag);
			
			action++;
        }
	}

 		// maps
		
    maps_tag=xml_findfirstchild("Maps",setup_tag);
    if (maps_tag!=-1) {
	
		setup.network.map_list.count=xml_countchildren(maps_tag);
		tag=xml_findfirstchild("Map",maps_tag);
		
        for (n=0;n!=setup.network.map_list.count;n++) {
			xml_get_attribute_text(tag,"name",setup.network.map_list.maps[n].name,name_str_len);
			tag=xml_findnextchild(tag);
 		}
	}
	
 		// options
		
    options_tag=xml_findfirstchild("Options",setup_tag);
    if (options_tag!=-1) {
	
		setup.network.option_list.count=xml_countchildren(options_tag);
		tag=xml_findfirstchild("Option",options_tag);
		
        for (n=0;n!=setup.network.option_list.count;n++) {
			xml_get_attribute_text(tag,"name",setup.network.option_list.options[n].name,name_str_len);
			tag=xml_findnextchild(tag);
 		}
	}
  
	xml_close_file();
	
	return(TRUE);
}
Exemple #17
0
bool setup_xml_write(void)
{
	int							n,k;
	char						path[1024],tag_name[32],err_str[256];
	bool						ok;
	setup_action_type			*action;
	
		// start the setup file
		
    xml_new_file();
    
    xml_add_tagstart("Setup");
    xml_add_tagend(FALSE);
	
		// keys

    xml_key_write_int("Screen_Width",setup.screen_wid);
    xml_key_write_int("Screen_Height",setup.screen_high);
	xml_key_write_float("Gamma",setup.gamma);
	xml_key_write_int("FSAA_Mode",setup.fsaa_mode);
	xml_key_write_boolean("Decal_On",setup.decal_on);
	xml_key_write_boolean("Shadow_On",setup.shadow_on);
	xml_key_write_float("Sound_Volume",setup.sound_volume);
	xml_key_write_boolean("Music_On",setup.music_on);
	xml_key_write_float("Music_Volume",setup.music_volume);
	xml_key_write_boolean("Always_Run",setup.always_run);
	xml_key_write_boolean("Toggle_Run",setup.toggle_run);
	xml_key_write_boolean("Invert_Look",setup.invert_look);
	xml_key_write_boolean("Auto_Aim",setup.auto_aim);
	xml_key_write_boolean("Mouse_Smooth",setup.mouse_smooth);
	xml_key_write_float("Mouse_Speed",setup.mouse.speed);
	xml_key_write_float("Mouse_Acceleration",setup.mouse.acceleration);
	xml_key_write_float("Joystick_Speed",setup.joystick.speed);
	xml_key_write_float("Joystick_Acceleration",setup.joystick.acceleration);
	xml_key_write_text("Network_Name",setup.network.name);
	xml_key_write_int("Character",setup.network.character_idx);
	xml_key_write_int("Tint",setup.network.tint_color_idx);
	xml_key_write_text("Network_Custom_Host_IP",setup.network.custom_host_ip);
	xml_key_write_int("Host_Bot_Count",setup.network.bot.count);
	xml_key_write_int("Host_Bot_Skill",setup.network.bot.skill);
	xml_key_write_int("Host_Game_Type",setup.network.game_type);
	xml_key_write_int("Host_Score_Limit",setup.network.score_limit);
	xml_key_write_int("Host_Game_Reset_Secs",setup.network.game_reset_secs);
	xml_key_write_int("Host_Respawn_Secs",setup.network.respawn_secs);
	xml_key_write_boolean("Network_Show_Names",setup.network.show_names);
	xml_key_write_boolean("Network_Map_Rotation",setup.network.map_rotation);
	xml_key_write_boolean("Window",setup.window);
	xml_key_write_boolean("Window_Editor",setup.window_editor);
	xml_key_write_boolean("No_HUD",setup.no_hud);
	xml_key_write_boolean("No_Draw_Weapon",setup.no_draw_weapon);
	xml_key_write_boolean("Metrics_On",setup.metrics_on);
	xml_key_write_boolean("Debug_On",setup.debug_on);
	xml_key_write_boolean("Ignore_FPS_Lock",setup.ignore_fps_lock);
    xml_key_write_int("Screen_dim3RTL_Width",setup.screen_rtl_wid);
    xml_key_write_int("Screen_dim3RTL_Height",setup.screen_rtl_high);
	xml_key_write_boolean("Screen_dim3RTL_Full_Window",setup.screen_rtl_full_window);

		// actions

    xml_add_tagstart("Actions");
    xml_add_tagend(FALSE);
	
	action=setup.action_list.actions;
		
	for (n=0;n!=setup.action_list.naction;n++) {
		xml_add_tagstart("Action");
		xml_add_attribute_text("name",action->name);
			
		for (k=0;k!=max_setup_action_attach;k++) {
			if (action->attach[k][0]!=0x0) {
				sprintf(tag_name,"attach_%d",k);
				xml_add_attribute_text(tag_name,action->attach[k]);
			}
		}
           
	    xml_add_tagend(TRUE);
		action++;
	}

    xml_add_tagclose("Actions");
	
		// maps
		
    xml_add_tagstart("Maps");
    xml_add_tagend(FALSE);
	
	for (n=0;n!=setup.network.map_list.count;n++) {
		xml_add_tagstart("Map");
		xml_add_attribute_text("name",setup.network.map_list.maps[n].name);
		xml_add_tagend(TRUE);
	}

    xml_add_tagclose("Maps");
	
		// options
		
    xml_add_tagstart("Options");
    xml_add_tagend(FALSE);
	
	for (n=0;n!=setup.network.option_list.count;n++) {
		xml_add_tagstart("Option");
		xml_add_attribute_text("name",setup.network.option_list.options[n].name);
		xml_add_tagend(TRUE);
	}

    xml_add_tagclose("Options");
		
		// close setup
		
    xml_add_tagclose("Setup");

        // save the setup
		// always save to user specific data
		
	file_paths_app_data(&file_path_setup,path,"Settings","Setup","xml");
		
	ok=xml_save_file(path,err_str);
    xml_close_file();
	
	return(ok);
}
Exemple #18
0
bool iface_write_settings_ring(iface_type *iface,char *err_str)
{
	int					n;
	char				path[1024];
	bool				ok;
	iface_ring_type		*ring;
	
		// start new file
		
	xml_new_file();

	xml_add_tagstart("Rings");
	xml_add_tagend(FALSE);

	ring=iface->ring_list.rings;

	for (n=0;n!=iface->ring_list.nring;n++) {

		xml_add_tagstart("Ring");
		xml_add_attribute_text("name",ring->name);
		xml_add_tagend(FALSE);
		
  		xml_add_tagstart("Settings");
		xml_add_attribute_int("time",ring->life_msec);
		xml_add_attribute_boolean("additive",ring->blend_add);
		xml_add_tagend(TRUE);
		
        xml_add_tagstart("Image");
		xml_add_attribute_text("file",ring->bitmap_name);
		xml_add_attribute_int("count",ring->animate.image_count);
		xml_add_attribute_int("time",ring->animate.msec);
		xml_add_attribute_boolean("loop",ring->animate.loop);
		xml_add_attribute_boolean("loop_back",ring->animate.loop_back);
		xml_add_tagend(TRUE);
		
        xml_add_tagstart("Outer");
		xml_add_attribute_int("start",ring->start_outer_size);
		xml_add_attribute_int("end",ring->end_outer_size);
		xml_add_tagend(TRUE);

        xml_add_tagstart("Inner");
		xml_add_attribute_int("start",ring->start_inner_size);
		xml_add_attribute_int("end",ring->end_inner_size);
		xml_add_tagend(TRUE);

        xml_add_tagstart("Rotate");
		xml_add_attribute_float("x",ring->ang.x);
		xml_add_attribute_float("y",ring->ang.y);
		xml_add_attribute_float("z",ring->ang.z);
		xml_add_attribute_float("x_add",ring->rot.x);
		xml_add_attribute_float("y_add",ring->rot.y);
		xml_add_attribute_float("z_add",ring->rot.z);
		xml_add_attribute_float("x_accel",ring->rot_accel.x);
		xml_add_attribute_float("y_accel",ring->rot_accel.y);
		xml_add_attribute_float("z_accel",ring->rot_accel.z);
		xml_add_tagend(TRUE);

        xml_add_tagstart("Move");
		xml_add_attribute_float("x",ring->vct.x);
		xml_add_attribute_float("y",ring->vct.y);
		xml_add_attribute_float("z",ring->vct.z);
		xml_add_tagend(TRUE);

        xml_add_tagstart("Color");
		xml_add_attribute_color("start",&ring->start_color);
		xml_add_attribute_color("end",&ring->end_color);
		xml_add_tagend(TRUE);

        xml_add_tagstart("Alpha");
        xml_add_attribute_float("start",ring->start_alpha);
        xml_add_attribute_float("end",ring->end_alpha);
		xml_add_tagend(TRUE);
	
		xml_add_tagclose("Ring");

		ring++;
	}

	xml_add_tagclose("Rings");

        // write the xml
		
	file_paths_data(&file_path_setup,path,"Settings","Rings","xml");
		
	ok=xml_save_file(path,err_str);
    xml_close_file();
	
	return(ok);
}