#ifndef _CGAMEGLOBALOBJECTS_HPP
#define _CGAMEGLOBALOBJECTS_HPP

#include "types.h"

#include "rstl/optional_object.hpp"
#include "rstl/single_ptr.hpp"

#include "Kyoto/Basics/COsContext.hpp"
#include "Kyoto/CMemoryCardSys.hpp"
#include "Kyoto/CMemorySys.hpp"
#include "Kyoto/CResFactory.hpp"
#include "Kyoto/CSimplePool.hpp"
#include "Kyoto/CToken.hpp"
#include "Kyoto/Graphics/CGraphicsSys.hpp"
#include "Kyoto/Text/CRasterFont.hpp"
#include "Kyoto/TOneStatic.hpp"
#include "MetroidPrime/CInGameTweakManager.hpp"
#include "MetroidPrime/Enemies/CAiFuncMap.hpp"
#include "MetroidPrime/Factories/CCharacterFactoryBuilder.hpp"
#include "MetroidPrime/Player/CGameState.hpp"

class CGameGlobalObjects : public TOneStatic< CGameGlobalObjects > {
public:
  CGameGlobalObjects(COsContext&, CMemorySys&);

  void PostInitialize(COsContext&, CMemorySys&);

  rstl::single_ptr< CGameState >& GameState() { return x134_gameState; }

private:
  rstl::single_ptr< CMemoryCardSys > x0_memoryCardSys;
  CResFactory x4_resFactory;
  CSimplePool xcc_simplePool;
  CCharacterFactoryBuilder xec_characterFactoryBuilder;
  CAiFuncMap x110_aiFuncMap;
  CGraphicsSys x130_graphicsSys;
  rstl::single_ptr< CGameState > x134_gameState;
  u32 x138_;
  rstl::optional_object< TCachedToken< unkptr > > x13c_;
  u32 x14c_;
  rstl::single_ptr< CInGameTweakManager > x150_inGameTweakManager;
  TToken< CRasterFont > x154_defaultFont;
};

// TODO move to related headers
extern unkptr gGuiSystem;
extern unkptr gpController;
extern unkptr gpDefaultFont;

#endif