summaryrefslogtreecommitdiff
path: root/src/d/actor/d_a_obj_amiShutter.cpp
blob: 260ac60e7b8139749a06a646c6a6e59aff193232 (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
/**
 * @file d_a_obj_amiShutter.cpp
 * 
*/

#include "d/actor/d_a_obj_amiShutter.h"
#include "d/actor/d_a_player.h"
#include "c/c_damagereaction.h"
#include "d/d_bg_w.h"

//
// Declarations:
//

/* ############################################################################################## */

UNK_REL_DATA

/* 80BA14CC-80BA1514 0000EC 0048+00 1/1 0/0 0/0 .text            __ct__18daAmiShutter_HIO_cFv */
daAmiShutter_HIO_c::daAmiShutter_HIO_c() {
    mMaxOpenSpeed = 70.0f;
    mMaxCloseSpeed = 70.0f;
    field_0x11 = 3;
    mRange = 400.f;
    mWaitTime = 0;
}

#ifdef DEBUG
void daAmiShutter_HIO_c::genMessage(JORMContext* i_ctx) {
    i_ctx->genSlider("open速度", &mMaxOpenSpeed, 0.1f, 1000.0f, 
        0, NULL, 0xffff, 0xffff, 512, 24);
    i_ctx->genSlider("close速度", &mMaxCloseSpeed, 0.1f, 1000.0f, 
        0, NULL, 0xffff, 0xffff, 512, 24);
    i_ctx->genSlider("range", &mRange, 0.1f, 1000.0f, 
        0, NULL, 0xffff, 0xffff, 512, 24);
    i_ctx->genSlider("waitTime", &mWaitTime, 0, 255, 
        0, NULL, 0xffff, 0xffff, 512, 24);
}
#endif

/* 80BA256C-80BA2580 000014 0014+00 6/6 0/0 0/0 .bss             l_HIO */
static daAmiShutter_HIO_c l_HIO;

/* 80BA155C-80BA15E4 00017C 0088+00 2/2 0/0 0/0 .text            setBaseMtx__14daAmiShutter_cFv */
void daAmiShutter_c::setBaseMtx() {
    mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
    mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z);
    mpModel->setBaseScale(scale);
    mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
}

/* ############################################################################################## */

/* 80BA15E4-80BA1650 000204 006C+00 1/0 0/0 0/0 .text            CreateHeap__14daAmiShutter_cFv */
int daAmiShutter_c::CreateHeap() {
    J3DModelData* modelData = (J3DModelData*) dComIfG_getObjectRes("S_Zami", 4);
    JUT_ASSERT(167, modelData != 0); 
    
    mpModel = mDoExt_J3DModel__create(modelData, 
        J3DMdlFlag_Unk80000, 0x11000084);
    if (mpModel == NULL) {
        return 0;
    }
    return 1;
}

/* ############################################################################################## */

/* 80BA1650-80BA182C 000270 01DC+00 1/1 0/0 0/0 .text            create__14daAmiShutter_cFv */
cPhs__Step daAmiShutter_c::create() {
    fopAcM_SetupActor(this, daAmiShutter_c);
    cPhs__Step phaseStep = (cPhs__Step) dComIfG_resLoad(&mPhaseReq, "S_Zami");

    if (phaseStep == cPhs_COMPLEATE_e) {
        cPhs__Step res = (cPhs__Step) MoveBGCreate("S_Zami", 7, 
            dBgS_MoveBGProc_Typical, 0x1a00, NULL);

        if (res == cPhs_ERROR_e) {
            phaseStep = cPhs_ERROR_e;
            return phaseStep;
        }

        fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
        fopAcM_setCullSizeBox2(this, mpModel->getModelData());
        mType = getType();
        mPosZ = current.pos.z;
        
        if (mType == 0 || mType == 1) {
            if (mType == 0 && cDmr_SkipInfo != 0 
                && daPy_getPlayerActorClass()->current.pos.y > -800.0f){
                mMode = MODE_CLOSE_END;
            } else {
                mPos = current.pos;
                current.pos.z -= 600.0f;
                mOpen = true;
                init_modeWaitEvent();
            }
        } else {
            mSwBit = getSwBit();
            mSwitch = fopAcM_isSwitch(this, mSwBit);
            mOpen = false;
            init_modeWait();
        }
        setBaseMtx();
        #ifdef DEBUG
        l_HIO.entryHIO("アミシャッター");
        #endif
    }
    return phaseStep;
}

/* 80BA182C-80BA1888 00044C 005C+00 1/0 0/0 0/0 .text            Execute__14daAmiShutter_cFPPA3_A4_f
 */
int daAmiShutter_c::Execute(Mtx** i_mtx) {
    eventUpdate();
    moveShutter();
    *i_mtx = &mpModel->getBaseTRMtx();
    setBaseMtx();
    return 1;
}

/* ############################################################################################## */

