/***********************************************************************
*Copyright (c)2012 , 天际边工作室
*All rights reserved.
**
文件名称：	ScriptEng.cpp
*摘要：		游戏引擎类头文件
**
*修改历史：
*	版本    日期     作者     改动内容和原因
*   ----------------------------------------------------
*	1.0    2012-10-5  wstjb     基本的功能完成
***********************************************************************/

#pragma once

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "PublicFun.h"
#include "Map.h"
#include "RoleList.h"
#include "GoodList.h"
#include "MagicList.h"
#include "Save.h"
#include "Menu.h"
#include "Fight.h"
#include "SayBox.h"
#include "DegreeList.h"
#include "GameMenu.h"

class ScriptEng
{
public:

	void Init();
	
	int KeyDown(WPARAM KeyCode);
	void Show(WPARAM KeyCode);
	int CallChapter(int type,int index);
	int StartChapter(int type,int index,int runornot= 0);//runornot是否执行 0- 是 1-不是
	void InitCommandParam();
	int GetOrderParaNum(int orderType);
	int ExecOrder(int orderType);
	int RunOrderCycle(int startOrderPos);
	void InitValue();
	void ChangeDataToSave();
	void ChangeSaveToData();
	void DelEquipUse();
	int DelGoodEffect();
	void DelMagicUse();
	void MusicOnOff(int i,int times);
	void DelBuyGood();
	void DelSellGood();
	int DelTimerEvent();
	void SetStackForCallChapter();
	void getStackForRun();
	void SetFightHeroData();
	void AfterFight(int isrunaway = 0);
	void SetObjMapNpc(int x,int y,int num,int type);//20160316新增处理场景对象可行走 type=1清除
	int CheckNPCMoveable(int npcid,int faceTo);//20160719
	int CheckAntiCauseBy(int type,int goodType,int goodIdx,int usedecorateflag);//20181007

	//命令函数运行集合
	int _Music();
	int _LoadMap();
	int _CreateActor();
	int _DeleteNpc();
	int _MapEvent();
	int _ActorEvent();
	int _Move();
	int _ActorMove();
	int _ActorSpeed();
	int _Callback();
	int _Goto();
	int _If();
	int _Set();
	int _Say();
	int _StartChapter();
	int _ScreenR();
	int _ScreenS();
	int _ScreenA();
	int _Event();
	int _Money();
	int _Gameover();
	int _IfCmp();
	int _Add();
	int _Sub();
	int _SetControlId();
	int _GutEvent();
	int _SetEvent();
	int _ClrEvent();
	int _Buy();
	int _FaceToFace();
	int _Movie();
	int _Choice();
	int _CreateBox();
	int _DeleteBox();
	int _GainGoods();
	int _InitFight();
	int _FightEnable();
	int _FightDisenable();
	int _CreateNpc();
	int _EnterFight();
	int _DeleteActor();
	int _GainMoney();
	int _UseMoney();
	int _SetMoney();
	int _LearnMagic();
	int _Sale();
	int _NpcMoveMod();
	int _Message();
	int _DeleteGoods();
	int _ResumeActorHp();
	int _ActorLayerUp();
	int _BoxOpen();
	int _DelAllNpc();
	int _NpcStep();
	int _SetSceneName();
	int _ShowSceneName();
	int _ShowScreen();
	int _UseGoods();
	int _AttribTest();
	int _AttribSet();
	int _AttribAdd();
	int _ShowGut();
	int _UseGoodsNum();
	int _Randrade();
	int _Menu();
	int _TestMoney();
	int _CallChapter();
	int _DisCmp();
	int _Return();
	int _TimeMsg();
	int _DisableSave();
	int _EnableSave();
	int _GameSave();
	int _SetEventTimer();
	int _EnableShowPos();
	int _DisableShowPos();
	int _SetTo();
	int _TestGoodsNum();
	int _SetArmsToss();
	int _SetFightMiss();

