summaryrefslogtreecommitdiff
path: root/include/SSystem/SComponent/c_cc_d.h
blob: 0ed9dc1361f0247030cd1817c73597e515c3aa90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
#ifndef C_CC_D_H
#define C_CC_D_H

#include "SSystem/SComponent/c_m3d_g_aab.h"
#include "SSystem/SComponent/c_m3d_g_cps.h"
#include "SSystem/SComponent/c_m3d_g_cyl.h"
#include "SSystem/SComponent/c_m3d_g_sph.h"
#include "SSystem/SComponent/c_m3d_g_tri.h"
#include "f_pc/f_pc_base.h"

class fopAc_ac_c;
class cCcD_PntAttr;
class cCcD_CpsAttr;
class cCcD_TriAttr;
class cCcD_AabAttr;
class cCcD_CylAttr;
class cCcD_SphAttr;

enum cCcD_AtSPrm_e {
    /* 0x01 */ cCcD_AtSPrm_Set_e = 0x01,
    /* 0x02 */ cCcD_AtSPrm_VsEnemy_e = 0x02,
    /* 0x04 */ cCcD_AtSPrm_VsPlayer_e = 0x04,
    /* 0x08 */ cCcD_AtSPrm_VsOther_e = 0x08,
    /* 0x0E */ cCcD_AtSPrm_GrpAll_e = cCcD_AtSPrm_VsEnemy_e | cCcD_AtSPrm_VsPlayer_e | cCcD_AtSPrm_VsOther_e,
    /* 0x10 */ cCcD_AtSPrm_NoTgHitInfSet_e = 0x10,
};

enum cCcD_AtRPrm_e {
    cCcD_AtRPrm_Hit_e = 1 << 0,
};

enum cCcD_TgSPrm_e {
    /* 0x01 */ cCcD_TgSPrm_Set_e = 0x01,
    /* 0x02 */ cCcD_TgSPrm_IsEnemy_e = 0x02,
    /* 0x04 */ cCcD_TgSPrm_IsPlayer_e = 0x04,
    /* 0x08 */ cCcD_TgSPrm_IsOther_e = 0x08,
    /* 0x0E */ cCcD_TgSPrm_GrpAll_e = cCcD_TgSPrm_IsEnemy_e | cCcD_TgSPrm_IsPlayer_e | cCcD_TgSPrm_IsOther_e,
    /* 0x10 */ cCcD_TgSPrm_NoAtHitInfSet_e = 0x10,
};

enum cCcD_TgRPrm_e {
    cCcD_TgRPrm_Hit_e = 1 << 0,
};

enum cCcD_CoSPrm_e {
    /* 0x0001 */ cCcD_CoSPrm_Set_e = 0x01,
    /* 0x0002 */ cCcD_CoSPrm_IsEnemy_e = 0x02,
    /* 0x0004 */ cCcD_CoSPrm_IsPlayer_e = 0x04,
    /* 0x0008 */ cCcD_CoSPrm_IsOther_e = 0x08,
    /* 0x0010 */ cCcD_CoSPrm_VsEnemy_e = 0x10,
    /* 0x0020 */ cCcD_CoSPrm_VsPlayer_e = 0x20,
    /* 0x0040 */ cCcD_CoSPrm_VsOther_e = 0x40,
    /* 0x000E */ cCcD_CoSPrm_IGrpAll_e = cCcD_CoSPrm_IsEnemy_e | cCcD_CoSPrm_IsPlayer_e | cCcD_CoSPrm_IsOther_e,
    /* 0x0070 */ cCcD_CoSPrm_VsGrpAll_e = cCcD_CoSPrm_VsEnemy_e | cCcD_CoSPrm_VsPlayer_e | cCcD_CoSPrm_VsOther_e,
    /* 0x0080 */ cCcD_CoSPrm_Sph3DCrr_e = 0x80,
    /* 0x0100 */ cCcD_CoSPrm_NoCrr_e = 0x100,
    /* 0x0200 */ cCcD_CoSPrm_NoCoHitInfSet_e = 0x200,
};

enum cCcD_CoRPrm_e {
    cCcD_CoRPrm_Hit_e = 1 << 0,
};

class cCcD_ShapeAttr {
public:
    /* 0x00 */ cM3dGAab mAab;
    /* 0x1C vtable */

