2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
6 ///////////////////////////////////////////////////////////////////////////////
7 // $Header: r:/t2repos/thief2/src/shock/shkaisho.cpp,v 1.2 2000/02/19 12:36:31 toml Exp $
35 #include <dbmem.h> // must be last header!
37 ///////////////////////////////////////////////////////////////////////////////
39 IFloatProperty
* g_pAIShodanExplodeRangeProperty
;
41 static sPropertyDesc g_AIShodanExplodeRangePropertyDesc
=
46 { AI_ABILITY_CAT
, "Shodan: Explode range" },
49 #define AIGetShodanExplodeRange(obj) AIGetProperty(g_pAIShodanExplodeRangeProperty, (obj), (float)5.0)
51 ///////////////////////////////////////
53 void ShockAIInitShodan()
55 g_pAIShodanExplodeRangeProperty
= CreateFloatProperty(&g_AIShodanExplodeRangePropertyDesc
, kPropertyImplVerySparse
);
58 ///////////////////////////////////////
60 void ShockAITermShodan()
62 SafeRelease(g_pAIShodanExplodeRangeProperty
);
65 ///////////////////////////////////////////////////////////////////////////////
67 // CLASS: cAIShodanCombat
70 cAIShodanCombat::cAIShodanCombat()
72 SetMode(kAIShodanClosing
);
75 ///////////////////////////////////////
77 void cAIShodanCombat::SetMode(eAIShodanCombatMode mode
)
82 ///////////////////////////////////////
84 STDMETHODIMP_(const char *) cAIShodanCombat::GetName()
86 return "Shodan combat";
89 ///////////////////////////////////////
91 void cAIShodanCombat::TestTarget(void)
93 ObjID target
= GetTarget();
96 float rangeSq
= AIGetShodanExplodeRange(GetID());
98 float targDistSq
= m_pAIState
->DistSq(*GetObjLocation(target
));
100 if (targDistSq
< rangeSq
)
102 SetMode(kAIShodanStartExplode
);
108 //////////////////////////////////////
110 STDMETHODIMP_(void) cAIShodanCombat::OnActionProgress(IAIAction
* pAction
)
112 cAICombat::OnActionProgress(pAction
);
114 if (IsOwn(pAction
) && pAction
->GetResult() >= kAIR_Success
)
116 SetMode(kAIShodanClosing
);
120 else if (IsOwn(pAction
) && (m_mode
== kAIShodanClosing
) && pAction
->GetResult() >= kAIR_NoResult
)
124 ///////////////////////////////////////
126 STDMETHODIMP
cAIShodanCombat::SuggestActions(cAIGoal
* pGoal
, const cAIActions
& previous
, cAIActions
* pNew
)
128 ObjID target
= GetTarget();
130 if (target
== OBJ_NULL
)
133 if (m_mode
== kAIShodanStartExplode
)
136 sAIProjectileRel
* pProjData
;
138 if (GetProjectile(&projID
, &pProjData
))
140 cAIExplodeAction
* pAction
= new cAIExplodeAction(this);
141 pAction
->Set(projID
);
142 SetMode(kAIShodanExploding
);
143 pNew
->Append(pAction
);
147 Warning(("No projectile link for shodan creature %d\n", m_pAIState
->GetID()));
148 SetMode(kAIShodanClosing
);
151 if (m_mode
== kAIShodanClosing
)
153 m_pAI
->AccessSoundEnactor()->RequestConcept(kAISC_CombatAttack
);
154 cAIChargeAction
* pAction
= new cAIChargeAction(this, 0);
155 pAction
->Set(target
, kAIT_1Sec
);
156 pNew
->Append(pAction
);
161 ///////////////////////////////////////////////////////////////////////////////
163 BOOL
cAIShodanCombat::GetProjectile(ObjID
* pProjectileID
, sAIProjectileRel
** ppProjData
)
165 AutoAppIPtr(TraitManager
);
166 cAutoLinkQuery
query(g_pAIProjectileRelation
, pTraitManager
->GetArchetype(m_pAIState
->GetID()), LINKOBJ_WILDCARD
);
169 *pProjectileID
= query
.GetDest();
170 *ppProjData
= (sAIProjectileRel
*)(query
->Data());