	int DgCheckSysMsg();
	int DgDelMsg(int type,char *value);
	int DgCheckRet(int orderType,int i);
	int DgAddBreakPoint(int type,int idx,int orderpos);//脚本类 脚本序号 orderpos
	int DgDelBreakPoint(int type,int idx,int orderpos);//脚本类 脚本序号 orderpos
	int DgAddMonitor(int type,int idx);
	int DgDelMonitor(int type,int idx);
	int DgSetEvent(int idx,int value);//事件号
	int DgSetHurt(int hurt);
	int DgSetRand(int rand);//rand
	int DgSetVal(int idx,int value);//变量号
	void AddFightHeroData();//20161126处理战斗回合中加入角色的过程
	int DgDelay(long time);
	int DgAddBreakPointStep(int type,int idx,int orderpos);//脚本类 脚本序号 orderpos
	int DgGainGood(int type,int idx);//20210816 21
	int DgLearnMagic(int actorid,int type,int idx);//20210816 22
	int DgGainMoney(int value);//20210816 23
	int DgLevelUp(int actorid,int level);//20210816 24
	int DgAttSet(int actorid,int type,int value);//20210816 25 ATTRIBSET actor type attrval
	//end
//private:
	
	Map map;
	Menu menu;
	Menu secondmenu1;
	Menu secondmenu2;
	Menu secondmenu3;
	Menu secondmenu4;
	Menu thirdmenu1;
	Menu thirdmenu2;//20160719选择装备对象 菜单

	Save save;
	Fight fight;
	RoleList roleList;
	MagicList magicList[256];//暂定256条
	MagicList actorMagicList[25];//角色对应的魔法链 20170116改25条
	DegreeList degreeList[25];//暂定25条
	GoodList goodList;
	SayBox sayBox;
	GameMenu gameMenu;

	int scriptByteLen;//存储当前脚本的脚本区长度
	int scriptType;
	int scriptIndex;

	byte orderByte[16384];
	int orderByteLen;
	int orderByteStart;
	int orderParaLen;//指令参数区长度

	int jumpSegmentLen;//转移区大小

	int jumpTable[256];//转移表地址储存

	int command[78][20];//0-无参数  1-直接地址 2-字符串 3-间接地址（gutevent） 4-4字节数L  5-2字节数N 6-buy用多个N
	
	int orderType;//获取当前解析的指令的类型
	int orderParaNum;
	
	int startAddress;
	int parmNum;
	int orderPos ;
	int keyflag;//0-map 1-saybox 2-menu 3-choice命令 4-menu命令
	int keyflag2;//1-属性 2-魔法 3-物品 4系统
	int keyflag21;//1-技能使用确认
	int keyflag31;//1-状态 2-穿戴
	int keyflag32;//1-4主角编号
	int keyflag33;//1-使用 2-装备
	int keyflag34;//1-读入进度 2-存储进度 3-游戏设置 4-结束游戏
	int keyflag431;//1-使用道具
	int keyflag432;//1-使用装备
	int keyflag433;//1-装备界面显示道具信息
	int keyflag5;//1-显示出售界面 2-显示收购界面
	int keyflag51;//1-显示购买数量界面
	int keyflag52;//1-显示出售数量界面
	int keyflagfight;//战斗界面启用flag
	int keyflag332;//20160719新增 装备使用角色
	int keytmp;//技能选择行 0 1
	

	int globalEvent[2400];//存储事件
	int globalValue[256];//存储变量
	long money;
	int saveEnable;
	int fightEnable;
	int posEnable;
	char sceneName[20];
	int actorShowNum;


	int newStartFlag;//重新开始标志
	int newStartType;
	int newStartIdx;

	int attFlag;//选择的pageup pagedown 属性界面的显示0-1区分界面 
	int attFlag2;//选择的up down 属性界面的显示0-2区分角色
	int attFlag3;//left right
	int selectedGood;//属性比较界面前导界面道具选择
	int selectedMagic;//技能确认选择界面前导界面技能选择
	int selectedEquipType;//换装界面前
	int selectedEquipId;
	int selectedNewEquipId;
	int selectedRole;//20161120更新定义为选择的角色号（不连续的）
	int selectedRoleIdx;//20161120选择的角色在角色链中序号（从0开始）
	int g_goodType[100];
	int g_goodId[100];
	int g_goodSum;