    cCcD_ShapeAttr() {}
    virtual ~cCcD_ShapeAttr() {}
    virtual bool CrossAtTg(cCcD_ShapeAttr const&, cXyz*) const {
        return false;
    }
    virtual bool CrossAtTg(cCcD_PntAttr const&, cXyz*) const = 0;
    virtual bool CrossAtTg(cCcD_CpsAttr const&, cXyz*) const = 0;
    virtual bool CrossAtTg(cCcD_TriAttr const&, cXyz*) const = 0;
    virtual bool CrossAtTg(cCcD_AabAttr const&, cXyz*) const = 0;
    virtual bool CrossAtTg(cCcD_CylAttr const&, cXyz*) const = 0;
    virtual bool CrossAtTg(cCcD_SphAttr const&, cXyz*) const = 0;
    virtual bool CrossCo(cCcD_ShapeAttr const&, f32*) const { return false; }
    virtual bool CrossCo(cCcD_PntAttr const&, f32*) const = 0;
    virtual bool CrossCo(cCcD_CpsAttr const&, f32*) const = 0;
    virtual bool CrossCo(cCcD_TriAttr const&, f32*) const = 0;
    virtual bool CrossCo(cCcD_AabAttr const&, f32*) const = 0;
    virtual bool CrossCo(cCcD_CylAttr const&, f32*) const = 0;
    virtual bool CrossCo(cCcD_SphAttr const&, f32*) const = 0;
    virtual const cXyz* GetCoCP() const { return &m_virtual_center; }
    virtual cXyz* GetCoCP() { return &m_virtual_center; }
    virtual void CalcAabBox() = 0;
    virtual bool GetNVec(cXyz const&, cXyz*) const = 0;

    cM3dGAab& GetWorkAab() { return mAab; }
    cM3dGAab const& GetWorkAab() const { return mAab; }

    static cXyz m_virtual_center;
};  // Size: 0x20

STATIC_ASSERT(0x20 == sizeof(cCcD_ShapeAttr));

struct cCcD_SrcCylAttr {
    cM3dGCylS mCyl;
};

struct cCcD_SrcTriAttr {
    cM3dGTriS mTri;
};

class cCcD_TriAttr : public cCcD_ShapeAttr, public cM3dGTri {
public:
    cCcD_TriAttr() {}

    virtual void CalcAabBox();
    virtual bool GetNVec(cXyz const&, cXyz*) const;
    virtual bool CrossAtTg(cCcD_CpsAttr const&, cXyz*) const;
    virtual bool CrossAtTg(cCcD_TriAttr const&, cXyz*) const;
    virtual bool CrossAtTg(cCcD_SphAttr const&, cXyz*) const;
    virtual bool CrossAtTg(cCcD_ShapeAttr const& shape, cXyz* xyz) const {
        return shape.CrossAtTg(*this, xyz);
    }
    virtual bool CrossAtTg(cCcD_PntAttr const&, cXyz*) const { return false; }
    virtual bool CrossAtTg(cCcD_AabAttr const&, cXyz*) const { return false; }
    virtual bool CrossAtTg(cCcD_CylAttr const&, cXyz*) const;
    virtual bool CrossCo(cCcD_ShapeAttr const& shape, f32* f) const {
        return shape.CrossCo(*this, f);
    }
    virtual bool CrossCo(cCcD_PntAttr const&, f32*) const { return false; }
    virtual bool CrossCo(cCcD_CpsAttr const&, f32*) const { return false; }
    virtual bool CrossCo(cCcD_TriAttr const&, f32*) const { return false; }
    virtual bool CrossCo(cCcD_AabAttr const&, f32*) const { return false; }
    virtual bool CrossCo(cCcD_CylAttr const&, f32*) const { return false; }
    virtual bool CrossCo(cCcD_SphAttr const&, f32*) const { return false; }
    virtual ~cCcD_TriAttr() {}
};  // Size: 0x58

struct cCcD_SrcCpsAttr {
    cM3dGCpsS mCps;
};

class cCcD_CpsAttr : public cCcD_ShapeAttr, public cM3dGCps {
public:
    /* 0x00 */ /* cCcD_ShapeAttr */
    /* 0x20 */ /* cM3dGCps */

    cCcD_CpsAttr() {}
    void Set(const cCcD_SrcCpsAttr& pSrc) {
        cM3dGCps::Set(pSrc.mCps);
    }
    void Set(const cXyz& pStart, const cXyz& pEnd, f32 radius) {
        cM3dGCps::Set(pStart, pEnd, radius);
    }

