summaryrefslogtreecommitdiff
path: root/src/d/d_scope.cpp
blob: 544e49f88b8fc7f47bf30cd8ecc8ee4ea3665ec5 (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
//
// Generated By: dol2asm
// Translation Unit: d/d_scope
//

#define NO_INLINE_DLSTBASE_DRAW

#include "d/d_scope.h"
#include "JSystem/J2DGraph/J2DScreen.h"
#include "JSystem/JUtility/JUTTexture.h"
#include "d/com/d_com_inf_game.h"
#include "d/meter/d_meter2_info.h"
#include "dol2asm.h"

//
// Forward References:
//

extern "C" void __ct__8dScope_cFUc();
extern "C" void __ct__Q28JUtility6TColorFv();
extern "C" void __dt__8dScope_cFv();
extern "C" void _execute__8dScope_cFUl();
extern "C" void draw__8dScope_cFv();
extern "C" void isDead__8dScope_cFv();
extern "C" void open_init__8dScope_cFv();
extern "C" void open_proc__8dScope_cFv();
extern "C" void move_init__8dScope_cFv();
extern "C" void move_proc__8dScope_cFv();
extern "C" void close_init__8dScope_cFv();
extern "C" void close_proc__8dScope_cFv();
extern "C" void __dt__11dMeterSub_cFv();
extern "C" int _create__11dMeterSub_cFv();
extern "C" int _delete__11dMeterSub_cFv();
extern "C" void draw__11dMeterSub_cFv();
extern "C" int _execute__11dMeterSub_cFUl();
extern "C" int isDead__11dMeterSub_cFv();
extern "C" void __sinit_d_scope_cpp();
extern "C" extern char const* const d_d_scope__stringBase0;

//
// External References:
//

extern "C" void* __nw__FUl();
extern "C" void __dl__FPv();
extern "C" void J2DDrawLine__FffffQ28JUtility6TColori();
extern "C" void __ct__10J2DPictureFPC7ResTIMG();
extern "C" void __construct_array();
extern "C" void __ptmf_scall();
extern "C" void _savegpr_23();
extern "C" void _savegpr_29();
extern "C" void _restgpr_23();
extern "C" void _restgpr_29();
extern "C" extern void* __vt__12dDlst_base_c[3];

//
// Declarations:
//

/* 803BB618-803BB624 018738 000C+00 1/1 0/0 0/0 .data            cNullVec__6Z2Calc */
SECTION_DATA static u8 cNullVec__6Z2Calc[12] = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

/* 803BB648-803BB66C 018768 0024+00 2/3 0/0 0/0 .data            init_process */
typedef void (dScope_c::*initFunc)();
SECTION_DATA initFunc init_process[] = {
    &dScope_c::open_init,
    &dScope_c::move_init,
    &dScope_c::close_init,
};

/* 803BB690-803BB6B4 0187B0 0024+00 1/2 0/0 0/0 .data            move_process */
typedef void (dScope_c::*moveFunc)();
SECTION_DATA moveFunc move_process[] = {
    &dScope_c::open_proc,
    &dScope_c::move_proc,
    &dScope_c::close_proc,
};

/* 80453A10-80453A14 002010 0004+00 4/4 0/0 0/0 .sdata2          @3756 */
SECTION_SDATA2 static f32 lit_3756 = 3.0f;

/* 80453A14-80453A18 002014 0004+00 4/4 0/0 0/0 .sdata2          @3757 */
SECTION_SDATA2 static u8 lit_3757[4] = {
    0x00,
    0x00,
    0x00,
    0x00,
};

extern void* __vt__11dMeterSub_c[8 + 3 /* padding */];

/* 80193690-80193960 18DFD0 02D0+00 0/0 1/1 0/0 .text            __ct__8dScope_cFUc */
dScope_c::dScope_c(u8 param_0) : field_0x58(-1), field_0x5c(-1) {
    field_0x8d = param_0;
    ResTIMG* mp_image = (ResTIMG*)dComIfGp_getMain2DArchive()->getResource('TIMG', "wipe_00.bti");

    mHawkEyeScrn = NULL;
    mHawkEyeRootPane = NULL;
    mZoomInOutScrn = NULL;
    mZoomInOutRootPane = NULL;

    for (int i = 0; i < 3; i++) {
        mHawkEyePanes[i] = NULL;
    }

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
            mZoomInOutPanes[i][j] = NULL;
        }
    }

    mpWipeTex = new J2DPicture(mp_image);
    mpWipeTex->setBlackWhite(JUtility::TColor(0, 0, 0, 0), JUtility::TColor(0, 0, 0, 255));
    mWidth = mp_image->width;
    mHeight = mp_image->height;

    mp_image = (ResTIMG*)dComIfGp_getMain2DArchive()->getResource('TIMG', "tt_block8x8.bti");
    mpBlackTex = new J2DPicture(mp_image);
    mpBlackTex->setBlackWhite(JUtility::TColor(0, 0, 0, 0), JUtility::TColor(0, 0, 0, 255));
    mScale = lit_3756;
    mAlpha = FLOAT_LABEL(lit_3757);
    mOpenTimer = 0;
    field_0x8a = 0;
    mProcess = PROC_OPEN;
    mIsDead = false;
    (this->*init_process[mProcess])();
}