	int showPos;//显示位置
	int flagd;//下方向标示
	int flagu;//上方向标示

	int timeEventNo;
	int timeEventSecond;
	int timeEventNum;//定时事件间隔计时
	int timeEventNum2;
	int timeEventNum3;//20161226
	
	int callStack[5][20000];//callchapter堆栈保存
	int callStackDeep;//当初存储深度

	int initsaveflag;//1-初始化时不初始化save类
	int keyflagret ;

	int orderChoiceJmpPos;
	int goodNo[100];//序列号，在整个链中的编号

	int keyinfight;//20160118增加 对于战斗内事件的标志,用于返回

	int missflag;//是否开启miss flag
	int throwflag;//是否开启武器投掷
	
	int decorateflag;//用于标志当前选中的使用饰品位置 0-自动 1 2
	int inscriptsaveflag;//20160816在脚本过程中调用gamesave标志。用于回到原脚本后续执行
	int autowalkflag;//20161221自动行走标志 
	int tmpOrderPos;//20170329临时存储的脚本位置
	//20161120
	struct
	{
		int type;
		int idx;
		int orderpos;
	}dgbreakpoint[100];//type index orderpos
	int dgbreakpointmax;
	int dgrand;
	int dghurt;
	struct
	{
		int type;
		int idx;
	}dgmonitor[100];//type index
	int dgmonitormax;

	/* 以下为标签定义, 和代码无关

	@ A 直接地址
	@ C 字符串
	@ E 间接地址
	@ L 4字节数
	@ N 2字节数
	@ U 多个N

	0x00 Music NN
	0x01 LoadMap NNNN
	0x02 CreateActor NNN
	0x03 DeleteNpc N
	0x04 MapEvent NNNNNN T
	0x05 ActorEvent NA T
	0x06 Move  NNN
	0x07 ActorMove NNNNNN T
	0x08 ActorSpeed NN T
	0x09 Callback
	0x0A Goto A
	0x0B If NA
	0x0C Set NN
	0x0D Say NC
	0x0E StartChapter NN
	0x0F ScreenR N T
	0x10 ScreenS NN
	0x11 ScreenA N T
	0x12 Event NA T
	0x13 Money N T
	0x14 Gameover
	0x15 IfCmp NNA
	0x16 Add NN
	0x17 Sub NN
	0x18 SetControlId N
	0x19 GutEvent NE
	0x1A SetEvent N
	0x1B ClrEvent N
	0x1C Buy U
	0x1D FaceToFace NN
	0x1E Movie NNNNN
	0x1F Choice CCA
	0x20 CreateBox NNNN
	0x21 DeleteBox N
	0x22 GainGoods NN
	0x23 InitFight NNNNNNNNNNN
	0x24 FightEnable
	0x25 FightDisenable
	0x26 CreateNpc NNNN
	0x27 EnterFight NNNNNNNNNNNNNAA
	0x28 DeleteActor N
	0x29 GainMoney L
	0x2A UseMoney L
	0x2B SetMoney L
	0x2C LearnMagic NNN
	0x2D Sale
	0x2E NpcMoveMod NN
	0x2F Message C
	0x30 DeleteGoods NNA
	0x31 ResumeActorHp NN
	0x32 ActorLayerUp NN
	0x33 BoxOpen N
	0x34 DelAllNpc
	0x35 NpcStep NNN
	0x36 SetSceneName C
	0x37 ShowSceneName
	0x38 ShowScreen
	0x39 UseGoods NNA
	0x3A AttribTest NNNAA
	0x3B AttribSet NNN
	0x3C AttribAdd NNN
	0x3D ShowGut NNC
	0x3E UseGoodsNum NNNA
	0x3F Randrade NA
	0x40 Menu NC
	0x41 TestMoney LA
	0x42 CallChapter NN
	0x43 DisCmp NNAA
	0x44 Return
	0x45 TimeMsg NC
	0x46 DisableSave
	0x47 EnableSave
	0x48 GameSave
	0x49 SetEventTimer NN
	0x4A EnableShowPos
	0x4B DisableShowPos
	0x4C SetTo NN
	0x4D TestGoodsNum NNNAA
	*/


};