    virtual ~cCcD_CpsAttr() {}
    virtual bool CrossAtTg(cCcD_SphAttr const&, cXyz*) const;
    virtual bool CrossAtTg(cCcD_TriAttr const&, cXyz*) const;
    virtual bool CrossAtTg(cCcD_ShapeAttr const& shape, cXyz* xyz) const {
        return shape.CrossAtTg(*this, xyz);
    }
    virtual bool CrossAtTg(cCcD_PntAttr const&, cXyz*) const { return false; }
    virtual bool CrossAtTg(cCcD_AabAttr const&, cXyz*) const { return false; }
    virtual bool CrossAtTg(cCcD_CpsAttr const&, cXyz*) const;
    virtual bool CrossAtTg(cCcD_CylAttr const&, cXyz*) const;
    virtual bool CrossCo(cCcD_CylAttr const&, f32*) const;
    virtual bool CrossCo(cCcD_CpsAttr const&, f32*) const;
    virtual bool CrossCo(cCcD_SphAttr const&, f32*) const;
    virtual bool CrossCo(cCcD_ShapeAttr const& shape, f32* f) const {
        return shape.CrossCo(*this, f);
    }
    virtual bool CrossCo(cCcD_PntAttr const&, f32*) const { return false; }
    virtual bool CrossCo(cCcD_TriAttr const&, f32*) const { return false; }
    virtual bool CrossCo(cCcD_AabAttr const&, f32*) const { return false; }
    virtual void CalcAabBox();
    virtual bool GetNVec(cXyz const&, cXyz*) const;
};  // Size: 0x40

STATIC_ASSERT(0x40 == sizeof(cCcD_CpsAttr));

struct cCcD_SrcSphAttr {
    cM3dGSphS mSph;
};

class cCcD_SphAttr : public cCcD_ShapeAttr, public cM3dGSph {
public:
    cCcD_SphAttr() {}

    void Set(const cCcD_SrcSphAttr& src) {
        cM3dGSph::Set(src.mSph);
    }

    virtual ~cCcD_SphAttr() {}
    virtual const cXyz* GetCoCP() const { return &mCenter; }
    virtual cXyz* GetCoCP() { return &mCenter; }
    virtual bool CrossAtTg(cCcD_ShapeAttr const& shape, cXyz* xyz) const {
        return shape.CrossAtTg(*this, xyz);
    }
    virtual bool CrossAtTg(cCcD_PntAttr const&, cXyz*) const { return false; }
    virtual bool CrossAtTg(cCcD_AabAttr const&, cXyz*) const { return false; }
    virtual bool CrossCo(cCcD_ShapeAttr const& shape, f32* f) const {
        return shape.CrossCo(*this, f);
    }
    virtual bool CrossCo(cCcD_PntAttr const&, f32*) const { return false; }
    virtual bool CrossCo(cCcD_TriAttr const&, f32*) const { return false; }
    virtual bool CrossCo(cCcD_AabAttr const&, f32*) const { return false; }
    virtual bool CrossAtTg(cCcD_CylAttr const&, cXyz*) const;
    virtual bool CrossAtTg(cCcD_TriAttr const&, cXyz*) const;
    virtual bool CrossAtTg(cCcD_CpsAttr const&, cXyz*) const;
    virtual bool CrossAtTg(cCcD_SphAttr const&, cXyz*) const;
    virtual bool CrossCo(cCcD_CpsAttr const&, f32*) const;
    virtual bool CrossCo(cCcD_SphAttr const&, f32*) const;
    virtual bool CrossCo(cCcD_CylAttr const&, f32*) const;
    virtual void CalcAabBox();
    virtual bool GetNVec(cXyz const&, cXyz*) const;
};  // Size = 0x34

STATIC_ASSERT(0x34 == sizeof(cCcD_SphAttr));

class cCcD_CylAttr : public cCcD_ShapeAttr, public cM3dGCyl {
public:
    cCcD_CylAttr() {}
    void Set(const cCcD_SrcCylAttr& src) {
        cM3dGCyl::Set(src.mCyl);
    }

