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); }
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); }
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()); }
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")); }
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"); }
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"); }
void submarine::tank::save(xml_elem& parent) const { parent.set_attr(fill, "fill"); parent.set_attr(flood_valve_open, "flood_valve_open"); }
void submarine::tank::load(const xml_elem& parent) { fill = parent.attrf("fill"); flood_valve_open = parent.attrb("flood_valve_open"); }
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"); }
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); }
void gun_shell::load(const xml_elem& parent) { sea_object::load(parent); oldpos = parent.child("oldpos").attrv3(); damage_amount = parent.child("damage_amount").attrf(); }