comparison 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
comparison
equal deleted inserted replaced
55:f1a27ee7e03c 56:c7bcc0ec2267
1 #ifndef __SCN2K_CMD_H__
2 #define __SCN2K_CMD_H__
3
4 #include <vector>
5 #include <string>
6 #include <map>
7
8 #include "scn2k_flags.h"
9
10 #define STRHEAP_SIZE 10000
11 enum Cmdtype {
12 CMD_NOP, CMD_FLAGS, CMD_JMP, CMD_TEXT, CMD_OTHER, CMD_SYSVAR,
13 CMD_TEXTEND,
14 CMD_SAVECMDGRP, CMD_SAVECMDGRP_START, CMD_SAVECMDGRP_ONCE, CMD_SAVECMD_ONCE, CMD_WAITFRAMEUPDATE,CMD_SAVEPOINT, CMD_ROLLBACKPOINT,
15 CMD_SAVEREQ, CMD_SAVE,
16 CMD_LOADREQ, CMD_LOAD,
17 CMD_MENUREQ,
18 CMD_BACKLOGREQ, CMD_BACKLOGREQ_FWD,
19 CMD_END};
20
21 enum SkipMode {
22 SKIP_NO=0, SKIP_TEXT=1, SKIP_GRP_FAST=16, SKIP_GRP_NOEFFEC=32,
23 SKIP_GRP_NODRAW=64, SKIPEND_TEXT=256, SKIPEND_KEY=512, SKIP_IN_MENU=1024
24 };
25
26 struct CmdSimplified { // Cmd ÊÝžÍÑ
27 int type, cmd1, cmd2, cmd3, cmd4, argc;
28 char* args;
29 void Save(std::string& save);
30 void Load(const char* save, char*& args_buffer);
31 void copy(const CmdSimplified& from, char*& args_buffer);
32 };
33
34 class SimpleCmd {
35 public:
36 SimpleCmd(int a, int b, int c);
37 SimpleCmd();
38
39 bool operator==(const SimpleCmd& cmd) const;
40 bool operator<(const SimpleCmd& cmd) const;
41
42 public:
43 int cmd1, cmd2, cmd3;
44 };
45
46 class Cmd : public SimpleCmd{
47 public:
48 Cmdtype cmd_type;
49 int cmd4;
50 int argc;
51 int pos, scn;
52 const char* rawdata;
53 char cmdstr[1024];
54 std::vector<VarInfo> args;
55
56 private:
57 const Flags& flags;
58 bool errorflag;
59 int system_version;
60
61 int GetArgs(const char*& d);
62 int GetArgsSpecial(int normal_args,const char*& d);
63 void GetSelection(const char*& d);
64 int GetSwitch(const char*& d);
65 int GetSimpleSwitch(const char*& d);
66 int GetExpression(const char*& d, struct VarInfo* info = 0);
67 int GetExpressionCond(const char*& d);
68 int GetLeftToken(const char*& d, struct VarInfo& info);
69 int GetString(const char*& d);
70 int CopyString(const char* d);
71 int StrVar(int type, int number);
72 static char strtype[256];
73 static int StrType(const char* d) { return strtype[*(unsigned const char*)d];}
74
75 public:
76 const char* Str(const VarInfo& info) const;
77 int AddStr(char* s);
78
79 private:
80 char strheap[STRHEAP_SIZE];
81 int strend;
82 void SetError(void) { errorflag = true;}
83 void ResetString(void) {
84 strend = 0;
85 }
86
87 public:
88 void GetCmd(Flags& f, const char*& d);
89 void SetSysvar(int n, int v);
90 void SetSysvar(int v) { SetSysvar(TYPE_SYS_SYS, v); }
91 void SetFlagvar(VarInfo info, int v);
92 void SetStrvar(VarInfo info, const std::string& s);
93 bool IsError() { return errorflag;}
94 void clear(void);
95 virtual const char * CmdDescr(int, int, int, int) { return "Not supported"; }
96 Cmd(const Flags& f, int _sys_ver);
97 void read(const CmdSimplified& cmd);
98 void write(CmdSimplified& cmd, char*& args_buffer) const;
99 };
100
101 class CommandHandler {
102 public:
103 typedef void (CommandHandler::*CmdImpl)(Cmd& cmd);
104 typedef struct {
105 const char* descr;
106 CmdImpl function;
107 } CommandInfo;
108 void RegisterCommand(int cmd1, int cmd2, int cmd3, const char* descr, CmdImpl func);
109 bool Exec(Cmd& cmd);
110 void PrintCmd(Cmd& cmd);
111
112 private:
113 typedef std::map<SimpleCmd, CommandInfo> CommandMap;
114 CommandMap command_map;
115 };
116
117 #endif