/* 803BB6B4-803BB6D4 0187D4 0020+00 2/2 0/0 0/0 .data            __vt__8dScope_c */
SECTION_DATA extern void* __vt__8dScope_c[8] = {
    (void*)NULL /* RTTI */,          (void*)NULL,
    (void*)draw__8dScope_cFv,        (void*)__dt__8dScope_cFv,
    (void*)_create__11dMeterSub_cFv, (void*)_execute__8dScope_cFUl,
    (void*)_delete__11dMeterSub_cFv, (void*)isDead__8dScope_cFv,
};

/* 803BB6D4-803BB700 0187F4 0020+0C 3/3 6/6 0/0 .data            __vt__11dMeterSub_c */
SECTION_DATA extern void* __vt__11dMeterSub_c[8 + 3 /* padding */] = {
    (void*)NULL /* RTTI */,
    (void*)NULL,
    (void*)draw__11dMeterSub_cFv,
    (void*)__dt__11dMeterSub_cFv,
    (void*)_create__11dMeterSub_cFv,
    (void*)_execute__11dMeterSub_cFUl,
    (void*)_delete__11dMeterSub_cFv,
    (void*)isDead__11dMeterSub_cFv,
    /* padding */
    NULL,
    NULL,
    NULL,
};

/* 8019396C-80193B90 18E2AC 0224+00 1/0 0/0 0/0 .text            __dt__8dScope_cFv */
dScope_c::~dScope_c() {
    if (mHawkEyeScrn != NULL) {
        delete mHawkEyeScrn;
        mHawkEyeScrn = NULL;
    }

    if (mHawkEyeRootPane != NULL) {
        delete mHawkEyeRootPane;
        mHawkEyeRootPane = NULL;
    }

    for (int i = 0; i < 3; i++) {
        if (mHawkEyePanes[i] != NULL) {
            delete mHawkEyePanes[i];
            mHawkEyePanes[i] = NULL;
        }
    }

    if (mZoomInOutScrn != NULL) {
        delete mZoomInOutScrn;
        mZoomInOutScrn = NULL;
    }

    if (mZoomInOutRootPane != NULL) {
        delete mZoomInOutRootPane;
        mZoomInOutRootPane = NULL;
    }

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
            if (mZoomInOutPanes[i][j] != NULL) {
                delete mZoomInOutPanes[i][j];
                mZoomInOutPanes[i][j] = NULL;
            }
        }
    }

    delete mpWipeTex;
    mpWipeTex = NULL;

    delete mpBlackTex;
    mpBlackTex = NULL;

    dMeter2Info_setScopeZoomPointer(0);
}

/* 80193B90-80193C68 18E4D0 00D8+00 1/0 0/0 0/0 .text            _execute__8dScope_cFUl */
int dScope_c::_execute(u32) {
    u8 old_proc = mProcess;
    (this->*move_process[mProcess])();

    if (!dComIfGp_checkCameraAttentionStatus(0, 8)) {
        mProcess = PROC_CLOSE;
    }

    if (mProcess != old_proc) {
        (this->*init_process[mProcess])();
    }

    if (mProcess != PROC_CLOSE) {
        dComIfGp_setCStickStatusForce(61, 10, 3);

        if (dComIfGp_checkPlayerStatus0(0, 0x1000)) {
            dComIfGp_setRStatusForce(0x11, 3);
        }
    }

    return 1;
}

