void SpeedWeightedObject::Properties::checkAllSet() { #define CHECK_NEG( a,strA) if(a<=SPEED_WEIGHTED_OBJECT_PROPERTY_UNDEFINED) { \ Log::fatal("SpeedWeightedObject", "Missing default value for '%s'.", \ strA); \ } CHECK_NEG(m_strength_factor, "speed-weighted strength-factor" ); CHECK_NEG(m_speed_factor, "speed-weighted speed-factor" ); CHECK_NEG(m_texture_speed.X, "speed-weighted texture speed X" ); CHECK_NEG(m_texture_speed.Y, "speed-weighted texture speed Y" ); #undef CHECK_NEG }
/** Checks if all necessary physics values are indeed defines. This helps * finding bugs early, e.g. missing default in stk_config.dat file. * \param filename File from which the data was read (only used to print * meaningful error messages). */ void KartProperties::checkAllSet(const std::string &filename) { #define CHECK_NEG( a,strA) if(a<=UNDEFINED) { \ Log::fatal("KartProperties", \ "Missing default value for '%s' in '%s'.", \ strA,filename.c_str()); \ } CHECK_NEG(m_friction_slip, "friction slip" ); CHECK_NEG(m_collision_terrain_impulse, "collision terrain-impulse" ); CHECK_NEG(m_collision_impulse, "collision impulse" ); CHECK_NEG(m_collision_impulse_time, "collision impulse-time" ); CHECK_NEG(m_physical_wheel_position, "collision physical-wheel-position"); if(m_restitution.size()<1) Log::fatal("KartProperties", "Missing restitution value."); for(unsigned int i=0; i<RaceManager::DIFFICULTY_COUNT; i++) m_ai_properties[i]->checkAllSet(filename); } // checkAllSet
/** Checks if all necessary physics values are indeed defines. This helps * finding bugs early, e.g. missing default in stk_config.dat file. * \param filename File from which the data was read (only used to print * meaningful error messages). */ void KartProperties::checkAllSet(const std::string &filename) { if(m_gear_switch_ratio.size()==0) { fprintf(stderr,"Missing default value for 'gear-switch-ratio' in '%s'.\n", filename.c_str()); exit(-1); } if(m_gear_power_increase.size()==0) { fprintf(stderr,"Missing default value for 'gear-power-increase' in '%s'.\n", filename.c_str()); exit(-1); } if(m_gear_switch_ratio.size()!=m_gear_power_increase.size()) { fprintf(stderr,"Number of entries for 'gear-switch-ratio' and 'gear-power-increase\n"); fprintf(stderr,"in '%s' must be equal.\n", filename.c_str()); exit(-1); } if(m_startup_boost.size()!=m_startup_times.size()) { fprintf(stderr, "Number of entried for 'startup times' and 'startup-boost\n"); fprintf(stderr, "must be identical.\n"); exit(-1); } #define CHECK_NEG( a,strA) if(a<=UNDEFINED) { \ fprintf(stderr,"Missing default value for '%s' in '%s'.\n", \ strA,filename.c_str());exit(-1); \ } CHECK_NEG(m_mass, "mass" ); CHECK_NEG(m_time_full_steer, "turn time-full-steer" ); CHECK_NEG(m_wheel_damping_relaxation, "wheels damping-relaxation" ); CHECK_NEG(m_wheel_damping_compression, "wheels damping-compression" ); CHECK_NEG(m_wheel_radius, "wheels radius" ); CHECK_NEG(m_friction_slip, "friction slip" ); CHECK_NEG(m_roll_influence, "stability roll-influence" ); CHECK_NEG(m_chassis_linear_damping, "stability chassis-linear-damping" ); CHECK_NEG(m_chassis_angular_damping, "stability chassis-angular-damping"); CHECK_NEG(m_downward_impulse_factor, "stability downward-impulse-factor"); CHECK_NEG(m_track_connection_accel, "stability track-connection-accel" ); CHECK_NEG(m_engine_power[0], "engine power[0]" ); CHECK_NEG(m_engine_power[1], "engine power[1]" ); CHECK_NEG(m_engine_power[2], "engine power[2]" ); CHECK_NEG(m_max_speed[0], "engine maximum-speed[0]" ); CHECK_NEG(m_max_speed[1], "engine maximum-speed[1]" ); CHECK_NEG(m_max_speed[2], "engine maximum-speed[2]" ); CHECK_NEG(m_max_speed_reverse_ratio, "engine max-speed-reverse-ratio"); CHECK_NEG(m_brake_factor, "engine brake-factor" ); CHECK_NEG(m_suspension_stiffness, "suspension stiffness" ); CHECK_NEG(m_suspension_rest, "suspension rest" ); CHECK_NEG(m_suspension_travel_cm, "suspension travel-cm" ); CHECK_NEG(m_max_suspension_force, "suspension max-force" ); CHECK_NEG(m_collision_impulse, "collision impulse" ); CHECK_NEG(m_collision_impulse_time, "collision impulse-time" ); CHECK_NEG(m_restitution, "collision restitution" ); CHECK_NEG(m_collision_terrain_impulse, "collision terrain-impulse" ); CHECK_NEG(m_bevel_factor.getX(), "collision bevel-factor" ); CHECK_NEG(m_bevel_factor.getY(), "collision bevel-factor" ); CHECK_NEG(m_bevel_factor.getZ(), "collision bevel-factor" ); CHECK_NEG(m_upright_tolerance, "upright tolerance" ); CHECK_NEG(m_upright_max_force, "upright max-force" ); CHECK_NEG(m_plunger_in_face_duration[0],"plunger in-face-time[0]" ); CHECK_NEG(m_plunger_in_face_duration[1],"plunger in-face-time[1]" ); CHECK_NEG(m_plunger_in_face_duration[2],"plunger in-face-time[2]" ); CHECK_NEG(m_rubber_band_max_length, "plunger band-max-length" ); CHECK_NEG(m_rubber_band_force, "plunger band-force" ); CHECK_NEG(m_rubber_band_duration, "plunger band-duration" ); CHECK_NEG(m_rubber_band_speed_increase, "plunger band-speed-increase" ); CHECK_NEG(m_rubber_band_fade_out_time, "plunger band-fade-out-time" ); CHECK_NEG(m_zipper_time, "zipper-time" ); CHECK_NEG(m_zipper_fade_out_time, "zipper-fade-out-time" ); CHECK_NEG(m_zipper_force, "zipper-force" ); CHECK_NEG(m_zipper_speed_gain, "zipper-speed-gain" ); CHECK_NEG(m_zipper_max_speed_increase, "zipper-max-speed-increase" ); CHECK_NEG(m_slipstream_length, "slipstream length" ); CHECK_NEG(m_slipstream_width, "slipstream width" ); CHECK_NEG(m_slipstream_collect_time, "slipstream collect-time" ); CHECK_NEG(m_slipstream_use_time, "slipstream use-time" ); CHECK_NEG(m_slipstream_add_power, "slipstream add-power" ); CHECK_NEG(m_slipstream_min_speed, "slipstream min-speed" ); CHECK_NEG(m_slipstream_max_speed_increase, "slipstream max-speed-increase" ); CHECK_NEG(m_slipstream_duration, "slipstream duration" ); CHECK_NEG(m_slipstream_fade_out_time, "slipstream fade-out-time" ); CHECK_NEG(m_camera_distance, "camera distance" ); CHECK_NEG(m_camera_forward_up_angle, "camera forward-up-angle" ); CHECK_NEG(m_camera_backward_up_angle, "camera forward-up-angle" ); CHECK_NEG(m_nitro_consumption, "nitro consumption" ); CHECK_NEG(m_nitro_big_container, "nitro big-container" ); CHECK_NEG(m_nitro_small_container, "nitro small-container" ); CHECK_NEG(m_nitro_max_speed_increase, "nitro max-speed-increase" ); CHECK_NEG(m_nitro_engine_force, "nitro engine-force" ); CHECK_NEG(m_nitro_duration, "nitro duration" ); CHECK_NEG(m_nitro_fade_out_time, "nitro fade-out-time" ); CHECK_NEG(m_nitro_max, "nitro max" ); CHECK_NEG(m_swatter_distance2, "swatter distance" ); CHECK_NEG(m_swatter_duration, "swatter duration" ); CHECK_NEG(m_squash_duration, "squash-duration" ); CHECK_NEG(m_squash_slowdown, "squash-slowdown" ); CHECK_NEG(m_rescue_height, "rescue height" ); CHECK_NEG(m_rescue_time, "rescue time" ); CHECK_NEG(m_rescue_vert_offset, "rescue vert-offset" ); CHECK_NEG(m_explosion_time, "explosion time" ); CHECK_NEG(m_explosion_invulnerability_time, "explosion invulnerability-time"); CHECK_NEG(m_explosion_radius, "explosion radius" ); m_skidding_properties->checkAllSet(filename); for(unsigned int i=0; i<RaceManager::DIFFICULTY_COUNT; i++) m_ai_properties[i]->checkAllSet(filename); } // checkAllSet
/** Loads the stk configuration file. After loading it checks if all necessary * values are actually defined, otherwise an error message is printed and STK * is aborted. * /param filename Name of the configuration file to load. */ void STKConfig::load(const std::string &filename) { // Avoid loading the default config file if a user-specific // config file has already been loaded. if(m_has_been_loaded) return; m_has_been_loaded = true; init_defaults(); XMLNode *root = 0; try { root = new XMLNode(filename); if(!root || root->getName()!="config") { if(root) delete root; std::ostringstream msg; msg << "Couldn't load config '" << filename << "': no config node."; throw std::runtime_error(msg.str()); } getAllData(root); } catch(std::exception& err) { Log::error("StkConfig", "FATAL ERROR while reading '%s':", filename.c_str()); Log::fatal("StkConfig", " %s", err.what()); } delete root; // Check that all necessary values are indeed set // ----------------------------------------------- #define CHECK_NEG( a,strA) if(a<=UNDEFINED) { \ Log::fatal("StkConfig", "Missing default value for '%s' in '%s'.", \ strA,filename.c_str()); \ } if(m_score_increase.size()==0 || (int)m_score_increase.size()!=m_max_karts) { Log::fatal("StkConfig", "Not or not enough scores defined in stk_config"); } if(m_leader_intervals.size()==0) { Log::fatal("StkConfig", "No follow leader interval(s) defined in stk_config"); } if(m_switch_items.size()!=Item::ITEM_LAST-Item::ITEM_FIRST+1) { Log::fatal("StkConfig", "Wrong number of item switches defined in stk_config"); } CHECK_NEG(m_max_karts, "<karts max=..." ); CHECK_NEG(m_item_switch_time, "item-switch-time" ); CHECK_NEG(m_bubblegum_counter, "bubblegum disappear counter"); CHECK_NEG(m_explosion_impulse_objects, "explosion-impulse-objects" ); CHECK_NEG(m_max_skidmarks, "max-skidmarks" ); CHECK_NEG(m_min_kart_version, "<kart-version min...>" ); CHECK_NEG(m_max_kart_version, "<kart-version max=...>" ); CHECK_NEG(m_min_track_version, "min-track-version" ); CHECK_NEG(m_max_track_version, "max-track-version" ); CHECK_NEG(m_skid_fadeout_time, "skid-fadeout-time" ); CHECK_NEG(m_near_ground, "near-ground" ); CHECK_NEG(m_delay_finish_time, "delay-finish-time" ); CHECK_NEG(m_music_credit_time, "music-credit-time" ); CHECK_NEG(m_leader_time_per_kart, "leader time-per-kart" ); CHECK_NEG(m_penalty_time, "penalty-time" ); CHECK_NEG(m_max_display_news, "max-display-news" ); CHECK_NEG(m_replay_max_time, "replay max-time" ); CHECK_NEG(m_replay_delta_angle, "replay delta-angle" ); CHECK_NEG(m_replay_delta_pos2, "replay delta-position" ); CHECK_NEG(m_replay_dt, "replay delta-t" ); CHECK_NEG(m_smooth_angle_limit, "physics smooth-angle-limit" ); // Square distance to make distance checks cheaper (no sqrt) m_replay_delta_pos2 *= m_replay_delta_pos2; m_default_kart_properties->checkAllSet(filename); } // load
int main(int argc, char ** argv) { int cs=-1, flags=0, ret=0; struct sockaddr_in sin; char rbuf[4096]; ssize_t woff=0; size_t hsent=0; const char *hdr_ptr=NULL, *end=NULL; struct itimerval it; cs=socket(AF_INET, SOCK_STREAM, 0); if (cs < 0) { perror("socket"); exit(1); } if (argc != 2) { fprintf(stderr, ":P\n"); exit(1); } sin.sin_family=AF_INET; sin.sin_port=htons(25); if (inet_pton(AF_INET, argv[1], &sin.sin_addr) < 0) { perror("inet pton"); exit(1); } if (connect(cs, (struct sockaddr *)&sin, (socklen_t )sizeof(sin)) < 0) { perror("connect"); exit(1); } signal(SIGIO, toggle_fdio); /* get the current flags of this socket */ flags=fcntl(cs, F_GETFL); CHECK_NEG(flags, "F_GETFL"); /* Set the current flags to what they were + O_ASYNC and O_NONBLOCK */ ret=fcntl(cs, F_SETFL, (flags|O_ASYNC|O_NONBLOCK)); CHECK_NEG(ret, "F_SETFL"); ret=fcntl(cs, F_SETSIG, SIGIO); CHECK_NEG(ret, "F_SETSIG"); /* Tell the kernel to notify our pid when a socket change happends */ ret=fcntl(cs, F_SETOWN, getpid()); CHECK_NEG(ret, "F_SETOWN"); /* Make sure the socket really changed */ flags=fcntl(cs, F_GETFL, 0); CHECK_NEG(flags, "F_GETFL (2)"); #undef CHECK_NEG if ((flags & (O_ASYNC|O_NONBLOCK)) != (O_ASYNC|O_NONBLOCK)) { fprintf(stderr, "socket cant be non-blocking and async."); exit(1); } for (;;) { switch (state) { case 0: write(cs, START, strlen(START)); state++; pause(); break; case 1: woff=0; hdr_ptr=hdrs; end=hdrs + strlen(hdrs); do { again: woff=write(cs, hdr_ptr, strlen(hdr_ptr)); if (woff == -1 && (errno == EINTR || errno == EAGAIN)) { goto again; } if (woff < 0) { perror("write"); exit(1); } hsent += woff; assert(hdr_ptr + woff <= end); hdr_ptr += woff; } while (hdr_ptr != end); assert(gettimeofday(&s_time, NULL) > -1); printf("sent %zu bytes of headers\n", hsent); state++; break; case 2: pause(); break; case 3: if (e_time.tv_usec < s_time.tv_usec) { e_time.tv_sec--; e_time.tv_usec += 1000000; } w_time.tv_sec=e_time.tv_sec - s_time.tv_sec; w_time.tv_usec=e_time.tv_usec - s_time.tv_usec; printf("ok timeout was %u and %u microseconds\n", w_time.tv_sec, w_time.tv_usec ); state++; break; case 4: write(cs, START, strlen(START)); state++; pause(); break; case 5: woff=0; hdr_ptr=hdrs; end=hdrs + strlen(hdrs); hsent=0; do { again2: woff=write(cs, hdr_ptr, strlen(hdr_ptr)); if (woff == -1 && (errno == EINTR || errno == EAGAIN)) { goto again2; } if (woff < 0) { perror("write"); exit(1); } hsent += woff; assert(hdr_ptr + woff <= end); hdr_ptr += woff; } while (hdr_ptr != end); printf("sent %zu bytes of headers\n", hsent); printf("now wait" " %u secs and %u microsecs\n", w_time.tv_sec, w_time.tv_usec ); memset(&it.it_interval, 0, sizeof(it.it_interval)); it.it_value.tv_sec=w_time.tv_sec; it.it_value.tv_usec=w_time.tv_usec; if (setitimer(ITIMER_REAL, &it, NULL) < 0) { perror("setitimer"); exit(123); } signal(SIGALRM, collecttimeout); pause(); break; case 6: write(cs, "AAAAAAAA", 8); state++; break; case 7: sleep(4); break; default: fprintf(stderr, "unknown state! %d\n", state); exit(1); break; } if (fdio != ofdio) { memset(rbuf, 0, sizeof(rbuf)); if (read(cs, rbuf, sizeof(rbuf) -1) > 0) { process_data(rbuf); ofdio=fdio; } } if (state == 7) { break; } } shutdown(cs, SHUT_RDWR); close(cs); exit(0); }
/** Loads the stk configuration file. After loading it checks if all necessary * values are actually defined, otherwise an error message is printed and STK * is aborted. * /param filename Name of the configuration file to load. */ void STKConfig::load(const std::string &filename) { // Avoid loading the default config file if a user-specific // config file has already been loaded. if(m_has_been_loaded) return; m_has_been_loaded = true; init_defaults(); XMLNode *root = 0; try { root = new XMLNode(filename); if(!root || root->getName()!="config") { if(root) delete root; std::ostringstream msg; msg << "Couldn't load config '" << filename << "': no config node."; throw std::runtime_error(msg.str()); } getAllData(root); } catch(std::exception& err) { fprintf(stderr, "Error while parsing KartProperties '%s':\n", filename.c_str()); fprintf(stderr, "%s", err.what()); fprintf(stderr, "\n"); } delete root; // Check that all necessary values are indeed set // ----------------------------------------------- #define CHECK_NEG( a,strA) if(a<=UNDEFINED) { \ fprintf(stderr,"Missing default value for '%s' in '%s'.\n", \ strA,filename.c_str());exit(-1); \ } if(m_score_increase.size()==0 || (int)m_score_increase.size()!=m_max_karts) { fprintf(stderr,"Not or not enough scores defined in stk_config"); exit(-1); } if(m_leader_intervals.size()==0) { fprintf(stderr,"No follow leader interval(s) defined in stk_config"); exit(-1); } if(m_switch_items.size()!=Item::ITEM_LAST-Item::ITEM_FIRST+1) { fprintf(stderr,"No item switches defined in stk_config"); exit(-1); } CHECK_NEG(m_max_karts, "<karts max=..." ); CHECK_NEG(m_gp_order, "grand-prix order=..." ); CHECK_NEG(m_parachute_friction, "parachute-friction" ); CHECK_NEG(m_parachute_done_fraction, "parachute-done-fraction" ); CHECK_NEG(m_parachute_time, "parachute-time" ); CHECK_NEG(m_parachute_time_other, "parachute-time-other" ); CHECK_NEG(m_bomb_time, "bomb-time" ); CHECK_NEG(m_bomb_time_increase, "bomb-time-increase" ); CHECK_NEG(m_anvil_time, "anvil-time" ); CHECK_NEG(m_anvil_weight, "anvil-weight" ); CHECK_NEG(m_item_switch_time, "item-switch-time" ); CHECK_NEG(m_bubble_gum_counter, "bubblegum disappear counter"); CHECK_NEG(m_explosion_impulse, "explosion-impulse" ); CHECK_NEG(m_explosion_impulse_objects, "explosion-impulse-objects" ); CHECK_NEG(m_max_history, "max-history" ); CHECK_NEG(m_max_skidmarks, "max-skidmarks" ); CHECK_NEG(m_min_kart_version, "<kart-version min...>" ); CHECK_NEG(m_max_kart_version, "<kart-version max=...>" ); CHECK_NEG(m_min_track_version, "min-track-version" ); CHECK_NEG(m_max_track_version, "max-track-version" ); CHECK_NEG(m_skid_fadeout_time, "skid-fadeout-time" ); CHECK_NEG(m_near_ground, "near-ground" ); CHECK_NEG(m_delay_finish_time, "delay-finish-time" ); CHECK_NEG(m_music_credit_time, "music-credit-time" ); CHECK_NEG(m_leader_time_per_kart, "leader time-per-kart" ); CHECK_NEG(m_penalty_time, "penalty-time" ); m_kart_properties.checkAllSet(filename); } // load
/** Checks if all necessary physics values are indeed defines. This helps * finding bugs early, e.g. missing default in stk_config.dat file. * \param filename File from which the data was read (only used to print * meaningful error messages). */ void KartProperties::checkAllSet(const std::string &filename) { if(m_gear_switch_ratio.size()==0) { fprintf(stderr,"Missing default value for 'gear-switch-ratio' in '%s'.\n", filename.c_str()); exit(-1); } if(m_gear_power_increase.size()==0) { fprintf(stderr,"Missing default value for 'gear-power-increase' in '%s'.\n", filename.c_str()); exit(-1); } if(m_gear_switch_ratio.size()!=m_gear_power_increase.size()) { fprintf(stderr,"Number of entries for 'gear-switch-ratio' and 'gear-power-increase\n"); fprintf(stderr,"in '%s' must be equal.\n", filename.c_str()); exit(-1); } if(m_startup_boost.size()!=m_startup_times.size()) { fprintf(stderr, "Number of entried for 'startup times' and 'startup-boost\n"); fprintf(stderr, "must be identical.\n"); exit(-1); } #define CHECK_NEG( a,strA) if(a<=UNDEFINED) { \ fprintf(stderr,"Missing default value for '%s' in '%s'.\n", \ strA,filename.c_str());exit(-1); \ } CHECK_NEG(m_mass, "mass" ); CHECK_NEG(m_min_speed_turn, "turn min-speed-angle" ); CHECK_NEG(m_min_radius, "turn min-speed-angle" ); CHECK_NEG(m_max_speed_turn, "turn max-speed-angle" ); CHECK_NEG(m_max_radius, "turn max-speed-angle" ); CHECK_NEG(m_time_full_steer, "turn time-full-steer" ); CHECK_NEG(m_time_full_steer_ai, "turn time-full-steer-ai" ); CHECK_NEG(m_wheel_damping_relaxation, "wheels damping-relaxation" ); CHECK_NEG(m_wheel_damping_compression, "wheels damping-compression" ); CHECK_NEG(m_wheel_radius, "wheels radius" ); CHECK_NEG(m_friction_slip, "friction slip" ); CHECK_NEG(m_roll_influence, "stability roll-influence" ); CHECK_NEG(m_chassis_linear_damping, "stability chassis-linear-damping"); CHECK_NEG(m_chassis_angular_damping, "stability chassis-angular-damping"); CHECK_NEG(m_engine_power[0], "engine power[0]" ); CHECK_NEG(m_engine_power[1], "engine power[1]" ); CHECK_NEG(m_engine_power[2], "engine power[2]" ); CHECK_NEG(m_max_speed[0], "engine maximum-speed[0]" ); CHECK_NEG(m_max_speed[1], "engine maximum-speed[1]" ); CHECK_NEG(m_max_speed[2], "engine maximum-speed[2]" ); CHECK_NEG(m_max_speed_reverse_ratio, "engine max-speed-reverse-ratio"); CHECK_NEG(m_brake_factor, "engine brake-factor" ); CHECK_NEG(m_suspension_stiffness, "suspension stiffness" ); CHECK_NEG(m_suspension_rest, "suspension rest" ); CHECK_NEG(m_suspension_travel_cm, "suspension travel-cm" ); CHECK_NEG(m_collision_side_impulse, "collision side-impulse" ); CHECK_NEG(m_jump_velocity, "jump velocity" ); CHECK_NEG(m_upright_tolerance, "upright tolerance" ); CHECK_NEG(m_upright_max_force, "upright max-force" ); CHECK_NEG(m_track_connection_accel, "track-connection-accel" ); CHECK_NEG(m_rubber_band_max_length, "rubber-band max-length" ); CHECK_NEG(m_plunger_in_face_duration[0],"plunger: in-face-time[0]" ); CHECK_NEG(m_plunger_in_face_duration[1],"plunger: in-face-time[1]" ); CHECK_NEG(m_plunger_in_face_duration[2],"plunger: in-face-time[2]" ); CHECK_NEG(m_rubber_band_force, "rubber-band force" ); CHECK_NEG(m_rubber_band_duration, "rubber-band duration" ); CHECK_NEG(m_zipper_time, "zipper-time" ); CHECK_NEG(m_zipper_fade_out_time, "zipper-fade-out-time" ); CHECK_NEG(m_zipper_force, "zipper-force" ); CHECK_NEG(m_zipper_speed_gain, "zipper-speed-gain" ); CHECK_NEG(m_zipper_max_speed_increase, "zipper-max-speed-increase" ); CHECK_NEG(m_skid_decrease, "skid decrease" ); CHECK_NEG(m_time_till_max_skid, "skid time-till-max" ); CHECK_NEG(m_skid_increase, "skid increase" ); CHECK_NEG(m_skid_max, "skid max" ); CHECK_NEG(m_skid_visual, "skid visual" ); CHECK_NEG(m_slipstream_length, "slipstream length" ); CHECK_NEG(m_slipstream_collect_time, "slipstream collect-time" ); CHECK_NEG(m_slipstream_use_time, "slipstream use-time" ); CHECK_NEG(m_slipstream_add_power, "slipstream add-power" ); CHECK_NEG(m_slipstream_min_speed, "slipstream min-speed" ); CHECK_NEG(m_slipstream_max_speed_increase, "slipstream max-speed-increase" ); CHECK_NEG(m_slipstream_duration, "slipstream duration" ); CHECK_NEG(m_slipstream_fade_out_time, "slipstream fade-out-time" ); CHECK_NEG(m_camera_distance, "camera distance" ); CHECK_NEG(m_camera_forward_up_angle, "camera forward-up-angle" ); CHECK_NEG(m_camera_backward_up_angle, "camera forward-up-angle" ); CHECK_NEG(m_nitro_power_boost, "nitro power-boost" ); CHECK_NEG(m_nitro_consumption, "nitro consumption" ); CHECK_NEG(m_nitro_big_container, "nitro big-container" ); CHECK_NEG(m_nitro_small_container, "nitro small-container" ); CHECK_NEG(m_nitro_max_speed_increase, "nitro max-speed-increase" ); CHECK_NEG(m_nitro_duration, "nitro duration" ); CHECK_NEG(m_nitro_fade_out_time, "nitro fade-out-time" ); CHECK_NEG(m_rescue_height, "rescue height" ); CHECK_NEG(m_rescue_time, "rescue time" ); CHECK_NEG(m_rescue_vert_offset, "rescue vert-offset" ); CHECK_NEG(m_explosion_time, "explosion time" ); CHECK_NEG(m_explosion_radius, "explosion radius" ); CHECK_NEG(m_ai_steering_variation, "ai steering-variation" ); } // checkAllSet