1 /*
2  * Copyright (C) Volition, Inc. 1999.  All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell
5  * or otherwise commercially exploit the source or things you created based on the
6  * source.
7  *
8 */
9 
10 #ifndef _SEXP_H
11 #define _SEXP_H
12 
13 #include "globalincs/globals.h"
14 #include "globalincs/pstypes.h"	// for NULL
15 
16 class ship_subsys;
17 class ship;
18 class waypoint_list;
19 
20 // bumped to 30 by Goober5000
21 #define	OPERATOR_LENGTH	30  // if this ever exceeds TOKEN_LENGTH, let JasonH know!
22 
23 #define MAX_SEXP_VARIABLES 250
24 
25 #define	MAX_OPERATORS	1024  // Yes, this is used, but not by the Sexp code.
26 
27 // Operator argument formats (data types of an argument)
28 #define	OPF_NONE				1		// argument cannot exist at this position if it's this
29 #define	OPF_NULL				2		// no value.  Can still be used for type matching, however
30 #define	OPF_BOOL				3
31 #define	OPF_NUMBER				4
32 #define	OPF_SHIP				5
33 #define	OPF_WING				6
34 #define	OPF_SUBSYSTEM			7
35 #define	OPF_POINT				8		// either a 3d point in space, or a waypoint name
36 #define	OPF_IFF					9
37 #define	OPF_AI_GOAL				10		// special to match ai goals
38 #define	OPF_DOCKER_POINT		11		// docking point on docker ship
39 #define	OPF_DOCKEE_POINT		12		// docking point on dockee ship
40 #define	OPF_MESSAGE				13		// the name (id) of a message in Messages[] array
41 #define	OPF_WHO_FROM			14		// who sent the message -- doesn't necessarily have to be a ship!!!
42 #define	OPF_PRIORITY			15		// priority for messages
43 #define	OPF_WAYPOINT_PATH		16		// name of a waypoint
44 #define	OPF_POSITIVE			17		// positive number or zero
45 #define	OPF_MISSION_NAME		18		// name of a mission for various mission related things
46 #define	OPF_SHIP_POINT			19		// a waypoint or a ship
47 #define	OPF_GOAL_NAME			20		// name of goal (or maybe event?) from a mission
48 #define	OPF_SHIP_WING			21		// either a ship or wing name (they don't conflict)
49 #define OPF_SHIP_WING_WHOLETEAM			22	// Karajorma - Ship, wing or an entire team's worth of ships
50 #define	OPF_SHIP_WING_SHIPONTEAM_POINT	23	// name of a ship, wing, any ship on a team, or a point
51 #define OPF_SHIP_WING_POINT		24
52 #define OPF_SHIP_WING_POINT_OR_NONE	25	// WMC - Ship, wing, point or none
53 #define	OPF_SHIP_TYPE			26		// type of ship (fighter/bomber/etc)
54 #define	OPF_KEYPRESS			27		// a default key
55 #define	OPF_EVENT_NAME			28		// name of an event
56 #define	OPF_AI_ORDER			29		// a squadmsg order player can give to a ship
57 #define	OPF_SKILL_LEVEL			30		// current skill level of the game
58 #define	OPF_MEDAL_NAME			31		// name of medals
59 #define	OPF_WEAPON_NAME			32		// name of a weapon
60 #define	OPF_SHIP_CLASS_NAME		33		// name of a ship class
61 #define	OPF_CUSTOM_HUD_GAUGE	34		// name of custom HUD gauge
62 #define	OPF_HUGE_WEAPON			35		// name of a secondary bomb type weapon
63 #define	OPF_SHIP_NOT_PLAYER		36		// a ship, but not a player ship
64 #define	OPF_JUMP_NODE_NAME		37		// name of a jump node
65 #define	OPF_VARIABLE_NAME		38		// variable name
66 #define	OPF_AMBIGUOUS			39		// type used with variable
67 #define	OPF_AWACS_SUBSYSTEM		40		// an awacs subsystem
68 #define OPF_CARGO				41		// Goober5000 - a cargo string (currently used for set-cargo and is-cargo)
69 #define OPF_AI_CLASS			42		// Goober5000 - an AI class
70 #define OPF_SUPPORT_SHIP_CLASS	43		// Goober5000 - a support ship class
71 #define OPF_ARRIVAL_LOCATION	44		// Goober5000 - a ship arrival location
72 #define OPF_ARRIVAL_ANCHOR_ALL	45		// Goober5000 - all of a ship's possible arrival anchors
73 #define OPF_DEPARTURE_LOCATION	46		// Goober5000 - a ship departure location
74 #define OPF_SHIP_WITH_BAY		47		// Goober5000 - a ship with a fighter bay
75 #define OPF_SOUNDTRACK_NAME		48		// Goober5000 - the name of a music soundtrack
76 #define OPF_INTEL_NAME			49		// Goober5000 - the name of an intel entry in species.tbl
77 #define OPF_STRING				50		// Goober5000 - any old string
78 #define OPF_ROTATING_SUBSYSTEM	51		// Goober5000 - a rotating subsystem
79 #define OPF_NAV_POINT			52		// Kazan	  - a Nav Point name
80 #define OPF_SSM_CLASS			53		// Goober5000 - an SSM class
81 #define OPF_FLEXIBLE_ARGUMENT	54		// Goober5000 - special to match for when-argument
82 #define OPF_ANYTHING			55		// Goober5000 - anything goes
83 #define OPF_SKYBOX_MODEL_NAME	56		// taylor - changing skybox model
84 #define OPF_SHIP_OR_NONE		57		// Goober5000 - an "optional" ship argument
85 #define OPF_BACKGROUND_BITMAP	58		// phreak - name of a background bitmap
86 #define OPF_SUN_BITMAP			59		// phreak - name of a background bitmap
87 #define OPF_NEBULA_STORM_TYPE	60		// phreak - name a nebula storm
88 #define OPF_NEBULA_POOF			61		// phreak - name of a nebula poof
89 #define OPF_TURRET_TARGET_ORDER	62		// WMC - name of a turret target type (see aiturret.cpp)
90 #define OPF_SUBSYSTEM_OR_NONE	63		// Goober5000 - an "optional" subsystem argument
91 #define OPF_PERSONA				64		// Karajorma - name of a persona
92 #define OPF_SUBSYS_OR_GENERIC	65		// Karajorma - a subsystem or a generic name (like engine) which covers all subsystems of that type
93 #define OPF_ORDER_RECIPIENT		66		// Karajorma - since orders can go to All Fighters as well as a ship or wing
94 #define OPF_SUBSYSTEM_TYPE		67		// Goober5000 - a generic subsystem type (navigation, engines, etc.) rather than a specific subsystem
95 #define OPF_POST_EFFECT			68		// Hery - type of post-processing effect
96 #define OPF_TARGET_PRIORITIES	69		// FUBAR - Target priority groups
97 #define OPF_ARMOR_TYPE			70		// FUBAR - Armor type or <none>
98 #define OPF_FONT				71		// Goober5000 - a FreeSpace font
99 #define OPF_HUD_ELEMENT			72		// A magic name of a specific HUD element
100 #define OPF_SOUND_ENVIRONMENT	73		// Goober5000 - one of EFX_presets, per Taylor
101 #define OPF_SOUND_ENVIRONMENT_OPTION 74	// Goober5000 - one of Taylor's options
102 #define OPF_EXPLOSION_OPTION	75		// Goober5000
103 #define OPF_AUDIO_VOLUME_OPTION 76		// The E
104 #define OPF_WEAPON_BANK_NUMBER	77		// Karajorma - The number of a primary/secondary/tertiary weapon bank or all of them
105 #define OPF_MESSAGE_OR_STRING	78		// Goober5000 - provides a list of messages like OPF_MESSAGE, but also allows entering arbitrary strings
106 #define OPF_BUILTIN_HUD_GAUGE	79		// The E
107 #define OPF_DAMAGE_TYPE			80		// FUBAR - Damage type or <none>
108 #define OPF_SHIP_EFFECT			81		// The E - per-ship effects, as defined in post-processing.tbl
109 #define OPF_ANIMATION_TYPE		82		// Goober5000 - as defined in modelanim.h
110 #define OPF_MISSION_MOOD		83		// Karajorma - Moods determine which builtin messages will be sent
111 #define OPF_SHIP_FLAG			84		// Karajorma - The name of a ship flag
112 #define OPF_TEAM_COLOR			85		// The E - Color settings as defined in Colors.tbl
113 #define OPF_NEBULA_PATTERN		86		// Axem - Full Nebula Background Patterns, as defined in nebula.tbl
114 #define OPF_SKYBOX_FLAGS		87		// niffiwan - valid skybox flags
115 #define OPF_GAME_SND			88		// m!m - A game sound
116 #define OPF_FIREBALL			89		// Goober5000 - an entry in fireball.tbl
117 #define OPF_SPECIES				90		// Goober5000
118 #define OPF_LANGUAGE			91		// Goober5000
119 
120 // Operand return types
121 #define	OPR_NUMBER				1	// returns number
122 #define	OPR_BOOL				2	// returns true/false value
123 #define	OPR_NULL				3	// doesn't return a value
124 #define	OPR_AI_GOAL				4	// is an ai operator (doesn't really return a value, but used for type matching)
125 #define	OPR_POSITIVE			5	// returns a non-negative number
126 #define	OPR_STRING				6	// not really a return type, but used for type matching.
127 #define	OPR_AMBIGUOUS			7	// not really a return type, but used for type matching.
128 #define OPR_FLEXIBLE_ARGUMENT	8	// Goober5000 - is an argument operator (doesn't really return a value, but used for type matching)
129 
130 #define	OP_INSERT_FLAG			0x8000
131 #define	OP_REPLACE_FLAG			0x4000
132 #define	OP_NONCAMPAIGN_FLAG		0x2000
133 #define	OP_CAMPAIGN_ONLY_FLAG	0x1000
134 
135 // if we ever have more than 1024 (!)
136 // total sexps, we're going to have to
137 // figure out a different way of
138 // distinguishing between sexp identifier
139 // and sexp array index
140 #define	FIRST_OP				0x0400
141 
142 // IMPORTANT: because of the way
143 // categories work, no category can
144 // have more than 256 sexps (mapped
145 // to 00 through ff) otherwise
146 // they'll overlap their category)
147 #define	OP_CATEGORY_OBJECTIVE	0x0400
148 #define	OP_CATEGORY_TIME		0x0500
149 #define	OP_CATEGORY_LOGICAL		0x0600
150 #define	OP_CATEGORY_ARITHMETIC	0x0700
151 #define	OP_CATEGORY_STATUS		0x0800
152 #define	OP_CATEGORY_CHANGE		0x0900
153 #define OP_CATEGORY_CHANGE2		0x0a00
154 #define	OP_CATEGORY_CONDITIONAL	0x0b00
155 #define	OP_CATEGORY_AI			0x0c00  // used for AI goals
156 #define	OP_CATEGORY_TRAINING	0x0d00
157 #define	OP_CATEGORY_UNLISTED	0x0e00
158 #define	OP_CATEGORY_GOAL_EVENT	0x0f00	// final category can't be higher than 0x0f00,
159 										// to avoid overlap with flags above
160 
161 #define	OP_CATEGORY_MASK		0x0f00	// 0000111100000000b
162 
163 
164 // The debug category is obsolete, so
165 // I removed it.  It originally took the
166 // place of OP_CATEGORY_CONDITIONAL,
167 // which was bumped (along with all the
168 // lower categories) so that FIRST_OP
169 // could be 0x0400.  This allows for
170 // 1024 possible sexps, as opposed to
171 // the 768 possible if the categories
172 // had not been bumped.
173 /*
174 #define	OP_CATEGORY_DEBUG		0x0a00
175 */
176 
177 // New subcategories! :) -- Goober5000
178 // Adding more subcategories is possible with the new code.  All that needs to be done is
179 // to add a #define here (a number from 0x0000 to 0x00ff ORred with the category that it
180 // goes under), some appropriate case statements in get_subcategory() (in sexp.cpp) that
181 // will return the subcategory for each sexp that uses it, and the submenu name in the
182 // op_submenu[] array in sexp.cpp.
183 #define SUBCATEGORY_MASK									0x00ff
184 
185 #define CHANGE_SUBCATEGORY_MESSAGING						(0x0000 | OP_CATEGORY_CHANGE)
186 #define CHANGE_SUBCATEGORY_AI_CONTROL						(0x0001 | OP_CATEGORY_CHANGE)
187 #define CHANGE_SUBCATEGORY_SHIP_STATUS						(0x0002 | OP_CATEGORY_CHANGE)
188 #define CHANGE_SUBCATEGORY_SHIELDS_ENGINES_AND_WEAPONS		(0x0003 | OP_CATEGORY_CHANGE)
189 #define CHANGE_SUBCATEGORY_SUBSYSTEMS						(0x0004 | OP_CATEGORY_CHANGE)
190 #define CHANGE_SUBCATEGORY_CARGO							(0x0005 | OP_CATEGORY_CHANGE)
191 #define CHANGE_SUBCATEGORY_ARMOR_AND_DAMAGE_TYPES			(0x0006 | OP_CATEGORY_CHANGE)
192 #define CHANGE_SUBCATEGORY_BEAMS_AND_TURRETS				(0x0007 | OP_CATEGORY_CHANGE)
193 #define CHANGE_SUBCATEGORY_MODELS_AND_TEXTURES				(0x0008 | OP_CATEGORY_CHANGE)
194 #define CHANGE_SUBCATEGORY_COORDINATE_MANIPULATION			(0x0009 | OP_CATEGORY_CHANGE)
195 #define CHANGE_SUBCATEGORY_MISSION_AND_CAMPAIGN				(0x000A | OP_CATEGORY_CHANGE)
196 #define CHANGE_SUBCATEGORY_MUSIC_AND_SOUND					(0x000B | OP_CATEGORY_CHANGE)
197 #define CHANGE_SUBCATEGORY_HUD								(0x000C | OP_CATEGORY_CHANGE)
198 #define CHANGE_SUBCATEGORY_NAV								(0x000D | OP_CATEGORY_CHANGE)
199 #define CHANGE_SUBCATEGORY_CUTSCENES						(0x000E | OP_CATEGORY_CHANGE)
200 #define CHANGE_SUBCATEGORY_BACKGROUND_AND_NEBULA			(0x000F | OP_CATEGORY_CHANGE)
201 #define CHANGE_SUBCATEGORY_JUMP_NODES						(0x0010 | OP_CATEGORY_CHANGE)
202 #define CHANGE_SUBCATEGORY_SPECIAL_EFFECTS					(0x0011 | OP_CATEGORY_CHANGE)
203 #define CHANGE_SUBCATEGORY_VARIABLES						(0x0012 | OP_CATEGORY_CHANGE)
204 #define CHANGE_SUBCATEGORY_OTHER							(0x0013 | OP_CATEGORY_CHANGE)
205 
206 
207 #define STATUS_SUBCATEGORY_MISSION							(0x0000 | OP_CATEGORY_STATUS)
208 #define STATUS_SUBCATEGORY_PLAYER							(0x0001 | OP_CATEGORY_STATUS)
209 #define STATUS_SUBCATEGORY_MULTIPLAYER						(0x0002 | OP_CATEGORY_STATUS)
210 #define STATUS_SUBCATEGORY_SHIP_STATUS						(0x0003 | OP_CATEGORY_STATUS)
211 #define STATUS_SUBCATEGORY_SHIELDS_ENGINES_AND_WEAPONS		(0x0004 | OP_CATEGORY_STATUS)
212 #define STATUS_SUBCATEGORY_CARGO							(0x0005 | OP_CATEGORY_STATUS)
213 #define STATUS_SUBCATEGORY_DAMAGE							(0x0006 | OP_CATEGORY_STATUS)
214 #define STATUS_SUBCATEGORY_DISTANCE_AND_COORDINATES			(0x0007 | OP_CATEGORY_STATUS)
215 #define STATUS_SUBCATEGORY_VARIABLES						(0x0008 | OP_CATEGORY_STATUS)
216 #define STATUS_SUBCATEGORY_OTHER							(0x0009 | OP_CATEGORY_STATUS)
217 
218 
219 #define	OP_PLUS								(0x0000 | OP_CATEGORY_ARITHMETIC)
220 #define	OP_MINUS							(0x0001 | OP_CATEGORY_ARITHMETIC)
221 #define	OP_MOD								(0x0002 | OP_CATEGORY_ARITHMETIC)
222 #define	OP_MUL								(0x0003 | OP_CATEGORY_ARITHMETIC)
223 #define	OP_DIV								(0x0004 | OP_CATEGORY_ARITHMETIC)
224 #define	OP_RAND								(0x0005 | OP_CATEGORY_ARITHMETIC)
225 #define OP_ABS								(0x0006	| OP_CATEGORY_ARITHMETIC)	// Goober5000
226 #define OP_MIN								(0x0007	| OP_CATEGORY_ARITHMETIC)	// Goober5000
227 #define OP_MAX								(0x0008	| OP_CATEGORY_ARITHMETIC)	// Goober5000
228 #define OP_AVG								(0x0009	| OP_CATEGORY_ARITHMETIC)	// Goober5000
229 #define OP_RAND_MULTIPLE					(0x000a | OP_CATEGORY_ARITHMETIC)	// Goober5000
230 #define OP_POW								(0x000b | OP_CATEGORY_ARITHMETIC)	// Goober5000
231 #define OP_BITWISE_AND						(0x000c | OP_CATEGORY_ARITHMETIC)	// Goober5000
232 #define OP_BITWISE_OR						(0x000d | OP_CATEGORY_ARITHMETIC)	// Goober5000
233 #define OP_BITWISE_NOT						(0x000e | OP_CATEGORY_ARITHMETIC)	// Goober5000
234 #define OP_BITWISE_XOR						(0x000f | OP_CATEGORY_ARITHMETIC)	// Goober5000
235 
236 #define OP_SET_BIT							(0x0010 | OP_CATEGORY_ARITHMETIC)	// Goober5000
237 #define OP_UNSET_BIT						(0x0011 | OP_CATEGORY_ARITHMETIC)	// Goober5000
238 #define OP_IS_BIT_SET						(0x0012 | OP_CATEGORY_ARITHMETIC)	// Goober5000
239 #define OP_SIGNUM							(0x0013 | OP_CATEGORY_ARITHMETIC)	// Goober5000
240 #define OP_IS_NAN							(0x0014 | OP_CATEGORY_ARITHMETIC)	// Goober5000
241 #define OP_NAN_TO_NUMBER					(0x0015 | OP_CATEGORY_ARITHMETIC)	// Goober5000
242 
243 
244 #define	OP_TRUE								(0x0000 | OP_CATEGORY_LOGICAL)
245 #define	OP_FALSE							(0x0001 | OP_CATEGORY_LOGICAL)
246 #define	OP_AND								(0x0002 | OP_CATEGORY_LOGICAL)
247 #define	OP_AND_IN_SEQUENCE					(0x0003 | OP_CATEGORY_LOGICAL)
248 #define	OP_OR								(0x0004 | OP_CATEGORY_LOGICAL)
249 #define	OP_EQUALS							(0x0005 | OP_CATEGORY_LOGICAL)
250 #define	OP_GREATER_THAN						(0x0006 | OP_CATEGORY_LOGICAL)
251 #define	OP_LESS_THAN						(0x0007 | OP_CATEGORY_LOGICAL)
252 #define	OP_HAS_TIME_ELAPSED					(0x0008 | OP_CATEGORY_LOGICAL | OP_NONCAMPAIGN_FLAG)
253 #define	OP_NOT								(0x0009 | OP_CATEGORY_LOGICAL)
254 #define OP_STRING_EQUALS					(0x000a | OP_CATEGORY_LOGICAL)
255 #define OP_STRING_GREATER_THAN				(0x000b | OP_CATEGORY_LOGICAL)
256 #define OP_STRING_LESS_THAN					(0x000c | OP_CATEGORY_LOGICAL)
257 #define OP_NOT_EQUAL						(0x000d | OP_CATEGORY_LOGICAL)	// Goober5000
258 #define OP_GREATER_OR_EQUAL					(0x000e | OP_CATEGORY_LOGICAL)	// Goober5000
259 #define OP_LESS_OR_EQUAL					(0x000f | OP_CATEGORY_LOGICAL)	// Goober5000
260 
261 #define OP_XOR								(0x0010 | OP_CATEGORY_LOGICAL)	// Goober5000
262 #define OP_PERFORM_ACTIONS					(0x0011 | OP_CATEGORY_LOGICAL | OP_NONCAMPAIGN_FLAG)	// Goober5000
263 
264 
265 #define	OP_GOAL_INCOMPLETE					(0x0000 | OP_CATEGORY_GOAL_EVENT | OP_NONCAMPAIGN_FLAG)
266 #define	OP_GOAL_TRUE_DELAY					(0x0001 | OP_CATEGORY_GOAL_EVENT | OP_NONCAMPAIGN_FLAG)
267 #define	OP_GOAL_FALSE_DELAY					(0x0002 | OP_CATEGORY_GOAL_EVENT | OP_NONCAMPAIGN_FLAG)
268 #define	OP_EVENT_INCOMPLETE					(0x0003 | OP_CATEGORY_GOAL_EVENT | OP_NONCAMPAIGN_FLAG)
269 #define	OP_EVENT_TRUE_DELAY					(0x0004 | OP_CATEGORY_GOAL_EVENT | OP_NONCAMPAIGN_FLAG)
270 #define	OP_EVENT_FALSE_DELAY				(0x0005 | OP_CATEGORY_GOAL_EVENT | OP_NONCAMPAIGN_FLAG)
271 #define	OP_PREVIOUS_EVENT_TRUE				(0x0006 | OP_CATEGORY_GOAL_EVENT)
272 #define	OP_PREVIOUS_EVENT_FALSE				(0x0007 | OP_CATEGORY_GOAL_EVENT)
273 #define	OP_PREVIOUS_GOAL_TRUE				(0x0009 | OP_CATEGORY_GOAL_EVENT)
274 #define	OP_PREVIOUS_GOAL_FALSE				(0x000a | OP_CATEGORY_GOAL_EVENT)
275 #define	OP_EVENT_TRUE_MSECS_DELAY			(0x000b | OP_CATEGORY_GOAL_EVENT | OP_NONCAMPAIGN_FLAG)
276 #define	OP_EVENT_FALSE_MSECS_DELAY			(0x000c | OP_CATEGORY_GOAL_EVENT | OP_NONCAMPAIGN_FLAG)
277 
278 #define	OP_IS_DESTROYED_DELAY				(0x0000 | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
279 #define	OP_IS_SUBSYSTEM_DESTROYED_DELAY		(0x0001 | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
280 #define	OP_IS_DISABLED_DELAY				(0x0002 | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
281 #define	OP_IS_DISARMED_DELAY				(0x0003 | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
282 #define	OP_HAS_DOCKED_DELAY					(0x0004 | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
283 #define	OP_HAS_UNDOCKED_DELAY				(0x0005 | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
284 #define	OP_HAS_ARRIVED_DELAY				(0x0006 | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
285 #define	OP_HAS_DEPARTED_DELAY				(0x0007 | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
286 #define	OP_WAYPOINTS_DONE_DELAY				(0x0008 | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
287 #define	OP_SHIP_TYPE_DESTROYED				(0x0009 | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
288 #define	OP_PERCENT_SHIPS_DEPARTED			(0x000a | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
289 #define	OP_PERCENT_SHIPS_DESTROYED			(0x000b | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
290 #define	OP_DEPART_NODE_DELAY				(0x000c | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
291 #define	OP_DESTROYED_DEPARTED_DELAY			(0x000d | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)
292 #define OP_PERCENT_SHIPS_DISARMED			(0x000e | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)	// Goober5000
293 #define OP_PERCENT_SHIPS_DISABLED			(0x000f | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)	// Goober5000
294 #define OP_PERCENT_SHIPS_ARRIVED			(0x0010 | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)	// FUBAR-BDHR
295 #define OP_NAV_IS_VISITED					(0x0011 | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)	// Kazan
296 #define OP_WAS_DESTROYED_BY_DELAY			(0x0012 | OP_CATEGORY_OBJECTIVE | OP_NONCAMPAIGN_FLAG)	// WCS
297 
298 #define	OP_TIME_SHIP_DESTROYED				(0x0000 | OP_CATEGORY_TIME | OP_NONCAMPAIGN_FLAG)
299 #define	OP_TIME_SHIP_ARRIVED				(0x0001 | OP_CATEGORY_TIME | OP_NONCAMPAIGN_FLAG)
300 #define	OP_TIME_SHIP_DEPARTED				(0x0002 | OP_CATEGORY_TIME | OP_NONCAMPAIGN_FLAG)
301 #define	OP_TIME_WING_DESTROYED				(0x0003 | OP_CATEGORY_TIME | OP_NONCAMPAIGN_FLAG)
302 #define	OP_TIME_WING_ARRIVED				(0x0004 | OP_CATEGORY_TIME | OP_NONCAMPAIGN_FLAG)
303 #define	OP_TIME_WING_DEPARTED				(0x0005 | OP_CATEGORY_TIME | OP_NONCAMPAIGN_FLAG)
304 #define	OP_MISSION_TIME						(0x0006 | OP_CATEGORY_TIME | OP_NONCAMPAIGN_FLAG)
305 #define	OP_MISSION_TIME_MSECS				(0x0007 | OP_CATEGORY_TIME | OP_NONCAMPAIGN_FLAG)	// Goober5000
306 #define	OP_TIME_DOCKED						(0x0008 | OP_CATEGORY_TIME | OP_NONCAMPAIGN_FLAG)
307 #define	OP_TIME_UNDOCKED					(0x0009 | OP_CATEGORY_TIME | OP_NONCAMPAIGN_FLAG)
308 #define OP_TIME_TO_GOAL						(0x000a | OP_CATEGORY_TIME | OP_NONCAMPAIGN_FLAG) // tcrayford
309 
310 #define	OP_SHIELDS_LEFT						(0x0000 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
311 #define	OP_HITS_LEFT						(0x0001 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
312 #define	OP_HITS_LEFT_SUBSYSTEM				(0x0002 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// deprecated
313 #define	OP_SIM_HITS_LEFT					(0x0003 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
314 #define	OP_DISTANCE							(0x0004 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
315 #define	OP_DISTANCE_CENTER_SUBSYSTEM		(0x0005 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
316 #define	OP_LAST_ORDER_TIME					(0x0006 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
317 #define	OP_NUM_PLAYERS						(0x0007 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
318 #define	OP_SKILL_LEVEL_AT_LEAST				(0x0008 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
319 #define	OP_WAS_PROMOTION_GRANTED			(0x0009 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
320 #define	OP_WAS_MEDAL_GRANTED				(0x000a | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
321 #define	OP_CARGO_KNOWN_DELAY				(0x000b | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
322 #define	OP_CAP_SUBSYS_CARGO_KNOWN_DELAY		(0x000c | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
323 #define	OP_HAS_BEEN_TAGGED_DELAY			(0x000d | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
324 #define	OP_IS_TAGGED						(0x000e | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
325 #define	OP_NUM_KILLS						(0x000f | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
326 
327 #define	OP_NUM_TYPE_KILLS					(0x0010 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
328 #define	OP_NUM_CLASS_KILLS					(0x0011 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
329 #define OP_SHIELD_RECHARGE_PCT				(0x0012 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
330 #define OP_ENGINE_RECHARGE_PCT				(0x0013 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
331 #define OP_WEAPON_RECHARGE_PCT				(0x0014 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
332 #define	OP_SHIELD_QUAD_LOW					(0x0015 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
333 #define	OP_SECONDARY_AMMO_PCT				(0x0016 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
334 #define	OP_IS_SECONDARY_SELECTED			(0x0017 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
335 #define	OP_IS_PRIMARY_SELECTED				(0x0018 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
336 #define	OP_SPECIAL_WARP_DISTANCE			(0x0019 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
337 #define	OP_IS_SHIP_VISIBLE					(0x001a | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
338 #define	OP_TEAM_SCORE						(0x001b | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
339 #define OP_PRIMARY_AMMO_PCT					(0x001c | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
340 #define OP_IS_SHIP_STEALTHY					(0x001d | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
341 #define OP_IS_CARGO							(0x001e | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
342 #define OP_IS_FRIENDLY_STEALTH_VISIBLE		(0x001f | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
343 
344 #define OP_GET_OBJECT_X						(0x0020	| OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
345 #define OP_GET_OBJECT_Y						(0x0021	| OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
346 #define OP_GET_OBJECT_Z						(0x0022	| OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
347 #define OP_IS_AI_CLASS						(0x0023 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
348 #define OP_IS_SHIP_TYPE						(0x0024 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
349 #define OP_IS_SHIP_CLASS					(0x0025	| OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
350 #define OP_NUM_SHIPS_IN_BATTLE				(0x0026 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// phreak
351 #define OP_CURRENT_SPEED					(0x0027 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // WMCoolmon
352 #define OP_IS_IFF							(0x0028 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
353 #define OP_NUM_WITHIN_BOX					(0x0029 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// WMCoolmon
354 #define OP_SCRIPT_EVAL_NUM					(0x002a | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // WMCoolmon
355 #define OP_SCRIPT_EVAL_STRING				(0x002b | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // WMCoolmon
356 #define OP_NUM_SHIPS_IN_WING				(0x002c | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Karajorma
357 #define OP_GET_PRIMARY_AMMO					(0x002d | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
358 #define OP_GET_SECONDARY_AMMO				(0x002e | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
359 #define	OP_NUM_ASSISTS						(0x002f | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
360 
361 #define	OP_SHIP_SCORE						(0x0030 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
362 #define	OP_SHIP_DEATHS						(0x0031 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
363 #define	OP_RESPAWNS_LEFT					(0x0032 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
364 #define	OP_IS_PLAYER						(0x0033 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
365 #define OP_GET_DAMAGE_CAUSED				(0x0034 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
366 #define OP_AFTERBURNER_LEFT					(0x0035 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
367 #define OP_WEAPON_ENERGY_LEFT				(0x0036 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
368 #define OP_PRIMARY_FIRED_SINCE				(0x0037 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
369 #define OP_SECONDARY_FIRED_SINCE			(0x0038 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
370 #define OP_CUTSCENES_GET_FOV				(0x0039 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Echelon9
371 #define OP_GET_THROTTLE_SPEED				(0x003a | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
372 #define OP_HITS_LEFT_SUBSYSTEM_GENERIC		(0x003b | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Goober5000
373 #define OP_HITS_LEFT_SUBSYSTEM_SPECIFIC		(0x003c | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Goober5000
374 #define OP_GET_OBJECT_PITCH					(0x003d	| OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
375 #define OP_GET_OBJECT_BANK					(0x003e	| OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
376 #define OP_GET_OBJECT_HEADING				(0x003f	| OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
377 
378 #define OP_HAS_PRIMARY_WEAPON				(0x0040 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
379 #define OP_HAS_SECONDARY_WEAPON				(0x0041 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
380 #define OP_STRING_TO_INT					(0x0042 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
381 #define OP_STRING_GET_LENGTH				(0x0043 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
382 #define OP_GET_OBJECT_SPEED_X				(0x0044 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
383 #define OP_GET_OBJECT_SPEED_Y				(0x0045 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
384 #define OP_GET_OBJECT_SPEED_Z				(0x0046 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)
385 #define OP_NAV_DISTANCE						(0x0047 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Kazan
386 #define OP_NAV_ISLINKED						(0x0048 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Kazan
387 #define OP_IS_FACING						(0x0049 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // The E
388 #define OP_DIRECTIVE_VALUE					(0x004a | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
389 #define OP_GET_NUM_COUNTERMEASURES			(0x004b | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
390 #define OP_IS_IN_BOX					    (0x004c | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Sushi
391 #define OP_IS_IN_MISSION					(0x004d | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
392 #define OP_ARE_SHIP_FLAGS_SET				(0x004e | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Karajorma
393 #define OP_TURRET_GET_PRIMARY_AMMO			(0x004f | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// DahBlount, part of the turret ammo code
394 
395 #define OP_TURRET_GET_SECONDARY_AMMO		(0x0050 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// DahBlount, part of the turret ammo code
396 #define OP_IS_DOCKED						(0x0051 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
397 #define OP_IS_IN_TURRET_FOV					(0x0052 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG)	// Goober5000
398 #define OP_GET_HOTKEY						(0x0053 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // wookieejedi
399 #define OP_DISTANCE_CENTER					(0x0054 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Goober5000
400 #define OP_DISTANCE_BBOX					(0x0055 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Goober5000
401 #define OP_DISTANCE_BBOX_SUBSYSTEM			(0x0056 | OP_CATEGORY_STATUS | OP_NONCAMPAIGN_FLAG) // Goober5000
402 #define OP_IS_LANGUAGE						(0x0057 | OP_CATEGORY_STATUS)						// Goober5000
403 
404 // conditional sexpressions
405 #define OP_WHEN								(0x0000 | OP_CATEGORY_CONDITIONAL)
406 #define OP_WHEN_ARGUMENT					(0x0001 | OP_CATEGORY_CONDITIONAL)	// Goober5000
407 #define OP_EVERY_TIME						(0x0002 | OP_CATEGORY_CONDITIONAL | OP_NONCAMPAIGN_FLAG)	// Goober5000
408 #define OP_EVERY_TIME_ARGUMENT				(0x0003 | OP_CATEGORY_CONDITIONAL | OP_NONCAMPAIGN_FLAG)	// Goober5000
409 #define OP_ANY_OF							(0x0004 | OP_CATEGORY_CONDITIONAL)	// Goober5000
410 #define OP_EVERY_OF							(0x0005 | OP_CATEGORY_CONDITIONAL)	// Goober5000
411 #define OP_RANDOM_OF						(0x0006 | OP_CATEGORY_CONDITIONAL)	// Goober5000
412 #define OP_NUMBER_OF						(0x0007 | OP_CATEGORY_CONDITIONAL)	// Goober5000
413 #define OP_INVALIDATE_ARGUMENT				(0x0008 | OP_CATEGORY_CONDITIONAL)	// Goober5000
414 #define OP_RANDOM_MULTIPLE_OF				(0x0009 | OP_CATEGORY_CONDITIONAL)	// Karajorma
415 #define OP_IN_SEQUENCE						(0x000a | OP_CATEGORY_CONDITIONAL)	// Karajorma
416 #define OP_VALIDATE_ARGUMENT				(0x000b | OP_CATEGORY_CONDITIONAL)	// Karajorma
417 #define OP_DO_FOR_VALID_ARGUMENTS			(0x000c | OP_CATEGORY_CONDITIONAL)	// Karajorma
418 #define OP_INVALIDATE_ALL_ARGUMENTS			(0x000d | OP_CATEGORY_CONDITIONAL)	// Karajorma
419 #define OP_VALIDATE_ALL_ARGUMENTS			(0x000e | OP_CATEGORY_CONDITIONAL)	// Karajorma
420 #define OP_FOR_COUNTER						(0x000f | OP_CATEGORY_CONDITIONAL)	// Goober5000
421 
422 #define OP_IF_THEN_ELSE						(0x0010 | OP_CATEGORY_CONDITIONAL)	// Goober5000
423 #define OP_NUM_VALID_ARGUMENTS				(0x0011 | OP_CATEGORY_CONDITIONAL)	// Karajorma
424 #define OP_FUNCTIONAL_IF_THEN_ELSE			(0x0012 | OP_CATEGORY_CONDITIONAL)	// Goober5000
425 #define OP_FOR_SHIP_CLASS					(0x0013 | OP_CATEGORY_CONDITIONAL)	// Goober5000
426 #define OP_FOR_SHIP_TYPE					(0x0014 | OP_CATEGORY_CONDITIONAL)	// Goober5000
427 #define OP_FOR_SHIP_TEAM					(0x0015 | OP_CATEGORY_CONDITIONAL)	// Goober5000
428 #define OP_FOR_SHIP_SPECIES					(0x0016 | OP_CATEGORY_CONDITIONAL)	// Goober5000
429 #define OP_FOR_PLAYERS						(0x0017 | OP_CATEGORY_CONDITIONAL)	// Goober5000
430 #define OP_FIRST_OF							(0x0018 | OP_CATEGORY_CONDITIONAL)	// MageKing17
431 #define OP_SWITCH							(0x0019 | OP_CATEGORY_CONDITIONAL)	// Goober5000
432 #define OP_FUNCTIONAL_SWITCH				(0x001a | OP_CATEGORY_CONDITIONAL)	// Goober5000
433 
434 
435 // sexpressions with side-effects
436 #define OP_CHANGE_IFF						(0x0000 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
437 #define OP_REPAIR_SUBSYSTEM					(0x0001 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
438 #define OP_SABOTAGE_SUBSYSTEM				(0x0002 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
439 #define OP_SET_SUBSYSTEM_STRNGTH			(0x0003 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
440 #define OP_PROTECT_SHIP						(0x0004 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
441 #define OP_SEND_MESSAGE						(0x0005 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
442 #define OP_SELF_DESTRUCT					(0x0006 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
443 #define OP_CLEAR_GOALS						(0x0007 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
444 #define OP_ADD_GOAL							(0x0008 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
445 #define OP_REMOVE_GOAL						(0x0009 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
446 #define OP_INVALIDATE_GOAL					(0x000a | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
447 #define OP_VALIDATE_GOAL					(0x000b | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
448 #define OP_SEND_RANDOM_MESSAGE				(0x000c | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
449 #define OP_TRANSFER_CARGO					(0x000d | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
450 #define OP_EXCHANGE_CARGO					(0x000e | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
451 #define OP_UNPROTECT_SHIP					(0x000f | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
452 
453 #define OP_GOOD_REARM_TIME					(0x0010 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
454 #define OP_BAD_REARM_TIME					(0x0011 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
455 #define OP_GRANT_PROMOTION					(0x0012 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
456 #define OP_GRANT_MEDAL						(0x0013 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
457 #define OP_ALLOW_SHIP						(0x0014 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
458 #define OP_ALLOW_WEAPON						(0x0015 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
459 #define OP_GOOD_SECONDARY_TIME				(0x0016 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
460 #define OP_WARP_BROKEN						(0x0017 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
461 #define OP_WARP_NOT_BROKEN					(0x0018 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
462 #define OP_WARP_NEVER						(0x0019 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
463 #define OP_WARP_ALLOWED						(0x001a | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
464 #define OP_SHIP_INVISIBLE					(0x001b | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
465 #define OP_SHIP_VISIBLE						(0x001c | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
466 #define OP_SHIP_INVULNERABLE				(0x001d | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
467 #define OP_SHIP_VULNERABLE					(0x001e | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
468 #define OP_RED_ALERT						(0x001f | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
469 
470 #define OP_TECH_ADD_SHIP					(0x0020 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
471 #define OP_TECH_ADD_WEAPON					(0x0021 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
472 #define OP_END_CAMPAIGN						(0x0022 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
473 #define OP_JETTISON_CARGO_DELAY				(0x0023 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
474 #define OP_MODIFY_VARIABLE					(0X0024 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
475 #define OP_NOP								(0x0025 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
476 #define OP_BEAM_FIRE						(0x0026 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
477 #define OP_BEAM_FREE						(0x0027 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
478 #define OP_BEAM_FREE_ALL					(0x0028 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
479 #define OP_BEAM_LOCK						(0x0029 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
480 #define OP_BEAM_LOCK_ALL					(0x002a | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
481 #define OP_BEAM_PROTECT_SHIP				(0x002b | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
482 #define OP_BEAM_UNPROTECT_SHIP				(0x002c | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
483 #define OP_TURRET_FREE						(0x002d | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
484 #define OP_TURRET_FREE_ALL					(0x002e | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
485 #define OP_TURRET_LOCK						(0x002f | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
486 
487 #define OP_TURRET_LOCK_ALL					(0x0030 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
488 #define OP_ADD_REMOVE_ESCORT				(0x0031 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
489 #define OP_AWACS_SET_RADIUS					(0x0032 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
490 #define OP_SEND_MESSAGE_LIST				(0x0033 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
491 #define OP_CAP_WAYPOINT_SPEED				(0x0034 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
492 #define OP_SHIP_GUARDIAN					(0x0035 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
493 #define OP_SHIP_NO_GUARDIAN					(0x0036 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
494 #define OP_TURRET_TAGGED_ONLY_ALL			(0x0037 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
495 #define OP_TURRET_TAGGED_CLEAR_ALL			(0x0038 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
496 #define OP_SUBSYS_SET_RANDOM				(0x0039 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
497 #define OP_SUPERNOVA_START					(0x003a | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
498 #define OP_CARGO_NO_DEPLETE					(0x003b | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
499 #define OP_SET_SPECIAL_WARPOUT_NAME			(0X003c | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
500 #define OP_SHIP_VANISH						(0X003d | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
501 #define OP_SHIELDS_ON						(0x003e | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	//-Sesquipedalian
502 #define OP_SHIELDS_OFF						(0x003f | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	//-Sesquipedalian
503 
504 #define OP_CHANGE_AI_LEVEL					(0x0040 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	//-Sesquipedalian
505 #define OP_END_MISSION						(0x0041 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) //-Sesquipedalian. replaces end-mission-delay, which did nothing
506 #define OP_SET_SCANNED						(0x0042 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
507 #define OP_SET_UNSCANNED					(0x0043	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
508 #define OP_SHIP_STEALTHY					(0x0044	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
509 #define OP_SHIP_UNSTEALTHY					(0x0045	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
510 #define OP_SET_CARGO						(0x0046	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
511 #define OP_CHANGE_AI_CLASS					(0x0047 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
512 #define OP_FRIENDLY_STEALTH_INVISIBLE		(0x0048	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
513 #define OP_FRIENDLY_STEALTH_VISIBLE			(0x0049	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
514 #define OP_DAMAGED_ESCORT_LIST				(0x004a | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) //phreak
515 #define OP_DAMAGED_ESCORT_LIST_ALL			(0x004b	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
516 #define OP_SHIP_VAPORIZE					(0x004c	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
517 #define OP_SHIP_NO_VAPORIZE					(0x004d	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
518 #define OP_COLLIDE_INVISIBLE				(0x004e	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
519 #define OP_DONT_COLLIDE_INVISIBLE			(0x004f	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
520 
521 #define OP_PRIMITIVE_SENSORS_SET_RANGE		(0x0050	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
522 #define OP_CHANGE_SHIP_CLASS				(0x0051	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
523 #define OP_SCRIPT_EVAL						(0x0052 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) //WMC
524 #define OP_SET_SUPPORT_SHIP					(0x0053 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
525 #define OP_DEACTIVATE_GLOW_POINTS			(0x0054	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	//-Bobboau
526 #define OP_ACTIVATE_GLOW_POINTS				(0x0055	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	//-Bobboau
527 #define OP_DEACTIVATE_GLOW_MAPS				(0x0056	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	//-Bobboau
528 #define OP_ACTIVATE_GLOW_MAPS				(0x0057	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	//-Bobboau
529 #define OP_DEACTIVATE_GLOW_POINT_BANK		(0x0058	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	//-Bobboau
530 #define OP_ACTIVATE_GLOW_POINT_BANK			(0x0059	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	//-Bobboau
531 #define OP_CHANGE_SOUNDTRACK				(0x005a	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
532 #define OP_TECH_ADD_INTEL					(0x005b	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
533 #define OP_TECH_RESET_TO_DEFAULT			(0x005c	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
534 #define OP_EXPLOSION_EFFECT					(0x005d | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
535 #define OP_WARP_EFFECT						(0x005e | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
536 #define OP_SET_OBJECT_FACING				(0x005f | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
537 
538 #define OP_SET_OBJECT_FACING_OBJECT			(0x0060 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
539 #define OP_SET_OBJECT_POSITION				(0x0061	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
540 #define OP_PLAY_SOUND_FROM_TABLE			(0x0062	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
541 #define OP_PLAY_SOUND_FROM_FILE				(0x0063	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
542 #define OP_CLOSE_SOUND_FROM_FILE			(0x0064 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
543 #define OP_HUD_DISABLE						(0x0065	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
544 #define OP_KAMIKAZE							(0x0066 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	//-Sesquipedalian
545 #define OP_MISSION_SET_SUBSPACE				(0x0067 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
546 #define OP_TURRET_TAGGED_SPECIFIC			(0x0068 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) //phreak
547 #define OP_TURRET_TAGGED_CLEAR_SPECIFIC		(0x0069 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) //phreak
548 #define OP_LOCK_ROTATING_SUBSYSTEM			(0x006a | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
549 #define OP_FREE_ROTATING_SUBSYSTEM			(0x006b | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
550 #define OP_REVERSE_ROTATING_SUBSYSTEM		(0x006c | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
551 #define OP_ROTATING_SUBSYS_SET_TURN_TIME	(0x006d | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
552 #define OP_PLAYER_USE_AI					(0x006e | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
553 #define OP_PLAYER_NOT_USE_AI				(0x006f | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
554 
555 #define OP_HUD_DISABLE_EXCEPT_MESSAGES		(0x0070 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
556 #define OP_FORCE_JUMP						(0x0071 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
557 #define OP_HUD_SET_TEXT						(0x0072 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) //WMC
558 #define OP_HUD_SET_TEXT_NUM					(0x0073 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) //WMC
559 #define OP_HUD_SET_COORDS					(0x0074 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) //WMC
560 #define OP_HUD_SET_FRAME					(0x0075 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) //WMC
561 #define OP_HUD_SET_COLOR					(0x0076 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) //WMC
562 #define OP_HUD_SET_MAX_TARGETING_RANGE		(0x0077 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Goober5000
563 #define OP_SHIP_TAG							(0x0078 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Goober5000
564 #define OP_SHIP_UNTAG						(0x0079 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Goober5000
565 #define OP_SHIP_CHANGE_ALT_NAME				(0x007a | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
566 #define OP_SCRAMBLE_MESSAGES				(0x007b | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// phreak
567 #define OP_UNSCRAMBLE_MESSAGES				(0x007c | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// phreak
568 #define OP_CUTSCENES_SET_CUTSCENE_BARS		(0x007d | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
569 #define OP_CUTSCENES_UNSET_CUTSCENE_BARS	(0x007e | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
570 #define OP_CUTSCENES_FADE_IN				(0x007f | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
571 
572 #define OP_CUTSCENES_FADE_OUT				(0x0080 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
573 #define OP_CUTSCENES_SET_CAMERA_POSITION	(0x0081 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
574 #define OP_CUTSCENES_SET_CAMERA_FACING		(0x0082 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
575 #define OP_CUTSCENES_SET_CAMERA_FACING_OBJECT	(0x0083 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
576 #define OP_CUTSCENES_SET_CAMERA_ROTATION	(0x0084 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
577 #define OP_CUTSCENES_SET_FOV				(0x0085 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
578 #define OP_CUTSCENES_RESET_FOV				(0x0086 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
579 #define OP_CUTSCENES_RESET_CAMERA			(0x0087 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
580 #define OP_CUTSCENES_SHOW_SUBTITLE			(0x0088 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC / deprecated
581 #define OP_CUTSCENES_SET_TIME_COMPRESSION	(0x0089 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
582 #define OP_CUTSCENES_RESET_TIME_COMPRESSION	(0x008a | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
583 #define OP_CUTSCENES_FORCE_PERSPECTIVE		(0x008b | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
584 #define OP_JUMP_NODE_SET_JUMPNODE_NAME		(0x008c | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// CommanderDJ
585 #define OP_JUMP_NODE_SET_JUMPNODE_COLOR		(0x008d | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
586 #define OP_JUMP_NODE_SET_JUMPNODE_MODEL		(0x008e | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
587 #define OP_JUMP_NODE_SHOW_JUMPNODE			(0x008f | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
588 
589 #define OP_JUMP_NODE_HIDE_JUMPNODE			(0x0090 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
590 #define OP_SHIP_GUARDIAN_THRESHOLD			(0x0091 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
591 #define OP_SHIP_SUBSYS_GUARDIAN_THRESHOLD	(0x0092 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
592 #define OP_SET_SKYBOX_MODEL					(0x0093 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // taylor
593 #define OP_SHIP_CREATE						(0X0094 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
594 #define OP_WEAPON_CREATE					(0x0095	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
595 #define OP_SET_OBJECT_SPEED_X				(0X0096 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Deprecated by wookieejedi
596 #define OP_SET_OBJECT_SPEED_Y				(0X0097 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Deprecated by wookieejedi
597 #define OP_SET_OBJECT_SPEED_Z				(0X0098 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Deprecated by wookieejedi
598 #define OP_MISSION_SET_NEBULA				(0x0099 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
599 #define OP_ADD_BACKGROUND_BITMAP			(0x009a | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
600 #define OP_REMOVE_BACKGROUND_BITMAP			(0x009b | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
601 #define OP_ADD_SUN_BITMAP					(0x009c | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
602 #define OP_REMOVE_SUN_BITMAP				(0x009d | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
603 #define OP_NEBULA_CHANGE_STORM				(0x009e | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
604 #define OP_NEBULA_TOGGLE_POOF				(0x009f | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
605 
606 #define OP_TURRET_CHANGE_WEAPON				(0x00a0 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
607 #define OP_TURRET_SET_TARGET_ORDER			(0x00a1 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
608 #define OP_SHIP_TURRET_TARGET_ORDER			(0x00a2 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
609 #define OP_SET_PRIMARY_AMMO					(0x00a3 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
610 #define OP_SET_SECONDARY_AMMO				(0x00a4 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
611 #define OP_SHIP_BOMB_TARGETABLE				(0x00a5 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	//WMC
612 #define OP_SHIP_BOMB_UNTARGETABLE			(0x00a6 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	//WMC
613 #define OP_SHIP_SUBSYS_TARGETABLE			(0x00a7 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
614 #define OP_SHIP_SUBSYS_UNTARGETABLE			(0x00a8 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
615 #define OP_SET_DEATH_MESSAGE				(0x00a9 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
616 #define OP_SET_PRIMARY_WEAPON				(0x00aa | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
617 #define OP_SET_SECONDARY_WEAPON				(0x00ab | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
618 #define OP_DISABLE_BUILTIN_MESSAGES			(0x00ac | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
619 #define OP_ENABLE_BUILTIN_MESSAGES			(0x00ad | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
620 #define OP_LOCK_PRIMARY_WEAPON				(0x00ae | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
621 #define OP_UNLOCK_PRIMARY_WEAPON			(0x00af | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
622 
623 #define OP_LOCK_SECONDARY_WEAPON			(0x00b0 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
624 #define OP_UNLOCK_SECONDARY_WEAPON			(0x00b1 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
625 #define OP_SET_CAMERA_SHUDDER				(0x00b2 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
626 #define OP_ALLOW_TREASON					(0x00b3 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
627 #define OP_SHIP_COPY_DAMAGE					(0x00b4 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
628 #define OP_CHANGE_SUBSYSTEM_NAME			(0x00b5 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Karajorma
629 #define OP_SET_PERSONA						(0x00b6 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
630 #define OP_CHANGE_PLAYER_SCORE				(0x00b7 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
631 #define OP_CHANGE_TEAM_SCORE				(0x00b8 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
632 #define OP_CUTSCENES_SET_CAMERA_FOV			(0x00b9 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// WMC
633 #define OP_CUTSCENES_SET_CAMERA				(0x00ba | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // WMC
634 #define OP_CUTSCENES_SET_CAMERA_HOST		(0x00bb | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // WMC
635 #define OP_CUTSCENES_SET_CAMERA_TARGET		(0x00bc | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // WMC
636 #define OP_LOCK_AFTERBURNER					(0x00bd | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // KeldorKatarn
637 #define OP_UNLOCK_AFTERBURNER				(0x00be | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // KeldorKatarn
638 #define OP_SHIP_CHANGE_CALLSIGN				(0x00bf | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// FUBAR
639 
640 #define OP_SET_RESPAWNS						(0x00c0 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
641 #define OP_SET_AFTERBURNER_ENERGY			(0x00c1 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
642 #define OP_SET_WEAPON_ENERGY				(0x00c2 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
643 #define OP_SET_SHIELD_ENERGY				(0x00c3 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
644 #define OP_SET_AMBIENT_LIGHT				(0x00c4 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Karajorma
645 #define OP_CHANGE_IFF_COLOR					(0x00c5 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Wanderer
646 #define OP_TURRET_SUBSYS_TARGET_DISABLE		(0x00c6 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Wanderer
647 #define OP_TURRET_SUBSYS_TARGET_ENABLE		(0x00c7 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Wanderer
648 #define OP_CLEAR_WEAPONS					(0x00c8 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Wanderer
649 #define OP_SHIP_MANEUVER					(0x00c9 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Wanderer
650 #define OP_SHIP_ROT_MANEUVER				(0x00ca | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Wanderer
651 #define OP_SHIP_LAT_MANEUVER				(0x00cb | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Wanderer
652 #define OP_GET_VARIABLE_BY_INDEX			(0x00cc | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Goober5000
653 #define OP_SET_VARIABLE_BY_INDEX			(0x00cd | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Goober5000
654 #define OP_SET_POST_EFFECT					(0x00ce | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Hery
655 #define OP_TURRET_SET_OPTIMUM_RANGE			(0x00cf | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
656 
657 #define OP_TURRET_SET_DIRECTION_PREFERENCE	(0x00d0 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
658 #define OP_TURRET_SET_TARGET_PRIORITIES		(0x00d1 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
659 #define OP_SET_ARMOR_TYPE					(0x00d2 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
660 #define OP_CUTSCENES_SHOW_SUBTITLE_TEXT		(0x00d3 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
661 #define OP_CUTSCENES_SHOW_SUBTITLE_IMAGE	(0x00d4 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
662 #define OP_HUD_DISPLAY_GAUGE				(0x00d5 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)
663 #define OP_SET_SOUND_ENVIRONMENT			(0x00d6 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Taylor
664 #define OP_UPDATE_SOUND_ENVIRONMENT			(0x00d7 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Taylor
665 #define OP_SET_EXPLOSION_OPTION				(0x00d8 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
666 #define OP_ADJUST_AUDIO_VOLUME				(0x00d9 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // The E
667 #define OP_FORCE_GLIDE						(0x00da	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // The E
668 #define OP_TURRET_SET_RATE_OF_FIRE			(0x00db | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
669 #define OP_HUD_SET_MESSAGE					(0x00dc	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // The E
670 #define OP_SHIP_SUBSYS_NO_REPLACE			(0x00dd	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
671 #define OP_SET_IMMOBILE						(0x00de | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
672 #define OP_SET_MOBILE						(0x00df | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
673 
674 #define OP_SHIP_SUBSYS_NO_LIVE_DEBRIS		(0x00e0	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
675 #define OP_SHIP_SUBSYS_VANISHED				(0x00e1	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
676 #define OP_SHIP_SUBSYS_IGNORE_IF_DEAD		(0x00e2	| OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
677 #define OP_HUD_SET_DIRECTIVE				(0x00e3 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // The E
678 #define OP_HUD_GAUGE_SET_ACTIVE				(0x00e4 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // The E - slightly deprecated
679 #define OP_HUD_ACTIVATE_GAUGE_TYPE			(0x00e5 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // The E - slightly deprecated
680 #define OP_SET_OBJECT_ORIENTATION			(0x00e6 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
681 #define OP_STRING_CONCATENATE				(0x00e7 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
682 #define OP_INT_TO_STRING					(0x00e8 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // Goober5000
683 #define OP_WEAPON_SET_DAMAGE_TYPE			(0x00e9 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
684 #define OP_SHIP_SET_DAMAGE_TYPE				(0x00ea | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
685 #define OP_SHIP_SHOCKWAVE_SET_DAMAGE_TYPE	(0x00eb | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
686 #define OP_FIELD_SET_DAMAGE_TYPE			(0x00ec | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // FUBAR
687 #define OP_TURRET_PROTECT_SHIP				(0x00ed | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
688 #define OP_TURRET_UNPROTECT_SHIP			(0x00ee | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Goober5000
689 #define OP_DISABLE_ETS						(0x00ef | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // The E
690 
691 #define OP_ENABLE_ETS						(0x00f0 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG) // The E
692 #define OP_NAV_ADD_WAYPOINT					(0x00f1 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
693 #define OP_NAV_ADD_SHIP						(0x00f2 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
694 #define OP_NAV_DEL							(0x00f3 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
695 #define OP_NAV_HIDE							(0x00f4 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
696 #define OP_NAV_RESTRICT						(0x00f5 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
697 #define OP_NAV_UNHIDE						(0x00f6 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
698 #define OP_NAV_UNRESTRICT					(0x00f7 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
699 #define OP_NAV_SET_VISITED					(0x00f8 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
700 #define OP_NAV_SET_CARRY					(0x00f9 | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
701 #define OP_NAV_UNSET_CARRY					(0x00fa | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
702 #define OP_NAV_UNSET_VISITED				(0x00fb | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
703 #define OP_NAV_SET_NEEDSLINK				(0x00fc | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
704 #define OP_NAV_UNSET_NEEDSLINK				(0x00fd | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
705 #define OP_NAV_USECINEMATICS				(0x00fe | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
706 #define OP_NAV_USEAP						(0x00ff | OP_CATEGORY_CHANGE | OP_NONCAMPAIGN_FLAG)	// Kazan
707 
708 // 0x00ff is the last remaining sexp in the CHANGE category!  Future change sexps should go under CHANGE2
709 
710 #define OP_STRING_GET_SUBSTRING				(0x0000 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
711 #define OP_STRING_SET_SUBSTRING				(0x0001 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
712 #define OP_SET_NUM_COUNTERMEASURES			(0x0002 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) // Karajorma
713 #define OP_ADD_TO_COLGROUP					(0x0003 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) // The E
714 #define OP_REMOVE_FROM_COLGROUP				(0x0004 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) // The E
715 #define OP_GET_COLGROUP_ID					(0x0005 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) // The E
716 #define OP_SHIP_EFFECT						(0x0006 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) // Valathil
717 #define OP_CLEAR_SUBTITLES					(0x0007 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) // The E
718 #define OP_BEAM_FIRE_COORDS					(0x0008 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
719 #define OP_SET_DOCKED						(0x0009 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) // Sushi
720 #define OP_SET_THRUSTERS					(0x000a	| OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) // The E
721 #define OP_TRIGGER_SUBMODEL_ANIMATION		(0x000b | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
722 #define OP_HUD_CLEAR_MESSAGES				(0x000c | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) // Swifty
723 #define OP_SET_PLAYER_ORDERS				(0x000d | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Karajorma
724 #define OP_SUPERNOVA_STOP					(0x000e | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) //CommanderDJ
725 #define OP_SET_PLAYER_THROTTLE_SPEED		(0x000f | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) //CommanderDJ
726 
727 #define OP_SET_DEBRIEFING_TOGGLED			(0x0010 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
728 #define OP_SET_SUBSPACE_DRIVE				(0x0011 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
729 #define OP_SET_ARRIVAL_INFO					(0x0012 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
730 #define OP_SET_DEPARTURE_INFO				(0x0013 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
731 #define OP_SET_SKYBOX_ORIENT				(0x0014 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
732 #define OP_DESTROY_INSTANTLY				(0x0015 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Admiral MS
733 #define OP_DESTROY_SUBSYS_INSTANTLY			(0x0016 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Admiral MS
734 #define OP_DEBUG							(0x0017 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Karajorma
735 #define OP_SET_MISSION_MOOD					(0x0018 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Karajorma
736 #define OP_NAV_SELECT						(0x0019 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) 	// Talon1024
737 #define OP_NAV_UNSELECT						(0x001a | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) 	// Talon1024
738 #define OP_ALTER_SHIP_FLAG					(0x001b | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Karajorma
739 #define OP_CHANGE_TEAM_COLOR				(0x001c | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// The E
740 #define OP_NEBULA_CHANGE_PATTERN			(0x001d | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Axem
741 #define OP_PLAYER_IS_CHEATING_BASTARD		(0x001e | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// The E
742 #define OP_TECH_ADD_INTEL_XSTR				(0x001f | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
743 
744 #define OP_COPY_VARIABLE_FROM_INDEX			(0x0020 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) // Goober5000
745 #define OP_COPY_VARIABLE_BETWEEN_INDEXES	(0x0021 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) // Goober5000
746 #define OP_GET_ETS_VALUE					(0x0022 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// niffiwan
747 #define OP_SET_ETS_VALUES					(0x0023 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// niffiwan
748 #define OP_CALL_SSM_STRIKE					(0x0024 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) // X3N0-Life-Form
749 #define OP_SET_MOTION_DEBRIS				(0x0025 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)    // The E
750 #define OP_HUD_SET_CUSTOM_GAUGE_ACTIVE		(0x0026 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) 	// The E, just revamped a bit by Axem
751 #define OP_HUD_SET_BUILTIN_GAUGE_ACTIVE		(0x0027 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) 	// The E, just revamped a bit by Axem
752 #define OP_SCRIPT_EVAL_MULTI				(0x0028 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Karajorma
753 #define OP_PAUSE_SOUND_FROM_FILE			(0x0029 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
754 #define OP_SCRIPT_EVAL_BLOCK				(0x002a | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG) // niffiwan
755 #define OP_BEAM_FLOATING_FIRE				(0x002b | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// MageKing17
756 #define OP_TURRET_SET_PRIMARY_AMMO			(0x002c | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// DahBlount, part of the turret ammo changes
757 #define OP_TURRET_SET_SECONDARY_AMMO		(0x002d | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// DahBlount, part of the turret ammo changes
758 #define OP_JETTISON_CARGO_NEW				(0x002e | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
759 #define OP_STRING_CONCATENATE_BLOCK			(0x002f | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
760 
761 #define OP_MODIFY_VARIABLE_XSTR				(0X0030 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// m!m
762 #define OP_RESET_POST_EFFECTS				(0x0031 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
763 #define OP_ADD_REMOVE_HOTKEY				(0x0032 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)    // wookieejedi
764 #define OP_TECH_REMOVE_INTEL_XSTR			(0x0033 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)    // wookieejedi
765 #define OP_TECH_REMOVE_INTEL				(0x0034 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)   // wookieejedi
766 #define OP_CHANGE_BACKGROUND				(0x0035 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
767 #define OP_CLEAR_DEBRIS						(0x0036 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
768 #define OP_SET_DEBRIEFING_PERSONA			(0x0037 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
769 #define OP_ADD_TO_COLGROUP2					(0x0038 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
770 #define OP_REMOVE_FROM_COLGROUP2			(0x0039 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
771 #define OP_GET_POWER_OUTPUT					(0x003a | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// The E
772 #define OP_TURRET_SET_FORCED_TARGET			(0x003b | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Asteroth
773 #define OP_TURRET_SET_FORCED_SUBSYS_TARGET	(0x003c | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Asteroth
774 #define OP_TURRET_CLEAR_FORCED_TARGET		(0x003d | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Asteroth
775 #define OP_SEND_MESSAGE_CHAIN				(0x003e | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Goober5000
776 #define OP_TURRET_SET_INACCURACY		    (0x003f | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Asteroth
777 
778 #define OP_REPLACE_TEXTURE					(0x0040 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Lafiel
779 #define OP_NEBULA_CHANGE_FOG_COLOR			(0x0041 | OP_CATEGORY_CHANGE2 | OP_NONCAMPAIGN_FLAG)	// Asteroth
780 
781 // defined for AI goals
782 #define OP_AI_CHASE							(0x0000 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
783 #define OP_AI_DOCK							(0x0001 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
784 #define OP_AI_UNDOCK						(0x0002 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
785 #define OP_AI_WARP_OUT						(0x0003 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
786 #define OP_AI_WAYPOINTS						(0x0004 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
787 #define OP_AI_WAYPOINTS_ONCE				(0x0005 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
788 #define OP_AI_DESTROY_SUBSYS				(0x0006 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
789 #define OP_AI_DISABLE_SHIP					(0x0007 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
790 #define OP_AI_DISARM_SHIP					(0x0008 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
791 #define OP_AI_GUARD							(0x0009 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
792 #define OP_AI_CHASE_ANY						(0x000a | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
793 #define OP_AI_EVADE_SHIP					(0x000b | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
794 #define OP_AI_STAY_NEAR_SHIP				(0x000c | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
795 #define OP_AI_KEEP_SAFE_DISTANCE			(0x000d | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
796 #define OP_AI_IGNORE						(0x000e | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
797 #define OP_AI_STAY_STILL					(0x000f | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
798 #define OP_AI_PLAY_DEAD						(0x0010 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)
799 #define OP_AI_IGNORE_NEW					(0x0011 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)	// Goober5000
800 #define OP_AI_FORM_ON_WING					(0x0012 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG) // The E
801 #define OP_AI_CHASE_SHIP_CLASS				(0x0013 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)	// Goober5000
802 #define OP_AI_PLAY_DEAD_PERSISTENT			(0x0014 | OP_CATEGORY_AI | OP_NONCAMPAIGN_FLAG)	// Goober5000
803 
804 #define OP_GOALS_ID							(0x0000 | OP_CATEGORY_UNLISTED)
805 #define OP_NEXT_MISSION						(0x0001 | OP_CATEGORY_UNLISTED)		// used in campaign files for branching
806 #define OP_IS_DESTROYED						(0x0002 | OP_CATEGORY_UNLISTED)
807 #define OP_IS_SUBSYSTEM_DESTROYED			(0x0003 | OP_CATEGORY_UNLISTED)
808 #define OP_IS_DISABLED						(0x0004 | OP_CATEGORY_UNLISTED)
809 #define OP_IS_DISARMED						(0x0005 | OP_CATEGORY_UNLISTED)
810 #define OP_HAS_DOCKED						(0x0006 | OP_CATEGORY_UNLISTED)
811 #define OP_HAS_UNDOCKED						(0x0007 | OP_CATEGORY_UNLISTED)
812 #define OP_HAS_ARRIVED						(0x0008 | OP_CATEGORY_UNLISTED)
813 #define OP_HAS_DEPARTED						(0x0009 | OP_CATEGORY_UNLISTED)
814 #define OP_WAYPOINTS_DONE					(0x000a | OP_CATEGORY_UNLISTED)
815 #define OP_ADD_SHIP_GOAL					(0x000b | OP_CATEGORY_UNLISTED)
816 #define OP_CLEAR_SHIP_GOALS					(0x000c | OP_CATEGORY_UNLISTED)
817 #define OP_ADD_WING_GOAL					(0x000d | OP_CATEGORY_UNLISTED)
818 #define OP_CLEAR_WING_GOALS					(0x000e | OP_CATEGORY_UNLISTED)
819 #define OP_AI_CHASE_WING					(0x000f | OP_CATEGORY_UNLISTED)
820 #define OP_AI_GUARD_WING					(0x0010 | OP_CATEGORY_UNLISTED)
821 #define OP_EVENT_TRUE						(0x0011 | OP_CATEGORY_UNLISTED)
822 #define OP_EVENT_FALSE						(0x0012 | OP_CATEGORY_UNLISTED)
823 #define OP_PREVIOUS_GOAL_INCOMPLETE			(0x0013 | OP_CATEGORY_UNLISTED)
824 #define OP_PREVIOUS_EVENT_INCOMPLETE		(0x0014 | OP_CATEGORY_UNLISTED)
825 #define OP_AI_WARP							(0x0015 | OP_CATEGORY_UNLISTED)
826 #define OP_IS_CARGO_KNOWN					(0x0016 | OP_CATEGORY_UNLISTED)
827 #define OP_COND								(0x0017 | OP_CATEGORY_UNLISTED)
828 #define OP_END_OF_CAMPAIGN					(0x0018 | OP_CATEGORY_UNLISTED)
829 
830 // training sexps
831 #define OP_KEY_PRESSED						(0x0000 | OP_CATEGORY_TRAINING)
832 #define OP_KEY_RESET						(0x0001 | OP_CATEGORY_TRAINING)
833 #define OP_TARGETED							(0x0002 | OP_CATEGORY_TRAINING)
834 #define OP_SPEED							(0x0003 | OP_CATEGORY_TRAINING)
835 #define OP_FACING							(0x0004 | OP_CATEGORY_TRAINING)
836 #define OP_ORDER							(0x0005 | OP_CATEGORY_TRAINING)
837 #define OP_WAYPOINT_MISSED					(0x0006 | OP_CATEGORY_TRAINING)
838 #define OP_PATH_FLOWN						(0x0007 | OP_CATEGORY_TRAINING)
839 #define OP_WAYPOINT_TWICE					(0x0008 | OP_CATEGORY_TRAINING)
840 #define OP_TRAINING_MSG						(0x0009 | OP_CATEGORY_TRAINING)
841 #define OP_FLASH_HUD_GAUGE					(0x000a | OP_CATEGORY_TRAINING)
842 #define OP_SPECIAL_CHECK					(0x000b | OP_CATEGORY_TRAINING)
843 #define OP_SECONDARIES_DEPLETED				(0x000c | OP_CATEGORY_TRAINING)
844 #define OP_FACING2							(0x000d | OP_CATEGORY_TRAINING)
845 #define OP_PRIMARIES_DEPLETED				(0x000e | OP_CATEGORY_TRAINING)	// Goober5000
846 #define OP_MISSILE_LOCKED					(0x000f | OP_CATEGORY_TRAINING)	// Sesquipedalian
847 #define OP_SET_TRAINING_CONTEXT_FLY_PATH	(0x0010 | OP_CATEGORY_TRAINING)
848 #define OP_SET_TRAINING_CONTEXT_SPEED		(0x0011 | OP_CATEGORY_TRAINING)
849 #define OP_KEY_RESET_MULTIPLE				(0x0012 | OP_CATEGORY_TRAINING)	// Goober5000
850 #define OP_RESET_ORDERS						(0x0013 | OP_CATEGORY_TRAINING) // Karajorma
851 #define OP_QUERY_ORDERS						(0x0014 | OP_CATEGORY_TRAINING) // Karajorma
852 #define OP_NODE_TARGETED					(0x0015 | OP_CATEGORY_TRAINING) // FUBAR
853 #define OP_IGNORE_KEY						(0x0016 | OP_CATEGORY_TRAINING) // Karajorma
854 
855 // defines for string constants
856 #define SEXP_HULL_STRING			"Hull"
857 #define SEXP_SIM_HULL_STRING		"Simulated Hull"
858 #define SEXP_SHIELD_STRING			"Shields"
859 #define SEXP_ALL_ENGINES_STRING		"<all engines>"
860 #define SEXP_ALL_TURRETS_STRING		"<all turrets>"
861 #define SEXP_ARGUMENT_STRING		"<argument>"
862 #define SEXP_NONE_STRING			"<none>"
863 #define SEXP_ANY_STRING				"<any string>"
864 #define SEXP_ALL_BANKS_STRING		"<all weapon banks>"
865 
866 // macros for accessing sexpression atoms
867 /**
868  * @brief Returns the first element of a SEXP list
869  *
870  * The name CAR originates from the original LISP language where it was a function which retrieved the first element of
871  * a list.
872  *
873  * @see https://en.wikipedia.org/wiki/CAR_and_CDR
874  */
875 #define CAR(n)		((n < 0) ? -1 : Sexp_nodes[n].first)
876 /**
877  * @brief Returns the rest of a SEXP list. The rest is everything starting from the second element.
878  *
879  * The name CDR originates from the original LISP language where it was a function which retrieved the "rest" of a list.
880  *
881  * @see https://en.wikipedia.org/wiki/CAR_and_CDR
882  */
883 #define CDR(n)		((n < 0) ? -1 : Sexp_nodes[n].rest)
884 #define CADR(n)		CAR(CDR(n))
885 // #define CTEXT(n)	(Sexp_nodes[n].text)
886 const char *CTEXT(int n);
887 
888 // added by Goober5000
889 #define CDDR(n)		CDR(CDR(n))
890 #define CDDDR(n)	CDR(CDDR(n))
891 #define CDDDDR(n)	CDR(CDDDR(n))
892 #define CDDDDDR(n)	CDR(CDDDDR(n))
893 #define CADDR(n)	CAR(CDDR(n))
894 #define CADDDR(n)	CAR(CDDDR(n))
895 #define CADDDDR(n)	CAR(CDDDDR(n))
896 #define CADDDDDR(n)	CAR(CDDDDDR(n))
897 
898 #define REF_TYPE_SHIP		1
899 #define REF_TYPE_WING		2
900 #define REF_TYPE_PLAYER		3
901 #define REF_TYPE_WAYPOINT	4
902 #define REF_TYPE_PATH		5	// waypoint path
903 
904 #define SRC_SHIP_ARRIVAL	0x10000
905 #define SRC_SHIP_DEPARTURE	0x20000
906 #define SRC_WING_ARRIVAL	0x30000
907 #define SRC_WING_DEPARTURE	0x40000
908 #define SRC_EVENT				0x50000
909 #define SRC_MISSION_GOAL	0x60000
910 #define SRC_SHIP_ORDER		0x70000
911 #define SRC_WING_ORDER		0x80000
912 #define SRC_DEBRIEFING		0x90000
913 #define SRC_BRIEFING			0xa0000
914 #define SRC_UNKNOWN			0xffff0000
915 #define SRC_MASK				0xffff0000
916 #define SRC_DATA_MASK		0xffff
917 
918 #define SEXP_MODE_GENERAL	0
919 #define SEXP_MODE_CAMPAIGN	1
920 
921 // defines for type field of sexp nodes.  The actual type of the node will be stored in the lower
922 // two bytes of the field.  The upper two bytes will be used for flags (bleah...)
923 // Be sure not to conflict with type field of sexp_variable
924 #define SEXP_NOT_USED		0
925 #define SEXP_LIST				1
926 #define SEXP_ATOM				2
927 
928 // flags for sexpressions -- masked onto the end of the type field
929 #define SEXP_FLAG_PERSISTENT				(1<<31)		// should this sexp node be persistant across missions
930 #define SEXP_FLAG_VARIABLE					(1<<30)
931 
932 // sexp variable definitions
933 #define SEXP_VARIABLE_CHAR					('@')
934 // defines for type field of sexp_variable.  Be sure not to conflict with type field of sexp_node
935 #define SEXP_VARIABLE_NUMBER				(1<<4)	//	(0x0010)
936 #define SEXP_VARIABLE_STRING				(1<<5)	//	(0x0020)
937 #define SEXP_VARIABLE_UNKNOWN				(1<<6)	//	(0x0040)
938 #define SEXP_VARIABLE_NOT_USED				(1<<7)	//	(0x0080)
939 
940 #define SEXP_VARIABLE_BLOCK					(1<<0)	//	(0x0001)
941 /*
942 #define SEXP_VARIABLE_BLOCK_EXP				(1<<1)	//	(0x0002)
943 #define SEXP_VARIABLE_BLOCK_HIT				(1<<2)	//	(0x0004)
944 */
945 #define SEXP_VARIABLE_SAVE_ON_MISSION_CLOSE		(1<<3)	//	(0x0008)
946 
947 // Goober5000 - hopefully this should work and not conflict with anything
948 #define SEXP_VARIABLE_SAVE_ON_MISSION_PROGRESS	(1<<29)	//	(0x0100)
949 //Karajorma
950 #define SEXP_VARIABLE_NETWORK				(1<<28)
951 #define SEXP_VARIABLE_SAVE_TO_PLAYER_FILE	(1<<27)
952 
953 #define SEXP_VARIABLE_IS_PERSISTENT (SEXP_VARIABLE_SAVE_ON_MISSION_PROGRESS|SEXP_VARIABLE_SAVE_ON_MISSION_CLOSE)
954 
955 #define BLOCK_EXP_SIZE					6
956 #define INNER_RAD							0
957 #define OUTER_RAD							1
958 #define DAMAGE								2
959 #define BLAST								3
960 #define PROPAGATE							4
961 #define SHOCK_SPEED						5
962 
963 #define BLOCK_HIT_SIZE					2
964 #define SHIELD_STRENGTH					0
965 #define HULL_STRENGTH					1
966 
967 
968 #define SEXP_VARIABLE_SET				(0x0100)
969 #define SEXP_VARIABLE_MODIFIED		(0x0200)
970 
971 #define SEXP_TYPE_MASK(t)	(t & 0x00ff)
972 #define SEXP_NODE_TYPE(n)	(Sexp_nodes[n].type & 0x00ff)
973 
974 // defines for subtypes of atoms
975 #define SEXP_ATOM_LIST			0
976 #define SEXP_ATOM_OPERATOR		1
977 #define SEXP_ATOM_NUMBER		2
978 #define SEXP_ATOM_STRING		3
979 #define SEXP_ATOM_CONTAINER		4
980 
981 // defines to short circuit evaluation when possible. Also used when goals can't
982 // be satisfied yet because ship (or wing) hasn't been created yet.
983 
984 #define SEXP_TRUE			1
985 #define SEXP_FALSE			0
986 
987 // Goober5000: changed these to unlikely values, because now we have sexps using negative numbers
988 #define SEXP_KNOWN_FALSE	(INT_MIN+10)
989 #define SEXP_KNOWN_TRUE		(INT_MIN+11)
990 #define SEXP_UNKNOWN		(INT_MIN+12)
991 #define SEXP_NAN			(INT_MIN+13)	// not a number -- used when ships/wing part of boolean and haven't arrived yet
992 #define SEXP_NAN_FOREVER	(INT_MIN+14)	// not a number and will never change -- used to falsify boolean sexpressions
993 #define SEXP_CANT_EVAL		(INT_MIN+15)	// can't evaluate yet for whatever reason (acts like false)
994 #define SEXP_NUM_EVAL		(INT_MIN+16)	// already completed an arithmetic operation and result is stored
995 // in case we want to test for any of the above
996 #define SEXP_UNLIKELY_RETURN_VALUE_BOUND		(INT_MIN+17)
997 
998 // defines for check_sexp_syntax
999 #define SEXP_CHECK_NONOP_ARGS			-1			// non-operator has arguments
1000 #define SEXP_CHECK_OP_EXPECTED		-2			// operator expected, but found data instead
1001 #define SEXP_CHECK_UNKNOWN_OP			-3			// unrecognized operator
1002 #define SEXP_CHECK_TYPE_MISMATCH		-4			// return type or data type mismatch
1003 #define SEXP_CHECK_BAD_ARG_COUNT		-5			// argument count in incorrect
1004 #define SEXP_CHECK_UNKNOWN_TYPE		-6			// unrecognized return type of data type
1005 
1006 #define SEXP_CHECK_INVALID_NUM					-101		// number is not valid
1007 #define SEXP_CHECK_INVALID_SHIP					-102		// invalid ship name
1008 #define SEXP_CHECK_INVALID_WING					-103		// invalid wing name
1009 #define SEXP_CHECK_INVALID_SUBSYS				-104		// invalid subsystem
1010 #define SEXP_CHECK_INVALID_IFF					-105		// invalid iff string
1011 #define SEXP_CHECK_INVALID_POINT					-106		// invalid point
1012 #define SEXP_CHECK_NEGATIVE_NUM					-107		// negative number wasn't allowed
1013 #define SEXP_CHECK_INVALID_SHIP_WING			-108	// invalid ship/wing
1014 #define SEXP_CHECK_INVALID_SHIP_TYPE			-109	// invalid ship type
1015 #define SEXP_CHECK_UNKNOWN_MESSAGE				-110	// invalid message
1016 #define SEXP_CHECK_INVALID_PRIORITY				-111	// invalid priority for a message
1017 #define SEXP_CHECK_INVALID_MISSION_NAME		-112	// invalid mission name
1018 #define SEXP_CHECK_INVALID_GOAL_NAME			-113	// invalid goal name
1019 #define SEXP_CHECK_INVALID_LEVEL					-114	// mission level too high in campaign
1020 #define SEXP_CHECK_INVALID_MSG_SOURCE			-115	// invalid 'who-from' for a message being sent
1021 #define SEXP_CHECK_INVALID_DOCKER_POINT		-116
1022 #define SEXP_CHECK_INVALID_DOCKEE_POINT		-117
1023 #define SEXP_CHECK_ORDER_NOT_ALLOWED			-118	// ship goal (order) isn't allowed for given ship
1024 #define SEXP_CHECK_DOCKING_NOT_ALLOWED			-119
1025 #define SEXP_CHECK_NUM_RANGE_INVALID			-120
1026 #define SEXP_CHECK_INVALID_EVENT_NAME			-121
1027 #define SEXP_CHECK_INVALID_SKILL_LEVEL			-122
1028 #define SEXP_CHECK_INVALID_MEDAL_NAME			-123
1029 #define SEXP_CHECK_INVALID_WEAPON_NAME			-124
1030 #define SEXP_CHECK_INVALID_SHIP_CLASS_NAME	-125
1031 #define SEXP_CHECK_INVALID_CUSTOM_HUD_GAUGE		-126
1032 #define SEXP_CHECK_INVALID_JUMP_NODE			-127
1033 #define SEXP_CHECK_INVALID_VARIABLE				-128
1034 #define SEXP_CHECK_INVALID_AI_CLASS				-129
1035 #define SEXP_CHECK_UNKNOWN_ERROR				-130
1036 #define SEXP_CHECK_INVALID_SUPPORT_SHIP_CLASS	-131
1037 #define SEXP_CHECK_INVALID_SHIP_WITH_BAY		-132
1038 #define SEXP_CHECK_INVALID_ARRIVAL_LOCATION		-133
1039 #define SEXP_CHECK_INVALID_DEPARTURE_LOCATION	-134
1040 #define SEXP_CHECK_INVALID_ARRIVAL_ANCHOR_ALL	-135
1041 #define SEXP_CHECK_INVALID_SOUNDTRACK_NAME		-136
1042 #define SEXP_CHECK_INVALID_INTEL_NAME			-137
1043 #define SEXP_CHECK_INVALID_SKYBOX_NAME			-138
1044 #define SEXP_CHECK_INVALID_PERSONA_NAME			-139
1045 #define SEXP_CHECK_INVALID_VARIABLE_TYPE		-140
1046 #define SEXP_CHECK_INVALID_SUBSYS_TYPE			-141
1047 #define SEXP_CHECK_INVALID_FONT					-142
1048 #define SEXP_CHECK_INVALID_HUD_ELEMENT			-143
1049 #define SEXP_CHECK_INVALID_SOUND_ENVIRONMENT	-144
1050 #define SEXP_CHECK_INVALID_SOUND_ENVIRONMENT_OPTION	-145
1051 #define SEXP_CHECK_INVALID_EXPLOSION_OPTION		-146
1052 #define SEXP_CHECK_INVALID_SHIP_EFFECT			-147
1053 #define SEXP_CHECK_INVALID_TURRET_TARGET_ORDER	-148
1054 #define SEXP_CHECK_INVALID_ARMOR_TYPE			-149
1055 #define SEXP_CHECK_INVALID_DAMAGE_TYPE			-150
1056 #define SEXP_CHECK_INVALID_TARGET_PRIORITIES	-151
1057 #define SEXP_CHECK_INVALID_AUDIO_VOLUME_OPTION	-152
1058 #define SEXP_CHECK_INVALID_BUILTIN_HUD_GAUGE	-153
1059 #define SEXP_CHECK_INVALID_ANIMATION_TYPE		-154
1060 #define SEXP_CHECK_INVALID_MISSION_MOOD			-155
1061 #define SEXP_CHECK_INVALID_SHIP_FLAG			-156
1062 #define SEXP_CHECK_INVALID_TEAM_COLOR			-157
1063 #define SEXP_CHECK_INVALID_SKYBOX_FLAG			-158
1064 #define SEXP_CHECK_INVALID_GAME_SND				-159
1065 #define SEXP_CHECK_INVALID_SSM_CLASS			-160
1066 #define SEXP_CHECK_INVALID_FIREBALL				-161
1067 #define SEXP_CHECK_INVALID_SPECIES				-162
1068 
1069 #define TRAINING_CONTEXT_SPEED		(1<<0)
1070 #define TRAINING_CONTEXT_FLY_PATH	(1<<1)
1071 
1072 // numbers used in special_training_check() function
1073 #define SPECIAL_CHECK_TRAINING_FAILURE	2000
1074 
1075 typedef struct sexp_ai_goal_link {
1076 	int ai_goal;
1077 	int op_code;
1078 } sexp_ai_goal_link;
1079 
1080 #define SEXP_CONDITIONAL_OPERATOR			(1<<0)
1081 #define SEXP_ARGUMENT_OPERATOR				(1<<1)
1082 #define SEXP_ACTION_OPERATOR				(1<<2)
1083 #define SEXP_ARITHMETIC_OPERATOR			(1<<3)
1084 #define SEXP_BOOLEAN_OPERATOR				(1<<4)
1085 #define SEXP_INTEGER_OPERATOR				(1<<5)
1086 #define SEXP_GOAL_OPERATOR					(1<<6)
1087 
1088 #define SEXP_TRIGGER_OPERATOR		( SEXP_ARITHMETIC_OPERATOR | SEXP_BOOLEAN_OPERATOR | SEXP_INTEGER_OPERATOR )
1089 
1090 typedef struct sexp_oper {
1091 	SCP_string text;
1092 	int	value;
1093 	int	min, max;
1094 	int type;
1095 } sexp_oper;
1096 
1097 // Goober5000
1098 struct sexp_cached_data
1099 {
1100 	int sexp_node_data_type = OPF_NONE;		// an OPF_ #define
1101 	int numeric_literal = 0;				// i.e. a number
1102 	int ship_registry_index = -1;			// because ship status is pretty common
1103 	void *pointer = nullptr;				// could be an IFF, a wing, a goal, or other unchanging reference
1104 
1105 	sexp_cached_data() = default;
1106 
sexp_cached_datasexp_cached_data1107 	sexp_cached_data(int _sexp_node_data_type)
1108 		: sexp_node_data_type(_sexp_node_data_type)
1109 	{}
1110 
sexp_cached_datasexp_cached_data1111 	sexp_cached_data(int _sexp_node_data_type, void *_pointer)
1112 		: sexp_node_data_type(_sexp_node_data_type), pointer(_pointer)
1113 	{}
1114 
sexp_cached_datasexp_cached_data1115 	sexp_cached_data(int _sexp_node_data_type, int _numeric_literal, int _ship_registry_index)
1116 		: sexp_node_data_type(_sexp_node_data_type), numeric_literal(_numeric_literal), ship_registry_index(_ship_registry_index)
1117 	{}
1118 };
1119 
1120 typedef struct sexp_node {
1121 	char	text[TOKEN_LENGTH];
1122 	int op_index;				// the index in the Operators array for the operator at this node (or -1 if not an operator)
1123 	int	type;						// atom, list, or not used
1124 	int	subtype;					// type of atom or list?
1125 	int	first;					// if first parameter is sexp, index into Sexp_nodes
1126 	int	rest;						// index into Sexp_nodes of rest of parameters
1127 	int	value;					// known to be true, known to be false, or not known
1128 	int flags;					// Goober5000
1129 
1130 	sexp_cached_data *cache;	// Goober5000
1131 	int cached_variable_index;	// Goober5000
1132 } sexp_node;
1133 
1134 // Goober5000
1135 #define SNF_ARGUMENT_VALID			(1<<0)
1136 #define SNF_ARGUMENT_SELECT			(1<<1)
1137 #define SNF_SPECIAL_ARG_IN_NODE		(1<<2)
1138 #define SNF_SPECIAL_ARG_IN_TREE		(1<<3)
1139 #define SNF_SPECIAL_ARG_NOT_IN_TREE	(1<<4)
1140 #define SNF_CHECKED_ARG_FOR_VAR		(1<<5)
1141 #define SNF_DEFAULT_VALUE			SNF_ARGUMENT_VALID
1142 
1143 typedef struct sexp_variable {
1144 	int		type;
1145 	char	text[TOKEN_LENGTH];
1146 	char	variable_name[TOKEN_LENGTH];
1147 } sexp_variable;
1148 
1149 // next define used to eventually mark a directive as satisfied even though there may be more
1150 // waves for a wing.  bascially a hack for the directives display.
1151 #define DIRECTIVE_WING_ZERO		-999
1152 
1153 // Goober5000 - it's dynamic now
1154 //extern sexp_node Sexp_nodes[MAX_SEXP_NODES];
1155 
1156 extern int Num_sexp_nodes;
1157 extern sexp_node *Sexp_nodes;
1158 
1159 extern sexp_variable Sexp_variables[MAX_SEXP_VARIABLES];
1160 extern sexp_variable Block_variables[MAX_SEXP_VARIABLES];
1161 
1162 extern SCP_vector<sexp_oper> Operators;
1163 
1164 extern int Locked_sexp_true, Locked_sexp_false;
1165 extern int Directive_count;
1166 extern int Sexp_useful_number;  // a variable to pass useful info in from external modules
1167 extern int Training_context;
1168 extern int Training_context_speed_min;
1169 extern int Training_context_speed_max;
1170 extern int Training_context_speed_set;
1171 extern int Training_context_speed_timestamp;
1172 extern waypoint_list *Training_context_path;
1173 extern int Training_context_goal_waypoint;
1174 extern int Training_context_at_waypoint;
1175 extern float Training_context_distance;
1176 extern int Players_target;
1177 extern int Players_mlocked;
1178 extern ship_subsys *Players_targeted_subsys;
1179 extern int Players_target_timestamp;
1180 extern int Players_mlocked_timestamp;
1181 extern int Sexp_clipboard;  // used by Fred
1182 
1183 extern SCP_vector<int> Current_sexp_operator;
1184 
1185 
1186 // event log stuff
1187 extern SCP_vector<SCP_string> *Current_event_log_buffer;
1188 extern SCP_vector<SCP_string> *Current_event_log_variable_buffer;
1189 extern SCP_vector<SCP_string> *Current_event_log_argument_buffer;
1190 
1191 extern void init_sexp();
1192 extern void sexp_shutdown();
1193 extern int alloc_sexp(const char *text, int type, int subtype, int first, int rest);
1194 extern int find_free_sexp();
1195 extern int free_one_sexp(int num);
1196 extern int free_sexp(int num);
1197 extern int free_sexp2(int num);
1198 extern int dup_sexp_chain(int node);
1199 extern int cmp_sexp_chains(int node1, int node2);
1200 extern int find_sexp_list(int num);
1201 extern int find_parent_operator(int num);
1202 extern int is_sexp_top_level( int node );
1203 
1204 // Goober5000 - renamed these to be more clear, to prevent bugs :p
1205 extern int get_operator_index(const char *token);
1206 extern int get_operator_index(int node);
1207 extern int get_operator_const(const char *token);
1208 extern int get_operator_const(int node);
1209 
1210 extern int check_sexp_syntax(int node, int return_type = OPR_BOOL, int recursive = 0, int *bad_node = 0 /*NULL*/, int mode = 0);
1211 extern int get_sexp_main(void);	//	Returns start node
1212 extern int run_sexp(const char* sexpression, bool run_eval_num = false, bool *is_nan_or_nan_forever = nullptr); // debug and lua sexps
1213 extern int stuff_sexp_variable_list();
1214 extern int eval_sexp(int cur_node, int referenced_node = -1);
1215 extern int eval_num(int n, bool &is_nan, bool &is_nan_forever);
1216 extern bool is_sexp_true(int cur_node, int referenced_node = -1);
1217 extern int query_operator_return_type(int op);
1218 extern int query_operator_argument_type(int op, int argnum);
1219 extern void update_sexp_references(const char *old_name, const char *new_name);
1220 extern void update_sexp_references(const char *old_name, const char *new_name, int format);
1221 extern int query_referenced_in_sexp(int mode, const char *name, int *node);
1222 extern int build_sexp_string(SCP_string &accumulator, int cur_node, int level, int mode);
1223 extern int sexp_query_type_match(int opf, int opr);
1224 extern const char *sexp_error_message(int num);
1225 extern int count_free_sexp_nodes();
1226 
1227 struct ship_registry_entry;
1228 struct wing;
1229 
1230 // Goober5000 - stuff with caching
1231 // (included in the header file because Lua uses the first three)
1232 extern const ship_registry_entry *eval_ship(int node);
1233 extern wing *eval_wing(int node);
1234 extern int sexp_get_variable_index(int node);
1235 extern int sexp_atoi(int node);
1236 extern bool sexp_can_construe_as_integer(int node);
1237 
1238 // Goober5000
1239 void do_action_for_each_special_argument(int cur_node);
1240 bool special_argument_appears_in_sexp_tree(int node);
1241 bool special_argument_appears_in_sexp_list(int node);
1242 
1243 // functions to change the attributes of an sexpression tree to persistent or not persistent
1244 extern void sexp_unmark_persistent( int n );
1245 extern void sexp_mark_persistent( int n );
1246 extern int verify_sexp_tree(int node);
1247 extern int query_sexp_ai_goal_valid(int sexp_ai_goal, int ship);
1248 int query_node_in_sexp(int node, int sexp);
1249 void flush_sexp_tree(int node);
1250 
1251 // sexp_variable
1252 void sexp_modify_variable(const char *text, int index, bool sexp_callback = true);
1253 int get_index_sexp_variable_name(const char *text);
1254 int get_index_sexp_variable_name(SCP_string &text);	// Goober5000
1255 int get_index_sexp_variable_name_special(const char *text);	// Goober5000
1256 int get_index_sexp_variable_name_special(SCP_string &text, size_t startpos);	// Goober5000
1257 bool sexp_replace_variable_names_with_values(char *text, int max_len);	// Goober5000
1258 bool sexp_replace_variable_names_with_values(SCP_string &text);	// Goober5000
1259 int get_nth_variable_index(int nth, int variable_type);	// Karajorma
1260 int sexp_variable_count();
1261 int sexp_campaign_file_variable_count();	// Goober5000
1262 int sexp_variable_typed_count(int sexp_variables_index, int variable_type); // Karajorma
1263 void sexp_variable_delete(int index);
1264 void sexp_variable_sort();
1265 void sexp_fred_modify_variable(const char *text, const char *var_name, int index, int type);
1266 int sexp_add_variable(const char *text, const char *var_name, int type, int index=-1);
1267 bool generate_special_explosion_block_variables();
1268 int num_block_variables();
1269 bool has_special_explosion_block_index(ship *shipp, int *index);
1270 
1271 // Karajorma
1272 void set_primary_ammo (int ship_index, int requested_bank, int requested_ammo, int rearm_limit=-1);
1273 void set_secondary_ammo (int ship_index, int requested_bank, int requested_ammo, int rearm_limit=-1);
1274 
1275 // DahBlount - Similar to Karajorma's functions, but for turrets
1276 void set_turret_primary_ammo(ship_subsys *turret, int requested_bank, int requested_ammo);
1277 void set_turret_secondary_ammo(ship_subsys *turret, int requested_bank, int requested_ammo);
1278 
1279 extern int get_category(int sexp_id);
1280 extern int category_of_subcategory(int subcategory_id);
1281 extern int get_subcategory(int sexp_id);
1282 
1283 // Goober5000
1284 extern void sexp_music_close();
1285 
1286 // Goober5000
1287 extern int Knossos_warp_ani_used;
1288 
1289 //WMC - moved here from FRED
1290 typedef struct sexp_help_struct {
1291 	int id;
1292 	SCP_string help;
1293 } sexp_help_struct;
1294 
1295 extern SCP_vector<sexp_help_struct> Sexp_help;
1296 
1297 typedef struct op_menu_struct {
1298 	SCP_string name;
1299 	int id;
1300 } op_menu_struct;
1301 
1302 extern SCP_vector<op_menu_struct> op_menu;
1303 extern SCP_vector<op_menu_struct> op_submenu;
1304 
1305 //WMC
1306 //Outputs sexp.html file
1307 bool output_sexps(const char *filepath);
1308 
1309 void multi_sexp_eval();
1310 
1311 // Goober5000/Taylor
1312 extern int Num_sound_environment_options;
1313 extern const char *Sound_environment_option[];
1314 
1315 // Goober5000
1316 extern int Num_explosion_options;
1317 extern const char *Explosion_option[];
1318 
1319 //The E
1320 extern int Num_adjust_audio_options;
1321 extern const char *Adjust_audio_options[];
1322 
1323 extern int Num_skybox_flags;
1324 extern const char *Skybox_flags[];
1325 
1326 /** Global state variables for the hud-display-gauge sexp.
1327 They all should be named Sexp_hud_display_*;
1328 They all should follow the following symantics for the value of the
1329 variable:
1330 =0	don't show
1331 =1	show until canceled
1332 >1	timestamp when gauge should stop showing (set zero when expired)
1333 \sa sexp_hud_display_warpout
1334 */
1335 extern int Sexp_hud_display_warpout;
1336 
1337 //Needed for scripting access to ship effects
1338 int get_effect_from_name(const char* name);
1339 
1340 void maybe_write_to_event_log(int result);
1341 
1342 #endif
1343