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
|
#include "Z2AudioLib/Z2FxLineMgr.h"
#include "Z2AudioLib/Z2SceneMgr.h"
#include "JSystem/JAudio2/JASDSPInterface.h"
#include "JSystem/JKernel/JKRArchive.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JSupport/JSUMemoryStream.h"
/* 802BA7DC-802BA7FC 2B511C 0020+00 0/0 1/1 0/0 .text __ct__11Z2FxLineMgrFv */
Z2FxLineMgr::Z2FxLineMgr() : JASGlobalInstance<Z2FxLineMgr>(true) {
mConfig = NULL;
mLineID = -1;
mFxDataNum = 0;
mSetUnderWaterFx = false;
#if DEBUG
mHIOEdit = NULL;
#endif
}
/* 802BA7FC-802BAC28 2B513C 042C+00 0/0 1/1 0/0 .text
* initDataArc__11Z2FxLineMgrFP10JKRArchiveP7JKRHeap */
void Z2FxLineMgr::initDataArc(JKRArchive* arc, JKRHeap* heap) {
JUT_ASSERT(44, arc);
JUT_ASSERT(45, heap);
mFxLineBuffer[0] = new (heap, 0x20) u8[0x2800];
mFxLineBuffer[1] = new (heap, 0x20) u8[0x2800];
mFxLineBuffer[2] = new (heap, 0x20) u8[0x4B00];
mFxLineBuffer[3] = new (heap, 0x20) u8[0x4B00];
JUT_ASSERT(53, mFxLineBuffer[0]);
JUT_ASSERT(54, mFxLineBuffer[1]);
JUT_ASSERT(55, mFxLineBuffer[2]);
JUT_ASSERT(56, mFxLineBuffer[3]);
mFxDataNum = arc->countResource();
mConfig = new (heap, 0) Z2FxLineConfig[mFxDataNum];
for (u8 i = 0; i < mFxDataNum; i++) {
void* res = arc->getResource(i);
u32 size = (arc->getResSize(res) + 0x1f) & ~0x1f;
JSUMemoryInputStream stream(res, size);
stream >> mConfig[i].field_0x0;
stream >> mConfig[i].field_0x1;
stream >> mConfig[i].field_0x2;
stream >> mConfig[i].field_0x3;
stream >> mConfig[i].field_0x4;
stream >> mConfig[i].field_0x6;
stream >> mConfig[i].field_0x8[0];
stream >> mConfig[i].field_0x8[1];
stream >> mConfig[i].field_0x8[2];
stream >> mConfig[i].field_0x8[3];
stream >> mConfig[i].field_0x8[4];
stream >> mConfig[i].field_0x8[5];
stream >> mConfig[i].field_0x8[6];
stream >> mConfig[i].field_0x8[7];
stream >> mConfig[i].field_0x18;
stream >> mConfig[i].field_0x19;
stream >> mConfig[i].field_0x1a;
stream >> mConfig[i].field_0x1b;
stream >> mConfig[i].field_0x1c;
stream >> mConfig[i].field_0x1e;
stream >> mConfig[i].field_0x20[0];
stream >> mConfig[i].field_0x20[1];
stream >> mConfig[i].field_0x20[2];
stream >> mConfig[i].field_0x20[3];
stream >> mConfig[i].field_0x20[4];
stream >> mConfig[i].field_0x20[5];
stream >> mConfig[i].field_0x20[6];
stream >> mConfig[i].field_0x20[7];
JKRFree(res);
}
setLineID(-1, false, false);
setLineID(-1, true, false);
}
/* 802BAC28-802BAC74 2B5568 004C+00 4/4 0/0 0/0 .text setLineID__11Z2FxLineMgrFScbb */
void Z2FxLineMgr::setLineID(s8 fxID, bool param_1, bool param_2) {
JUT_ASSERT(109, fxID < mFxDataNum);
if (fxID < 0) {
mLineID = 0;
} else {
mLineID = fxID;
}
setLine(&mConfig[mLineID], param_1, param_2);
}
/* 802BAC74-802BAE1C 2B55B4 01A8+00 1/1 0/0 0/0 .text setLine__11Z2FxLineMgrFP14Z2FxLineConfigbb
*/
void Z2FxLineMgr::setLine(Z2FxLineConfig* config, bool param_1, bool param_2) {
JUT_ASSERT(121, config);
u8 buf1 = 0;
u8 buf2 = 1;
if (param_1) {
buf1 = 2;
buf2 = 3;
}
if (mFxLineBuffer[buf1] == NULL || mFxLineBuffer[buf2] == NULL) {
OS_REPORT("[Z2FxLineMgr::setLine] FxBuffer is NOT CREATED!!\n");
return;
}
JASDsp::FxlineConfig_ dsp_config;
dsp_config.field_0x0 = config->field_0x0;
dsp_config.field_0x2 = config->field_0x1;
dsp_config.field_0x6 = config->field_0x2;
if (param_2) {
dsp_config.field_0x4 = 0;
dsp_config.field_0x8 = 0;
} else {
dsp_config.field_0x4 = config->field_0x4;
dsp_config.field_0x8 = config->field_0x6;
}
dsp_config.field_0xc = config->field_0x3;
dsp_config.field_0x10[0] = config->field_0x8[0];
dsp_config.field_0x10[1] = config->field_0x8[1];
dsp_config.field_0x10[2] = config->field_0x8[2];
dsp_config.field_0x10[3] = config->field_0x8[3];
dsp_config.field_0x10[4] = config->field_0x8[4];
dsp_config.field_0x10[5] = config->field_0x8[5];
dsp_config.field_0x10[6] = config->field_0x8[6];
dsp_config.field_0x10[7] = config->field_0x8[7];
JASDsp::setFXLine(buf1, (s16*)mFxLineBuffer[buf1], &dsp_config);
dsp_config.field_0x0 = config->field_0x18;
dsp_config.field_0x2 = config->field_0x19;
dsp_config.field_0x6 = config->field_0x1a;
if (param_2) {
dsp_config.field_0x4 = 0;
dsp_config.field_0x8 = 0;
} else {
dsp_config.field_0x4 = config->field_0x1c;
dsp_config.field_0x8 = config->field_0x1e;
}
dsp_config.field_0xc = config->field_0x1b;
dsp_config.field_0x10[0] = config->field_0x20[0];
dsp_config.field_0x10[1] = config->field_0x20[1];
dsp_config.field_0x10[2] = config->field_0x20[2];
dsp_config.field_0x10[3] = config->field_0x20[3];
dsp_config.field_0x10[4] = config->field_0x20[4];
dsp_config.field_0x10[5] = config->field_0x20[5];
dsp_config.field_0x10[6] = config->field_0x20[6];
dsp_config.field_0x10[7] = config->field_0x20[7];
JASDsp::setFXLine(buf2, (s16*)mFxLineBuffer[buf2], &dsp_config);
}
/* 802BAE1C-802BAE48 2B575C 002C+00 0/0 1/1 0/0 .text setFxForceOff__11Z2FxLineMgrFb */
void Z2FxLineMgr::setFxForceOff(bool param_0) {
setLineID(mLineID, true, param_0);
}
/* 802BAE48-802BAEB8 2B5788 0070+00 0/0 1/1 0/0 .text setUnderWaterFx__11Z2FxLineMgrFb */
void Z2FxLineMgr::setUnderWaterFx(bool isUnderWaterFx) {
if (mSetUnderWaterFx != isUnderWaterFx) {
if (isUnderWaterFx) {
OS_REPORT("[Z2FxLineMgr::setUnderWaterFx] → underWaterFx!\n");
setLineID(12, true, false);
} else {
OS_REPORT("[Z2FxLineMgr::setUnderWaterFx] → sceneFx!\n");
setSceneFx(Z2GetSceneMgr()->getCurrentSceneNum());
}
mSetUnderWaterFx = isUnderWaterFx;
}
}
/* 802BAEB8-802BB00C 2B57F8 0154+00 2/1 1/1 0/0 .text setSceneFx__11Z2FxLineMgrFl */
void Z2FxLineMgr::setSceneFx(s32 sceneNo) {
if (Z2GetSceneMgr()->isInDarkness()) {
setLineID(11, true, false);
} else {
switch (sceneNo) {
case Z2SCENE_SHADES_REALM:
setLineID(9, true, false);
break;
case Z2SCENE_KAKARIKO_VILLAGE:
case Z2SCENE_DEATH_MOUNTAIN:
case Z2SCENE_HIDDEN_VILLAGE:
case Z2SCENE_ZORAS_RIVER:
case Z2SCENE_HYRULE_FIELD:
setLineID(10, true, false);
break;
case Z2SCENE_SACRED_GROVE:
case Z2SCENE_FOREST_TEMPLE:
case Z2SCENE_FOREST_TEMPLE_MINIBOSS:
case Z2SCENE_FOREST_TEMPLE_BOSS:
case Z2SCENE_GORGE_LANTERN_CAVE:
case Z2SCENE_LAKE_LANTERN_CAVE:
case Z2SCENE_FARON_WOODS_CAVE:
if (Z2GetSceneMgr()->getCurrentRoomNum() == 2) {
return;
}
// fallthrough
case Z2SCENE_FARON_WOODS:
setLineID(1, true, false);
break;
case Z2SCENE_GORON_MINES:
case Z2SCENE_GORON_MINES_MINIBOSS:
case Z2SCENE_GORON_MINES_BOSS:
case Z2SCENE_ELDIN_MAGNET_CAVE:
setLineID(2, true, false);
break;
case Z2SCENE_LAKE_HYLIA:
case Z2SCENE_LAKEBED_TEMPLE:
case Z2SCENE_LAKEBED_TEMPLE_MINIBOSS:
case Z2SCENE_LAKEBED_TEMPLE_BOSS:
if (Z2GetSceneMgr()->getCurrentRoomNum() == 1) {
setLineID(3, true, false);
}
break;
case Z2SCENE_ARBITERS_GROUNDS:
case Z2SCENE_ARBITERS_GROUNDS_MINIBOSS:
case Z2SCENE_ARBITERS_GROUNDS_BOSS:
setLineID(4, true, false);
break;
case Z2SCENE_SNOWPEAK_RUINS:
case Z2SCENE_SNOWPEAK_RUINS_MINIBOSS:
case Z2SCENE_SNOWPEAK_RUINS_BOSS:
case Z2SCENE_ICE_BLOCK_PUZZLE:
setLineID(5, true, false);
break;
case Z2SCENE_TEMPLE_OF_TIME:
case Z2SCENE_TEMPLE_OF_TIME_MINIBOSS:
case Z2SCENE_TEMPLE_OF_TIME_BOSS:
setLineID(6, true, false);
break;
case Z2SCENE_CITY_IN_THE_SKY:
case Z2SCENE_CITY_IN_THE_SKY_MINIBOSS:
case Z2SCENE_CITY_IN_THE_SKY_BOSS:
setLineID(7, true, false);
break;
case Z2SCENE_HYRULE_CASTLE:
case Z2SCENE_FINAL_BATTLE_THRONE_ROOM:
setLineID(8, true, false);
break;
default:
setLineID(-1, true, false);
break;
}
}
}
|