#ifndef _CGAMEOPTIONS
#define _CGAMEOPTIONS

#include "types.h"

#include "rstl/pair.hpp"
#include "rstl/reserved_vector.hpp"
#include "rstl/vector.hpp"

#include "Kyoto/Audio/CAudioSys.hpp"
#include "Kyoto/SObjectTag.hpp"
#include "MetroidPrime/TGameTypes.hpp"

class CInputStream;
class CMemoryStreamOut;

class CGameOptions {
public:
  CGameOptions();
  CGameOptions(CInputStream& in);

  void PutTo(CMemoryStreamOut&);

  void InitSoundMode();
  void ResetToDefaults();
  void EnsureOptions();

  void SetScreenBrightness(int, bool);
  float TuneScreenBrightness();
  void SetScreenPositionX(int, bool);
  void SetScreenPositionY(int, bool);
  void SetScreenStretch(int, bool);
  void SetSfxVolume(int, bool);
  void SetMusicVolume(int, bool);
  void SetSurroundMode(CAudioSys::ESurroundModes, bool);

  float GetHudAlpha() const;
  float GetHelmetAlpha() const;
  void SetHelmetAlpha(int);
  void SetHUDLag(bool);
  void SetIsHintSystemEnabled(bool);
  void SetInvertYAxis(bool);
  void ToggleControls(bool);
  void ResetControllerAssets(int);
  void SetControls(int);

  void SetIsRumbleEnabled(bool rumble);
  bool GetIsRumbleEnabled() const { return x68_26_rumble; }

private:
  rstl::reserved_vector< uchar, 64 > x0_;
  int x44_soundMode;
  int x48_screenBrightness;
  int x4c_screenXOffset;
  int x50_screenYOffset;
  int x54_screenStretch;
  uint x58_sfxVol;
  uint x5c_musicVol;
  int x60_hudAlpha;
  int x64_helmetAlpha;
  bool x68_24_hudLag : 1;
  bool x68_25_invertY : 1;
  bool x68_26_rumble : 1;
  bool x68_27_swapBeamsControls : 1;
  bool x68_28_hintSystem : 1;
  rstl::vector< rstl::pair< CAssetId, CAssetId > > x6c_controlTxtrMap;
};

#endif // _CGAMEOPTIONS