    virtual ~cCcD_CylAttr() {}
    virtual const cXyz* GetCoCP() const { return &mCenter; }
    virtual bool CrossAtTg(cCcD_SphAttr const&, cXyz*) const;
    virtual bool CrossAtTg(cCcD_CylAttr const&, cXyz*) const;
    virtual bool CrossAtTg(cCcD_TriAttr const&, cXyz*) const;
    virtual bool CrossAtTg(cCcD_ShapeAttr const& shape, cXyz* xyz) const {
        return shape.CrossAtTg(*this, xyz);
    }
    virtual bool CrossAtTg(cCcD_PntAttr const&, cXyz*) const { return false; }
    virtual bool CrossAtTg(cCcD_AabAttr const&, cXyz*) const { return false; }
    virtual bool CrossAtTg(cCcD_CpsAttr const&, cXyz*) const;
    virtual bool CrossCo(cCcD_CylAttr const&, f32*) const;
    virtual bool CrossCo(cCcD_CpsAttr const&, f32*) const;
    virtual bool CrossCo(cCcD_ShapeAttr const& shape, f32* f) const {
        return shape.CrossCo(*this, f);
    }
    virtual bool CrossCo(cCcD_PntAttr const&, f32*) const { return false; }
    virtual bool CrossCo(cCcD_TriAttr const&, f32*) const { return false; }
    virtual bool CrossCo(cCcD_AabAttr const&, f32*) const { return false; }
    virtual bool CrossCo(cCcD_SphAttr const&, f32*) const;
    virtual cXyz* GetCoCP() { return &mCenter; }
    virtual void CalcAabBox();
    virtual bool GetNVec(cXyz const&, cXyz*) const;

};  // Size = 0x38

STATIC_ASSERT(0x38 == sizeof(cCcD_CylAttr));

class cCcD_DivideInfo {
public:
    /* 0x00 */ u32 mRangeBits;
    /* 0x04 vtable */
public:
    cCcD_DivideInfo() {}
    virtual ~cCcD_DivideInfo() {}
    void Set(u32 param_1) { mRangeBits = param_1; }
    bool Chk(cCcD_DivideInfo const&) const;
};  // Size = 0x8

STATIC_ASSERT(0x8 == sizeof(cCcD_DivideInfo));

class cCcD_DivideArea : public cM3dGAab {
private:
    /* 0x1C */ bool mXDiffIsZero;
    /* 0x20 */ f32 mScaledXDiff;
    /* 0x24 */ f32 mInvScaledXDiff;
    /* 0x28 */ bool mYDiffIsZero;
    /* 0x2C */ f32 mScaledYDiff;
    /* 0x30 */ f32 mInvScaledYDiff;
    /* 0x34 */ bool mZDiffIsZero;
    /* 0x38 */ f32 mScaledZDiff;
    /* 0x3C */ f32 mInvScaledZDiff;

public:
    cCcD_DivideArea() {}
    virtual ~cCcD_DivideArea() {}
    void SetArea(cM3dGAab const&);
    void CalcDivideInfo(cCcD_DivideInfo*, cM3dGAab const&, u32);
    void CalcDivideInfoOverArea(cCcD_DivideInfo*, cM3dGAab const&);
};  // Size = 0x40

STATIC_ASSERT(0x40 == sizeof(cCcD_DivideArea));

struct cCcD_SrcObjCommonBase {
    /* 0x0 */ u32 mSPrm;
};

struct cCcD_SrcObjTg {
    /* 0x0 */ u32 mType;
    /* 0x4 */ cCcD_SrcObjCommonBase mBase;
};  // Size: 0x8

struct cCcD_SrcObjAt {
    /* 0x0 */ u32 mType;
    /* 0x4 */ u8 mAtp;
    /* 0x8 */ cCcD_SrcObjCommonBase mBase;
};  // Size: 0xC

struct cCcD_SrcObjCo {
    /* 0x0 */ cCcD_SrcObjCommonBase mBase;
};  // Size: 0x4

struct cCcD_SrcObjHitInf {
    /* 0x00 */ cCcD_SrcObjAt mObjAt;
    /* 0x0C */ cCcD_SrcObjTg mObjTg;
    /* 0x14 */ cCcD_SrcObjCo mObjCo;
};  // Size: 0x18

struct cCcD_SrcObj {
    /* 0x0 */ u32 mFlags;
    /* 0x4 */ cCcD_SrcObjHitInf mSrcObjHitInf;
};  // Size: 0x1C

