convert line ends
[canaan.git] / prj / cam / src / ai / aiscrpt.cpp
blob31d778c5d290f7c61c550a03b4afa45471329b5c
1 /*
2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
4 */
6 ///////////////////////////////////////////////////////////////////////////////
7 // $Header: r:/t2repos/thief2/src/ai/aiscrpt.cpp,v 1.17 2000/02/19 12:45:34 toml Exp $
8 //
9 //
12 #include <lg.h>
13 #include <mprintf.h>
14 #include <appagg.h>
16 #include <link.h>
17 #include <relation.h>
19 #include <aiapiiai.h>
20 #include <scrptapi.h>
21 #include <scrptsrv.h>
22 #include <scrptmsg.h>
24 #include <aialert.h>
25 #include <aiapi.h>
26 #include <aiaware.h>
27 #include <aiprcore.h>
28 #include <aiscrabl.h>
29 #include <aisignal.h>
30 #include <aisound.h>
31 #include <speech.h>
33 #include <objscrt.h>
34 #include <aiscrpt.h>
36 #include <netmsg.h>
37 #include <memall.h>
38 #include <dbmem.h> // must be last header!
40 ///////////////////////////////////////////////////////////////////////////////
42 // Messages
45 IMPLEMENT_SCRMSG_PERSISTENT(sAISignalMsg)
47 PersistenceHeader(sScrMsg, kAISignalMsgVer);
48 PersistentEnum(signal);
50 return TRUE;
53 IMPLEMENT_SCRMSG_PERSISTENT(sAIPatrolPointMsg)
55 PersistenceHeader(sScrMsg, kAIPatrolPointMsgVer);
56 PersistentEnum(patrolObj);
58 return TRUE;
61 IMPLEMENT_SCRMSG_PERSISTENT(sAIModeChangeMsg)
63 PersistenceHeader(sScrMsg, kAIModeChangeMsgVer);
64 PersistentEnum(mode);
65 PersistentEnum(previous_mode);
67 return TRUE;
71 IMPLEMENT_SCRMSG_PERSISTENT(sAIAlertnessMsg)
73 PersistenceHeader(sScrMsg, kAIAlertnessMsgVer);
74 PersistentEnum(level);
75 PersistentEnum(oldLevel);
77 return TRUE;
81 IMPLEMENT_SCRMSG_PERSISTENT(sAIHighAlertMsg)
83 PersistenceHeader(sScrMsg, kAIHighAlertMsgVer);
84 PersistentEnum(level);
85 PersistentEnum(oldLevel);
87 return TRUE;
90 IMPLEMENT_SCRMSG_PERSISTENT(sAIResultMsg)
92 PersistenceHeader(sScrMsg, kAIResultMsgVer);
93 PersistentEnum(action);
94 PersistentEnum(result);
95 Persistent(data);
97 return TRUE;
100 IMPLEMENT_SCRMSG_PERSISTENT(sAIObjActResultMsg)
102 PersistenceHeader(sAIResultMsg, kAIObjActResultMsgVer);
103 Persistent(target);
105 return TRUE;
108 #if 0
109 IMPLEMENT_SCRMSG_PERSISTENT(sAIMnvrResultMsg)
111 PersistenceHeader(sAIResultMsg, kAIMnvrResultMsgVer);
112 Persistent(maneuver);
114 return TRUE;
116 #endif
118 ///////////////////////////////////////////////////////////////////////////////
120 // Distributed services
122 // These are the implementations for script service methods that may need
123 // to be sent to AIs on other machines.
125 // @TBD (justin 2/12/99): Many more of the services should be distributed
126 // like this. Essentially, anything that may get invoked by a script on an
127 // object *other* than the AI itself should be treated like this. For the
128 // time being, AI.Signal() is the high-priority, since it's usually called
129 // by other objects.
132 //////////
134 // AI.Signal()
136 static void doSignal(ObjID objIdAI, const char *signalName)
138 cAIBasicScript * pBasicScript = cAIBasicScript::AccessBasicScript(objIdAI);
140 if (pBasicScript)
142 IInternalAI * pAI = pBasicScript->AccessOuterAI();
143 sAISignal signal;
144 signal.name = signalName;
145 pAI->NotifySignal(&signal);
149 static cNetMsg *g_pAISignalMsg = NULL;
151 // Message contains an ObjID and a string, and will be sent to the object's
152 // owner. If that is this machine, it will loopback.
153 static sNetMsgDesc g_pAISignalDesc =
155 kNMF_SendToObjOwner,
156 "AISignal",
157 "AI.Signal Script Service",
158 NULL,
159 doSignal,
160 {{kNMPT_ReceiverObjID},
161 {kNMPT_String},
162 {kNMPT_End}}
165 ///////////////////////////////////////////////////////////////////////////////
167 // CLASS: cAIScrSrv
170 eAIPriority g_AIScriptPriorityToAIPriority[] =
172 kAIP_Low, // kLowPriorityAction
173 kAIP_Normal, // kNormalPriorityAction
174 kAIP_VeryHigh // kHighPriorityAction
177 eAISpeed g_AIScriptSpeedToAISpeed[] =
179 kAIS_Slow, // kSlow
180 kAIS_Normal, // kNormalSpeed
181 kAIS_Fast // kFast
184 #define ScrPriToAIPri(pri) g_AIScriptPriorityToAIPriority[pri]
185 // @TBD (toml 05-25-98): remove this test after the next skup
186 #define ScrSpdToAISpd(spd) \
187 (((spd) > kAIS_Fast) ? \
188 (((spd) == 100) ? kAIS_Fast : kAIS_Normal) : \
189 g_AIScriptSpeedToAISpeed[(spd)])
191 DECLARE_SCRIPT_SERVICE_IMPL(cAIScrSrv, AI)
193 public:
195 STDMETHOD_(void, Init)()
197 g_pAISignalMsg = new cNetMsg(&g_pAISignalDesc);
200 STDMETHOD_(void, End)()
202 if (g_pAISignalMsg)
204 delete g_pAISignalMsg;
205 g_pAISignalMsg = NULL;
209 STDMETHOD_(boolean, MakeGotoObjLoc)(ObjID objIdAI, const object &objIdTarget, eAIScriptSpeed speed, eAIActionPriority priority, const cMultiParm ref dataToSendOnReach)
211 cAIBasicScript * pBasicScript = cAIBasicScript::AccessBasicScript(objIdAI);
212 if (pBasicScript)
214 // @TBD (toml 05-25-98): casts bad
215 return pBasicScript->GotoObjLoc(ScriptObjID(objIdTarget),
216 ScrSpdToAISpd(speed),
217 ScrPriToAIPri(priority),
218 dataToSendOnReach);
220 return FALSE;
223 #if 0
224 STDMETHOD_(boolean, MakeDoManeuver)(ObjID objIdAI, const string ref Maneuver, eAIActionPriority priority, const cMultiParm ref dataToSendOnCompletion)
226 cAI * pAI;
227 g_pAIPool->GetObjAI(objIdAI, pAI);
228 if (pAI)
229 return pAI->GetScriptCtx()->DoManeuver(Maneuver, priority, dataToSendOnCompletion);
231 return FALSE;
233 #endif
235 STDMETHOD_(boolean, MakeFrobObj)(ObjID objIdAI, const object &objIdTarget, eAIActionPriority priority, const cMultiParm ref dataToSendOnReach)
237 cAIBasicScript * pBasicScript = cAIBasicScript::AccessBasicScript(objIdAI);
238 if (pBasicScript)
240 // @TBD (toml 05-25-98): casts bad
241 return pBasicScript->FrobObj(ScriptObjID(objIdTarget),
242 OBJ_NULL,
243 ScrPriToAIPri(priority),
244 dataToSendOnReach);
246 return FALSE;
249 STDMETHOD_(boolean, MakeFrobObj)(ObjID objIdAI, const object &objIdTarget, const object &objWith, eAIActionPriority priority, const cMultiParm ref dataToSendOnReach)
251 cAIBasicScript * pBasicScript = cAIBasicScript::AccessBasicScript(objIdAI);
252 if (pBasicScript)
254 // @TBD (toml 05-25-98): casts bad
255 return pBasicScript->FrobObj(ScriptObjID(objIdTarget),
256 ScriptObjID(objWith),
257 ScrPriToAIPri(priority),
258 dataToSendOnReach);
260 return FALSE;
263 STDMETHOD_(eAIScriptAlertLevel, GetAlertLevel)(ObjID objIdAI)
265 cAIBasicScript * pBasicScript = cAIBasicScript::AccessBasicScript(objIdAI);
266 if (pBasicScript)
268 return (eAIScriptAlertLevel)pBasicScript->AccessOuterAI()->GetState()->GetAlertness();
270 return kNoAlert;
273 STDMETHOD_(void, SetMinimumAlert)(ObjID objIdAI, eAIScriptAlertLevel level)
275 cAIBasicScript * pBasicScript = cAIBasicScript::AccessBasicScript(objIdAI);
276 if (pBasicScript)
278 sAIAlertCap defCap;
279 sAIAlertCap * pAlertCap;
280 if (!g_pAIAlertCapProperty->Get(objIdAI, &pAlertCap))
281 pAlertCap = &defCap;
283 if (pAlertCap->minLevel != (eAIAwareLevel)level)
285 pAlertCap->minLevel = (eAIAwareLevel)level;
286 g_pAIAlertCapProperty->Set(objIdAI, pAlertCap);
291 STDMETHOD_(void, ClearGoals)(ObjID objIdAI)
293 // I'm not exactly sure if this is meaningful in the new AI
296 // @HACK. The whole thing. Also, this only supports stopping
297 // speech, despite the existance of a matching flag to stop motions.
298 STDMETHOD_(void, SetScriptFlags)(ObjID objIdAI, int fFlags)
300 cAIBasicScript * pBasicScript
301 = cAIBasicScript::AccessBasicScript(objIdAI);
303 if (pBasicScript)
305 IInternalAI *pAI = pBasicScript->AccessOuterAI();
306 cAISoundEnactor *pEnactor
307 = (cAISoundEnactor *) pAI->AccessSoundEnactor();
309 if (!pEnactor)
310 return;
312 if (fFlags & kSpeechOff)
314 pEnactor->m_fSpeechStop = TRUE;
315 SpeechHalt(objIdAI);
317 else
318 pEnactor->m_fSpeechStop = FALSE;
322 STDMETHOD_(void, ClearAlertness)(ObjID objIdAI)
324 cAIBasicScript * pBasicScript = cAIBasicScript::AccessBasicScript(objIdAI);
325 if (pBasicScript)
327 sAIAlertness defaultAlertness;
328 sAIAlertness * pAlertness;
329 if (!g_pAIAlertnessProperty->Get(objIdAI, &pAlertness))
330 pAlertness = &defaultAlertness;
331 pAlertness->level = kAIAL_Lowest;
332 g_pAIAlertnessProperty->Set(objIdAI, pAlertness);
333 LinkDestroyMany(objIdAI, LINKOBJ_WILDCARD, g_pAIAwarenessLinks->GetID());
337 STDMETHOD_(void, Signal)(ObjID objIdAI, const string ref signalName)
339 // This will go to doSignal() on the AI's host machine:
340 g_pAISignalMsg->Send(OBJ_NULL, objIdAI, signalName);
343 STDMETHOD_(boolean, StartConversation)(ObjID conversationID)
345 AutoAppIPtr(AIManager);
346 return pAIManager->StartConversation(conversationID);
351 IMPLEMENT_SCRIPT_SERVICE_IMPL(cAIScrSrv, AI);
353 ///////////////////////////////////////////////////////////////////////////////