-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathphscrpt.h
297 lines (233 loc) · 9.08 KB
/
phscrpt.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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
/*
@Copyright Looking Glass Studios, Inc.
1996,1997,1998,1999,2000 Unpublished Work.
*/
////////////////////////////////////////////////////////////////////////////////
// $Header: r:/t2repos/thief2/src/physics/phscrpt.h,v 1.18 1999/12/10 14:45:33 PATMAC Exp $
//
#ifndef __PHSCRPT_H
#define __PHSCRPT_H
#pragma once
#include <scrptsrv.h>
#include <scrptmsg.h>
#include <objscrt.h>
#include <matrix.h>
#include <phscrt.h>
////////////////////////////////////////
//
// Services
//
DECLARE_SCRIPT_SERVICE(Physics, 0x141)
{
// Subsribe an object to message types
STDMETHOD(SubscribeMsg)(object phys_obj, int message_types) PURE;
// Unsubscribe an object to message types
STDMETHOD(UnsubscribeMsg)(object phys_obj, int message_types) PURE;
// @HACK: should this be here?
// Launch Projectile
STDMETHOD_(object,LaunchProjectile)(object launcher, object proj, real power, integer flags, const vector& add_vel) PURE;
// Velocity
STDMETHOD(SetVelocity)(object obj, const vector& vel) PURE;
STDMETHOD(GetVelocity)(object obj, vector& vel) PURE;
STDMETHOD(ControlVelocity)(object obj, const vector& vel) PURE;
STDMETHOD(StopControlVelocity)(object obj) PURE;
// Gravity
STDMETHOD(SetGravity)(object obj, float gravity) PURE;
STDMETHOD_(float, GetGravity)(object obj) PURE;
// Utility
STDMETHOD_(BOOL, HasPhysics)(object obj) PURE;
// Has sphere, point or sphere hat model instantiated
STDMETHOD_(BOOL, IsSphere)(object obj) PURE;
// Has OBB model instantiated
STDMETHOD_(BOOL, IsOBB)(object obj) PURE;
// Control
// Control location/rotation/position/velocity to current value
STDMETHOD(ControlCurrentLocation)(object obj) PURE;
STDMETHOD(ControlCurrentRotation)(object obj) PURE;
STDMETHOD(ControlCurrentPosition)(object obj) PURE;
// Model control
STDMETHOD(DeregisterModel)(object obj) PURE;
// Player
STDMETHOD_(void, PlayerMotionSetOffset)(int subModel, vector& offset) PURE;
STDMETHOD(Activate)(const object obj) PURE;
STDMETHOD_(BOOL, ValidPos)(const object obj) PURE;
};
////////////////////////////////////////
//
// Messages
//
struct sPhysMsgBase
{
int Submod;
// CollisionMsg
ePhysCollisionType collType;
ObjID collObj; // either object or terrain archetype
int collSubmod;
mxs_real collMomentum; // p = mv + mv
mxs_vector collNormal; // from object or terrain hit
mxs_vector collPt; // only estimate for object collisions // ContactMsg
ePhysContactType contactType;
ObjID contactObj; // either object or terrain archetype
int contactSubmod;
// Enter/exit
ObjID transObj;
int transSubmod;
sPhysMsgBase() {}
// Collision
sPhysMsgBase(int submod, ePhysCollisionType type, ObjID coll_object,
int coll_submod, const mxs_vector &normal, mxs_real momentum, const mxs_vector &pt)
{
Submod = submod;
collType = type;
collObj = coll_object;
collSubmod = coll_submod;
collNormal = normal;
collMomentum = momentum;
collPt = pt;
contactType = kContactNone;
contactObj = OBJ_NULL;
contactSubmod = -1;
transObj = OBJ_NULL;
transSubmod = -1;
}
// Contact
sPhysMsgBase(int submod, ePhysContact cd, ePhysContactType type, ObjID contact_object, int contact_submod)
{
Submod = submod;
contactType = type;
contactObj = contact_object;
contactSubmod = contact_submod;
collType = kCollNone;
collObj = OBJ_NULL;
collSubmod = -1;
mx_zero_vec(&collNormal);
mx_zero_vec(&collPt);
collMomentum = 0;
transObj = OBJ_NULL;
transSubmod = -1;
}
// Enter/exit
sPhysMsgBase(ePhysEnterExit type, ObjID trans_object, int trans_submod)
{
Submod = -1;
transObj = trans_object;
transSubmod = trans_submod;
collType = kCollNone;
collObj = OBJ_NULL;
collSubmod = -1;
mx_zero_vec(&collNormal);
mx_zero_vec(&collPt);
collMomentum = 0;
contactType = kContactNone;
contactObj = OBJ_NULL;
contactSubmod = -1;
}
};
#define kPhysMsgVer 3
struct sPhysMsg : public sScrMsg, public sPhysMsgBase
{
sPhysMsg() {}
// Creation
sPhysMsg(ObjID objID, ePhysScriptMsgType type)
{
to = objID;
free((void *)message);
switch (type)
{
case kFellAsleepMsg:
message = strdup("PhysFellAsleep");
break;
case kWokeUpMsg:
message = strdup("PhysWokeUp");
break;
case kMadePhysMsg:
message = strdup("PhysMadePhysical");
break;
case kMadeNonPhysMsg:
message = strdup("PhysMadeNonPhysical");
break;
default:
Warning(("Invalid physics message type\n"));
message = strdup("Invalid");
break;
}
}
// Collision
sPhysMsg(ObjID objID, int submod, ePhysCollisionType type, ObjID coll_object,
int coll_submod, const mxs_vector &normal, mxs_real momentum, const mxs_vector &pt):
sPhysMsgBase(submod, type, coll_object, coll_submod, normal, momentum, pt)
{
to = objID;
free((void *)message);
message = strdup("PhysCollision");
}
// Contact
sPhysMsg(ObjID objID, int submod, ePhysContact cd, ePhysContactType type, ObjID contact_object, int contact_submod):
sPhysMsgBase(submod, cd, type, contact_object, contact_submod)
{
static const char *contact_names[] = { "PhysContactCreate", "PhysContactDestroy" };
to = objID;
free((void *)message);
message = strdup(contact_names[cd]);
}
// Enter/exit
sPhysMsg(ObjID objID, ePhysEnterExit type, ObjID trans_object, int trans_submod):
sPhysMsgBase(type, trans_object, trans_submod)
{
static const char *enter_exit_names[] = { "PhysEnter", "PhysExit" };
to = objID;
free((void *)message);
message = strdup(enter_exit_names[type]);
}
DECLARE_SCRMSG_PERSISTENT();
};
#ifdef SCRIPT
#define OnPhysFellAsleep() SCRIPT_MESSAGE_HANDLER_SIGNATURE_(PhysFellAsleep, sPhysMsg)
#define DefaultOnPhysFellAsleep() SCRIPT_CALL_BASE(PhysFellAsleep)
#define OnPhysWokeUp() SCRIPT_MESSAGE_HANDLER_SIGNATURE_(PhysWokeUp, sPhysMsg)
#define DefaultOnPhysWokeUp() SCRIPT_CALL_BASE(PhysWokeUp)
#define OnPhysMadePhysical() SCRIPT_MESSAGE_HANDLER_SIGNATURE_(PhysMadePhysical, sPhysMsg)
#define DefaultOnPhysMadePhysical() SCRIPT_CALL_BASE(PhysMadePhysical)
#define OnPhysMadeNonPhysical() SCRIPT_MESSAGE_HANDLER_SIGNATURE_(PhysMadeNonPhysical, sPhysMsg)
#define DefaultOnPhysMadeNonPhysical() SCRIPT_CALL_BASE(PhysMadeNonPhysical)
#define OnPhysCollision() SCRIPT_MESSAGE_HANDLER_SIGNATURE_(PhysCollision, sPhysMsg)
#define DefaultOnPhysCollision() SCRIPT_CALL_BASE(PhysCollision)
#define OnPhysContactCreate() SCRIPT_MESSAGE_HANDLER_SIGNATURE_(PhysContactCreate, sPhysMsg)
#define DefaultOnPhysContactCreate() SCRIPT_CALL_BASE(PhysContactCreate)
#define OnPhysContactDestroy() SCRIPT_MESSAGE_HANDLER_SIGNATURE_(PhysContactDestroy, sPhysMsg)
#define DefaultOnPhysContactDestroy() SCRIPT_CALL_BASE(PhysContactDestroy)
#define OnPhysEnter() SCRIPT_MESSAGE_HANDLER_SIGNATURE_(PhysEnter, sPhysMsg)
#define DefaultOnPhysEnter() SCRIPT_CALL_BASE(PhysEnter)
#define OnPhysExit() SCRIPT_MESSAGE_HANDLER_SIGNATURE_(PhysExit, sPhysMsg)
#define DefaultOnPhysExit() SCRIPT_CALL_BASE(PhysExit)
#endif
////////////////////////////////////////
//
// Default physics script
//
#ifdef SCRIPT
BEGIN_SCRIPT(Physics, RootScript)
MESSAGE_DEFS:
SCRIPT_DEFINE_MESSAGE_DEFAULT_(PhysFellAsleep, sPhysMsg)
SCRIPT_DEFINE_MESSAGE_DEFAULT_(PhysWokeUp, sPhysMsg)
SCRIPT_DEFINE_MESSAGE_DEFAULT_(PhysMadePhysical, sPhysMsg)
SCRIPT_DEFINE_MESSAGE_DEFAULT_(PhysMadeNonPhysical,sPhysMsg)
SCRIPT_DEFINE_MESSAGE_DEFAULT_(PhysCollision, sPhysMsg)
SCRIPT_DEFINE_MESSAGE_DEFAULT_(PhysContactCreate, sPhysMsg)
SCRIPT_DEFINE_MESSAGE_DEFAULT_(PhysContactDestroy, sPhysMsg)
SCRIPT_DEFINE_MESSAGE_DEFAULT_(PhysEnter, sPhysMsg)
SCRIPT_DEFINE_MESSAGE_DEFAULT_(PhysExit, sPhysMsg)
SCRIPT_BEGIN_MESSAGE_MAP()
SCRIPT_MSG_MAP_ENTRY(PhysFellAsleep)
SCRIPT_MSG_MAP_ENTRY(PhysWokeUp)
SCRIPT_MSG_MAP_ENTRY(PhysMadePhysical)
SCRIPT_MSG_MAP_ENTRY(PhysMadeNonPhysical)
SCRIPT_MSG_MAP_ENTRY(PhysCollision)
SCRIPT_MSG_MAP_ENTRY(PhysContactCreate)
SCRIPT_MSG_MAP_ENTRY(PhysContactDestroy)
SCRIPT_MSG_MAP_ENTRY(PhysEnter)
SCRIPT_MSG_MAP_ENTRY(PhysExit)
SCRIPT_END_MESSAGE_MAP()
END_SCRIPT(Physics)
#endif
#endif // __PHSCRPT_H