class cCcD_GStts {
public:
    virtual ~cCcD_GStts() {}

private:
    /* 0x00 vtable */
};  // Size = 0x4

STATIC_ASSERT(sizeof(cCcD_GStts) == 0x4);

class cCcD_Stts {
private:
    /* 0x00 */ cXyz m_cc_move;
    /* 0x0C */ fopAc_ac_c* mp_actor;
    /* 0x10 */ fpc_ProcID m_apid;
    /* 0x14 */ u8 m_weight;
    /* 0x15 */ u8 field_0x15;
    /* 0x16 */ u8 m_dmg;
    /* 0x18 */ /* vtable */

public:
    cCcD_Stts() {}
    virtual ~cCcD_Stts() {}
    virtual const cCcD_GStts* GetGStts() const;
    virtual cCcD_GStts* GetGStts();
    void Init(int, int, void*, fpc_ProcID);
    virtual void Ct();
#if VERSION == VERSION_DEMO
    void PlusCcMove(f32 x, f32 y, f32 z) {
        m_cc_move.x += x;
        m_cc_move.y += y;
        m_cc_move.z += z;
    }
#else
    void PlusCcMove(f32, f32, f32);
#endif
    void ClrCcMove() {
        m_cc_move.x = m_cc_move.y = m_cc_move.z = 0.0f;
    }
    void PlusDmg(int dmg) { m_dmg = dmg; }
    u8 GetDmg() { return m_dmg; }
    f32 GetWeightF() const { return (s32)m_weight; }
    u8 GetWeightUc() const { return m_weight; }
    void SetWeight(u8 weight) { m_weight = weight; }
    virtual void ClrAt() {}
    virtual void ClrTg() { m_dmg = 0; }
    
    fopAc_ac_c* GetActor() const { return mp_actor; }
    void SetActor(void* ac) { mp_actor = (fopAc_ac_c*)ac; }
    cXyz* GetCCMoveP() { return &m_cc_move; }
    fpc_ProcID GetApid() const { return m_apid; }
};  // Size = 0x1C

STATIC_ASSERT(0x1C == sizeof(cCcD_Stts));

class cCcD_Obj;  // placeholder

class cCcD_ObjCommonBase {
protected:
    /* 0x00 */ u32 mSPrm;
    /* 0x04 */ u32 mRPrm;
    /* 0x08 */ cCcD_Obj* mHitObj;
    /* 0x0C vtable */
public:
    cCcD_ObjCommonBase() { ct(); }
    virtual ~cCcD_ObjCommonBase() {}
    void ct() {
        SetSPrm(0);
        SetRPrm(0);
        ClrObj();
    }
    void SetSPrm(u32 sprm) { mSPrm = sprm; }
    void SetRPrm(u32 rprm) { mRPrm = rprm; }
    cCcD_Obj* GetHitObj() const { return mHitObj; }
    void ClrObj() { mHitObj = NULL; }
    u32 MskSPrm(u32 mask) const { return mSPrm & mask; }
    u32 MskRPrm(u32 mask) const { return mRPrm & mask; }
    void OnSPrmBit(u32 flag) { mSPrm |= flag; }
    void OffSPrmBit(u32 flag) { mSPrm &= ~flag; }
    void ClrRPrm(u32 flag) { mRPrm &= ~flag; }
    void SetHitObj(cCcD_Obj* obj) { mHitObj = obj; }

    void Set(cCcD_SrcObjCommonBase const& src) {
        mSPrm = src.mSPrm;
    }
};

STATIC_ASSERT(0x10 == sizeof(cCcD_ObjCommonBase));

class cCcD_ObjAt : public cCcD_ObjCommonBase {
public:
    cCcD_ObjAt() { mType = 0; }
    virtual ~cCcD_ObjAt() {}
    void SetHit(cCcD_Obj* obj) {
        SetRPrm(cCcD_AtRPrm_Hit_e);
        SetHitObj(obj);
    }
    void Set(cCcD_SrcObjAt const& src) {
        cCcD_ObjCommonBase::Set(src.mBase);
        mType = src.mType;
        mAtp = src.mAtp;
    }
    void ClrHit() { ClrRPrm(cCcD_AtRPrm_Hit_e); ClrObj(); }
    u32 GetType() const { return mType; }
    u32 GetGrp() const { return MskSPrm(cCcD_AtSPrm_GrpAll_e); }
    bool ChkSet() const { return MskSPrm(cCcD_AtSPrm_Set_e); }
    u8 GetAtp() const { return mAtp; }
    u32 MskType(u32 msk) const { return mType & msk; }
    void SetType(u32 type) { mType = type; }
    void SetAtp(int atp) { mAtp = atp; }
    void ClrSet() { OffSPrmBit(cCcD_AtSPrm_Set_e); }
    void OnHitBit() { SetRPrm(cCcD_AtRPrm_Hit_e); }
    void OffHitBit() { ClrRPrm(cCcD_AtRPrm_Hit_e); }
    u32 ChkHit() const { return MskRPrm(cCcD_AtRPrm_Hit_e); }

protected:
    /* 0x10 */ u32 mType;
    /* 0x14 */ u8 mAtp; // AtPoint, amount of damage done when attacking
}; // size = 0x18