/* 80BA1888-80BA1974 0004A8 00EC+00 1/1 0/0 0/0 .text            moveShutter__14daAmiShutter_cFv */
void daAmiShutter_c::moveShutter() {
    static daAmiShutter_c::modeProc const mode_proc[6] = {
        &daAmiShutter_c::modeWait,
        &daAmiShutter_c::modeWaitEvent,
        &daAmiShutter_c::modeClose,
        &daAmiShutter_c::modeCloseEvent,
        &daAmiShutter_c::modeCloseEnd,
        &daAmiShutter_c::modeOpen,
    };

    (this->*mode_proc[mMode])();
}

/* ############################################################################################## */

/* 80BA1974-80BA1B4C 000594 01D8+00 1/1 0/0 0/0 .text            playerAreaCheck__14daAmiShutter_cFv
 */
BOOL daAmiShutter_c::playerAreaCheck() {
    BOOL inArea = FALSE;
    if (mType == 0) {
        fopAc_ac_c* player = dComIfGp_getPlayer(0);
        cXyz posDiff = mPos - player->current.pos;
        f32 distance = posDiff.absXZ();
        if (distance >= l_HIO.mRange 
            && player->current.pos.y > current.pos.y
            && player->current.pos.y < current.pos.y + 50.f){
            inArea = TRUE;
        }
    } else if (dComIfGp_getLinkPlayer()->getFootOnGround()) {
        inArea = TRUE;
    }
    return inArea;
}

/* 80BA1B4C-80BA1B58 00076C 000C+00 3/3 0/0 0/0 .text            init_modeWait__14daAmiShutter_cFv
 */
void daAmiShutter_c::init_modeWait() {
    mMode = MODE_WAIT;
}

/* 80BA1B58-80BA1BCC 000778 0074+00 1/0 0/0 0/0 .text            modeWait__14daAmiShutter_cFv */
void daAmiShutter_c::modeWait() {
    u8 isSwitch = fopAcM_isSwitch(this, mSwBit);
    if (mSwitch != isSwitch) {
        mSwitch = isSwitch;
        mSwitch == FALSE ? init_modeClose() : init_modeOpen();
    }
}

/* 80BA1BCC-80BA1BD8 0007EC 000C+00 1/1 0/0 0/0 .text init_modeWaitEvent__14daAmiShutter_cFv */
void daAmiShutter_c::init_modeWaitEvent() {
    mMode = MODE_WAIT_EVENT;
}

/* 80BA1BD8-80BA1C90 0007F8 00B8+00 1/0 0/0 0/0 .text            modeWaitEvent__14daAmiShutter_cFv
 */
void daAmiShutter_c::modeWaitEvent() {
    if (playerAreaCheck() == TRUE) {
        if (getEvent() != 0xff) {
            if (mType == 0 && fopAcM_isSwitch(this, 4) == TRUE) {
                eventStart();
            } else {
                orderEvent(getEvent(), 0xff, 1);
            }
        } else {
            eventStart();
        }
    }
}

/* 80BA1C90-80BA1CB4 0008B0 0024+00 2/1 0/0 0/0 .text            eventStart__14daAmiShutter_cFv */
bool daAmiShutter_c::eventStart() {
    init_modeCloseEvent();
    return true;
}

/* ############################################################################################## */

/* 80BA1CB4-80BA1D48 0008D4 0094+00 1/1 0/0 0/0 .text            init_modeClose__14daAmiShutter_cFv
 */
