mirror of https://github.com/pmret/papermario.git
320 lines
8.6 KiB
C
320 lines
8.6 KiB
C
#include "common.h"
|
|
#include "effects_internal.h"
|
|
#include "message_ids.h"
|
|
|
|
typedef struct {
|
|
/* 0x00 */ Gfx* displayList;
|
|
/* 0x04 */ s16 x;
|
|
/* 0x06 */ s16 y;
|
|
/* 0x08 */ s16 width;
|
|
/* 0x0A */ s16 height;
|
|
} UnkStruct; // size: 0xC
|
|
|
|
extern Gfx D_0900BE40_3F7CA0[];
|
|
extern Gfx D_0900BE88_3F7CE8[];
|
|
extern Gfx D_0900BED0_3F7D30[];
|
|
extern Gfx D_0900BF18_3F7D78[];
|
|
extern Gfx D_0900BF60_3F7DC0[];
|
|
extern Gfx D_0900BFA8_3F7E08[];
|
|
extern Gfx D_0900BFF0_3F7E50[];
|
|
extern Gfx D_0900C038_3F7E98[];
|
|
extern Gfx D_0900C080_3F7EE0[];
|
|
extern Gfx D_0900C168_3F7FC8[];
|
|
extern Gfx D_0900C1B0_3F8010[];
|
|
extern Gfx D_0900C1F8_3F8058[];
|
|
extern Gfx D_0900C240_3F80A0[];
|
|
extern Gfx D_0900C328_3F8188[];
|
|
extern Gfx D_0900C370_3F81D0[];
|
|
extern Gfx D_0900C458_3F82B8[];
|
|
extern Gfx D_0900C540_3F83A0[];
|
|
|
|
s32 D_E010E750[] = {
|
|
-1,
|
|
MSG_Menus_019D, MSG_Menus_019E, MSG_Menus_019F,
|
|
MSG_Menus_01A0, MSG_Menus_01A1, MSG_Menus_01A2,
|
|
MSG_Menus_01A3, MSG_Menus_01A4, MSG_Menus_019C,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1
|
|
};
|
|
|
|
UnkStruct D_E010E79C[] = {
|
|
{ D_0900C080_3F7EE0, 104, 0, 128, 10 },
|
|
{ D_0900C168_3F7FC8, 104, 10, 128, 10 },
|
|
{ D_0900C1B0_3F8010, 104, 20, 128, 10 },
|
|
{ D_0900C1F8_3F8058, 104, 30, 128, 10 },
|
|
{ NULL, 0, 0, 0, 0 }
|
|
};
|
|
|
|
UnkStruct D_E010E7D8[] = {
|
|
{ D_0900C458_3F82B8, -16, -6, 144, 20 },
|
|
{ D_0900C540_3F83A0, -16, 14, 144, 20 },
|
|
{ NULL, 0, 0, 0, 0 }
|
|
};
|
|
|
|
UnkStruct D_E010E7FC[] = {
|
|
{ D_0900C080_3F7EE0, 0, -6, 128, 10 },
|
|
{ D_0900C168_3F7FC8, 0, 4, 128, 10 },
|
|
{ D_0900C1B0_3F8010, 0, 14, 128, 10 },
|
|
{ D_0900C1F8_3F8058, 0, 24, 128, 10 },
|
|
{ NULL, 0, 0, 0, 0 }
|
|
};
|
|
|
|
UnkStruct D_E010E838[] = {
|
|
{ D_0900C240_3F80A0, 0, 0, 104, 20 },
|
|
{ D_0900C328_3F8188, 0, 20, 104, 20 },
|
|
{ D_0900C370_3F81D0, 232, 0, 16, 40 },
|
|
{ NULL, 0, 0, 0, 0 }
|
|
};
|
|
|
|
#if VERSION_PAL
|
|
UnkStruct D_E010E838_b[] = {
|
|
{ D_0900C080_3F7EE0, 0, 0, 128, 10 },
|
|
{ D_0900C168_3F7FC8, 0, 10, 128, 10 },
|
|
{ D_0900C1B0_3F8010, 0, 20, 128, 10 },
|
|
{ D_0900C1F8_3F8058, 0, 30, 128, 10 },
|
|
{ NULL, 0, 0, 0, 0 }
|
|
};
|
|
|
|
UnkStruct D_E010E838_c[] = {
|
|
{ D_0900C240_3F80A0, 128, 0, 104, 20 },
|
|
{ D_0900C328_3F8188, 128, 20, 104, 20 },
|
|
{ D_0900C370_3F81D0, 232, 0, 16, 40 },
|
|
{ NULL, 0, 0, 0, 0 }
|
|
};
|
|
#endif
|
|
|
|
UnkStruct D_E010E868[] = {
|
|
{ D_0900BE40_3F7CA0, 128, -33, 64, 64 },
|
|
{ NULL, 0, 0, 0, 0 },
|
|
{ D_0900BE88_3F7CE8, 128, -33, 64, 64 },
|
|
{ NULL, 0, 0, 0, 0 },
|
|
{ D_0900BED0_3F7D30, 128, -33, 64, 64 },
|
|
{ NULL, 0, 0, 0, 0 },
|
|
{ D_0900BF18_3F7D78, 128, -33, 64, 64 },
|
|
{ NULL, 0, 0, 0, 0 },
|
|
{ D_0900BF60_3F7DC0, 128, -33, 64, 64 },
|
|
{ NULL, 0, 0, 0, 0 },
|
|
{ D_0900BFA8_3F7E08, 128, -33, 64, 64 },
|
|
{ NULL, 0, 0, 0, 0 },
|
|
{ D_0900BFF0_3F7E50, 128, -33, 64, 64 },
|
|
{ NULL, 0, 0, 0, 0 },
|
|
{ D_0900C038_3F7E98, 128, -33, 64, 64 },
|
|
{ NULL, 0, 0, 0, 0 }
|
|
};
|
|
|
|
#if VERSION_PAL
|
|
u32 pal_data[] = {
|
|
0x00000000,
|
|
0x00000000,
|
|
0x00000000,
|
|
0xE010E61C,
|
|
0xE010E5E4,
|
|
0xE010E5E4,
|
|
0xE010E5E4,
|
|
0xE010E5E4,
|
|
0xE010E5E4,
|
|
0xE010E5E4,
|
|
0xE010E5E4,
|
|
0xE010E5E4,
|
|
0xE010E60C,
|
|
0xE010E61C,
|
|
0xE010E61C,
|
|
0xE010E61C,
|
|
0xE010E61C,
|
|
0xE010E61C,
|
|
0xE010E61C,
|
|
0xE010E61C,
|
|
0xE010E61C,
|
|
0xE010E61C,
|
|
0x00000000,
|
|
};
|
|
#endif
|
|
|
|
void chapter_change_init(EffectInstance* effect);
|
|
void chapter_change_update(EffectInstance* effect);
|
|
void chapter_change_render(EffectInstance* effect);
|
|
void chapter_change_appendGfx(void* effect);
|
|
void shim_draw_msg(s32, s32, s32, s32, s32, s32);
|
|
s32 shim_get_msg_width(s32, u16);
|
|
|
|
void func_E010E000(ChapterChangeFXData* data, s32 arg1, UnkStruct* arg2) {
|
|
s32 unk_1C = data->lifetime;
|
|
UnkStruct* it;
|
|
f32 posX;
|
|
f32 posY;
|
|
s32 temp;
|
|
|
|
if (arg1 == 0) {
|
|
posX = data->chapterPos.x;
|
|
posY = data->chapterPos.y;
|
|
} else {
|
|
posX = data->endOfPos.x;
|
|
posY = data->endOfPos.y;
|
|
}
|
|
|
|
if (arg2 != NULL) {
|
|
for (it = arg2; it->displayList != NULL; it++) {
|
|
gSPDisplayList(gMainGfxPos++, it->displayList);
|
|
|
|
temp = it->x - 384;
|
|
gDPSetTileSize(gMainGfxPos++, 1, (unk_1C * 4 - temp) * 4, 0, (unk_1C * 4 - it->x + 511) * 4, 0);
|
|
gSPScisTextureRectangle(gMainGfxPos++,
|
|
(posX + it->x) * 4,
|
|
(posY + it->y) * 4,
|
|
(posX + it->x + it->width) * 4,
|
|
(posY + it->y + it->height) * 4,
|
|
G_TX_RENDERTILE, 0, 0, 1024, 1024);
|
|
}
|
|
|
|
gDPPipeSync(gMainGfxPos++);
|
|
}
|
|
}
|
|
|
|
EffectInstance* chapter_change_main(s32 arg0, f32 posX, f32 posY, f32 arg3, f32 arg4, s32 duration) {
|
|
EffectBlueprint bp;
|
|
ChapterChangeFXData* data;
|
|
EffectInstance* effect;
|
|
s32 numParts = 1;
|
|
|
|
bp.init = chapter_change_init;
|
|
bp.update = chapter_change_update;
|
|
bp.renderWorld = chapter_change_render;
|
|
bp.unk_00 = 0;
|
|
bp.unk_14 = NULL;
|
|
bp.effectID = EFFECT_CHAPTER_CHANGE;
|
|
|
|
effect = shim_create_effect_instance(&bp);
|
|
effect->numParts = numParts;
|
|
data = effect->data.chapterChange = shim_general_heap_malloc(numParts * sizeof(*data));
|
|
ASSERT(effect->data.chapterChange != NULL);
|
|
|
|
data->unk_00 = arg0;
|
|
data->lifetime = 0;
|
|
if (duration <= 0) {
|
|
data->timeLeft = 1000;
|
|
} else {
|
|
data->timeLeft = duration;
|
|
}
|
|
data->chapterPos.x = data->endOfPos.x = posX;
|
|
data->chapterPos.y = data->endOfPos.y = posY;
|
|
data->unk_0C = arg3;
|
|
data->unk_50 = arg4;
|
|
data->unk_20 = 255;
|
|
data->unk_24 = 255;
|
|
data->unk_28 = 255;
|
|
data->unk_2C = 255;
|
|
data->unk_30 = 0;
|
|
data->unk_34 = 0;
|
|
data->unk_38 = 0;
|
|
if (arg0 == 0 || (arg0 >= 10 && arg0 <= 18)) {
|
|
data->unk_3C = 0;
|
|
} else {
|
|
data->unk_3C = 255;
|
|
}
|
|
data->unk_54 = D_E010E750[arg0];
|
|
if (data->unk_54 >= 0) {
|
|
data->unk_40 = 160;
|
|
data->unk_44 = 160;
|
|
data->unk_48 = shim_get_msg_width(data->unk_54, 0);
|
|
data->unk_4C = 24;
|
|
}
|
|
|
|
return effect;
|
|
}
|
|
|
|
void chapter_change_init(EffectInstance* effect) {
|
|
}
|
|
|
|
void chapter_change_update(EffectInstance* effect) {
|
|
ChapterChangeFXData* data = effect->data.chapterChange;
|
|
|
|
if (effect->flags & EFFECT_INSTANCE_FLAG_10) {
|
|
effect->flags &= ~EFFECT_INSTANCE_FLAG_10;
|
|
data->timeLeft = 16;
|
|
}
|
|
|
|
if (data->timeLeft < 1000) {
|
|
data->timeLeft--;
|
|
}
|
|
|
|
data->lifetime++;
|
|
|
|
if (data->timeLeft < 0) {
|
|
shim_remove_effect(effect);
|
|
}
|
|
}
|
|
|
|
void chapter_change_render(EffectInstance* effect) {
|
|
RenderTask renderTask;
|
|
RenderTask* retTask;
|
|
|
|
renderTask.appendGfx = chapter_change_appendGfx;
|
|
renderTask.appendGfxArg = effect;
|
|
renderTask.distance = 10;
|
|
renderTask.renderMode = RENDER_MODE_2D;
|
|
|
|
retTask = shim_queue_render_task(&renderTask);
|
|
retTask->renderMode |= RENDER_TASK_FLAG_REFLECT_FLOOR;
|
|
}
|
|
|
|
#if VERSION_PAL
|
|
INCLUDE_ASM(void, "effects/chapter_change", chapter_change_appendGfx);
|
|
#else
|
|
void chapter_change_appendGfx(void* effect) {
|
|
ChapterChangeFXData* data = ((EffectInstance*)effect)->data.chapterChange;
|
|
s32 unk_2C = data->unk_2C;
|
|
u32 unk_00 = data->unk_00;
|
|
UnkStruct* ptr0;
|
|
UnkStruct* ptr1;
|
|
|
|
gDPPipeSync(gMainGfxPos++);
|
|
gSPSegment(gMainGfxPos++, 0x09, VIRTUAL_TO_PHYSICAL(((EffectInstance*)effect)->graphics->data));
|
|
|
|
switch (unk_00) {
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
ptr0 = D_E010E7FC;
|
|
ptr1 = &D_E010E868[(unk_00 - 1) * 2];
|
|
break;
|
|
case 9:
|
|
ptr0 = D_E010E7D8;
|
|
ptr1 = NULL;
|
|
break;
|
|
case 0:
|
|
case 10:
|
|
case 11:
|
|
case 12:
|
|
case 13:
|
|
case 14:
|
|
case 15:
|
|
case 16:
|
|
case 17:
|
|
case 18:
|
|
ptr0 = D_E010E79C;
|
|
ptr1 = D_E010E838;
|
|
break;
|
|
default:
|
|
ptr1 = NULL;
|
|
ptr0 = NULL;
|
|
break;
|
|
}
|
|
|
|
gDPSetPrimColor(gMainGfxPos++, 0, 0, data->unk_20, data->unk_24, data->unk_28, unk_2C);
|
|
gDPSetEnvColor(gMainGfxPos++, data->unk_30, data->unk_34, data->unk_38, data->unk_3C);
|
|
|
|
func_E010E000(data, 0, ptr0);
|
|
func_E010E000(data, 1, ptr1);
|
|
|
|
if (data->unk_54 >= 0) {
|
|
shim_draw_msg(data->unk_54, data->unk_40 - data->unk_48, data->unk_44, 255, 21, 0);
|
|
}
|
|
|
|
gDPPipeSync(gMainGfxPos++);
|
|
}
|
|
#endif
|