Example #1
0
void submarine::load(const xml_elem& parent)
{
	ship::load(parent);
	xml_elem dv = parent.child("diving");
	max_depth = dv.attrf("max_depth");
	dive_to = dv.attrf("dive_to");
	permanent_dive = dv.attrb("permanent_dive");
	dive_state = dive_states(dv.attru("dive_state"));
	bow_depth_rudder.load(dv.child("bow_depth_rudder"));
	stern_depth_rudder.load(dv.child("stern_depth_rudder"));

	xml_elem tp = parent.child("stored_torpedoes");
	torpedoes.clear();
	torpedoes.reserve(tp.attru("nr"));
	for (xml_elem::iterator it = tp.iterate("stored_torpedo"); !it.end(); it.next()) {
		torpedoes.push_back(stored_torpedo());
		torpedoes.back().load(gm, it.elem());
	}

	xml_elem sst = parent.child("sub_state");
	scope_raise_level = scope_raise_to_level = sst.attrf("scopeup");
	electric_engine = sst.attru("electric_engine");
	snorkelup = sst.attru("snorkelup");
	battery_level = sst.attrf("battery_level");
    
	// fixme: later move to ship, or even sea_object!
#if 0 // disabled to avoid abort when loading savegames
	xml_elem dm = parent.child("parts");
	parts.clear();
	parts.reserve(dm.attru("nr"));
	for (xml_elem::iterator it = tp.iterate("part"); !it.end(); it.next()) {
		//parts.push_back(part(it.elem()));
	}
#endif

	xml_elem tk = parent.child("tanks");
	for (xml_elem::iterator it = tp.iterate("tank"); !it.end(); it.next()) {
		xml_elem e = it.elem();
		unsigned id = e.attru("nr");
		if (id >= tanks.size()) throw error(std::string("invalid tank nr in ") + e.doc_name());
		tanks[id].load(e);
	}

	TDC.load(parent);
	sonarman.load(parent);
}
Example #2
0
void submarine::save(xml_elem& parent) const
{
	ship::save(parent);
	xml_elem dv = parent.add_child("diving");
	dv.set_attr(max_depth, "max_depth");
	dv.set_attr(dive_to, "dive_to");
	dv.set_attr(permanent_dive, "permanent_dive");
	dv.set_attr(dive_state, "dive_state");
	xml_elem ebdr = dv.add_child("bow_depth_rudder");
	bow_depth_rudder.save(ebdr);
	xml_elem esdr = dv.add_child("stern_depth_rudder");
	stern_depth_rudder.save(esdr);

	xml_elem tp = parent.add_child("stored_torpedoes");
	tp.set_attr(unsigned(torpedoes.size()), "nr");
	for (vector<stored_torpedo>::const_iterator it = torpedoes.begin(); it != torpedoes.end(); ++it) {
		//save a stored_torpedo node for each entry
		xml_elem stp = tp.add_child("stored_torpedo");
		it->save(stp);
	}

	xml_elem sst = parent.add_child("sub_state");
	sst.set_attr(scope_raise_level, "scopeup");
	sst.set_attr(electric_engine, "electric_engine");
	sst.set_attr(snorkelup, "snorkelup");
	sst.set_attr(battery_level, "battery_level");
    
	// fixme: later move to ship, or even sea_object!
	//xml_elem dm = parent.add_child("parts");
	//dm.set_attr(unsigned(parts.size()), "nr");
	//for (vector<sea_object::part>::const_iterator it = parts.begin(); it != parts.end(); ++it) {
		//save a part node for each entry
		//it->save(out);
	//}

	xml_elem tk = parent.add_child("tanks");
	for (unsigned i = 0; i < tanks.size(); ++i) {
		xml_elem e = tk.add_child("tank");
		e.set_attr(i, "nr");
		tanks[i].save(e);
	}

	TDC.save(parent);
	sonarman.save(parent);
}
Example #3
0
submarine::tank::tank(xml_elem e)
	: type(ballast),
	  volume(e.attrf("volume")),
	  fillrate(e.attrf("fillrate")),
	  pos(e.attrf("posx"), e.attrf("posy"), e.attrf("posz")),
	  fill(0),
	  flood_valve_open(false)
{
	if (e.attr("type") == "trim")
		type = trim;
	else if (e.attr("type") == "ballast")
		type = ballast;
	else throw error(std::string("invalid tank type in file ") + e.doc_name());
}
Example #4
0
void submarine::stored_torpedo::load(game& gm, const xml_elem& parent)
{
	specfilename = parent.attr("type");
	if (parent.has_child("setup")) {
		setup.load(parent.child("setup"));
	} else {
		setup = torpedo::setup();
	}
	temperature = parent.attrf("temperature");
	status = st_status(parent.attru("status"));
	associated = parent.attru("associated");
	remaining_time = parent.attrf("remaining_time");
	addleadangle = angle(parent.attrf("addleadangle"));
}
Example #5
0
void submarine::stored_torpedo::save(xml_elem& parent) const
{
	parent.set_attr(specfilename, "type");
	if (status != st_empty) {
		xml_elem s = parent.add_child("setup");
		setup.save(s);
	}
	parent.set_attr(temperature, "temperature");
	parent.set_attr(unsigned(status), "status");
	parent.set_attr(associated, "associated");
	parent.set_attr(remaining_time, "remaining_time");
	parent.set_attr(addleadangle.value(), "addleadangle");
}
Example #6
0
submarine::submarine(game& gm_, const xml_elem& parent)
	: ship(gm_, parent),
	  max_depth(0),
	  dive_to(0),
	  permanent_dive(false),
	  dive_state(dive_state_surfaced),
	  bow_depth_rudder(vector3(0,30,0 /*not used yet*/), 1, 30, 4/*area*/, 10),//read consts from spec file, fixme
	  stern_depth_rudder(vector3(0,-30,0 /*not used yet*/), 1, 30, 4/*area*/, 10),//read consts from spec file, fixme
	  mass_flooded_tanks(0),
	  ballast_tank_capacity(0), // read from spec file later
	  scope_raise_level(0.0f),
	  scope_raise_to_level(0.0f),
	  electric_engine(false),
	  hassnorkel(false),
	  snorkel_depth(8.0),
	  alarm_depth(150.0),
	  snorkelup(false),
	  battery_level(0)
{
	xml_elem sm = parent.child("motion").child("submerged");
	max_submerged_speed = kts2ms(sm.attrf("maxspeed"));
	double safedepth = sm.attrf("safedepth");
	double maxdepth = sm.attrf("maxdepth");
	max_depth = safedepth + rnd() * (maxdepth - safedepth);
	xml_elem dp = parent.child("depths");
	periscope_depth = dp.attrf("scope");
	snorkel_depth = dp.attrf("snorkel");
	alarm_depth = dp.attrf("alarm");
	xml_elem tp = parent.child("torpedoes");
	xml_elem tb = tp.child("tubes");
	number_of_tubes_at[0] = tb.attru("bow");
	number_of_tubes_at[1] = tb.attru("stern");
	number_of_tubes_at[2] = tb.attru("bowreserve");
	number_of_tubes_at[3] = tb.attru("sternreserve");
	number_of_tubes_at[4] = tb.attru("bowdeckreserve");
	number_of_tubes_at[5] = tb.attru("sterndeckreserve");
	unsigned nrtrp = 0;
	for (unsigned i = 0; i < 6; ++i) nrtrp += number_of_tubes_at[i];
	torpedoes.resize(nrtrp);
	xml_elem tf = tp.child("transfertimes");
	torp_transfer_times[0] = tf.attru("bow");
	torp_transfer_times[1] = tf.attru("stern");
	torp_transfer_times[2] = tf.attru("bowdeck");
	torp_transfer_times[3] = tf.attru("sterndeck");
	torp_transfer_times[4] = tf.attru("bowsterndeck");
	xml_elem bt = parent.child("battery");
	battery_capacity = bt.attru("capacity");
	battery_value_a = bt.attrf("consumption_a");
	battery_value_t = bt.attrf("consumption_t");
	battery_recharge_value_a = bt.attrf("recharge_a");
	battery_recharge_value_t = bt.attrf("recharge_t");
	if (parent.has_child("torpedomanage")) { // fixme: later all subs should have it!!
	xml_elem tm = parent.child("torpedomanage");
	torpedomanage_sidetopimg = tm.attr("image");
	}

	// set all common damageable parts to "no damage", fixme move to ship?, replace by damage editor data reading
	//parts.resize(nr_of_parts);
	//for (unsigned i = 0; i < unsigned(outer_stern_tubes); ++i)
	//parts[i] = part(0, 0);

	// set hearing device
	date dt = gm.get_date();
	if (dt < date(1941, 6, 1))
		hearing_device = hearing_device_KDB;
	else if (dt < date(1944, 11, 1))
		hearing_device = hearing_device_GHG;
	else
		hearing_device = hearing_device_BG;

	// load the bridge data
	xml_elem br = parent.child("bridge");
	bridge_model_name = data_file().get_rel_path(specfilename) + br.attr("model");

	bridge_camera_pos = br.child("camera").attrv3();
	bridge_uzo_pos = br.child("uzo").attrv3();
	bridge_freeview_pos = br.child("freeview").attrv3();

	if (parent.has_child("tanks")) { // fixme: later all subs should have it!!
		xml_elem etanks = parent.child("tanks");
		for (xml_elem::iterator it = etanks.iterate("tank"); !it.end(); it.next()) {
			tanks.push_back(tank(it.elem()));
			ballast_tank_capacity += tanks.back().get_volume();
		}
	}
	
	
	// load the damageable-parts data
	printf("LOADING PARTS\n");
	if (parent.has_child("damageable-parts")) { // fixme: later all subs should have it!!
	printf("DAMAGEABLE PARTS DETECTED\n");
		xml_elem epart = parent.child("damageable-parts");
		for (xml_elem::iterator it = epart.iterate("part"); !it.end(); it.next()) {
		    // fixme: complete parts cstor with more complete data x,y,z, repairable y/n etc.
		    float weakness = it.elem().attrf("weakness");
		    
    		part p;
		    p.id = it.elem().attr("id").c_str();

        // fixme: for testing purpose
		    //p.status = 0.25; // low damage at start ! (for testing) should be 0 for all
		    //p.damage = 0.25;
		    //p.remainingtime = 60;
		    //p.floodlevel = 0.25;
		    
		    p.strength = it.elem().attrf("weakness");
		    p.repairtime = it.elem().attru("repairtime");

        float x0 = it.elem().attrf("x0");
        float y0 = it.elem().attrf("y0");
        float z0 = it.elem().attrf("z0");
        float x1 = it.elem().attrf("x1");
        float y1 = it.elem().attrf("y1");
        float z1 = it.elem().attrf("z1");
        
        p.p1 = {x0,y0,z0};
        p.p2 = {x1,y1,z1};
        
        p.surfaced = (it.elem().attr("surfaced").find("true")!=std::string::npos);
        p.repairable = (it.elem().attr("repairable").find("true")!=std::string::npos);
        p.floodable = (it.elem().attr("floodable").find("true") != std::string::npos);
        
			parts.push_back(p);
			printf("PART ADDED %s\n",it.elem().attr("id").c_str());
		}
	}
	

	diveplane_1_id = mymodel->get_object_id_by_name("diveplane_1");
	diveplane_2_id = mymodel->get_object_id_by_name("diveplane_2");
}
Example #7
0
void submarine::tank::save(xml_elem& parent) const
{
	parent.set_attr(fill, "fill");
	parent.set_attr(flood_valve_open, "flood_valve_open");
}
Example #8
0
void submarine::tank::load(const xml_elem& parent)
{
	fill = parent.attrf("fill");
	flood_valve_open = parent.attrb("flood_valve_open");
}
Example #9
0
submarine::submarine(game& gm_, const xml_elem& parent)
	: ship(gm_, parent),
	  max_depth(0),
	  dive_to(0),
	  permanent_dive(false),
	  dive_state(dive_state_surfaced),
	  bow_depth_rudder(vector3(0,30,0 /*not used yet*/), 1, 30, 4/*area*/, 10),//read consts from spec file, fixme
	  stern_depth_rudder(vector3(0,-30,0 /*not used yet*/), 1, 30, 4/*area*/, 10),//read consts from spec file, fixme
	  mass_flooded_tanks(0),
	  ballast_tank_capacity(0), // read from spec file later
	  scope_raise_level(0.0f),
	  scope_raise_to_level(0.0f),
	  electric_engine(false),
	  hassnorkel(false),
	  snorkel_depth(8.0),
	  alarm_depth(150.0),
	  snorkelup(false),
	  battery_level(0)
{
	xml_elem sm = parent.child("motion").child("submerged");
	max_submerged_speed = kts2ms(sm.attrf("maxspeed"));
	double safedepth = sm.attrf("safedepth");
	double maxdepth = sm.attrf("maxdepth");
	max_depth = safedepth + rnd() * (maxdepth - safedepth);
	xml_elem dp = parent.child("depths");
	periscope_depth = dp.attrf("scope");
	snorkel_depth = dp.attrf("snorkel");
	alarm_depth = dp.attrf("alarm");
	xml_elem tp = parent.child("torpedoes");
	xml_elem tb = tp.child("tubes");
	number_of_tubes_at[0] = tb.attru("bow");
	number_of_tubes_at[1] = tb.attru("stern");
	number_of_tubes_at[2] = tb.attru("bowreserve");
	number_of_tubes_at[3] = tb.attru("sternreserve");
	number_of_tubes_at[4] = tb.attru("bowdeckreserve");
	number_of_tubes_at[5] = tb.attru("sterndeckreserve");
	unsigned nrtrp = 0;
	for (unsigned i = 0; i < 6; ++i) nrtrp += number_of_tubes_at[i];
	torpedoes.resize(nrtrp);
	xml_elem tf = tp.child("transfertimes");
	torp_transfer_times[0] = tf.attru("bow");
	torp_transfer_times[1] = tf.attru("stern");
	torp_transfer_times[2] = tf.attru("bowdeck");
	torp_transfer_times[3] = tf.attru("sterndeck");
	torp_transfer_times[4] = tf.attru("bowsterndeck");
	xml_elem bt = parent.child("battery");
	battery_capacity = bt.attru("capacity");
	battery_value_a = bt.attrf("consumption_a");
	battery_value_t = bt.attrf("consumption_t");
	battery_recharge_value_a = bt.attrf("recharge_a");
	battery_recharge_value_t = bt.attrf("recharge_t");
	if (parent.has_child("torpedomanage")) { // fixme: later all subs should have it!!
	xml_elem tm = parent.child("torpedomanage");
	torpedomanage_sidetopimg = tm.attr("image");
	}

	// set all common damageable parts to "no damage", fixme move to ship?, replace by damage editor data reading
	//parts.resize(nr_of_parts);
	//for (unsigned i = 0; i < unsigned(outer_stern_tubes); ++i)
	//parts[i] = part(0, 0);

	// set hearing device
	date dt = gm.get_date();
	if (dt < date(1941, 6, 1))
		hearing_device = hearing_device_KDB;
	else if (dt < date(1944, 11, 1))
		hearing_device = hearing_device_GHG;
	else
		hearing_device = hearing_device_BG;

	// load the bridge data
	xml_elem br = parent.child("bridge");
	bridge_model_name = data_file().get_rel_path(specfilename) + br.attr("model");

	bridge_camera_pos = br.child("camera").attrv3();
	bridge_uzo_pos = br.child("uzo").attrv3();
	bridge_freeview_pos = br.child("freeview").attrv3();

	if (parent.has_child("tanks")) { // fixme: later all subs should have it!!
		xml_elem etanks = parent.child("tanks");
		for (xml_elem::iterator it = etanks.iterate("tank"); !it.end(); it.next()) {
			tanks.push_back(tank(it.elem()));
			ballast_tank_capacity += tanks.back().get_volume();
		}
	}

	diveplane_1_id = mymodel->get_object_id_by_name("diveplane_1");
	diveplane_2_id = mymodel->get_object_id_by_name("diveplane_2");
}
Example #10
0
void gun_shell::save(xml_elem& parent) const
{
	sea_object::save(parent);
	parent.add_child("oldpos").set_attr(oldpos);
	parent.add_child("damage_amount").set_attr(damage_amount);
}
Example #11
0
void gun_shell::load(const xml_elem& parent)
{
	sea_object::load(parent);
	oldpos = parent.child("oldpos").attrv3();
	damage_amount = parent.child("damage_amount").attrf();
}