STATIC_ASSERT(0x18 == sizeof(cCcD_ObjAt));

class cCcD_ObjTg : public cCcD_ObjCommonBase {
public:
    cCcD_ObjTg() { ct(); }
    virtual ~cCcD_ObjTg() {}
    void Set(cCcD_SrcObjTg const& src) {
        cCcD_ObjCommonBase::Set(src.mBase);
        mType = src.mType;
    }
    void SetGrp(u32 grp) {
        OffSPrmBit(cCcD_TgSPrm_GrpAll_e);
        OnSPrmBit(grp);
    }
    void ClrHit() { ClrRPrm(cCcD_TgRPrm_Hit_e); ClrObj(); }
    void SetHit(cCcD_Obj* obj) {
        SetRPrm(cCcD_TgRPrm_Hit_e);
        SetHitObj(obj);
    }
    u32 GetType() const { return mType; }
    void SetType(u32 type) { mType = type; }
    u32 GetGrp() const { return MskSPrm(cCcD_TgSPrm_GrpAll_e); }
    bool ChkSet() const { return MskSPrm(cCcD_TgSPrm_Set_e); }
    void ClrSet() { OffSPrmBit(cCcD_TgSPrm_Set_e); }
    u32 ChkHit() const { return MskRPrm(cCcD_TgRPrm_Hit_e); }

private:
    /* 0x10 */ u32 mType;
};

STATIC_ASSERT(0x14 == sizeof(cCcD_ObjTg));

class cCcD_ObjCo : public cCcD_ObjCommonBase {
public:
    virtual ~cCcD_ObjCo() {}
    void SetHit(cCcD_Obj* obj) {
        SetRPrm(cCcD_CoRPrm_Hit_e);
        SetHitObj(obj);
    }
    void ClrHit() { ClrRPrm(cCcD_CoRPrm_Hit_e); ClrObj(); }
    void SetIGrp(u32 grp) { // Fake inline, but exists in TP
        OffSPrmBit(cCcD_CoSPrm_IGrpAll_e);
        OnSPrmBit(grp);
    }
    void SetVsGrp(u32 grp) {
        OffSPrmBit(cCcD_CoSPrm_VsGrpAll_e);
        OnSPrmBit(grp);
    }
    bool ChkSet() const { return MskSPrm(cCcD_CoSPrm_Set_e); }
    u32 GetVsGrp() const { return MskSPrm(cCcD_CoSPrm_VsGrpAll_e); }
    u32 GetIGrp() const { return MskSPrm(cCcD_CoSPrm_IGrpAll_e); }
    u32 ChkNoCrr() const { return MskSPrm(cCcD_CoSPrm_NoCrr_e); }
    u32 ChkSph3DCrr() const { return MskSPrm(cCcD_CoSPrm_Sph3DCrr_e); }
    void ClrSet() { OffSPrmBit(cCcD_CoSPrm_Set_e); }
    u32 ChkHit() const { return MskRPrm(cCcD_CoRPrm_Hit_e); }

    void Set(cCcD_SrcObjCo const& src) {
        cCcD_ObjCommonBase::Set(src.mBase);
    }
};

STATIC_ASSERT(0x10 == sizeof(cCcD_ObjCo));

class cCcD_ObjHitInf {
protected:
    /* 0x000 */ cCcD_ObjAt mObjAt;
    /* 0x018 */ cCcD_ObjTg mObjTg;
    /* 0x02C */ cCcD_ObjCo mObjCo;
    /* 0x03C vtable */
public:
    virtual ~cCcD_ObjHitInf() {}

