2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
6 // $Header: r:/t2repos/thief2/src/engfeat/quesloop.cpp,v 1.9 1998/10/27 12:20:38 mahk Exp $
42 // Must be last header
52 #define MY_GUID LOOPID_Quest
60 typedef struct _StateRecord
65 //////////////////////////////////////////////////
66 // Quest system tag file structures
68 TagFileTag QuestSystemTags
[2] = { { "QUEST_DB" }, {"QUEST_CMP" } };
69 TagVersion QuestSystemVersion
= { 0, 1 };
71 static ITagFile
* tagfile
= NULL
;
72 static long movefunc(void *buf
, size_t elsize
, size_t nelem
)
74 return ITagFile_Move(tagfile
,(char*)buf
,elsize
*nelem
);
77 static BOOL
setup_tagfile(ITagFile
* file
, TagFileTag
*tag
,
81 TagVersion found_version
= *version
;
84 result
= file
->OpenBlock(tag
, &found_version
);
85 if (!VersionNumsEqual(&found_version
,version
))
91 return result
== S_OK
;
95 static void cleanup_tagfile(ITagFile
* file
)
101 EXTERN
void QuestDataLoadTagFile(eQuestDataType type
, ITagFile
* file
)
103 if (setup_tagfile(file
, &QuestSystemTags
[type
],
104 &QuestSystemVersion
))
106 AutoAppIPtr(QuestData
);
107 pQuestData
->Load(movefunc
, type
);
108 cleanup_tagfile(file
);
112 EXTERN
void QuestDataSaveTagFile(eQuestDataType type
, ITagFile
* File
)
115 if (setup_tagfile(File
, &QuestSystemTags
[type
],
116 &QuestSystemVersion
))
118 AutoAppIPtr(QuestData
);
119 pQuestData
->Save(movefunc
, type
);
120 cleanup_tagfile(File
);
125 ////////////////////////////////////////////////////////////
126 // Database message handler
129 static void db_message(DispatchData
* msg
)
131 AutoAppIPtr(QuestData
);
132 msgDatabaseData data
;
133 data
.raw
= msg
->data
;
135 switch (DB_MSG(msg
->subtype
))
138 // Hey, the campaign isn't a part of this, OK?
139 pQuestData
->DeleteAllType(kQuestDataMission
);
140 pQuestData
->UnsubscribeAll();
143 case kDatabaseDefault
:
147 if (msg
->subtype
& kDBMission
)
148 QuestDataSaveTagFile(kQuestDataMission
,data
.save
);
153 if (msg
->subtype
& kDBMission
)
154 QuestDataLoadTagFile(kQuestDataMission
,data
.load
);
160 ////////////////////////////////////////
162 // LOOP/DISPATCH callback
163 // Here's where we do the dirty work.
166 void setup_campaign();
168 #pragma off(unreferenced)
169 static eLoopMessageResult LGAPI
_LoopFunc(void* data
, eLoopMessage msg
, tLoopMessageData hdata
)
171 // useful stuff for most clients
172 eLoopMessageResult result
= kLoopDispatchContinue
;
173 StateRecord
* state
= (StateRecord
*)data
;
191 db_message(info
.dispatch
);
201 ////////////////////////////////////////////////////////////
203 // Loop client factory function.
206 #pragma off(unreferenced)
207 static ILoopClient
* LGAPI
_CreateClient(sLoopClientDesc
* pDesc
, tLoopClientData data
)
210 // allocate space for our state, and fill out the fields
211 state
= (StateRecord
*)Malloc(sizeof(StateRecord
));
212 state
->context
= (Context
*)data
;
214 return CreateSimpleLoopClient(_LoopFunc
,state
,pDesc
);
216 #pragma on(unreferenced)
222 sLoopClientDesc QuestLoopClientDesc
=
227 kMsgDatabase
| kMsgsAppOuter
| kMsgEnd
, // interests
239 ////////////////////////////////////////////////////////////
243 static void campaign_cb(const sDispatchMsg
* dmsg
, const sDispatchListenerDesc
* desc
)
245 AutoAppIPtr(QuestData
);
246 sCampaignMsg
* msg
= (sCampaignMsg
*)dmsg
;
250 pQuestData
->DeleteAllType(kQuestDataCampaign
);
254 QuestDataSaveTagFile(kQuestDataCampaign
,msg
->file
);
258 QuestDataLoadTagFile(kQuestDataCampaign
,msg
->file
);
264 static sDispatchListenerDesc camp_desc
=
272 static void setup_campaign()
274 AutoAppIPtr(Campaign
);
275 pCampaign
->Listen(&camp_desc
);