convert line ends
[canaan.git] / prj / cam / src / shock / shkaicbr.cpp
blobf9c04d59f941a79fde983cbe7a095232c7badd6f
1 /*
2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
4 */
6 ///////////////////////////////////////
7 // $Header: r:/t2repos/thief2/src/shock/shkaicbr.cpp,v 1.2 1999/05/29 21:43:54 JON Exp $
8 //
9 // Shock ranged combat
12 #include <shkaicbr.h>
14 #include <shkaicrb.h>
16 #include <aiapi.h>
17 #include <aibascmp.h>
18 #include <aicbrclo.h>
19 #include <aicbrfle.h>
20 #include <aicbridl.h>
21 #include <aicbrsht.h>
22 #include <aicbrstl.h>
23 #include <aicbrstr.h>
24 #include <aicbrloc.h>
25 #include <aicbrwnd.h>
26 #include <aimultcb.h>
27 #include <aiprcore.h>
28 #include <aiprrngd.h>
29 #include <aiteams.h>
31 #include <autolink.h>
32 #include <doorphys.h>
33 #include <linkman.h>
34 #include <relation.h>
36 #include <physapi.h>
37 #include <phmodobb.h>
39 #include <objhp.h>
41 // Must be last header
42 #include <dbmem.h>
44 ///////////////////////////////////////
46 STDMETHODIMP_(void) cAIShockRangedSubcombat::Init()
48 cAISubcombat::Init();
50 SetNotifications(kAICN_BeginFrame |
51 kAICN_ActionProgress |
52 kAICN_Damage |
53 kAICN_GoalChange |
54 kAICN_ModeChange);
56 // cache prop
57 sAIRangedCombatProp *pRangedProp = AIGetRangedCombat(GetID());
59 // location
60 m_pCurrentLocation = new cAIRangedLocation(this, *m_pAIState->GetPortalLocation());
62 // create modes, if we were cool, these would be installed like components
63 // @TODO: dont add modes if applicability is too low
64 m_numberModes = 0;
65 m_pModes[m_numberModes++] = new cAIRangedIdle(this);
66 m_pModes[m_numberModes++] = new cAIRangedShoot(this);
67 m_pModes[m_numberModes++] = new cAIRangedClose(this);
68 m_pModes[m_numberModes++] = new cAIShockRangedBackup(this);
69 m_pModes[m_numberModes++] = new cAIRangedWound(this);
70 m_pModes[m_numberModes++] = new cAIRangedStepRight(this);
71 m_pModes[m_numberModes++] = new cAIRangedStepLeft(this);
72 m_pModes[m_numberModes++] = new cAIRangedFlee(this);
74 // properties
75 m_pRangedCombatProp = AIGetRangedCombat(GetID());
76 m_pRanges = AIGetRangedRanges(GetID());
78 // ranges
79 // @TODO: prop listener or something
80 m_rangesSq.m_ranges[0] = m_pRanges->m_ranges[0]*m_pRanges->m_ranges[0];
81 m_rangesSq.m_ranges[1] = m_pRanges->m_ranges[1]*m_pRanges->m_ranges[1];
82 m_rangesSq.m_ranges[2] = m_pRanges->m_ranges[2]*m_pRanges->m_ranges[2];
83 m_rangesSq.m_ranges[3] = m_pRanges->m_ranges[3]*m_pRanges->m_ranges[3];
85 Reset();
88 ///////////////////////////////////////////////////////
90 // Shock physcast callback for ranged combat ability
93 BOOL ShockRangedPhyscastCallback(ObjID objID, const cPhysModel* pModel, sAIRangedCombatPhyscastData* pData)
95 // ignore myself & my target
96 if ((objID == (pData)->sourceID) || (objID == (pData)->targetID))
97 return FALSE;
99 // ignore edge triggers
100 if ((pModel->GetType(0) == kPMT_OBB) && ((cPhysOBBModel *)pModel)->IsEdgeTrigger())
101 return FALSE;
103 // ignore destroyable objects
104 int hp;
105 if (ObjGetHitPoints(objID, &hp))
107 // except, don't ignore other AIs that are team-mates
108 AutoAppIPtr(AIManager);
109 IAI* pAI;
110 if ((pAI = pAIManager->GetAI(objID)) != NULL)
112 BOOL friendlyFire = (AITeamCompare(AIGetTeam(pData->sourceID), AIGetTeam(objID)) == kAI_Teammates);
113 pAI->Release();
114 return friendlyFire;
116 return FALSE;
118 return TRUE;