    void Set(const cCcD_SrcObjHitInf& src) {
        mObjAt.Set(src.mObjAt);
        mObjTg.Set(src.mObjTg);
        mObjCo.Set(src.mObjCo);
    }
    cCcD_ObjAt& GetObjAt() { return mObjAt; } // Fake inline
    cCcD_ObjTg& GetObjTg() { return mObjTg; } // Fake inline
    cCcD_ObjCo& GetObjCo() { return mObjCo; } // Fake inline
    u32 GetTgGrp() const { return mObjTg.GetGrp(); }
    u32 GetAtGrp() const { return mObjAt.GetGrp(); }
    u32 GetTgType() const { return mObjTg.GetType(); }
    u32 GetAtType() const { return mObjAt.GetType(); }
    bool ChkTgSet() const { return mObjTg.ChkSet(); }
    bool ChkAtSet() const { return mObjAt.ChkSet(); }
    bool ChkCoSet() const { return mObjCo.ChkSet(); }
    u32 GetCoVsGrp() const { return mObjCo.GetVsGrp(); }
    u32 GetCoIGrp() const { return mObjCo.GetIGrp(); }
    u8 GetAtAtp() const { return mObjAt.GetAtp(); }
    u32 ChkAtNoTgHitInfSet() const { return mObjAt.MskSPrm(cCcD_AtSPrm_NoTgHitInfSet_e); }
    u32 ChkTgNoAtHitInfSet() const { return mObjTg.MskSPrm(cCcD_TgSPrm_NoAtHitInfSet_e); }
    u32 ChkCoNoCoHitInfSet() { return mObjCo.MskSPrm(cCcD_CoSPrm_NoCoHitInfSet_e); }
    void SetAtHit(cCcD_Obj* obj) { mObjAt.SetHit(obj); }
    void SetTgHit(cCcD_Obj* obj) { mObjTg.SetHit(obj); }
    void SetCoHit(cCcD_Obj* obj) { mObjCo.SetHit(obj); }
    bool ChkAtType(u32 type) const { return mObjAt.MskType(type); }
    u32 ChkCoNoCrr() const { return mObjCo.ChkNoCrr(); }
    u32 ChkCoSph3DCrr() const { return mObjCo.ChkSph3DCrr(); }
    void OnAtSPrmBit(u32 flag) { mObjAt.OnSPrmBit(flag); }
    void OffAtSPrmBit(u32 flag) { mObjAt.OffSPrmBit(flag); }
    void OnTgSPrmBit(u32 flag) { mObjTg.OnSPrmBit(flag); }
    void OffTgSPrmBit(u32 flag) { mObjTg.OffSPrmBit(flag); }
    void OnCoSPrmBit(u32 flag) { mObjCo.OnSPrmBit(flag); }
    void OffCoSPrmBit(u32 flag) { mObjCo.OffSPrmBit(flag); }
    void SetAtType(u32 type) { mObjAt.SetType(type); }
    void OnAtSetBit() { mObjAt.OnSPrmBit(cCcD_AtSPrm_Set_e); }
    void SetAtAtp(int atp) { mObjAt.SetAtp(atp); }
    void OffCoSetBit() { mObjCo.ClrSet(); }
    void SetTgType(u32 type) { mObjTg.SetType(type); }
    void OffAtSetBit() { mObjAt.ClrSet(); }
    void OnAtHitBit() { mObjAt.OnHitBit(); }
    void OffAtHitBit() { mObjAt.OffHitBit(); }
    void OnTgSetBit() { mObjTg.OnSPrmBit(cCcD_TgSPrm_Set_e); }
    void OffTgSetBit() { mObjTg.ClrSet(); }
    void OnCoSetBit() { mObjCo.OnSPrmBit(cCcD_CoSPrm_Set_e); }
    void OnAtVsBitSet(u32 prm) { mObjAt.OnSPrmBit(prm); }
    void OffAtVsBitSet(u32 prm) { mObjAt.OffSPrmBit(prm); }
    void OnAtVsEnemyBit() { mObjAt.OnSPrmBit(cCcD_AtSPrm_VsEnemy_e); }
    void OffAtVsEnemyBit() { mObjAt.OffSPrmBit(cCcD_AtSPrm_VsEnemy_e); }
    void OnAtVsPlayerBit() { mObjAt.OnSPrmBit(cCcD_AtSPrm_VsPlayer_e); }
    void OffAtVsPlayerBit() { mObjAt.OffSPrmBit(cCcD_AtSPrm_VsPlayer_e); }
    void SetTgSPrm(u32 prm) { mObjTg.SetSPrm(prm); } // Fake inline, but exists in TP
    void SetCoSPrm(u32 prm) { mObjCo.SetSPrm(prm); }
    void ClrAtHit() { mObjAt.ClrHit(); }
    void ClrTgHit() { mObjTg.ClrHit(); }
    void ClrCoHit() { mObjCo.ClrHit(); }
    u32 ChkAtHit() const { return mObjAt.ChkHit(); }
    u32 ChkTgHit() const { return mObjTg.ChkHit(); }
    u32 ChkCoHit() const { return mObjCo.ChkHit(); }
    cCcD_Obj* GetAtHitObj() const { return mObjAt.GetHitObj(); }
    cCcD_Obj* GetTgHitObj() const { return mObjTg.GetHitObj(); }
    cCcD_Obj* GetCoHitObj() const { return mObjCo.GetHitObj(); }
    void ClrAtSet() { OffAtSetBit(); }
    void ClrTgSet() { OffTgSetBit(); }
    void ClrCoSet() { OffCoSetBit(); }
    u32 MskAtSPrm(u32 prm) const { return mObjAt.MskSPrm(prm); }
    void OnAtNoTgHitInfSet() { mObjAt.OnSPrmBit(cCcD_AtSPrm_NoTgHitInfSet_e); }
    void OffAtNoTgHitInfSet() { mObjAt.OffSPrmBit(cCcD_AtSPrm_NoTgHitInfSet_e); }
    void OnTgNoAtHitInfSet() { mObjTg.OnSPrmBit(cCcD_TgSPrm_NoAtHitInfSet_e); }
    void SetTgGrp(u32 grp) { mObjTg.SetGrp(grp); }
    void SetCoIGrp(u32 grp) { mObjCo.SetIGrp(grp); } // Fake inline, but exists in TP
    void SetCoVsGrp(u32 grp) { mObjCo.SetVsGrp(grp); }
};  // Size = 0x40

