-
-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathcommand.h
172 lines (150 loc) · 3.25 KB
/
command.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/* Copyright (c) 2024 Julian Benda
*
* This file is part of inkCPP which is released under MIT license.
* See file LICENSE.txt or go to
* https://github.com/JBenda/inkcpp for full license details.
*/
#pragma once
namespace ink
{
// Commands (max 255)
enum class Command : unsigned char
{
// == Value Commands: Push values onto the stack
STR,
INT,
BOOL,
FLOAT,
VALUE_POINTER,
DIVERT_VAL,
LIST,
NEWLINE,
GLUE,
VOID,
TAG,
// == Diverts
DIVERT,
DIVERT_TO_VARIABLE,
TUNNEL,
FUNCTION,
// == Terminal commands
DONE,
END,
TUNNEL_RETURN,
FUNCTION_RETURN,
// == Variable definitions
DEFINE_TEMP,
SET_VARIABLE,
// == Evaluation stack
START_EVAL,
END_EVAL,
OUTPUT,
POP,
DUPLICATE,
PUSH_VARIABLE_VALUE,
VISIT,
TURN, /// How many choices where made since start of the story
READ_COUNT,
SEQUENCE,
SEED,
// == String stack
START_STR,
END_STR,
START_TAG,
END_TAG,
// == Choice commands
CHOICE,
// == Threading
THREAD,
// == thinary operations
LIST_RANGE,
OP_BEGIN = LIST_RANGE,
TERNARY_OPERATORS_START = LIST_RANGE,
TERNARY_OPERATORS_END = LIST_RANGE,
// == Binary operators
ADD,
BINARY_OPERATORS_START = ADD,
SUBTRACT,
DIVIDE,
MULTIPLY,
MOD,
RANDOM,
IS_EQUAL,
GREATER_THAN,
LESS_THAN,
GREATER_THAN_EQUALS,
LESS_THAN_EQUALS,
NOT_EQUAL,
AND,
OR,
MIN,
MAX,
HAS,
HASNT,
INTERSECTION,
LIST_INT,
BINARY_OPERATORS_END = LIST_INT,
// == Unary operators
UNARY_OPERATORS_START,
NOT = UNARY_OPERATORS_START,
NEGATE,
LIST_COUNT,
LIST_MIN,
LIST_MAX,
READ_COUNT_VAR,
TURNS,
lrnd,
FLOOR,
CEILING,
INT_CAST,
LIST_ALL,
LIST_INVERT,
LIST_VALUE,
UNARY_OPERATORS_END = LIST_VALUE,
CHOICE_COUNT,
OP_END,
// == Container tracking
START_CONTAINER_MARKER = OP_END,
END_CONTAINER_MARKER,
// == Function calls
CALL_EXTERNAL,
NUM_COMMANDS,
};
// Flags for commands
enum class CommandFlag : unsigned char
{
NO_FLAGS = 0,
// == Choice Flags ==
CHOICE_HAS_CONDITION = 1 << 0,
CHOICE_HAS_START_CONTENT = 1 << 1,
CHOICE_HAS_CHOICE_ONLY_CONTENT = 1 << 2,
CHOICE_IS_INVISIBLE_DEFAULT = 1 << 3,
CHOICE_IS_ONCE_ONLY = 1 << 4,
// == Divert flags
DIVERT_HAS_CONDITION = 1 << 0,
DIVERT_IS_FALLTHROUGH = 1 << 1, // Divert was auto-generated as a result of falling out of a containers content
// == Container marker
CONTAINER_MARKER_TRACK_VISITS = 1 << 0,
CONTAINER_MARKER_TRACK_TURNS = 1 << 1,
CONTAINER_MARKER_ONLY_FIRST = 1 << 2,
// == Variable assignment
ASSIGNMENT_IS_REDEFINE = 1 << 0,
// == Function/Tunnel flags
FUNCTION_TO_VARIABLE = 1 << 0,
TUNNEL_TO_VARIABLE = 1 << 0,
FALLBACK_FUNCTION = 1 << 1,
// note a internal function which should only be called if external reference is not working
};
inline bool operator& (CommandFlag lhs, CommandFlag rhs)
{
return (static_cast<unsigned char>(lhs) & static_cast<unsigned char>(rhs)) > 0;
}
inline CommandFlag& operator|= (CommandFlag& lhs, CommandFlag rhs)
{
lhs = static_cast<CommandFlag>(static_cast<unsigned char>(lhs) | static_cast<unsigned char>(rhs));
return lhs;
}
template<typename PayloadType>
constexpr unsigned int CommandSize = sizeof(Command) + sizeof(CommandFlag) + sizeof(PayloadType);
extern const char* CommandStrings[];
}