#pragma once
#include "global.h"
//前置声明
class MyGame;
class GameMap;
class MapDrawer;
class GameScript;
class GameMsgbox;
class EntityRes;
class GameFade;
class MyCamera;
class GameUI;
class DmgNum;
class MapSystem;
class Entity;
class ItemSystem;
struct MyView;
//脚本操作函数接口
class ScriptCmd
{
public:
	void Init(MyGame* game);
	//传送玩家到某地图
	void TRA(const char* mapName_utf8, const char* eventName_utf8, int x, int y);
	void TRA(const char* mapName_utf8, const char* eventName_utf8, int x, int y, int hv, int offset);
	//lua脚本调试
	void DBG(const char* str_utf8);
	//等待
	void WAI(int wait);
	//暂停事件直到玩家站在地上
	void WAS();
	//设置文本框样式
	void STY(const char* msgboxStyle_utf8);
	//显示文本框
	void MSG(const char* msg_utf8, int mode);
	//上方隐藏文本框
	void MS2(const char* msg_utf8, int mode);
	//上方文本框
	void MS3(const char* msg_utf8, int mode);
	//自动文本框
	void MS4(const char* msg_utf8, int mode);
	//设置文本框字显示的速度
	void MSS(int speed);
	//设置文本框字显示的速度
	void TUR(bool tur);
	//按z键继续
	void NOD();
	//附加文本
	void CAT(const char* msg_utf8, int mode);
	//清空文本
	void CLR();
	//清空并关闭文本框
	void CLO();
	//设置文本颜色
	void FCL(BYTE r, BYTE g, BYTE b, BYTE a);
	//设置字体
	void FNT(const char* fontFamily_utf8);
	//设置字号
	void FSZ();
	void FSZ(int fontSize);
	//设置头像
	void FAC(const char* faceID);
	//关闭头像
	void FAC();
	//播放org音乐
	void CMU(const char* musicName_utf8, float fadeInSecond);
	//暂停org音乐
	void PMU(float fadeOutSecond);
	//恢复org音乐
	void RMU(float fadeInSecond);
	//播放wav声音
	void SOU(const char* soundName_utf8);
	//播放ogg音乐
	void CMU2(const char* musicName_utf8, float fadeInSecond);
	//暂停ogg音乐
	void PMU2(float fadeOutSecond);
	//恢复ogg音乐
	void RMU2(float fadeInSecond);
	//在事件结束前锁住游戏
	void PRI();
	//在事件结束前锁住键盘
	void KEY(bool bKey = true);
	//玩家的水平速度设为0
	void MM0();
	void MM0(int playerIndex);
	//玩家速度置0
	void MV0();
	void MV0(int playerIndex);
	//将玩家移到坐标
	void MOV(int x, int y);
	void MOV(int x, int y, int hv, int offset);
	void MOV(int x, int y, int playerIndex);
	void MOV(int x, int y, int hv, int offset, int playerIndex);
	void MOV(int x, int y, const char* globalEntityID_utf8);
	void MOV(int x, int y, int hv, int offset, const char* globalEntityID_utf8);
	void MOV(const char* eventName_utf8);
	void MOV(const char* eventName_utf8, int playerIndex);
	void MOV(int playerIndex);
	//设置玩家的面朝方向
	void SLR(int lr);
	void SLR(int lr, int playerIndex);
	void SLR(const char* eventName_utf8, int playerIndex);
	void SLR(const char* eventName_utf8);
	//取玩家的面朝方向
	int GLR(int playerIndex);
	//设置玩家后跳
	void MYB(int lr);
	void MYB(int lr, int playerIndex);
	//聚焦到Npc
	void FON(const char* eventName_utf8, float focusTimes);
	//聚焦到玩家
	void FOM(float focusTimes);
	void FOM(float focusTimes, int playerIndex);
	//显示地图名称
	void MNA();
	//渐入
	void FAI(int direction);
	//渐出
	void FAO(int direction);
	//隐藏玩家
	void HMC();
	void HMC(int playerIndex);
	void HMC(const char* globalEntityID_utf8);
	//显示玩家
	void SMC();
	void SMC(int playerIndex);
	void SMC(const char* globalEntityID_utf8);
	//设置Npc动画
	void ANP(int stateID);
	void ANP(const char* eventName_utf8, int stateID, int lr);
	void ANP(const char* eventName_utf8, int stateID);
	void ANP(const char* stateName_utf8);
	void ANP(const char* eventName_utf8, const char* stateName_utf8, int lr);
	void ANP(const char* eventName_utf8, const char* stateName_utf8);
	//设置玩家动画
	void AMC(int stateID);
	void AMC(int stateID, int lr);
	void AMC(int stateID, int lr, int playerIndex);
	void AMC(int stateID, int lr, const char* globalEntityID_utf8);
	void AMC(int stateID, const char* mycharName_utf8);
	void AMC(const char* stateName_utf8);
	void AMC(const char* stateName_utf8, int lr);
	void AMC(const char* stateName_utf8, int lr, int playerIndex);
	void AMC(const char* stateName_utf8, int lr, const char* globalEntityID_utf8);
	void AMC(const char* stateName_utf8, const char* mycharName_utf8);
	//设置某一类型Npc动画
	void ATP(const char* npcName_utf8, const char* stateName_utf8);
	//设置玩家顶级绘制
	void TMC(bool enable);
	void TMC(bool enable, int playerIndex);
	//设置Npc顶级绘制
	void TNP(const char* eventName_utf8, bool enable);
	//替换NPC
	void CNP(const char* eventName_utf8, const char* npcName_utf8, int stateID, int lr);
	void CNP(const char* eventName_utf8, const char* npcName_utf8, int stateID);
	void CNP(const char* eventNameSrc_utf8, const char* eventNameDst_utf8);
	//移动Npc
	void MNP(const char* eventName_utf8, int x, int y, int lr);
	void MNP(const char* eventName_utf8, const char* dstEventName_utf8);
	//设置Boss战斗(显示boss血条)
	void BSL(const char* eventName_utf8, int lineSize);
	void BSL(const char* eventName_utf8);
	//保存游戏
	void SAV();
	//设置图层可见
	void LAY(const char* layerName_utf8, bool bVisible);
	//设置flag
	void FLP(const char* flagName_utf8);
	//移除flag
	void FLS(const char* flagName_utf8);
	//检查flag是否已设立
	bool FLJ(const char* flagName_utf8);
	//进入YesNo选择
	void YNJ();
	//返回最后一次YNJ选择结果
	bool YES();
	//重新载入游戏
	void INI();
	//返回标题画面
	void ESC();
	//事件结束时保留文本框显示
	void W99();
	//显示游戏地图
	void MAP();
	//取最近一次调查事件的玩家下标
	int PLY();
	//放置NPC
	void SNP(const char* npcName_utf8,int x,int y,int lr, const char* layerName_utf8, const char* eventName_utf8);
	//删除NPC
	void DNP(const char* eventName_utf8);
	void DNP();//删除正在调查的对象
	//增加玩家最大生命值
	void MLP(int val);
	void MLP(int val, int playerIndex);
	//检测房间里是否有某事件实体
	bool ECJ(const char* eventName_utf8);
	//恢复玩家生命
	void LIP(int val);
	void LIP(int val, int playerIndex);
	//恢复玩家能量
	void MIP(int val);
	void MIP(int val, int playerIndex);
	//取启动该事件的触发器类型
	const char* TGR();
	//设置实体预处理表
	void ELT(const char* npcName_utf8, const char* eventName_utf8, const char* triggerType_utf8);
	void ELT(const char* npcName_utf8);
	void ELT();
	//设置玩家控制的全局实体
	void SPL(int playerIndex, const char* globalEntityID_utf8);
	//放置全局NPC
	void SGP(const char* npcName_utf8, int x, int y, int lr, const char* globalEntityID_utf8);
	//复制并放置一个全局单位
	void CGP(const char* srcGlobalEntityID_utf8, const char* dstGlobalEntityID_utf8);
	//删除全局NPC
	void DGP(const char* globalEntityID_utf8);
	//让AI控制这个全局NPC
	void AGP(const char* globalEntityID_utf8, bool enableAI, const char* followID_utf8 = nullptr);
	//玩家2AI切换启用和禁止
	void P2A(bool bEnable);
	//调查目标是否在水中
	bool WET();
	//返回调查目标的实体id
	const char* EID();
	//注册物品
	void RGI(const char* regID_utf8, const char* iconEntityName_utf8,
		const char* functionName_utf8, const char* checkFunctionName_utf8, bool stackable);
	//添加物品，返回该物品总数量
	int ITP(const char* regID_utf8, int num);
	int ITP(const wchar_t* regID, int num);
	//移除物品（-1为移除全部）,返回剩余数量
	int ITS(const char* regID_utf8, int num);
	int ITS(const wchar_t* regID, int num);
	int ITS();//移除玩家所有物品
	//玩家是否拥有某物品
	bool ITJ(const char* regID_utf8, int num);
	//玩家拥有某物品的数量
	int ITC(const char* regID_utf8);
	int ITC(const wchar_t* regID);
	//注册任务
	void RGM(const char* regID_utf8, const char* iconEntityName_utf8,
		const char* missionName_utf8, const char* functionName_utf8, const char* checkFunctionName_utf8);
	//添加任务
	void MSA(const char* regID_utf8);
	//删除任务
	void MSD(const char* regID_utf8);
	void MSD();
	//替换任务
	void MSR(const char* regID_src_utf8, const char* regID_dst_utf8);
	//是否拥有某任务
	bool MSJ(const char* regID_utf8);
	//切换主游戏cmd命令
	void SUB(bool bSub);
	//锁定物品让其他玩家无法调查
	void LOC(int checkItemIndex, bool bLock);
	//当前物品是否被锁定
	bool LOC(int checkItemIndex);
	//展示某物品
	void GIT(const char* regID_utf8, int num);
	void GIT();
	//当前是否使用主游戏命令
	bool IsMainGame();
	//取当前正在调查的物品下标
	int GetCheckItemIndex();
	//立即更新玩家数据到UI
	void IMM();
	//设置快进旗
	void SKP(const char* flagName_utf8);
	//移除快进旗
	void SKS(const char* flagName_utf8);
	//检查快进旗是否已设立
	bool SKJ(const char* flagName_utf8);
	//保存和载入所有玩家坐标
	void POS(bool save = false);
	//更新地图上的瓦片
	void CMP(const char* layerCopyFrom_utf8, const char* layerCopyTo_utf8);
	void CMP(const char* layerCopyFrom_utf8, const char* layerCopyTo_utf8, const char* smokeNpcName_utf8);
	//晃动屏幕
	void QUA(int times, int mode);
	//替换新的玩家角色
	void SWC(int playerIndex, const char* npcName_utf8, const char* globalEntityID_utf8, bool extendHpMax);
	//交换玩家1和玩家2的角色
	void SWP();
	//取玩家的角色名
	const char* MCN(int playerIndex);
	//取玩家下标
	int MCI(const char* mycharName_utf8);
	//取当前游戏模式玩家数量
	int GOP();
	//闪屏
	void FLA(int times = 20);
	//杀死房间里某一种类型的敌人，返回击杀数量
	int KIL(const char* npcName_utf8,int damage = 9999);
	//设置星星砖破坏效果
	void STA(const char* smokeNpcName_utf8, int num, const char* soundName_utf8);
	//清空MP
	void ZAM();
	void ZAM(int playerIndex);
	//复位该关卡的所有敌人
	void RST(std::vector<std::wstring>& nameArr);
	//开始结尾致辞
	void CRE(const char* creditName_utf8);
	void CRE();//关闭结尾致辞
	//取玩家按键名称文本
	const char* KEN(int playerIndex, int keyIndex);
	//取当前游戏难度
	int DIF();
	//显示并开始计时器
	void TIM(bool visiable, bool start);
	//保存计时器数据
	bool STC();
	//读取计时器数据
	bool LTC();
private:
	MyGame* game = nullptr;
	MyView* pView = nullptr;
	GameMap* pGameMap = nullptr;
	MapDrawer* pMapDrawer = nullptr;
	GameScript* pGameScrpt = nullptr;
	GameMsgbox* pGameMsgbox = nullptr;
	EntityRes* pEntityRes = nullptr;
	GameFade* pGameFade = nullptr;
	MyCamera* pCamera = nullptr;
	GameUI* pGameUI = nullptr;
	std::set<std::wstring>* pFlagSet = nullptr;
	std::set<std::wstring>* pSkipSet = nullptr;
	DmgNum* dmgNum = nullptr;
	MapSystem* pMapSystem = nullptr;
	ItemSystem* pItemSystem = nullptr;
	int* pCheckEventPlayerIndex = nullptr;
	std::weak_ptr<Entity>* mychar_ptr_Player1 = nullptr;
	std::weak_ptr<Entity>* mychar_ptr_Player2 = nullptr;
	std::unordered_map<std::wstring, std::weak_ptr<Entity>>* globalEntityTable = nullptr;
	std::list<std::shared_ptr<Entity>>* globalEntity = nullptr;
	std::list<std::shared_ptr<Entity>>* globalEntity_addList = nullptr;
	std::vector<wchar_t> wbuff, wbuff2, wbuff3, wbuff4, wbuff5;
	std::vector<char> utf8;
	int lastWordCount = 0;
	//使用主游戏指令
	bool usingMainGameCmd = false;
};