void daAmiShutter_c::init_modeClose() {
    mDoAud_seStart(Z2SE_OBJ_NET_SHTR_CL, &current.pos, 0, 
        dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
    mpBgW->OffRoofRegist();
    mMode = MODE_CLOSE;
}

/* ############################################################################################## */
/* 80BA1D48-80BA1DCC 000968 0084+00 1/0 0/0 0/0 .text            modeClose__14daAmiShutter_cFv */
void daAmiShutter_c::modeClose() {
    f32 distance = cLib_addCalc(&current.pos.z, mPosZ, 0.5f, 
        l_HIO.mMaxCloseSpeed, 1.0f);
    if (distance == 0.0f) {
        mpBgW->OnRoofRegist();
        mOpen = false;
        init_modeWait();
    }
}

/* 80BA1DCC-80BA1E60 0009EC 0094+00 1/1 0/0 0/0 .text init_modeCloseEvent__14daAmiShutter_cFv */
void daAmiShutter_c::init_modeCloseEvent() {
    mDoAud_seStart(Z2SE_OBJ_NET_L_SHTR_CL, &current.pos, 0, 
        dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
    mWaitTime = l_HIO.mWaitTime;
    mMode = MODE_CLOSE_EVENT;
}

/* ############################################################################################## */

/* 80BA1E60-80BA1EEC 000A80 008C+00 1/0 0/0 0/0 .text            modeCloseEvent__14daAmiShutter_cFv
 */
void daAmiShutter_c::modeCloseEvent() {
    if (mWaitTime != 0) {
        mWaitTime -= 1;
        return;
    }

    f32 distance = cLib_addCalc(&current.pos.z, mPosZ, 0.2, 
        l_HIO.mMaxOpenSpeed, 1.0f);
    if (distance == 0.0f) {
        mOpen = false;
        init_modeCloseEnd();
    }
}

/* 80BA1EEC-80BA1F7C 000B0C 0090+00 1/1 0/0 0/0 .text init_modeCloseEnd__14daAmiShutter_cFv */
void daAmiShutter_c::init_modeCloseEnd() {
    if (mType == 0 && fopAcM_isSwitch(this, 4) == 0) {
        daPy_getPlayerActorClass()->changeOriginalDemo();
        daPy_getPlayerActorClass()->changeDemoMode(daPy_demo_c::DEMO_TURN_BACK_e,
             0, 0,0);
    }
    mMode = MODE_CLOSE_END;
}

/* 80BA1F7C-80BA1F80 000B9C 0004+00 1/0 0/0 0/0 .text            modeCloseEnd__14daAmiShutter_cFv */
void daAmiShutter_c::modeCloseEnd() {
    // EMPTY METHOD
}

/* 80BA1F80-80BA2004 000BA0 0084+00 1/1 0/0 0/0 .text            init_modeOpen__14daAmiShutter_cFv
 */
void daAmiShutter_c::init_modeOpen() {
    mDoAud_seStart(Z2SE_OBJ_NET_SHTR_OP, &current.pos, 0, 
        dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
    mMode = MODE_OPEN;
}

/* 80BA2004-80BA2080 000C24 007C+00 1/0 0/0 0/0 .text            modeOpen__14daAmiShutter_cFv */
void daAmiShutter_c::modeOpen() {
    f32 distance = cLib_addCalc(&current.pos.z, mPosZ - 600.0f, 0.2, 
        l_HIO.mMaxOpenSpeed, 1.0f);
    if (distance == 0.0f) {
        mOpen = true;
        init_modeWait();
    }
}

/* 80BA2080-80BA2124 000CA0 00A4+00 1/0 0/0 0/0 .text            Draw__14daAmiShutter_cFv */
int daAmiShutter_c::Draw() {
    g_env_light.settingTevStruct(16, &current.pos, &tevStr);
    g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr);
    dComIfGd_setListBG();
    mDoExt_modelUpdateDL(mpModel);
    dComIfGd_setList();
    return 1;
}

/* 80BA2124-80BA2154 000D44 0030+00 1/0 0/0 0/0 .text            Delete__14daAmiShutter_cFv */
int daAmiShutter_c::Delete() {
    dComIfG_resDelete(&mPhaseReq, "S_Zami");
    #ifdef DEBUG
    l_HIO.removeHIO();
    #endif

    return 1;
}

/* 80BA2154-80BA2180 000D74 002C+00 1/0 0/0 0/0 .text daAmiShutter_Draw__FP14daAmiShutter_c */
int daAmiShutter_Draw(daAmiShutter_c* i_this) {
    return i_this->MoveBGDraw();
}

/* 80BA2180-80BA21A0 000DA0 0020+00 1/0 0/0 0/0 .text daAmiShutter_Execute__FP14daAmiShutter_c */
int daAmiShutter_Execute(daAmiShutter_c* i_this) {
    return i_this->MoveBGExecute();
}

/* 80BA21A0-80BA21C0 000DC0 0020+00 1/0 0/0 0/0 .text daAmiShutter_Delete__FP14daAmiShutter_c */
int daAmiShutter_Delete(daAmiShutter_c* i_this) {
    fopAcM_GetID(i_this);
    return i_this->MoveBGDelete();
}

/* 80BA21C0-80BA21E0 000DE0 0020+00 1/0 0/0 0/0 .text            daAmiShutter_Create__FP10fopAc_ac_c
 */
int daAmiShutter_Create(fopAc_ac_c* i_this) {
    fopAcM_GetID(i_this);
    return static_cast<daAmiShutter_c*>(i_this)->create();
}

/* 80BA248C-80BA24AC -00001 0020+00 1/0 0/0 0/0 .data            l_daAmiShutter_Method */
actor_method_class l_daAmiShutter_Method = {
    (process_method_func)daAmiShutter_Create,
    (process_method_func)daAmiShutter_Delete,
    (process_method_func)daAmiShutter_Execute,
    NULL,
    (process_method_func)daAmiShutter_Draw,
};


/* 80BA24AC-80BA24DC -00001 0030+00 0/0 0/0 1/0 .data            g_profile_Obj_AmiShutter */
extern actor_process_profile_definition g_profile_Obj_AmiShutter = {
    fpcLy_CURRENT_e,        // mLayerID
    3,                      // mListID
    fpcPi_CURRENT_e,        // mListPrio
    PROC_Obj_AmiShutter,    // mProcName
    &g_fpcLf_Method.base,  // sub_method
    sizeof(daAmiShutter_c), // mSize
    0,                      // mSizeOther
    0,                      // mParameters
    &g_fopAc_Method.base,   // sub_method
    521,                    // mPriority
    &l_daAmiShutter_Method, // sub_method
    0x00044000,             // mStatus
    fopAc_ACTOR_e,          // mActorType
    fopAc_CULLBOX_CUSTOM_e, // cullType
  };