#pragma once
#include "global.h"
#include "MyView.h"
#include "MapDrawer.h"
#include "MyCamera.h"
#include "EntityRes.h"
#include "GameInput.h"
#include "GameScript.h"
#include "ScriptCmd.h"
#include "GameMsgbox.h"
#include "GameFade.h"
#include "GameUI.h"
#include "GameTimer.h"
#include "DmgNum.h"
#include "MapSystem.h"
#include "GameMap.h"
#include "GamePxa.h"
#include "GamePid.h"
#include "OrganyaPlayer.h"
#include "StageDrawer.h"
#include "ItemSystem.h"
#include "SlotDrawer.h"
#include "GameFlash.h"
#include "Pathfinding.h"
class MyGame
{
public:
	void Init(MyDX11Renderer* pRenderer, MySDLInput* pInput, JoystickInput* pJoystickInput, MyView* pView, const GameFunc* pGameFunc);//初始化游戏
	void SetMainGame();//将当前游戏设置为主游戏（影响一些全局变量）
	void EnableDrawDebug(bool bEnable);
	void SetUIVisiable(bool bVisiable);//设置血条UI显示
	void LoadSetting(const wchar_t* settingName);//载入启动配置
	void LoadSetting(const wchar_t* mapfileName, const wchar_t* mycharName, int xPos, int yPos, int lr = 0, bool hidePlayer = false, bool bLight = true, bool runEvent = false, const wchar_t* eventName = nullptr);
	void LoadMap(const wchar_t* mapfileName);//直接载入地图
	void StartEvent(const wchar_t* eventName, const wchar_t* triggerType);//设置启动事件
	virtual void Draw(float deltaTime);
	virtual void Step();
	virtual void Reset();
	void Controll();
	virtual void OnResetScale(int w, int h);
	std::weak_ptr<Entity> GetMyChar_Player1();
	std::weak_ptr<Entity> GetMyChar_Player1_menuKeyboard();
	std::weak_ptr<Entity> GetMyChar_Player2();
	std::weak_ptr<Entity> GetMyChar_Player2_menuKeyboard();
	void SetMyChar_Player1(std::weak_ptr<Entity> e);//设置玩家1的控制实体
	void SetMyChar_Player2(std::weak_ptr<Entity> e);//设置玩家2的控制实体
	bool TitleStageOk();//确认了标题画面
	void GetDebugEntityNum(int* outLsNum, int* outMcNum, int* outAmNum, int* outPeNum);
	virtual void SaveGame(std::vector<char>* saveData);
	virtual void LoadGame(const char* loadData);
	void ReloadLanguage();
	void ReloadGameMapScript();//更新物品栏语言
	void SetGlobalEntity(std::shared_ptr<Entity> we, const wchar_t* globalEntityID);//将实体设置到全局运行
	std::weak_ptr<Entity> GetGlobalEntity(const wchar_t* globalEntityID);//取出全局实体指针
	std::unordered_map<std::wstring, std::weak_ptr<Entity>>* GetGlobalEntityTable();
	int GetPlayerIndex(std::weak_ptr<Entity> e);//取当前实体的玩家下标
	std::weak_ptr<Entity> GetPlayerDistance(float x, float y);//取离该点最近的玩家
	std::weak_ptr<Entity> GetPlayerDistanceLR(float x, float y, int lr);//取离该点一侧最近的玩家
	std::weak_ptr<Entity> GetPlayerDistanceWithLineTest(float x, float y);//取离该点最近的可以直接射击的玩家
	std::weak_ptr<Entity> GetPlayerDistanceLRWithLineTest(float x, float y, int lr);//取离该点一侧最近的可以直接射击的玩家
	std::weak_ptr<Entity> GetCheckEventPlayer();//取最后一次正在调查事件的玩家
	void SetQuake(int times, int mode);//mode:0小抖动、1大抖动
	void SetLocalCamera(std::weak_ptr<Entity> e, float focusTimes);//设置局部相机
	void UnsetLocalCamera(std::weak_ptr<Entity> e);//取消该单位的聚焦
	void EnableItemSystem(bool bEnable);//启用物品栏系统
	void LockAllPlayerJump();//防止误跳跃
	void SaveAllPlayerPosition();//保存所有玩家坐标
	void LoadAllPlayerPosition();//载入所有玩家坐标
	void NoEnemyMode();
	void KillAllEnemy();//杀了所有敌人
	void MoveAllPlayerToMousePos();//移动所有玩家到鼠标的位置
	bool InBossFight();
	void FullLight();//将所有的图层的天光置1
	void TryControlMousePosEntity();//尝试控制目标（如果是可操控的玩家角色）
	ScriptCmd* GetCmd();
private:
	//初始化参数
	MyDX11Renderer* pRenderer = nullptr;
	MySDLInput* pInput = nullptr;
	JoystickInput* pJoystickInput = nullptr;
	MyView* pView = nullptr;
	GameFunc gameFunc;
	bool enableDrawDebug;
	bool bChildGame = false;
	bool bSetKillAllEnemy = false;
	bool bSetMoveAllPlayerToMousePos = false;
	bool bSetTryControlMousePosEntity = false;
	float game_delteTime = 0;
	bool enablePlayer2AISwitch = true;//允许玩家2的AI切换
	//游戏变量
	std::set<std::wstring> flagSet;//游戏flag集合
	std::set<std::wstring> skipSet;//skip集合
	//玩家1
	GameInput gameInput_player1;
	std::weak_ptr<Entity> mychar_player1;//玩家1正在控制的角色
	std::weak_ptr<Entity> mychar_player1_menuKeyboard;//玩家1的菜单键盘实体（不参与游戏，只保证菜单界面可以用键盘控制）
	//玩家2
	GameInput gameInput_player2;
	std::weak_ptr<Entity> mychar_player2;//玩家2正在控制的角色
	std::weak_ptr<Entity> mychar_player2_menuKeyboard;//玩家2的菜单键盘实体（不参与游戏，只保证菜单界面可以用键盘控制）
	//最近一次调查了事件的玩家下标
	int checkEventPlayerIndex = 0;
	//其他
	bool(GameInput::* GetKey[20])();
	void(GameInput::* SetKey[20])(bool);
	SDL_Scancode* is_p1k[20];
	SDL_Scancode* is_p2k[20];
	SDL_GameControllerButtonBind* is_p1j[20];
	SDL_GameControllerButtonBind* is_p2j[20];
	//组件模块
	GameMap gameMap;
	GamePxa gamePxa;
	GamePid gamePid;
	MyCamera myCamera;
	EntityRes entityRes;
	GameScript gameScript;
	ScriptCmd scriptCmd;
	GameMsgbox gameMsgbox;
	GameFade gameFade;
	GameUI gameUI;
	GameTimer gameTimer;
	DmgNum dmgNum;
	MapSystem mapSystem;
	StageDrawer stageDrawer;
	ItemSystem itemSystem;
	SlotDrawer slotDrawer;
	GameFlash gameFlash;
	std::unique_ptr<MyGame> credit;
	MyView creditView;
	//检查玩家调查事件
	void PlayerCheckEvent();
	void GridPlayerCheckEvent(std::weak_ptr<Entity> player);
	void PlayerWaitStand();
	void DrawDark();
	void Keyboard();
	void Joystick();
	void StepEntitySystem();
	void DeltaTimeEntitySystem(float deltaTime);
	//全局实体
	std::unordered_map<std::wstring, std::weak_ptr<Entity>> globalEntityTable;
	std::list<std::shared_ptr<Entity>> globalEntity;
	std::list<std::shared_ptr<Entity>> globalEntity_addList;
	std::list<Entity> positionSaver;//坐标保存器
	void StepGlobalEntity(MyMapLayer* pLayer, PxaData* pxaData);
	void DeltaTimeGlobalEntity(MyMapLayer* pLayer, float deltaTime);
	void SwitchPlayerStep();//切换角色
	void SwapPlayer();//交换玩家1和玩家2的角色
	//无敌人模式
	bool bNoEnemyMode = false;
	void ClearEnemy();//清除当前房间所有的敌人
	//友元
	friend class GameScript;
	friend class ScriptCmd;
	friend class MiniScriptSystem;
	friend class ItemSystem;
};

