11#include " zEGenerator.h"
2+
3+ #include " xDraw.h"
4+ #include " xEntBoulder.h"
5+ #include " xMovePoint.h"
26#include " zCollGeom.h"
37#include " zGlobals.h"
4-
5- #include " xEvent.h"
8+ #include " zThrown.h"
69
710#include < types.h>
811
9- extern F32 lbl_803CD290; // 1.0f
10- extern F32 lbl_803CD294; // 0.0f
11- extern const char zEGeneratorStringBase[];
12-
1312void zEGenerator_Init (void * egen, void * asset)
1413{
1514 zEGenerator_Init ((zEGenerator*)egen, (xEntAsset*)asset);
1615}
1716
18- // I can't figure out the 2nd parameter for the find asset function call.
19- // FIXME: struct access offsets and callback definitions with suspect parameter typing
2017void zEGenerator_Init (zEGenerator* egen, xEntAsset* asset)
2118{
19+ U32 size;
2220 zEntInit ((zEnt*)egen, (xEntAsset*)asset, ' EGEN' );
23- // egen->zasset = asset;
21+ zEGenAsset* zasset = (zEGenAsset*)asset;
22+ egen->zasset = zasset;
2423 if (egen->linkCount != 0 )
2524 {
26- // egen->link = asset + 1 ;
25+ egen->link = (xLinkAsset*)((U8*) asset + sizeof (zEGenAsset)) ;
2726 }
2827 else
2928 {
3029 egen->link = NULL ;
3130 }
32- // egen->update = zEGenerator_Update;
33- // egen->move = zEGenerator_Move;
34- // egen->eventFunc = zEGenerator_EventCB ;
35- // egen->render = zEGenerator_Render;
31+ egen->update = (xEntUpdateCallback) zEGenerator_Update;
32+ egen->move = (xEntMoveCallback) zEGenerator_Move;
33+ egen->eventFunc = (xBaseEventCB)zEGeneratorEventCB ;
34+ egen->render = (xEntRenderCallback) zEGenerator_Render;
3635 egen->afile = NULL ;
37- // if (asset->onAnimID)
38- // {
39- // void* buf = xSTFindAsset(asset->onAnimID, FREFREFRF);
40- // if (buf != NULL)
41- // {
42- // egen->afile = xAnimFileNew(buf, &zEGeneratorStringBase[0], 0, NULL);
43- // egen->atbl = xAnimTableNew(&zEGeneratorStringBase[0], NULL, 0);
44- // xAnimTableNewState(egen->atbl, &zEGeneratorStringBase[1], 0x10, 0, lbl_803CD290, NULL,
45- // NULL, lbl_803CD294, NULL, NULL, xAnimDefaultBeforeEnter, NULL, NULL);
46- // xAnimTableAddFile(egen->atbl, egen->afile, &zEGeneratorStringBase[1]);
47- // xAnimPoolAlloc(globals.scenePreload->mempool, egen, egen->atbl, egen->model);
48- // }
49- // }
36+
37+ if (zasset->onAnimID )
38+ {
39+ void * buf = xSTFindAsset (zasset->onAnimID , &size);
40+ if (buf != NULL )
41+ {
42+ egen->afile = xAnimFileNew (buf, " " , 0 , NULL );
43+ egen->atbl = xAnimTableNew (" " , NULL , 0 );
44+ xAnimTableNewState (egen->atbl , " On" , 0x10 , 0 , 1 .0f , NULL , NULL , 0 .0f , NULL , NULL ,
45+ xAnimDefaultBeforeEnter, NULL , NULL );
46+ xAnimTableAddFile (egen->atbl , egen->afile , " On" );
47+ xAnimPoolAlloc (&globals.sceneCur ->mempool , egen, egen->atbl , egen->model );
48+ }
49+ }
5050}
5151
5252void zEGenerator_Setup (zEGenerator* egen, xScene* sc)
@@ -109,12 +109,53 @@ void zEGenerator_Move(zEGenerator* egen, xScene* sc, F32 dt)
109109{
110110}
111111
112+ void zEGenerator_Update (zEGenerator* egen, xScene* sc, F32 dt)
113+ {
114+ xEntUpdate (egen, sc, dt);
115+ xMat4x3Toworld (&egen->src_pos , (xMat4x3*)egen->model ->Mat , &egen->zasset ->src_dpos );
116+
117+ zEnt* ent = (zEnt*)egen->dst ;
118+
119+ if (ent != NULL && ent->baseFlags & 0x20 )
120+ {
121+ if (ent->baseType == eBaseTypeBoulder)
122+ {
123+ xVec3Copy (&egen->dst_pos , xEntGetCenter (ent));
124+ }
125+ else
126+ {
127+ xMat4x3Toworld (&egen->dst_pos , (xMat4x3*)ent->model ->Mat , &egen->dst_off );
128+ }
129+ }
130+
131+ if (egen->lfx [0 ] != NULL )
132+ {
133+ zLightningModifyEndpoints (egen->lfx [0 ], &egen->src_pos , &egen->dst_pos );
134+ }
135+
136+ if (egen->lfx [1 ] != NULL )
137+ {
138+ zLightningModifyEndpoints (egen->lfx [1 ], &egen->src_pos , &egen->dst_pos );
139+ }
140+
141+ if (egen->tmr > 0 .0f )
142+ {
143+ egen->tmr -= dt;
144+
145+ if (egen->tmr <= 0 .0f )
146+ {
147+ zEGenerator_TurnOff (egen);
148+ zEntEvent ((xBase*)egen, eEventOff);
149+ }
150+ }
151+ }
152+
112153void zEGenerator_Render (zEGenerator* egen)
113154{
114155 xEntRender ((xEnt*)egen);
115156}
116157
117- // WIP.
158+ // scheduling
118159void zEGenerator_TurnOn (zEGenerator* egen)
119160{
120161 egen->flags |= 1 ;
@@ -124,16 +165,57 @@ void zEGenerator_TurnOn(zEGenerator* egen)
124165 egen->model ->Anim ->Single ->CurrentSpeed = 1 .0f ;
125166 }
126167 egen->tmr = zasset->ontime ;
127- xMat4x3Toworld (&egen->src_pos , (const xMat4x3*)&egen->model ->Mat , &egen->zasset ->src_dpos );
168+ xMat4x3Toworld (&egen->src_pos , (xMat4x3*)egen->model ->Mat , &zasset->src_dpos );
169+
128170 if (egen->num_dsts )
129171 {
130- // TODO!!!
131- }
132- else
133- {
134- // FIXME: Find correct definition
135- // xDrawSphere(&egen->dst_pos, @856, 0xc006);
172+ U16 itgt = xrand () % egen->num_dsts ;
173+ U16 imp = 0 ;
174+
175+ for (S32 i = 0 ; i < egen->linkCount ; i++)
176+ {
177+ const xLinkAsset* link = &egen->link [i];
178+ xBase* b = zSceneFindObject (link->dstAssetID );
179+
180+ xVec3 destOffset;
181+ destOffset.x = link->param [0 ];
182+ destOffset.y = link->param [1 ];
183+ destOffset.z = link->param [2 ];
184+ xVec3Copy (&egen->dst_off , &destOffset);
185+
186+ if (!b || link->dstEvent != eEventArcto)
187+ continue ;
188+
189+ if (imp == itgt)
190+ {
191+ if (b->baseType == eBaseTypeMovePoint)
192+ {
193+ xVec3Copy (&egen->dst_pos , xMovePointGetPos ((xMovePoint*)b));
194+ xVec3AddTo (&egen->dst_pos , &egen->dst_off );
195+ egen->dst = b;
196+ break ;
197+ }
198+ if (b->baseType == eBaseTypeBoulder)
199+ {
200+ xVec3Copy (&egen->dst_pos , xEntGetCenter ((xEntBoulder*)b));
201+ egen->dst = b;
202+ break ;
203+ }
204+ if ((b->baseFlags & 0x20 ) != 0 )
205+ {
206+ xMat4x3Toworld (&egen->dst_pos , (xMat4x3*)((xEnt*)b)->model ->Mat , &egen->dst_off );
207+ egen->dst = b;
208+ break ;
209+ }
210+ }
211+ else
212+ {
213+ imp++;
214+ }
215+ }
136216 }
217+ xDrawSphere (&egen->dst_pos , 2 .0f , 0xC0006 );
218+
137219 for (S32 i = 0 ; i < 2 ; i++)
138220 {
139221 if (egen->lfx [i] != NULL )
@@ -142,15 +224,47 @@ void zEGenerator_TurnOn(zEGenerator* egen)
142224 egen->lfx [i] = NULL ;
143225 }
144226 }
145- // TODO!!!
227+
228+ _tagLightningAdd add;
229+ memset (&add, 0 , sizeof (_tagLightningAdd));
230+ add.type = 3 ;
231+ add.total_points = ((xrand () << 1 ) & 6 ) + 8 ;
232+ add.start = &egen->src_pos ;
233+ add.end = &egen->dst_pos ;
234+ add.color = xColorFromRGBA (200 , 200 , 255 , 200 );
235+ add.thickness = 0 .3f ;
236+ add.arc_height = -0 .2f ;
237+ add.zeus_normal_offset = 0 .2f ;
238+ add.zeus_back_offset = 0 .1f ;
239+ add.zeus_side_offset = 0 .1f ;
240+ add.rand_radius = 15 .0f ;
241+ add.flags = 0x1C30 ;
242+ egen->lfx [0 ] = zLightningAdd (&add);
243+
244+ add.total_points = 0x10 ;
245+ add.type = 3 ;
246+ add.move_degrees = 360 .0f * xurand () + 180 .0f ;
247+
248+ if (xrand () & 1 )
249+ {
250+ add.move_degrees = -add.move_degrees ;
251+ }
252+
253+ add.setup_degrees = 90 .0f * xurand () + 20 .0f ;
254+ add.color = xColorFromRGBA (80 , 100 , 255 , 200 );
255+ add.rot_radius = 0 .25f ;
256+ add.thickness = 0 .3f ;
257+ add.rand_radius = 10 .0f ;
258+ add.flags = 0xC18 ;
259+ egen->lfx [1 ] = zLightningAdd (&add);
146260}
147261
148262void zEGenerator_TurnOff (zEGenerator* egen)
149263{
150264 egen->flags &= 0xfffe ;
151265 if (egen->afile != NULL )
152266 {
153- egen->model ->Anim ->Single ->CurrentSpeed = lbl_803CD294 ;
267+ egen->model ->Anim ->Single ->CurrentSpeed = 0 . 0f ;
154268 }
155269 for (S32 i = 0 ; i < 2 ; i++)
156270 {
@@ -174,7 +288,6 @@ void zEGenerator_ToggleOn(zEGenerator* egen)
174288 }
175289}
176290
177- // Need to figure out how to call the link function. Everything else should be in order as long as the case labels are correct.
178291S32 zEGeneratorEventCB (xBase* to, xBase* from, U32 toEvent, const F32* toParam,
179292 xBase* toParamWidget)
180293{
@@ -191,37 +304,39 @@ S32 zEGeneratorEventCB(xBase* to, xBase* from, U32 toEvent, const F32* toParam,
191304 zEGenerator_ToggleOn (egen);
192305 break ;
193306 case eEventReset:
194- zEGenerator_Reset (egen, (xScene*)globals.scenePreload );
307+ zEGenerator_Reset (egen, (xScene*)globals.sceneCur );
195308 break ;
309+ case eEventVisible:
196310 case eEventFastVisible:
197- xEntShow ((xEnt*) egen);
311+ xEntShow (egen);
198312 break ;
313+ case eEventInvisible:
199314 case eEventFastInvisible:
200- xEntHide ((xEnt*) egen);
315+ xEntHide (egen);
201316 break ;
202317 case eEventCollision_Visible_On:
203- xEntShow ((xEnt*)egen);
318+ xEntShow (egen);
319+ case eEventCollisionOn:
204320 egen->chkby = XENT_COLLTYPE_PLYR | XENT_COLLTYPE_NPC;
205- egen->bupdate ((xEnt*) egen, (xVec3*)&egen->model ->Mat ->pos );
321+ egen->bupdate (egen, (xVec3*)&egen->model ->Mat ->pos );
206322 break ;
207323 case eEventCollision_Visible_Off:
208- xEntHide ((xEnt*)egen);
324+ xEntHide (egen);
325+ case eEventCollisionOff:
209326 egen->chkby = XENT_COLLTYPE_NONE;
210327 break ;
211328 case eEventCameraCollideOn:
212- zCollGeom_CamEnable ((xEnt*) egen);
329+ zCollGeom_CamEnable (egen);
213330 break ;
214331 case eEventCameraCollideOff:
215- zCollGeom_CamDisable ((xEnt*) egen);
332+ zCollGeom_CamDisable (egen);
216333 break ;
217334 case eEventLaunchShrapnel:
218- if (toParamWidget == NULL )
219- break ;
220- if (toParamWidget->link == NULL )
335+ zShrapnelAsset* shrap = (zShrapnelAsset*)toParamWidget;
336+ if (shrap == NULL || shrap->initCB == NULL )
221337 break ;
222338
223- // FIXME: xLinkAsset isn't a function call :(
224- // toParamWidget->link(toParamWidget, egen->model, 0, 0);
339+ shrap->initCB (shrap, egen->model , 0 , 0 );
225340 break ;
226341 }
227342 return eEventEnable;
0 commit comments