/* -*- Mode: C++; -*- */
/* VER: $Id: SimulationOptions.h 8084 2022-03-22 23:18:49Z iobyte $ */
// copyright (c) 2004 by Christos Dimitrakakis <dimitrak@idiap.ch>
/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/
#ifndef SIMULATION_OPTIONS_H
#define SIMULATION_OPTIONS_H

#include "Options.h"
#include <car.h>

///	Aerodynamic flow model
enum AeroFlowModel {
	SIMPLE, ///< A simple model - can exceed theoretical limits
	PLANAR, ///< A planar model - severely underperforms
    OPTIMAL, ///< Gives the maximum theoretically allowed (accorindg to the principle of the conservation of energy) amount of lift for a given drag.
	SEGMENTS ///< A segmented surface model - not implemented.. yet
};

/**
   Simulation options for easy handling of default options.
   
   You can read/write the options directly but there is support for
   setting them through strings.
 */
class SimulationOptions
{
public:

	float tyre_damage; 	///< Amount of tyre wear, 1.0 is normal wear, 0.0 is no wear.
	bool tyre_temperature; ///< Tyre temperature effects.
	bool suspension_damage; ///< If true, the suspension shocks can be damaged from large bumps.
	bool alignment_damage; ///< If true, the suspension can become misaligned from large bumps.
	bool aero_damage; ///< If true, damage can cause changes to the aerodynamic profile.
	float aero_factor; ///< Multiplier for aerodynamic downforce. Defaults to 4.0 for all cases apart from pro, where it defaults to 1.0.
	enum AeroFlowModel aeroflow_model; ///< Experimental option

	SimulationOptions();
	/// Set the appropriate values for the driver's skill
	void SetFromSkill (tSkillLevel skill);
	/**
	   After setting defaults, you can customise by loading values from a file.
	   If values are not contained in the file then we just use the previously
	   defined values.
	*/
	void LoadFromFile(void* handle);
	/// Get a single option
	template <typename T>
	T Get (char* name)
	{
		return option_list.Get<T>(name);
	}
	/// Set a single option
	template <typename T>
	void Set (char* name, T value)
	{
		option_list.Set(name, value);
	}
private:
	OptionList option_list;
	void SetFloatFromGfParm(void* handle, const char* name);
	void SetBoolFromGfParm(void* handle, const char* name);
	bool StrToBool (const char* s, bool dontcare=false);
};

#endif
