Mercurial > otakunoraifu
diff scn2k/scn2k_cmd.h @ 56:c7bcc0ec2267
* replaced Grp and Text classes by the TextImpl and GrpImpl ones
* splitted scn2k.h into smaller header files
* moved some definitions from scn2k_*.cc to the header files
* moved opcode implementation to scn2k_*impl.cc
author | thib |
---|---|
date | Thu, 30 Apr 2009 19:05:09 +0000 |
parents | |
children | 4416cfac86ae |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/scn2k/scn2k_cmd.h @@ -0,0 +1,117 @@ +#ifndef __SCN2K_CMD_H__ +#define __SCN2K_CMD_H__ + +#include <vector> +#include <string> +#include <map> + +#include "scn2k_flags.h" + +#define STRHEAP_SIZE 10000 +enum Cmdtype { + CMD_NOP, CMD_FLAGS, CMD_JMP, CMD_TEXT, CMD_OTHER, CMD_SYSVAR, + CMD_TEXTEND, + CMD_SAVECMDGRP, CMD_SAVECMDGRP_START, CMD_SAVECMDGRP_ONCE, CMD_SAVECMD_ONCE, CMD_WAITFRAMEUPDATE,CMD_SAVEPOINT, CMD_ROLLBACKPOINT, + CMD_SAVEREQ, CMD_SAVE, + CMD_LOADREQ, CMD_LOAD, + CMD_MENUREQ, + CMD_BACKLOGREQ, CMD_BACKLOGREQ_FWD, + CMD_END}; + +enum SkipMode { + SKIP_NO=0, SKIP_TEXT=1, SKIP_GRP_FAST=16, SKIP_GRP_NOEFFEC=32, + SKIP_GRP_NODRAW=64, SKIPEND_TEXT=256, SKIPEND_KEY=512, SKIP_IN_MENU=1024 +}; + +struct CmdSimplified { // Cmd ÊÝžÍÑ + int type, cmd1, cmd2, cmd3, cmd4, argc; + char* args; + void Save(std::string& save); + void Load(const char* save, char*& args_buffer); + void copy(const CmdSimplified& from, char*& args_buffer); +}; + +class SimpleCmd { + public: + SimpleCmd(int a, int b, int c); + SimpleCmd(); + + bool operator==(const SimpleCmd& cmd) const; + bool operator<(const SimpleCmd& cmd) const; + + public: + int cmd1, cmd2, cmd3; +}; + +class Cmd : public SimpleCmd{ + public: + Cmdtype cmd_type; + int cmd4; + int argc; + int pos, scn; + const char* rawdata; + char cmdstr[1024]; + std::vector<VarInfo> args; + + private: + const Flags& flags; + bool errorflag; + int system_version; + + int GetArgs(const char*& d); + int GetArgsSpecial(int normal_args,const char*& d); + void GetSelection(const char*& d); + int GetSwitch(const char*& d); + int GetSimpleSwitch(const char*& d); + int GetExpression(const char*& d, struct VarInfo* info = 0); + int GetExpressionCond(const char*& d); + int GetLeftToken(const char*& d, struct VarInfo& info); + int GetString(const char*& d); + int CopyString(const char* d); + int StrVar(int type, int number); + static char strtype[256]; + static int StrType(const char* d) { return strtype[*(unsigned const char*)d];} + + public: + const char* Str(const VarInfo& info) const; + int AddStr(char* s); + + private: + char strheap[STRHEAP_SIZE]; + int strend; + void SetError(void) { errorflag = true;} + void ResetString(void) { + strend = 0; + } + + public: + void GetCmd(Flags& f, const char*& d); + void SetSysvar(int n, int v); + void SetSysvar(int v) { SetSysvar(TYPE_SYS_SYS, v); } + void SetFlagvar(VarInfo info, int v); + void SetStrvar(VarInfo info, const std::string& s); + bool IsError() { return errorflag;} + void clear(void); + virtual const char * CmdDescr(int, int, int, int) { return "Not supported"; } + Cmd(const Flags& f, int _sys_ver); + void read(const CmdSimplified& cmd); + void write(CmdSimplified& cmd, char*& args_buffer) const; +}; + +class CommandHandler { + public: + typedef void (CommandHandler::*CmdImpl)(Cmd& cmd); + typedef struct { + const char* descr; + CmdImpl function; + } CommandInfo; + void RegisterCommand(int cmd1, int cmd2, int cmd3, const char* descr, CmdImpl func); + bool Exec(Cmd& cmd); + void PrintCmd(Cmd& cmd); + + private: + typedef std::map<SimpleCmd, CommandInfo> CommandMap; + CommandMap command_map; +}; + +#endif