#pragma once
#include <iostream>
#include "GameCore.h"
#include "TextureManager.h"
#include "CharacterManager.h"
#include "TextManager.h"
#include "SpriteRenderer.h"
#include "MapManager.h"
#include "ScreenManager.h"
#include "KeyboardManager.h"
#include "GroundManager.h"
#include "Timing.h"
#include "CollisionManager.h"
#include "DialogueManager.h"
#include "TriggerManager.h"
#include "EventManager.h"
#include "SplashManager.h"
#include "WeatherManager.h"
#include "SoundManager.h"
#include "MainCharacter.h"
#include "CreateEnemy_Desert.h"
#include "ActivateTown.h"
#include "Centaur.h"
#include "TintManager.h"
#include "InitGame.h"
#include "EnemySpawner.h"
#include "ExitAfterSplash.h"
#include "HUD.h"

class RPGXEngine
{
public:
	HRESULT setupD3D(HWND hWnd);
	// initialize game
	HRESULT initGame();
	LPDIRECT3DDEVICE9& getDeviceHandle();
	LPDIRECT3D9 & getD3D();
    // go through game logic + rendering
	void gameLoop( bool tick );
	// render sceen
	HRESULT render();
	//constructor & destructor
	RPGXEngine( Timing* MyTimer, HINSTANCE newHInstance, HWND hWnd );
	~RPGXEngine();

private:
	//structures for init
	D3DDISPLAYMODE d3dDisplayMode;
	D3DPRESENT_PARAMETERS d3dPresentParameters;

	// member pointers for D3D
	LPDIRECT3D9 pd3d;
	LPDIRECT3DDEVICE9 pd3dDevice;

	// Variables to make our engine display things
    TextManager* textManager;
	DialogueManager* dialogueManager;
	TextureManager* textureManager;
	SpriteRenderer* spriteRenderer;
	MapManager* mapManager;
	ScreenManager* screenManager;
	KeyboardManager* keyboardManager;
	CharacterManager* characterManager;
	GroundManager* groundManager;
	CollisionManager* collisionManager;
    EventManager* eventManager;
	TriggerManager* triggerManager;
    WeatherManager* weatherManager;
    SplashManager* splashManager;
    SoundManager* soundManager;
	EnemySpawner* enemySpawner;
	Timing* timer;
	MainCharacter* mainCharacter;
	HINSTANCE hInstance;
	HWND hWnd;
	TintManager* tintManager;
    
    HUD* hud;

	bool readyToAttack;
    bool readyToMagic;

    SpriteStamp* mainCharHead;
	int worldTickCount;
    int dayTimer;
};
