papermario/src/effects/chapter_change.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