From 0fa746c805365fe4ea07f5e34a203515701dc382 Mon Sep 17 00:00:00 2001 From: Bart Cools Date: Thu, 26 Jun 2014 12:09:22 +0200 Subject: [PATCH] Changes to stk_config to make 3 groups of karts, which will default to the medium, and can be set in the kart.xml --- data/stk_config.xml | 193 ++++++++++++++++---- src/karts/kart_properties.cpp | 321 +++++++++++++++++++--------------- src/karts/kart_properties.hpp | 4 + 3 files changed, 338 insertions(+), 180 deletions(-) diff --git a/data/stk_config.xml b/data/stk_config.xml index a2e4e4d2d..2b6056c07 100644 --- a/data/stk_config.xml +++ b/data/stk_config.xml @@ -145,6 +145,7 @@ + - - - - - - - - - + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/karts/kart_properties.cpp b/src/karts/kart_properties.cpp index 203704ea9..e6694a803 100644 --- a/src/karts/kart_properties.cpp +++ b/src/karts/kart_properties.cpp @@ -172,7 +172,9 @@ void KartProperties::load(const std::string &filename, const std::string &node) { // Get the default values from STKConfig. This will also allocate any // pointers used in KartProperties + copyFrom(&stk_config->getDefaultKartProperties()); + // m_kart_model must be initialised after assigning the default // values from stk_config (otherwise all kart_properties will // share the same KartModel @@ -286,7 +288,7 @@ void KartProperties::load(const std::string &filename, const std::string &node) */ void KartProperties::getAllData(const XMLNode * root) { - root->get("version", &m_version); + root->get("version", &m_version); root->get("name", &m_name ); @@ -307,50 +309,32 @@ void KartProperties::getAllData(const XMLNode * root) root->get("shadow-x-offset", &m_shadow_x_offset ); root->get("shadow-y-offset", &m_shadow_y_offset ); + if(const XMLNode *props_group = root->getNode("properties")) { + props_group->get("group", &m_kart_type ); + } + else + { + root->get("kart-type", &m_kart_type ); + } + + if(const XMLNode *kart_type = root->getNode("kart-type")) + { + getProperties(kart_type->getNode(m_kart_type)); + } + else + { + //When we load in kart.xml values, we first set the correct type + //After we have done that, we can still enter kart-specific values + const XMLNode* config_root = new XMLNode(file_manager->getAsset("stk_config.xml")); + getProperties(config_root->getNode("general-kart-defaults")->getNode("kart-type")->getNode(m_kart_type)); + getProperties(root); + } + + + if(const XMLNode *dimensions_node = root->getNode("center")) dimensions_node->get("gravity-shift", &m_gravity_center_shift); - if(const XMLNode *nitro_node = root->getNode("nitro")) - { - nitro_node->get("consumption", &m_nitro_consumption ); - nitro_node->get("small-container", &m_nitro_small_container ); - nitro_node->get("big-container", &m_nitro_big_container ); - nitro_node->get("max-speed-increase", &m_nitro_max_speed_increase); - nitro_node->get("engine-force", &m_nitro_engine_force ); - nitro_node->get("duration", &m_nitro_duration ); - nitro_node->get("fade-out-time", &m_nitro_fade_out_time ); - nitro_node->get("max", &m_nitro_max ); - nitro_node->get("min-consumption-time", &m_nitro_min_consumption ); - } - - if(const XMLNode *bubble_node = root->getNode("bubblegum")) - { - bubble_node->get("time", &m_bubblegum_time ); - bubble_node->get("speed-fraction", &m_bubblegum_speed_fraction); - bubble_node->get("fade-in-time", &m_bubblegum_fade_in_time ); - bubble_node->get("torque", &m_bubblegum_torque ); - } - - if(const XMLNode *rescue_node = root->getNode("rescue")) - { - rescue_node->get("vert-offset", &m_rescue_vert_offset); - rescue_node->get("time", &m_rescue_time ); - rescue_node->get("height", &m_rescue_height ); - } - - if(const XMLNode *explosion_node = root->getNode("explosion")) - { - explosion_node->get("time", &m_explosion_time ); - explosion_node->get("radius", &m_explosion_radius); - explosion_node->get("invulnerability-time", - &m_explosion_invulnerability_time); - } - - if(const XMLNode *skid_node = root->getNode("skid")) - { - m_skidding_properties->load(skid_node); - } - if(const XMLNode *ai_node = root->getNode("ai")) { const XMLNode *easy = ai_node->getNode("easy"); @@ -363,59 +347,6 @@ void KartProperties::getAllData(const XMLNode * root) m_ai_properties[RaceManager::DIFFICULTY_BEST]->load(best); } - if(const XMLNode *slipstream_node = root->getNode("slipstream")) - { - slipstream_node->get("length", &m_slipstream_length ); - slipstream_node->get("width", &m_slipstream_width ); - slipstream_node->get("collect-time", &m_slipstream_collect_time ); - slipstream_node->get("use-time", &m_slipstream_use_time ); - slipstream_node->get("add-power", &m_slipstream_add_power ); - slipstream_node->get("min-speed", &m_slipstream_min_speed ); - slipstream_node->get("max-speed-increase", - &m_slipstream_max_speed_increase); - slipstream_node->get("duration", &m_slipstream_duration ); - slipstream_node->get("fade-out-time",&m_slipstream_fade_out_time ); - } - - if(const XMLNode *turn_node = root->getNode("turn")) - { - turn_node->get("time-full-steer", &m_time_full_steer ); - turn_node->get("time-reset-steer", &m_time_reset_steer ); - turn_node->get("turn-radius", &m_turn_angle_at_speed ); - // For now store the turn radius in turn angle, the correct - // value can only be determined later in ::load - } - - if(const XMLNode *engine_node = root->getNode("engine")) - { - engine_node->get("brake-factor", &m_brake_factor); - engine_node->get("max-speed-reverse-ratio", &m_max_speed_reverse_ratio); - engine_node->get("power", &m_engine_power); - if(m_engine_power.size()!=RaceManager::DIFFICULTY_COUNT) - { - Log::fatal("[KartProperties]", - "Incorrect engine-power specifications for kart '%s'", - getIdent().c_str()); - } - engine_node->get("max-speed", &m_max_speed); - if(m_max_speed.size()!=RaceManager::DIFFICULTY_COUNT) - { - Log::fatal("[KartProperties]", - "Incorrect max-speed specifications for kart '%s'", - getIdent().c_str()); - } - } // if getNode("engine") - - if(const XMLNode *gear_node = root->getNode("gear")) - { - gear_node->get("switch-ratio", &m_gear_switch_ratio ); - gear_node->get("power-increase", &m_gear_power_increase); - } - - if(const XMLNode *mass_node = root->getNode("mass")) - mass_node->get("value", &m_mass); - - if(const XMLNode *suspension_node = root->getNode("suspension")) { suspension_node->get("stiffness", &m_suspension_stiffness); @@ -488,50 +419,6 @@ void KartProperties::getAllData(const XMLNode * root) //TODO: listed as an attribute in the xml file after wheel-radius //TODO: same goes for their rear equivalents - if(const XMLNode *plunger_node= root->getNode("plunger")) - { - plunger_node->get("band-max-length", &m_rubber_band_max_length ); - plunger_node->get("band-force", &m_rubber_band_force ); - plunger_node->get("band-duration", &m_rubber_band_duration ); - plunger_node->get("band-speed-increase",&m_rubber_band_speed_increase); - plunger_node->get("band-fade-out-time", &m_rubber_band_fade_out_time ); - plunger_node->get("in-face-time", &m_plunger_in_face_duration); - if(m_plunger_in_face_duration.size()!=RaceManager::DIFFICULTY_COUNT) - { - Log::fatal("KartProperties", - "Invalid plunger in-face-time specification."); - } - } - - if(const XMLNode *zipper_node= root->getNode("zipper")) - { - zipper_node->get("time", &m_zipper_time ); - zipper_node->get("fade-out-time", &m_zipper_fade_out_time ); - zipper_node->get("force", &m_zipper_force ); - zipper_node->get("speed-gain", &m_zipper_speed_gain ); - zipper_node->get("max-speed-increase", &m_zipper_max_speed_increase); - } - - if(const XMLNode *swatter_node= root->getNode("swatter")) - { - swatter_node->get("duration", &m_swatter_duration ); - swatter_node->get("squash-duration", &m_squash_duration ); - swatter_node->get("squash-slowdown", &m_squash_slowdown ); - if(swatter_node->get("distance", &m_swatter_distance2) ) - { - // Avoid squaring if distance is not defined, so that - // distance2 remains UNDEFINED (which is a negative value) - m_swatter_distance2 *= m_swatter_distance2; - } - } - - if(const XMLNode *lean_node= root->getNode("lean")) - { - lean_node->get("max", &m_max_lean ); - lean_node->get("speed", &m_lean_speed); - m_max_lean *= DEGREE_TO_RAD; - m_lean_speed *= DEGREE_TO_RAD; - } if(const XMLNode *jump_node= root->getNode("jump")) { @@ -547,12 +434,6 @@ void KartProperties::getAllData(const XMLNode * root) m_camera_backward_up_angle *= DEGREE_TO_RAD; } - if(const XMLNode *startup_node= root->getNode("startup")) - { - startup_node->get("time", &m_startup_times); - startup_node->get("boost", &m_startup_boost); - } - if(const XMLNode *sounds_node= root->getNode("sounds")) { std::string s; @@ -755,6 +636,156 @@ bool KartProperties::isInGroup(const std::string &group) const return std::find(m_groups.begin(), m_groups.end(), group) != m_groups.end(); } // isInGroups +void KartProperties::getProperties(const XMLNode* root) +{ + + if(const XMLNode *nitro_node = root->getNode("nitro")) + { + nitro_node->get("consumption", &m_nitro_consumption ); + nitro_node->get("small-container", &m_nitro_small_container ); + nitro_node->get("big-container", &m_nitro_big_container ); + nitro_node->get("max-speed-increase", &m_nitro_max_speed_increase); + nitro_node->get("engine-force", &m_nitro_engine_force ); + nitro_node->get("duration", &m_nitro_duration ); + nitro_node->get("fade-out-time", &m_nitro_fade_out_time ); + nitro_node->get("max", &m_nitro_max ); + nitro_node->get("min-consumption-time", &m_nitro_min_consumption ); + } + + if(const XMLNode *bubble_node = root->getNode("bubblegum")) + { + bubble_node->get("time", &m_bubblegum_time ); + bubble_node->get("speed-fraction", &m_bubblegum_speed_fraction); + bubble_node->get("fade-in-time", &m_bubblegum_fade_in_time ); + bubble_node->get("torque", &m_bubblegum_torque ); + } + + if(const XMLNode *rescue_node = root->getNode("rescue")) + { + rescue_node->get("vert-offset", &m_rescue_vert_offset); + rescue_node->get("time", &m_rescue_time ); + rescue_node->get("height", &m_rescue_height ); + } + + if(const XMLNode *explosion_node = root->getNode("explosion")) + { + explosion_node->get("time", &m_explosion_time ); + explosion_node->get("radius", &m_explosion_radius); + explosion_node->get("invulnerability-time", + &m_explosion_invulnerability_time); + } + + if(const XMLNode *skid_node = root->getNode("skid")) + { + m_skidding_properties->load(skid_node); + } + + + if(const XMLNode *slipstream_node = root->getNode("slipstream")) + { + slipstream_node->get("length", &m_slipstream_length ); + slipstream_node->get("width", &m_slipstream_width ); + slipstream_node->get("collect-time", &m_slipstream_collect_time ); + slipstream_node->get("use-time", &m_slipstream_use_time ); + slipstream_node->get("add-power", &m_slipstream_add_power ); + slipstream_node->get("min-speed", &m_slipstream_min_speed ); + slipstream_node->get("max-speed-increase", + &m_slipstream_max_speed_increase); + slipstream_node->get("duration", &m_slipstream_duration ); + slipstream_node->get("fade-out-time",&m_slipstream_fade_out_time ); + } + + if(const XMLNode *turn_node = root->getNode("turn")) + { + turn_node->get("time-full-steer", &m_time_full_steer ); + turn_node->get("time-reset-steer", &m_time_reset_steer ); + turn_node->get("turn-radius", &m_turn_angle_at_speed ); + // For now store the turn radius in turn angle, the correct + // value can only be determined later in ::load + } + + if(const XMLNode *engine_node = root->getNode("engine")) + { + engine_node->get("brake-factor", &m_brake_factor); + engine_node->get("max-speed-reverse-ratio", &m_max_speed_reverse_ratio); + engine_node->get("power", &m_engine_power); + if(m_engine_power.size()!=RaceManager::DIFFICULTY_COUNT) + { + Log::fatal("[KartProperties]", + "Incorrect engine-power specifications for kart '%s'", + getIdent().c_str()); + } + engine_node->get("max-speed", &m_max_speed); + if(m_max_speed.size()!=RaceManager::DIFFICULTY_COUNT) + { + Log::fatal("[KartProperties]", + "Incorrect max-speed specifications for kart '%s'", + getIdent().c_str()); + } + } // if getNode("engine") + + if(const XMLNode *gear_node = root->getNode("gear")) + { + gear_node->get("switch-ratio", &m_gear_switch_ratio ); + gear_node->get("power-increase", &m_gear_power_increase); + } + + if(const XMLNode *mass_node = root->getNode("mass")) + mass_node->get("value", &m_mass); + + if(const XMLNode *plunger_node= root->getNode("plunger")) + { + plunger_node->get("band-max-length", &m_rubber_band_max_length ); + plunger_node->get("band-force", &m_rubber_band_force ); + plunger_node->get("band-duration", &m_rubber_band_duration ); + plunger_node->get("band-speed-increase",&m_rubber_band_speed_increase); + plunger_node->get("band-fade-out-time", &m_rubber_band_fade_out_time ); + plunger_node->get("in-face-time", &m_plunger_in_face_duration); + if(m_plunger_in_face_duration.size()!=RaceManager::DIFFICULTY_COUNT) + { + Log::fatal("KartProperties", + "Invalid plunger in-face-time specification."); + } + } + + if(const XMLNode *zipper_node= root->getNode("zipper")) + { + zipper_node->get("time", &m_zipper_time ); + zipper_node->get("fade-out-time", &m_zipper_fade_out_time ); + zipper_node->get("force", &m_zipper_force ); + zipper_node->get("speed-gain", &m_zipper_speed_gain ); + zipper_node->get("max-speed-increase", &m_zipper_max_speed_increase); + } + + if(const XMLNode *swatter_node= root->getNode("swatter")) + { + swatter_node->get("duration", &m_swatter_duration ); + swatter_node->get("squash-duration", &m_squash_duration ); + swatter_node->get("squash-slowdown", &m_squash_slowdown ); + if(swatter_node->get("distance", &m_swatter_distance2) ) + { + // Avoid squaring if distance is not defined, so that + // distance2 remains UNDEFINED (which is a negative value) + m_swatter_distance2 *= m_swatter_distance2; + } + } + + if(const XMLNode *lean_node= root->getNode("lean")) + { + lean_node->get("max", &m_max_lean ); + lean_node->get("speed", &m_lean_speed); + m_max_lean *= DEGREE_TO_RAD; + m_lean_speed *= DEGREE_TO_RAD; + } + + if(const XMLNode *startup_node= root->getNode("startup")) + { + startup_node->get("time", &m_startup_times); + startup_node->get("boost", &m_startup_boost); + } +} + + // ---------------------------------------------------------------------------- /** Called the first time a kart accelerates after 'ready-set-go'. It searches * through m_startup_times to find the appropriate slot, and returns the diff --git a/src/karts/kart_properties.hpp b/src/karts/kart_properties.hpp index 621b14cec..f9f90cf76 100644 --- a/src/karts/kart_properties.hpp +++ b/src/karts/kart_properties.hpp @@ -181,6 +181,9 @@ private: */ float m_nitro_min_consumption; + /** Type of the kart (for the properties) */ + std::string m_kart_type; + /** Filename of the wheel models. */ std::string m_wheel_filename[4]; /** Radius of the graphical wheels. */ @@ -389,6 +392,7 @@ public: float getStartupBoost () const; bool isInGroup (const std::string &group) const; bool operator<(const KartProperties &other) const; + void getProperties (const XMLNode * root); // ------------------------------------------------------------------------ /** Returns the (maximum) speed for a given turn radius.