/* ############################################################################################## */
/* 80453A20-80453A24 002020 0004+00 1/1 0/0 0/0 .sdata2          @3879 */
SECTION_SDATA2 static f32 lit_3879 = 255.0f;

/* 80453A24-80453A28 002024 0004+00 1/1 0/0 0/0 .sdata2          @3880 */
SECTION_SDATA2 static f32 lit_3880 = 304.0f;

/* 80453A28-80453A2C 002028 0004+00 1/1 0/0 0/0 .sdata2          @3881 */
SECTION_SDATA2 static f32 lit_3881 = 448.0f;

/* 80453A2C-80453A30 00202C 0004+00 1/1 0/0 0/0 .sdata2          @3882 */
SECTION_SDATA2 static f32 lit_3882 = 224.0f;

/* 80453A30-80453A34 002030 0004+00 1/1 0/0 0/0 .sdata2          @3883 */
SECTION_SDATA2 static f32 lit_3883 = 608.0f;

/* 80193C68-80193FA0 18E5A8 0338+00 1/0 0/0 0/0 .text            draw__8dScope_cFv */
// matches with literals and when vtables in this TU are fixed
#ifdef NONMATCHING
void dScope_c::draw() {
    dComIfGp_getCurrentGrafPort()->setup2D();
    f32 temp_f1 = mScale;
    f32 temp_f31 = mWidth * temp_f1;
    f32 temp_f30 = mHeight * temp_f1;
    u8 alpha = mAlpha * 255.0f;

    if (dComIfGp_checkPlayerStatus0(0, 0x1000)) {
        J2DDrawLine(304.0f, mDoGph_gInf_c::getMinYF(), 304.0f, mDoGph_gInf_c::getMaxYF(),
                    JUtility::TColor(255, 0, 0, alpha), 6);
        J2DDrawLine(mDoGph_gInf_c::getMinXF(), 224.0f, mDoGph_gInf_c::getMaxXF(), 224.0f,
                    JUtility::TColor(255, 0, 0, alpha), 6);
    }

    mpWipeTex->setAlpha(alpha);
    mpBlackTex->setAlpha(alpha);

    f32 temp_f29 = 304.0f - temp_f31;
    f32 temp_f28 = 304.0f + temp_f31;
    f32 temp_f27 = 224.0f - temp_f30;
    f32 temp_f26 = 224.0f + temp_f30;

    mpWipeTex->draw(temp_f29, temp_f27, temp_f31, temp_f30, false, false, false);
    mpWipeTex->draw(304.0f, temp_f27, temp_f31, temp_f30, true, false, false);
    mpWipeTex->draw(temp_f29, 224.0f, temp_f31, temp_f30, false, true, false);
    mpWipeTex->draw(304.0f, 224.0f, temp_f31, temp_f30, true, true, false);

    mpBlackTex->draw(mDoGph_gInf_c::getMinXF(), mDoGph_gInf_c::getMinYF(),
                     mDoGph_gInf_c::getWidthF(), temp_f27 - mDoGph_gInf_c::getMinYF(), false, false,
                     false);
    mpBlackTex->draw(mDoGph_gInf_c::getMinXF(), temp_f26, mDoGph_gInf_c::getWidthF(),
                     mDoGph_gInf_c::getMaxYF() - temp_f26, false, false, false);
    mpBlackTex->draw(mDoGph_gInf_c::getMinXF(), temp_f27, temp_f29 - mDoGph_gInf_c::getMinXF(),
                     temp_f26 - temp_f27, false, false, false);
    mpBlackTex->draw(temp_f28, temp_f27, mDoGph_gInf_c::getMaxXF() - temp_f28, temp_f26 - temp_f27,
                     false, false, false);
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
// asm void dScope_c::draw() {
extern "C" asm void draw__8dScope_cFv() {
    nofralloc
#include "asm/d/d_scope/draw__8dScope_cFv.s"
}
#pragma pop
#endif

/* 80193FA0-80193FB4 18E8E0 0014+00 1/0 0/0 0/0 .text            isDead__8dScope_cFv */
bool dScope_c::isDead() {
    return mIsDead != false ? 1 : 0;
}

/* 80193FB4-80193FD0 18E8F4 001C+00 1/0 0/0 0/0 .text            open_init__8dScope_cFv */
void dScope_c::open_init() {
    mScale = lit_3756;
    mAlpha = FLOAT_LABEL(lit_3757);
    mOpenTimer = 0;
}

/* ############################################################################################## */
/* 80453A34-80453A38 002034 0004+00 2/2 0/0 0/0 .sdata2          @3902 */
SECTION_SDATA2 static f32 lit_3902 = 1.5f;

/* 80453A38-80453A3C 002038 0004+00 2/2 0/0 0/0 .sdata2          @3903 */
SECTION_SDATA2 static f32 lit_3903 = 5.0f;

/* 80453A3C-80453A40 00203C 0004+00 2/2 0/0 0/0 .sdata2          @3904 */
SECTION_SDATA2 static f32 lit_3904 = 1.0f;

/* 80453A40-80453A48 002040 0008+00 2/2 0/0 0/0 .sdata2          @3906 */
SECTION_SDATA2 static f64 lit_3906 = 4503601774854144.0 /* cast s32 to float */;

/* 80193FD0-80194048 18E910 0078+00 1/0 0/0 0/0 .text            open_proc__8dScope_cFv */
// matches with literals
#ifdef NONMATCHING
void dScope_c::open_proc() {
    mOpenTimer++;
    mScale = 3.0f - (mOpenTimer / 5.0f) * 1.5f;
    mAlpha = 1.0f;

    if (mOpenTimer >= 5) {
        mScale = 1.5f;
        mAlpha = 1.0f;
        mProcess = PROC_MOVE;
    }
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dScope_c::open_proc() {
    nofralloc
#include "asm/d/d_scope/open_proc__8dScope_cFv.s"
}
#pragma pop
#endif

/* 80194048-8019404C 18E988 0004+00 1/0 0/0 0/0 .text            move_init__8dScope_cFv */
void dScope_c::move_init() {}

/* 8019404C-80194050 18E98C 0004+00 1/0 0/0 0/0 .text            move_proc__8dScope_cFv */
void dScope_c::move_proc() {}

/* 80194050-80194054 18E990 0004+00 1/0 0/0 0/0 .text            close_init__8dScope_cFv */
void dScope_c::close_init() {}

/* 80194054-801940D4 18E994 0080+00 1/0 0/0 0/0 .text            close_proc__8dScope_cFv */
// matches with literals
#ifdef NONMATCHING
void dScope_c::close_proc() {
    if (mOpenTimer > 0) {
        mOpenTimer--;
        mScale = 3.0f - (mOpenTimer / 5.0f) * 1.5f;
        mAlpha = 1.0f;
    } else {
        mScale = 3.0f;
        mAlpha = 0.0f;
        mIsDead = true;
    }
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dScope_c::close_proc() {
    nofralloc
#include "asm/d/d_scope/close_proc__8dScope_cFv.s"
}
#pragma pop
#endif

/* 801940D4-8019411C 18EA14 0048+00 1/0 0/0 0/0 .text            __dt__11dMeterSub_cFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
// asm dMeterSub_c::~dMeterSub_c() {
extern "C" asm void __dt__11dMeterSub_cFv() {
    nofralloc
#include "asm/d/d_scope/__dt__11dMeterSub_cFv.s"
}
#pragma pop

/* 8019411C-80194124 18EA5C 0008+00 2/0 0/0 0/0 .text            _create__11dMeterSub_cFv */
// int dMeterSub_c::_create() {
extern "C" int _create__11dMeterSub_cFv() {
    return false;
}

/* 80194124-8019412C 18EA64 0008+00 2/0 0/0 0/0 .text            _delete__11dMeterSub_cFv */
// int dMeterSub_c::_delete() {
extern "C" int _delete__11dMeterSub_cFv() {
    return false;
}

/* 8019412C-80194130 18EA6C 0004+00 1/0 0/0 0/0 .text            draw__11dMeterSub_cFv */
// void dMeterSub_c::draw() {
extern "C" void draw__11dMeterSub_cFv() {
    /* empty function */
}

/* 80194130-80194138 18EA70 0008+00 1/0 0/0 0/0 .text            _execute__11dMeterSub_cFUl */
// int dMeterSub_c::_execute(u32 param_0) {
extern "C" int _execute__11dMeterSub_cFUl() {
    return false;
}

/* 80194138-80194140 18EA78 0008+00 1/0 3/0 0/0 .text            isDead__11dMeterSub_cFv */
// int dMeterSub_c::isDead() {
extern "C" int isDead__11dMeterSub_cFv() {
    return false;
}