STATIC_ASSERT(0x40 == sizeof(cCcD_ObjHitInf));

class cCcD_GObjInf;

class cCcD_Obj : public cCcD_ObjHitInf {
public:
    cCcD_Obj() { ct(); }
    virtual ~cCcD_Obj() {}
    virtual cCcD_GObjInf const* GetGObjInf() const { return NULL; }
    virtual cCcD_GObjInf* GetGObjInf() { return NULL; }
    virtual cCcD_ShapeAttr const* GetShapeAttr() const { return NULL; }
    virtual cCcD_ShapeAttr* GetShapeAttr() { return NULL; }
    void ct() {
        mFlags = 0;
    }
    void Set(cCcD_SrcObj const&);

    cCcD_Stts* GetStts() { return mStts; }
    void SetStts(cCcD_Stts* stts) { mStts = stts; }
    fopAc_ac_c* GetAc() { return mStts == NULL ? NULL : mStts->GetActor(); }
    cCcD_DivideInfo& GetDivideInfo() { return mDivideInfo; }
    cCcD_DivideInfo* GetPDivideInfo() { return &mDivideInfo; }
    u32 ChkBsRevHit() const { return mFlags & 2; }
    void OnBsRevHit() { mFlags |= 2; }

private:
    /* 0x040 */ u32 mFlags;
    /* 0x044 */ cCcD_Stts* mStts;
    /* 0x048 */ cCcD_DivideInfo mDivideInfo;
};  // Size = 0x50

STATIC_ASSERT(0x50 == sizeof(cCcD_Obj));

class cCcD_GObjInf : public cCcD_Obj {
public:
    cCcD_GObjInf() {}
    virtual ~cCcD_GObjInf() {}
    virtual void ClrAtHit() { mObjAt.ClrHit(); }
    virtual void ClrTgHit() { mObjTg.ClrHit(); }
    virtual void ClrCoHit() { mObjCo.ClrHit(); }
    virtual cCcD_GObjInf const* GetGObjInf() const { return this; }
    virtual cCcD_GObjInf* GetGObjInf() { return this; }
};

STATIC_ASSERT(0x50 == sizeof(cCcD_GObjInf));

#endif /* C_CC_D_H */