2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
6 ///////////////////////////////////////////////////////////////////////////////
7 // $Header: r:/t2repos/thief2/src/ai/aiscrpt.cpp,v 1.17 2000/02/19 12:45:34 toml Exp $
38 #include <dbmem.h> // must be last header!
40 ///////////////////////////////////////////////////////////////////////////////
45 IMPLEMENT_SCRMSG_PERSISTENT(sAISignalMsg
)
47 PersistenceHeader(sScrMsg
, kAISignalMsgVer
);
48 PersistentEnum(signal
);
53 IMPLEMENT_SCRMSG_PERSISTENT(sAIPatrolPointMsg
)
55 PersistenceHeader(sScrMsg
, kAIPatrolPointMsgVer
);
56 PersistentEnum(patrolObj
);
61 IMPLEMENT_SCRMSG_PERSISTENT(sAIModeChangeMsg
)
63 PersistenceHeader(sScrMsg
, kAIModeChangeMsgVer
);
65 PersistentEnum(previous_mode
);
71 IMPLEMENT_SCRMSG_PERSISTENT(sAIAlertnessMsg
)
73 PersistenceHeader(sScrMsg
, kAIAlertnessMsgVer
);
74 PersistentEnum(level
);
75 PersistentEnum(oldLevel
);
81 IMPLEMENT_SCRMSG_PERSISTENT(sAIHighAlertMsg
)
83 PersistenceHeader(sScrMsg
, kAIHighAlertMsgVer
);
84 PersistentEnum(level
);
85 PersistentEnum(oldLevel
);
90 IMPLEMENT_SCRMSG_PERSISTENT(sAIResultMsg
)
92 PersistenceHeader(sScrMsg
, kAIResultMsgVer
);
93 PersistentEnum(action
);
94 PersistentEnum(result
);
100 IMPLEMENT_SCRMSG_PERSISTENT(sAIObjActResultMsg
)
102 PersistenceHeader(sAIResultMsg
, kAIObjActResultMsgVer
);
109 IMPLEMENT_SCRMSG_PERSISTENT(sAIMnvrResultMsg
)
111 PersistenceHeader(sAIResultMsg
, kAIMnvrResultMsgVer
);
112 Persistent(maneuver
);
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
136 static void doSignal(ObjID objIdAI
, const char *signalName
)
138 cAIBasicScript
* pBasicScript
= cAIBasicScript::AccessBasicScript(objIdAI
);
142 IInternalAI
* pAI
= pBasicScript
->AccessOuterAI();
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
=
157 "AI.Signal Script Service",
160 {{kNMPT_ReceiverObjID
},
165 ///////////////////////////////////////////////////////////////////////////////
170 eAIPriority g_AIScriptPriorityToAIPriority
[] =
172 kAIP_Low
, // kLowPriorityAction
173 kAIP_Normal
, // kNormalPriorityAction
174 kAIP_VeryHigh
// kHighPriorityAction
177 eAISpeed g_AIScriptSpeedToAISpeed
[] =
180 kAIS_Normal
, // kNormalSpeed
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
)
195 STDMETHOD_(void, Init
)()
197 g_pAISignalMsg
= new cNetMsg(&g_pAISignalDesc
);
200 STDMETHOD_(void, End
)()
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
);
214 // @TBD (toml 05-25-98): casts bad
215 return pBasicScript
->GotoObjLoc(ScriptObjID(objIdTarget
),
216 ScrSpdToAISpd(speed
),
217 ScrPriToAIPri(priority
),
224 STDMETHOD_(boolean
, MakeDoManeuver
)(ObjID objIdAI
, const string ref Maneuver
, eAIActionPriority priority
, const cMultiParm ref dataToSendOnCompletion
)
227 g_pAIPool
->GetObjAI(objIdAI
, pAI
);
229 return pAI
->GetScriptCtx()->DoManeuver(Maneuver
, priority
, dataToSendOnCompletion
);
235 STDMETHOD_(boolean
, MakeFrobObj
)(ObjID objIdAI
, const object
&objIdTarget
, eAIActionPriority priority
, const cMultiParm ref dataToSendOnReach
)
237 cAIBasicScript
* pBasicScript
= cAIBasicScript::AccessBasicScript(objIdAI
);
240 // @TBD (toml 05-25-98): casts bad
241 return pBasicScript
->FrobObj(ScriptObjID(objIdTarget
),
243 ScrPriToAIPri(priority
),
249 STDMETHOD_(boolean
, MakeFrobObj
)(ObjID objIdAI
, const object
&objIdTarget
, const object
&objWith
, eAIActionPriority priority
, const cMultiParm ref dataToSendOnReach
)
251 cAIBasicScript
* pBasicScript
= cAIBasicScript::AccessBasicScript(objIdAI
);
254 // @TBD (toml 05-25-98): casts bad
255 return pBasicScript
->FrobObj(ScriptObjID(objIdTarget
),
256 ScriptObjID(objWith
),
257 ScrPriToAIPri(priority
),
263 STDMETHOD_(eAIScriptAlertLevel
, GetAlertLevel
)(ObjID objIdAI
)
265 cAIBasicScript
* pBasicScript
= cAIBasicScript::AccessBasicScript(objIdAI
);
268 return (eAIScriptAlertLevel
)pBasicScript
->AccessOuterAI()->GetState()->GetAlertness();
273 STDMETHOD_(void, SetMinimumAlert
)(ObjID objIdAI
, eAIScriptAlertLevel level
)
275 cAIBasicScript
* pBasicScript
= cAIBasicScript::AccessBasicScript(objIdAI
);
279 sAIAlertCap
* pAlertCap
;
280 if (!g_pAIAlertCapProperty
->Get(objIdAI
, &pAlertCap
))
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
);
305 IInternalAI
*pAI
= pBasicScript
->AccessOuterAI();
306 cAISoundEnactor
*pEnactor
307 = (cAISoundEnactor
*) pAI
->AccessSoundEnactor();
312 if (fFlags
& kSpeechOff
)
314 pEnactor
->m_fSpeechStop
= TRUE
;
318 pEnactor
->m_fSpeechStop
= FALSE
;
322 STDMETHOD_(void, ClearAlertness
)(ObjID objIdAI
)
324 cAIBasicScript
* pBasicScript
= cAIBasicScript::AccessBasicScript(objIdAI
);
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 ///////////////////////////////////////////////////////////////////////////////