convert line ends
[canaan.git] / prj / cam / src / sound / vocore.cpp
blob43020fb16283507f3e07cacef627ac6a673a2689
1 /*
2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
4 */
6 // $Header: r:/t2repos/thief2/src/sound/vocore.cpp,v 1.3 2000/02/02 15:18:05 adurant Exp $
8 #include <vocore.h>
9 #include <appagg.h>
10 #include <aggmemb.h>
12 #include <property.h>
13 #include <propbase.h>
14 #include <propfac_.h>
16 #include <schprop.h>
17 #include <schbase.h>
18 #include <schema.h>
20 #include <questapi.h>
21 #include <iobjsys.h>
22 #include <str.h>
24 // Include these last
25 #include <dbmem.h>
26 #include <initguid.h>
27 #include <voguid.h>
29 ////////////////////////////////////////////////////////////
30 // Voice over implementation classes
32 //------------------------------------------------------------
33 // cVoiceOverSys agg member implementation
36 class cVoiceOverSys: public cCTDelegating<IVoiceOverSys>,
37 public cCTAggregateMemberControl<kCTU_Default>
39 protected:
40 static sRelativeConstraint gConstraints[];
42 public:
43 cVoiceOverSys(IUnknown* pOuter)
44 :mpInCombat(NULL),mPlaying(SCH_HANDLE_NULL)
46 MI_INIT_AGGREGATION_1(pOuter,IVoiceOverSys,kPriorityNormal,gConstraints);
49 ~cVoiceOverSys()
53 protected:
54 //----------------------------------------
55 // Member vars
58 tVOTestFunc mpInCombat;
59 int mPlaying;
61 IObjectSystem* mpObjSys;
62 IQuestData* mpQuest;
64 //----------------------------------------
65 // Init/Term
68 STDMETHOD(Init)()
70 mpObjSys = AppGetObj(IObjectSystem);
71 mpQuest = AppGetObj(IQuestData);
72 return S_OK;
75 STDMETHOD(Term)()
77 SafeRelease(mpObjSys);
78 SafeRelease(mpQuest);
79 return S_OK;
82 //----------------------------------------
83 // Schema callback
85 void OnSchema(int handle, ObjID schema)
87 if (handle == mPlaying)
88 mPlaying = SCH_HANDLE_NULL;
92 static void SchemaCB(int hSchema, ObjID schemaID, void* pdata)
94 cVoiceOverSys* us = (cVoiceOverSys*)pdata;
95 us->OnSchema(hSchema,schemaID);
98 inline cStr SchemaVarName(ObjID schemaID)
100 char buf[256];
101 const char* name = mpObjSys->GetName(schemaID);
102 if (name)
103 sprintf(buf,"SCHPLAY_%s",name);
104 else
105 sprintf(buf,"SCHPLAYID_%d",schemaID);
107 return buf;
110 //----------------------------------------
111 // IVoiceOverSys Methods
114 STDMETHOD_(int,Play)(int schema)
116 if (mPlaying != SCH_HANDLE_NULL)
117 return SCH_HANDLE_NULL;
119 sSchemaPlayParams* params = SchemaPlayParamsGet(schema);
121 //Don't crash if it doesn't exist.
122 if (!params) return SCH_HANDLE_NULL;
124 if ((params->flags & SCH_PLAY_ONCE) && AlreadyPlayed(schema))
125 return SCH_HANDLE_NULL;
127 if ((params->flags & SCH_NO_COMBAT) && mpInCombat && mpInCombat())
128 return SCH_HANDLE_NULL;
130 sSchemaCallParams call = g_sDefaultSchemaCallParams;
131 call.flags |= SCH_SET_CALLBACK;
132 call.callback = SchemaCB;
133 call.pData = this;
135 mPlaying = SchemaIDPlay(schema,&call);
137 if (mPlaying != SCH_HANDLE_NULL)
138 SetAlreadyPlayed(schema,TRUE);
140 return mPlaying;
143 STDMETHOD_(BOOL,AlreadyPlayed)(int schema)
145 return mpQuest->Get(SchemaVarName(schema));
148 STDMETHOD(SetAlreadyPlayed)(int schema, BOOL played)
150 cStr var = SchemaVarName(schema);
151 if (played)
153 if (mpQuest->Exists(var))
154 mpQuest->Set(var,TRUE);
155 else
156 mpQuest->Create(var,TRUE,kQuestDataMission);
158 else
159 mpQuest->Delete(var);
161 return S_OK;
164 STDMETHOD(SetCombatTest)(tVOTestFunc func)
166 mpInCombat = func;
167 return S_OK;
172 F_DECLARE_INTERFACE(IPropertyManager);
175 sRelativeConstraint cVoiceOverSys::gConstraints[] =
177 { kConstrainAfter, &IID_IPropertyManager },
178 { kNullConstraint },
181 void VoiceOverCreate()
183 AutoAppIPtr(Unknown);
184 cAutoIPtr<IVoiceOverSys> sys(new cVoiceOverSys(pUnknown));