mirror of https://github.com/pmret/papermario.git
846 lines
31 KiB
C
846 lines
31 KiB
C
#include "dro_02.h"
|
|
#include "model.h"
|
|
|
|
// cards used during Merlee's ritual
|
|
typedef struct RitualCard {
|
|
/* 0x00 */ s32 unk_00;
|
|
/* 0x04 */ Vec3f pos;
|
|
/* 0x10 */ f32 yaw;
|
|
/* 0x14 */ f32 pitch;
|
|
/* 0x18 */ s32 spriteID;
|
|
/* 0x1C */ s32 rasterIndex;
|
|
/* 0x20 */ s32 xoffset;
|
|
} RitualCard; // size = 0x24
|
|
|
|
BSS Evt* N(CreatorScript);
|
|
|
|
// this buffer is used as an array in scripts managaing the ritual scene
|
|
// values are enumerated below
|
|
BSS s32 N(RitualBuffer)[16];
|
|
|
|
enum {
|
|
RITUAL_VAR_FOLDER_1 = ArrayVar(0),
|
|
RITUAL_VAR_FOLDER_2 = ArrayVar(1),
|
|
RITUAL_VAR_FOLDER_3 = ArrayVar(2),
|
|
RITUAL_VAR_FOLDER_4 = ArrayVar(3),
|
|
RITUAL_VAR_POS_X = ArrayVar(4),
|
|
RITUAL_VAR_POS_Y = ArrayVar(5),
|
|
RITUAL_VAR_POS_Z = ArrayVar(6),
|
|
RITUAL_VAR_WORKER = ArrayVar(7),
|
|
RITUAL_VAR_ORB_EFFECT = ArrayVar(8),
|
|
RITUAL_VAR_STATE = ArrayVar(9),
|
|
};
|
|
|
|
enum {
|
|
RITUAL_STATE_INIT = 0,
|
|
RITUAL_STATE_APPEAR = 1,
|
|
RITUAL_STATE_2 = 2,
|
|
RITUAL_STATE_3 = 3,
|
|
RITUAL_STATE_4 = 4,
|
|
RITUAL_STATE_FLIP_LEFT = 5,
|
|
RITUAL_STATE_FLIP_MIDDLE = 6,
|
|
RITUAL_STATE_FLIP_RIGHT = 7,
|
|
RITUAL_STATE_8 = 8,
|
|
RITUAL_STATE_9 = 9,
|
|
RITUAL_STATE_A = 10,
|
|
RITUAL_STATE_B = 11,
|
|
RITUAL_STATE_C = 12,
|
|
RITUAL_STATE_D = 13,
|
|
};
|
|
|
|
BSS RitualCard N(RitualCards)[3];
|
|
MAP_STATIC_PAD(1,merlee);
|
|
|
|
s8 N(MerleeSpellCasts)[] = {
|
|
20, 10, 5, 0,
|
|
};
|
|
|
|
s8 N(MerleeCoinCosts)[] = {
|
|
50, 20, 5, 0,
|
|
};
|
|
|
|
#if !VERSION_PAL
|
|
s32 N(pad_XX111)[] = { 0 };
|
|
#endif
|
|
|
|
#include "world/area_dro/dro_02/card.png.inc.c"
|
|
#include "world/area_dro/dro_02/card.pal.inc.c"
|
|
#include "world/area_dro/dro_02/card_1.vtx.inc.c"
|
|
#include "world/area_dro/dro_02/card_2.vtx.inc.c"
|
|
#include "world/area_dro/dro_02/card_setup.gfx.inc.c"
|
|
#include "world/area_dro/dro_02/card_1.gfx.inc.c"
|
|
#include "world/area_dro/dro_02/card_2.gfx.inc.c"
|
|
|
|
void N(card_worker_update)(void);
|
|
void N(card_worker_render)(void);
|
|
|
|
API_CALLABLE(N(TryEnchantPlayer)) {
|
|
PlayerData* playerData = &gPlayerData;
|
|
Bytecode* args = script->ptrReadPos;
|
|
s32 tier = evt_get_variable(script, *args++);
|
|
s32 outPrevented = *args++;
|
|
u8 coins = N(MerleeCoinCosts)[tier];
|
|
u8 casts = N(MerleeSpellCasts)[tier];
|
|
|
|
if (playerData->coins < coins) {
|
|
evt_set_variable(script, outPrevented, TRUE);
|
|
} else {
|
|
playerData->coins = playerData->coins - coins;
|
|
if (playerData->merleeCastsLeft < casts) {
|
|
playerData->merleeCastsLeft = casts;
|
|
}
|
|
playerData->merleeTurnCount = rand_int(2) + 1;
|
|
switch (rand_int(3)) {
|
|
case 0:
|
|
playerData->merleeSpellType = MERLEE_SPELL_1;
|
|
break;
|
|
case 1:
|
|
playerData->merleeSpellType = MERLEE_SPELL_2;
|
|
break;
|
|
case 2:
|
|
playerData->merleeSpellType = MERLEE_SPELL_EXP_BOOST;
|
|
break;
|
|
case 3:
|
|
playerData->merleeSpellType = MERLEE_SPELL_COIN_BOOST;
|
|
break;
|
|
}
|
|
evt_set_variable(script, outPrevented, FALSE);
|
|
}
|
|
|
|
return ApiStatus_DONE2;
|
|
}
|
|
|
|
API_CALLABLE(N(DarkenWorld)) {
|
|
s32 i;
|
|
|
|
if (isInitialCall) {
|
|
mdl_set_all_fog_mode(FOG_MODE_1);
|
|
*gBackgroundFogModePtr = FOG_MODE_1;
|
|
set_background_color_blend(0, 0, 0, 0);
|
|
|
|
for (i = 0; i < MAX_NPCS; i++) {
|
|
Npc* npc = get_npc_by_index(i);
|
|
if (npc != 0 && npc->flags != 0 && npc->npcID != NPC_PARTNER && npc->npcID != NPC_Merlee) {
|
|
npc->flags |= NPC_FLAG_HIDING;
|
|
}
|
|
}
|
|
script->functionTemp[0] = 0;
|
|
}
|
|
|
|
script->functionTemp[0] += 8;
|
|
if (script->functionTemp[0] > 255) {
|
|
script->functionTemp[0] = 255;
|
|
}
|
|
set_background_color_blend(0, 0, 0, script->functionTemp[0]);
|
|
|
|
return (script->functionTemp[0] == 255) * ApiStatus_DONE2;
|
|
}
|
|
|
|
API_CALLABLE(N(UndarkenWorld)) {
|
|
s32 i;
|
|
|
|
if (isInitialCall) {
|
|
set_background_color_blend(0, 0, 0, 255);
|
|
script->functionTemp[0] = 255;
|
|
script->functionTemp[1] = 0;
|
|
}
|
|
script->functionTemp[0] -= 8;
|
|
if (script->functionTemp[0] < 0) {
|
|
script->functionTemp[0] = 0;
|
|
}
|
|
set_background_color_blend(0, 0, 0, script->functionTemp[0]);
|
|
|
|
if (script->functionTemp[0] == 0 && script->functionTemp[1] == 0) {
|
|
script->functionTemp[1] = 1;
|
|
} else if (script->functionTemp[1] == 1) {
|
|
mdl_set_all_fog_mode(FOG_MODE_0);
|
|
*gBackgroundFogModePtr = FOG_MODE_0;
|
|
for (i = 0; i < MAX_NPCS; i++) {
|
|
Npc* npc = get_npc_by_index(i);
|
|
|
|
if (npc != NULL && npc->flags != 0 && npc->npcID != NPC_PARTNER && npc->npcID != NPC_Merlee) {
|
|
npc->flags &= ~NPC_FLAG_HIDING;
|
|
}
|
|
}
|
|
return ApiStatus_DONE2;
|
|
}
|
|
return ApiStatus_BLOCK;
|
|
}
|
|
|
|
API_CALLABLE(N(CreateRitualCards)) {
|
|
s32 imgfxIdx;
|
|
|
|
N(CreatorScript) = script;
|
|
|
|
imgfxIdx = imgfx_get_free_instances(1);
|
|
imgfx_update(imgfxIdx, IMGFX_SET_ANIM, IMGFX_ANIM_SHUFFLE_CARDS, 1, 1, 0, IMGFX_FLAG_800);
|
|
evt_set_variable(script, RITUAL_VAR_FOLDER_1, imgfxIdx);
|
|
imgfxIdx = imgfx_get_free_instances(1);
|
|
imgfx_update(imgfxIdx, IMGFX_SET_ANIM, IMGFX_ANIM_FLIP_CARD_1, 1, 1, 0, IMGFX_FLAG_800);
|
|
evt_set_variable(script, RITUAL_VAR_FOLDER_2, imgfxIdx);
|
|
imgfxIdx = imgfx_get_free_instances(1);
|
|
imgfx_update(imgfxIdx, IMGFX_SET_ANIM, IMGFX_ANIM_FLIP_CARD_2, 1, 1, 0, IMGFX_FLAG_800);
|
|
evt_set_variable(script, RITUAL_VAR_FOLDER_3, imgfxIdx);
|
|
imgfxIdx = imgfx_get_free_instances(1);
|
|
imgfx_update(imgfxIdx, IMGFX_SET_ANIM, IMGFX_ANIM_FLIP_CARD_3, 1, 1, 0, IMGFX_FLAG_800);
|
|
evt_set_variable(script, RITUAL_VAR_FOLDER_4, imgfxIdx);
|
|
|
|
evt_set_variable(script, RITUAL_VAR_WORKER, create_worker_world(
|
|
N(card_worker_update),
|
|
N(card_worker_render)));
|
|
return ApiStatus_DONE2;
|
|
}
|
|
|
|
API_CALLABLE(N(DestroyRitualCards)) {
|
|
imgfx_release_instance(evt_get_variable(script, RITUAL_VAR_FOLDER_1));
|
|
imgfx_release_instance(evt_get_variable(script, RITUAL_VAR_FOLDER_2));
|
|
imgfx_release_instance(evt_get_variable(script, RITUAL_VAR_FOLDER_3));
|
|
imgfx_release_instance(evt_get_variable(script, RITUAL_VAR_FOLDER_4));
|
|
free_worker(evt_get_variable(script, RITUAL_VAR_WORKER));
|
|
return ApiStatus_DONE2;
|
|
}
|
|
|
|
u32 N(appendGfx_ritual_card)(RitualCard* card, Matrix4f mtxParent) {
|
|
Matrix4f mtxTransform;
|
|
Matrix4f mtxTemp;
|
|
ImgFXTexture ifxImg;
|
|
SpriteRasterInfo rasterInfo;
|
|
s32 ret;
|
|
|
|
if (card->unk_00 == 0) {
|
|
return 1;
|
|
}
|
|
|
|
gSPDisplayList(gMainGfxPos++, N(card_setup_gfx));
|
|
|
|
if (card->unk_00 == 1 || card->unk_00 == 4 || card->unk_00 == 5) {
|
|
guTranslateF(mtxTemp, card->pos.x, card->pos.y, card->pos.z);
|
|
guMtxCatF(mtxTemp, mtxParent, mtxTransform);
|
|
guRotateF(mtxTemp, card->yaw, 0.0f, 1.0f, 0.0f);
|
|
guMtxCatF(mtxTemp, mtxTransform, mtxTransform);
|
|
guRotateF(mtxTemp, card->pitch, 1.0f, 0.0f, 0.0f);
|
|
guMtxCatF(mtxTemp, mtxTransform, mtxTransform);
|
|
guMtxF2L(mtxTransform, &gDisplayContext->matrixStack[gMatrixListPos]);
|
|
gSPMatrix(gMainGfxPos++, VIRTUAL_TO_PHYSICAL(&gDisplayContext->matrixStack[gMatrixListPos++]), G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
|
|
if (card->unk_00 == 1 || card->unk_00 == 4) {
|
|
gSPDisplayList(gMainGfxPos++, N(card_1_gfx));
|
|
}
|
|
|
|
if (card->unk_00 == 1 || card->unk_00 == 5) {
|
|
spr_get_player_raster_info(&rasterInfo, card->spriteID, card->rasterIndex);
|
|
gDPSetTextureLUT(gMainGfxPos++, G_TT_RGBA16);
|
|
gDPLoadTLUT_pal16(gMainGfxPos++, 0, rasterInfo.defaultPal);
|
|
gDPLoadTextureTile_4b(gMainGfxPos++, rasterInfo.raster, G_IM_FMT_CI, rasterInfo.width, rasterInfo.height,
|
|
0, 0, rasterInfo.width - 1, rasterInfo.height - 1, 0,
|
|
G_TX_CLAMP, G_TX_CLAMP, 8, 8, G_TX_NOLOD, G_TX_NOLOD);
|
|
guTranslateF(mtxTransform, card->xoffset + 30 - rasterInfo.width / 2, 0.0f, 0.0f);
|
|
guMtxF2L(mtxTransform, &gDisplayContext->matrixStack[gMatrixListPos]);
|
|
gSPMatrix(gMainGfxPos++, VIRTUAL_TO_PHYSICAL(&gDisplayContext->matrixStack[gMatrixListPos++]), G_MTX_PUSH | G_MTX_MUL | G_MTX_MODELVIEW);
|
|
gSPDisplayList(gMainGfxPos++, N(card_2_gfx));
|
|
gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
|
|
}
|
|
gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
|
|
return 1;
|
|
}
|
|
|
|
if (card->unk_00 == 2) {
|
|
gDPSetTileSize(gMainGfxPos++, G_TX_RENDERTILE, 256 * 4, 256 * 4, 287 * 4, 287 * 4);
|
|
guTranslateF(mtxTemp, N(RitualCards)[0].pos.x, N(RitualCards)[0].pos.y, N(RitualCards)[0].pos.z);
|
|
guMtxCatF(mtxTemp, mtxParent, mtxTransform);
|
|
guMtxF2L(mtxTransform, &gDisplayContext->matrixStack[gMatrixListPos]);
|
|
gSPMatrix(gMainGfxPos++, VIRTUAL_TO_PHYSICAL(&gDisplayContext->matrixStack[gMatrixListPos++]), G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
ret = imgfx_appendGfx_component(evt_get_variable(N(CreatorScript), RITUAL_VAR_FOLDER_1), &ifxImg, IMGFX_FLAG_SKIP_GFX_SETUP | IMGFX_FLAG_SKIP_TEX_SETUP, mtxTransform);
|
|
gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
|
|
return ret;
|
|
}
|
|
|
|
if (card->unk_00 == 3) {
|
|
gDPSetTileSize(gMainGfxPos++, G_TX_RENDERTILE, 256 * 4, 256 * 4, 287 * 4, 287 * 4);
|
|
guTranslateF(mtxTemp, N(RitualCards)[0].pos.x, N(RitualCards)[0].pos.y, N(RitualCards)[0].pos.z);
|
|
guMtxCatF(mtxTemp, mtxParent, mtxTransform);
|
|
guMtxF2L(mtxTransform, &gDisplayContext->matrixStack[gMatrixListPos]);
|
|
gSPMatrix(gMainGfxPos++, VIRTUAL_TO_PHYSICAL(&gDisplayContext->matrixStack[gMatrixListPos++]), G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
imgfx_appendGfx_component(evt_get_variable(N(CreatorScript), RITUAL_VAR_FOLDER_2), &ifxImg, IMGFX_FLAG_SKIP_GFX_SETUP | IMGFX_FLAG_SKIP_TEX_SETUP, mtxTransform);
|
|
imgfx_appendGfx_component(evt_get_variable(N(CreatorScript), RITUAL_VAR_FOLDER_3), &ifxImg, IMGFX_FLAG_SKIP_GFX_SETUP | IMGFX_FLAG_SKIP_TEX_SETUP, mtxTransform);
|
|
gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
|
|
guTranslateF(mtxTemp, N(RitualCards)[0].pos.x, N(RitualCards)[0].pos.y, N(RitualCards)[0].pos.z);
|
|
guMtxCatF(mtxTemp, mtxParent, mtxTransform);
|
|
guMtxF2L(mtxTransform, &gDisplayContext->matrixStack[gMatrixListPos]);
|
|
gSPMatrix(gMainGfxPos++, VIRTUAL_TO_PHYSICAL(&gDisplayContext->matrixStack[gMatrixListPos++]), G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
spr_get_player_raster_info(&rasterInfo, card->spriteID, card->rasterIndex);
|
|
ifxImg.raster = rasterInfo.raster;
|
|
ifxImg.palette = rasterInfo.defaultPal;
|
|
ifxImg.width = rasterInfo.width;
|
|
ifxImg.height = rasterInfo.height;
|
|
ifxImg.xOffset = -(rasterInfo.width / 2);
|
|
ifxImg.yOffset = rasterInfo.height / 2;
|
|
ifxImg.alpha = 255;
|
|
ret = imgfx_appendGfx_component(evt_get_variable(N(CreatorScript), RITUAL_VAR_FOLDER_4), &ifxImg, IMGFX_FLAG_SKIP_GFX_SETUP, mtxTransform);
|
|
gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
|
|
return ret;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
void N(GetCardOrientation)(s32 index, f32* outX, f32* outY, f32* outZ, f32* outAngle) {
|
|
RitualCard* card;
|
|
Matrix4f mtxTranform;
|
|
Matrix4f mtxTemp;
|
|
Matrix4f mtxParent;
|
|
|
|
guPositionF(mtxParent, 0.0f, -gCameras[gCurrentCameraID].currentYaw, 0.0f, SPRITE_WORLD_SCALE_F,
|
|
evt_get_variable(N(CreatorScript), RITUAL_VAR_POS_X),
|
|
evt_get_variable(N(CreatorScript), RITUAL_VAR_POS_Y),
|
|
evt_get_variable(N(CreatorScript), RITUAL_VAR_POS_Z));
|
|
|
|
card = &N(RitualCards)[index];
|
|
guTranslateF(mtxTemp, card->pos.x, card->pos.y, card->pos.z);
|
|
guMtxCatF(mtxTemp, mtxParent, mtxTranform);
|
|
guRotateF(mtxTemp, card->yaw, 0.0f, 1.0f, 0.0f);
|
|
guMtxCatF(mtxTemp, mtxTranform, mtxTranform);
|
|
guTranslateF(mtxTemp, 0.0f, 0.0f, 1.0f);
|
|
guMtxCatF(mtxTemp, mtxTranform, mtxTranform);
|
|
*outX = mtxTranform[3][0];
|
|
*outY = mtxTranform[3][1];
|
|
*outZ = mtxTranform[3][2];
|
|
*outAngle = clamp_angle(card->yaw);
|
|
}
|
|
|
|
void N(card_worker_update)(void) {
|
|
f32 posX5, posY5, posZ5, yaw5;
|
|
f32 posX6, posY6, posZ6, yaw6;
|
|
f32 posX7, posY7, posZ7, yaw7;
|
|
f32 sp48, sp4C, sp50, sp54;
|
|
f32 sp58, sp5C, sp60, sp64;
|
|
f32 sp68, sp6C, sp70, sp74;
|
|
EffectInstance* effect;
|
|
EnergyInOutFXData* data;
|
|
s32 i, j;
|
|
|
|
switch (evt_get_variable(N(CreatorScript), RITUAL_VAR_STATE)) {
|
|
case RITUAL_STATE_INIT:
|
|
N(RitualStateTime) = 0;
|
|
evt_set_variable(N(CreatorScript), RITUAL_VAR_STATE, RITUAL_STATE_APPEAR);
|
|
N(RitualCards)[0].unk_00 = 1;
|
|
N(RitualCards)[0].pos.x = -200.0f;
|
|
N(RitualCards)[0].pos.y = 0.0f;
|
|
N(RitualCards)[0].pos.z = 0.0f;
|
|
N(RitualCards)[0].pitch = 0.0f;
|
|
N(RitualCards)[0].yaw = 0.0f;
|
|
N(RitualCards)[0].spriteID = 1;
|
|
N(RitualCards)[0].rasterIndex = 12;
|
|
N(RitualCards)[0].xoffset = 2;
|
|
|
|
N(RitualCards)[1].unk_00 = 1;
|
|
N(RitualCards)[1].pos.x = 200.0f;
|
|
N(RitualCards)[1].pos.y = 0.0f;
|
|
N(RitualCards)[1].pos.z = 1.0f;
|
|
N(RitualCards)[1].pitch = 0.0f;
|
|
N(RitualCards)[1].yaw = 0.0f;
|
|
N(RitualCards)[1].spriteID = 1;
|
|
N(RitualCards)[1].rasterIndex = 48;
|
|
N(RitualCards)[1].xoffset = 0;
|
|
|
|
|
|
N(RitualCards)[2].spriteID = 8;
|
|
N(RitualCards)[2].rasterIndex = 5;
|
|
N(RitualCards)[2].unk_00 = 1;
|
|
N(RitualCards)[2].pos.x = 0.0f;
|
|
N(RitualCards)[2].pos.y = 200.0f;
|
|
N(RitualCards)[2].pos.z = 2.0f;
|
|
N(RitualCards)[2].pitch = 0.0f;
|
|
N(RitualCards)[2].yaw = 0.0f;
|
|
N(RitualCards)[2].xoffset = 4;
|
|
break;
|
|
case RITUAL_STATE_APPEAR:
|
|
N(RitualStateTime)++;
|
|
N(RitualCards)[0].pos.x += 10.0f;
|
|
N(RitualCards)[1].pos.x += -10.0f;
|
|
N(RitualCards)[2].pos.y += -10.0f;
|
|
if (N(RitualStateTime) == 18) {
|
|
gPlayerStatus.position.y = NPC_DISPOSE_POS_Y;
|
|
}
|
|
if (N(RitualStateTime) == 20) {
|
|
evt_set_variable(N(CreatorScript), RITUAL_VAR_STATE, RITUAL_STATE_2);
|
|
N(RitualStateTime) = 0;
|
|
}
|
|
break;
|
|
case RITUAL_STATE_2:
|
|
N(RitualCards)[0].unk_00 = 2;
|
|
N(RitualCards)[1].unk_00 = 0;
|
|
N(RitualCards)[2].unk_00 = 0;
|
|
N(RitualCards)[0].pos.x = 0.0f;
|
|
N(RitualCards)[0].pos.y = 0.0f;
|
|
N(RitualCards)[0].pos.z = 0;
|
|
break;
|
|
case RITUAL_STATE_3:
|
|
N(RitualCards)[0].unk_00 = 1;
|
|
N(RitualCards)[1].unk_00 = 1;
|
|
N(RitualCards)[2].unk_00 = 1;
|
|
N(RitualStateTime)++;
|
|
N(RitualCards)[0].pos.x -= 10.0f;
|
|
N(RitualCards)[1].pos.x += 10.0f;
|
|
if (N(RitualStateTime) == 10) {
|
|
N(RitualStateTime) = 0;
|
|
evt_set_variable(N(CreatorScript), RITUAL_VAR_STATE, RITUAL_STATE_4);
|
|
}
|
|
break;
|
|
case RITUAL_STATE_4:
|
|
N(RitualCards)[0].pos.x = -100.0f;
|
|
N(RitualCards)[0].pos.y = 0.0f;
|
|
N(RitualCards)[0].pos.z = 0;
|
|
N(RitualCards)[1].pos.x = 100.0f;
|
|
N(RitualCards)[1].pos.y = 0.0f;
|
|
N(RitualCards)[1].pos.z = 1.0f;
|
|
N(RitualCards)[2].pos.x = 0;
|
|
N(RitualCards)[2].pos.y = 0.0f;
|
|
N(RitualCards)[2].pos.z = 2.0f;
|
|
N(RitualStateTime)++;
|
|
if (N(RitualStateTime) == 20) {
|
|
N(RitualStateTime) = 0;
|
|
evt_set_variable(N(CreatorScript), RITUAL_VAR_STATE, RITUAL_STATE_FLIP_LEFT);
|
|
sfx_play_sound_with_params(SOUND_203, 0, 24, 0);
|
|
}
|
|
break;
|
|
case RITUAL_STATE_FLIP_LEFT:
|
|
N(RitualCards)[0].yaw += 18.0f;
|
|
N(RitualCards)[1].yaw = 0.0f;
|
|
N(RitualCards)[2].yaw = 0.0f;
|
|
N(RitualStateTime)++;
|
|
if (N(RitualStateTime) == 8) {
|
|
N(GetCardOrientation)(0, &posX5, &posY5, &posZ5, &yaw5);
|
|
fx_sparkles(0, posX5, posY5 + 20.0f, posZ5, 30.0f);
|
|
}
|
|
if (N(RitualStateTime) == 10) {
|
|
N(RitualStateTime) = 0;
|
|
evt_set_variable(N(CreatorScript), RITUAL_VAR_STATE, RITUAL_STATE_FLIP_MIDDLE);
|
|
sfx_play_sound_with_params(SOUND_203, 0, 64, 0);
|
|
}
|
|
break;
|
|
case RITUAL_STATE_FLIP_MIDDLE:
|
|
N(RitualCards)[0].yaw += 18.0f;
|
|
N(RitualCards)[1].yaw = 0.0f;
|
|
N(RitualCards)[2].yaw += 18.0f;
|
|
N(RitualStateTime)++;
|
|
if (N(RitualStateTime) == 8) {
|
|
N(GetCardOrientation)(2, &posX6, &posY6, &posZ6, &yaw6);
|
|
fx_sparkles(0, posX6, posY6 + 20.0f, posZ6, 30.0f);
|
|
}
|
|
if (N(RitualStateTime) == 10) {
|
|
N(RitualStateTime) = 0;
|
|
evt_set_variable(N(CreatorScript), RITUAL_VAR_STATE, RITUAL_STATE_FLIP_RIGHT);
|
|
sfx_play_sound_with_params(SOUND_203, 0, 104, 0);
|
|
}
|
|
break;
|
|
case RITUAL_STATE_FLIP_RIGHT:
|
|
N(RitualCards)[0].yaw = 0.0f;
|
|
N(RitualCards)[1].yaw += 18.0f;
|
|
N(RitualCards)[2].yaw += 18.0f;
|
|
N(RitualStateTime)++;
|
|
if (N(RitualStateTime) == 8) {
|
|
N(GetCardOrientation)(1, &posX7, &posY7, &posZ7, &yaw7);
|
|
fx_sparkles(0, posX7, posY7 + 20.0f, posZ7, 30.0f);
|
|
}
|
|
if (N(RitualStateTime) == 10) {
|
|
N(RitualStateTime) = 0;
|
|
evt_set_variable(N(CreatorScript), RITUAL_VAR_STATE, RITUAL_STATE_8);
|
|
}
|
|
break;
|
|
case RITUAL_STATE_8:
|
|
N(RitualCards)[0].yaw = 0.0f;
|
|
N(RitualCards)[1].yaw += 18.0f;
|
|
N(RitualCards)[2].yaw = 0.0f;
|
|
N(RitualStateTime)++;
|
|
if (N(RitualStateTime) == 10) {
|
|
N(RitualStateTime) = 0;
|
|
evt_set_variable(N(CreatorScript), RITUAL_VAR_STATE, RITUAL_STATE_9);
|
|
}
|
|
break;
|
|
case RITUAL_STATE_9:
|
|
N(RitualCards)[0].pos.x += 10.0f;
|
|
N(RitualCards)[0].pos.y = 0.0f;
|
|
N(RitualCards)[0].yaw = 0.0f;
|
|
N(RitualCards)[1].pos.x -= 10.0f;
|
|
N(RitualCards)[1].pos.y = 0.0f;
|
|
N(RitualCards)[1].yaw = 0.0f;
|
|
N(RitualCards)[2].pos.x = 0;
|
|
N(RitualCards)[2].pos.y = 0.0f;
|
|
N(RitualCards)[2].yaw = 0.0f;
|
|
N(RitualStateTime)++;
|
|
if (N(RitualStateTime) == 10) {
|
|
N(RitualStateTime) = 0;
|
|
evt_set_variable(N(CreatorScript), RITUAL_VAR_STATE, RITUAL_STATE_A);
|
|
return;
|
|
}
|
|
break;
|
|
case RITUAL_STATE_A:
|
|
N(RitualCards)[0].unk_00 = 3;
|
|
N(RitualCards)[0].spriteID = 8;
|
|
N(RitualCards)[1].unk_00 = 0;
|
|
N(RitualCards)[2].unk_00 = 0;
|
|
N(RitualCards)[0].rasterIndex = 0x11;
|
|
return;
|
|
case RITUAL_STATE_B:
|
|
N(RitualCards)[0].unk_00 = 4;
|
|
N(RitualCards)[1].unk_00 = 5;
|
|
N(RitualCards)[1].spriteID = 8;
|
|
N(RitualCards)[0].pos.x = 0.0f;
|
|
N(RitualCards)[0].pos.z = 0;
|
|
N(RitualCards)[1].pos.x = 0.0f;
|
|
N(RitualCards)[1].pos.z = 0;
|
|
N(RitualCards)[1].rasterIndex = 10;
|
|
N(RitualCards)[1].xoffset = 0;
|
|
N(RitualStateTime) = 0;
|
|
N(RitualCards)[0].pos.y = 68.0f;
|
|
N(RitualCards)[0].yaw = 180.0f;
|
|
N(RitualCards)[1].pos.y = 68.0f;
|
|
N(RitualCards)[1].yaw = 180.0f;
|
|
evt_set_variable(N(CreatorScript), RITUAL_VAR_STATE, RITUAL_STATE_C);
|
|
N(D_8024EF80) = 0.0f;
|
|
N(D_8024EF84) = 1.0f;
|
|
|
|
N(GetCardOrientation)(1, &sp48, &sp4C, &sp50, &sp54);
|
|
|
|
for (j = 0; j < ARRAY_COUNT(N(D_8024EF90)); j++) {
|
|
s32 i;
|
|
|
|
N(D_8024EF90)[j] = fx_energy_in_out(2, sp48, sp4C + 20.0f, sp50, 8.0f, -1);
|
|
N(D_8024EF90)[j]->data.energyInOut->unk_28 = 215;
|
|
N(D_8024EF90)[j]->data.energyInOut->unk_2C = 55;
|
|
N(D_8024EF90)[j]->data.energyInOut->unk_30 = 255;
|
|
|
|
for (i = 1; i < N(D_8024EF90)[j]->numParts; i++) {
|
|
N(D_8024EF90)[j]->data.energyInOut[i].unk_38 *= 0.1;
|
|
}
|
|
}
|
|
break;
|
|
case RITUAL_STATE_C:
|
|
N(GetCardOrientation)(1, &sp58, &sp5C, &sp60, &sp64);
|
|
|
|
for (j = 0; j < ARRAY_COUNT(N(D_8024EF90)); j++) {
|
|
s32 i;
|
|
|
|
N(D_8024EF90)[j]->data.energyInOut->pos.x = sp58;
|
|
N(D_8024EF90)[j]->data.energyInOut->pos.y = sp5C + 20.0f;
|
|
N(D_8024EF90)[j]->data.energyInOut->pos.z = sp60;
|
|
N(D_8024EF90)[j]->data.energyInOut->scale -= 0.1;
|
|
|
|
if (N(D_8024EF90)[j]->data.energyInOut->scale < 0.1) {
|
|
N(D_8024EF90)[j]->data.energyInOut->scale = 0.1f;
|
|
}
|
|
|
|
for (i = 1; i < N(D_8024EF90)[j]->numParts; i++, data++) {
|
|
N(D_8024EF90)[j]->data.energyInOut[i].unk_38 += 0.01;
|
|
}
|
|
}
|
|
|
|
N(RitualCards)[0].pos.y += N(D_8024EF80);
|
|
N(RitualCards)[1].pos.y += N(D_8024EF84);
|
|
N(D_8024EF80) += 0.4;
|
|
N(D_8024EF84) -= 0.05;
|
|
N(RitualStateTime)++;
|
|
|
|
if (N(RitualCards)[1].pos.y < -5.0f) {
|
|
N(RitualCards)[1].pos.y = -5.0f;
|
|
N(RitualStateTime) = 0;
|
|
evt_set_variable(N(CreatorScript), RITUAL_VAR_STATE, RITUAL_STATE_D);
|
|
N(RitualCards)[0].unk_00 = 0;
|
|
N(RitualCards)[1].unk_00 = 0;
|
|
N(GetCardOrientation)(1, &sp68, &sp6C, &sp70, &sp74);
|
|
fx_sparkles(0, sp68, sp6C + 20.0f, sp70, 30.0f);
|
|
sfx_play_sound(SOUND_206);
|
|
|
|
for (j = 0; j < ARRAY_COUNT(N(D_8024EF90)); j++) {
|
|
N(D_8024EF90)[j]->flags |= EFFECT_INSTANCE_FLAG_10;
|
|
}
|
|
}
|
|
break;
|
|
case 13:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void N(card_worker_render)(void) {
|
|
Matrix4f mtx;
|
|
u32 temp_s1;
|
|
|
|
guPositionF(mtx, 0.0f, -gCameras[gCurrentCameraID].currentYaw, 0.0f, SPRITE_WORLD_SCALE_F,
|
|
evt_get_variable(N(CreatorScript), RITUAL_VAR_POS_X),
|
|
evt_get_variable(N(CreatorScript), RITUAL_VAR_POS_Y),
|
|
evt_get_variable(N(CreatorScript), RITUAL_VAR_POS_Z));
|
|
|
|
temp_s1 = N(appendGfx_ritual_card)(&N(RitualCards)[0], mtx);
|
|
N(appendGfx_ritual_card)(&N(RitualCards)[1], mtx);
|
|
N(appendGfx_ritual_card)(&N(RitualCards)[2], mtx);
|
|
if ((N(RitualCards)[0].unk_00 == 2) && ((temp_s1 - 1) < 2)) {
|
|
evt_set_variable(N(CreatorScript), RITUAL_VAR_STATE, RITUAL_STATE_3);
|
|
}
|
|
if ((N(RitualCards)[0].unk_00 == 3) && ((temp_s1 - 1) < 2)) {
|
|
evt_set_variable(N(CreatorScript), RITUAL_VAR_STATE, RITUAL_STATE_B);
|
|
}
|
|
}
|
|
|
|
API_CALLABLE(N(func_8024303C_96C1FC)) {
|
|
sfx_play_sound_with_params(SOUND_202A, 0, 24, 0);
|
|
return ApiStatus_DONE2;
|
|
}
|
|
|
|
API_CALLABLE(N(func_80243068_96C228)) {
|
|
sfx_play_sound_with_params(SOUND_202B, 0, 104, 0);
|
|
return ApiStatus_DONE2;
|
|
}
|
|
|
|
EvtScript N(EVS_NpcAuxAI_Merlee) = {
|
|
EVT_RETURN
|
|
EVT_END
|
|
};
|
|
|
|
EvtScript N(EVS_NpcAI_Merlee) = {
|
|
EVT_RETURN
|
|
EVT_END
|
|
};
|
|
|
|
EvtScript N(EVS_PerformRitual) = {
|
|
EVT_USE_ARRAY(EVT_PTR(N(RitualBuffer)))
|
|
EVT_SET(RITUAL_VAR_STATE, RITUAL_STATE_INIT)
|
|
EVT_CALL(GetNpcPos, NPC_Merlee, RITUAL_VAR_POS_X, RITUAL_VAR_POS_Y, RITUAL_VAR_POS_Z)
|
|
EVT_ADD(RITUAL_VAR_POS_X, 60)
|
|
EVT_ADD(RITUAL_VAR_POS_Z, 0)
|
|
EVT_CALL(PlaySoundAtNpc, NPC_Merlee, SOUND_201, SOUND_SPACE_MODE_0)
|
|
EVT_THREAD
|
|
EVT_CALL(MakeLerp, 720, 0, 60, EASING_LINEAR)
|
|
EVT_LOOP(0)
|
|
EVT_CALL(UpdateLerp)
|
|
EVT_CALL(SetNpcRotation, NPC_Merlee, 0, LVar0, 0)
|
|
EVT_IF_GT(LVar0, 360)
|
|
EVT_ADD(LVar0, -360)
|
|
EVT_END_IF
|
|
EVT_SWITCH(LVar0)
|
|
EVT_CASE_RANGE(90, 270)
|
|
EVT_SET(LVar2, ANIM_WorldMerlee_SpinBack)
|
|
EVT_CASE_DEFAULT
|
|
EVT_SET(LVar2, ANIM_WorldMerlee_SpinFront)
|
|
EVT_END_SWITCH
|
|
EVT_CALL(SetNpcAnimation, NPC_Merlee, LVar2)
|
|
EVT_WAIT(1)
|
|
EVT_IF_EQ(LVar1, 0)
|
|
EVT_BREAK_LOOP
|
|
EVT_END_IF
|
|
EVT_END_LOOP
|
|
EVT_CALL(SetNpcRotation, NPC_Merlee, 0, 0, 0)
|
|
EVT_CALL(SetNpcAnimation, NPC_Merlee, ANIM_WorldMerlee_Gather)
|
|
EVT_WAIT(200)
|
|
EVT_CALL(SetNpcAnimation, NPC_Merlee, ANIM_WorldMerlee_Bow)
|
|
EVT_WAIT(40)
|
|
EVT_CALL(SetNpcAnimation, NPC_Merlee, ANIM_WorldMerlee_Gather)
|
|
EVT_WAIT(75)
|
|
EVT_CALL(SetNpcAnimation, NPC_Merlee, ANIM_WorldMerlee_Release)
|
|
EVT_END_THREAD
|
|
EVT_WAIT(60)
|
|
EVT_CALL(PlaySoundAtNpc, NPC_Merlee, SOUND_202, SOUND_SPACE_MODE_0)
|
|
EVT_SET(LVar0, RITUAL_VAR_POS_Y)
|
|
EVT_ADD(LVar0, 25)
|
|
EVT_PLAY_EFFECT(EFFECT_RADIATING_ENERGY_ORB, 0, RITUAL_VAR_POS_X, LVar0, RITUAL_VAR_POS_Z, 1, -1)
|
|
EVT_SET(RITUAL_VAR_ORB_EFFECT, LVarF)
|
|
EVT_THREAD
|
|
EVT_WAIT(30)
|
|
EVT_CALL(func_802D7B10, RITUAL_VAR_ORB_EFFECT)
|
|
EVT_END_THREAD
|
|
EVT_CALL(N(DarkenWorld))
|
|
EVT_CALL(DisablePlayerPhysics, TRUE)
|
|
EVT_CALL(InterpPlayerYaw, 0, 0)
|
|
EVT_CALL(N(CreateRitualCards))
|
|
EVT_THREAD
|
|
EVT_LOOP(0)
|
|
EVT_IF_EQ(RITUAL_VAR_STATE, RITUAL_STATE_2)
|
|
EVT_BREAK_LOOP
|
|
EVT_END_IF
|
|
EVT_WAIT(1)
|
|
EVT_END_LOOP
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(10)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(9)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(4)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(4)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(3)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(2)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(2)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(2)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(3)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(2)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(6)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(3)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(3)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(3)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_WAIT(3)
|
|
EVT_CALL(PlaySound, SOUND_B000001D)
|
|
EVT_END_THREAD
|
|
EVT_THREAD
|
|
EVT_LOOP(0)
|
|
EVT_IF_GE(RITUAL_VAR_STATE, RITUAL_STATE_3)
|
|
EVT_BREAK_LOOP
|
|
EVT_END_IF
|
|
EVT_WAIT(1)
|
|
EVT_END_LOOP
|
|
EVT_WAIT(9)
|
|
EVT_CALL(N(func_8024303C_96C1FC))
|
|
EVT_WAIT(2)
|
|
EVT_CALL(N(func_80243068_96C228))
|
|
EVT_LOOP(0)
|
|
EVT_IF_GE(RITUAL_VAR_STATE, RITUAL_STATE_A)
|
|
EVT_BREAK_LOOP
|
|
EVT_END_IF
|
|
EVT_WAIT(1)
|
|
EVT_END_LOOP
|
|
EVT_WAIT(3)
|
|
EVT_CALL(PlaySound, SOUND_204)
|
|
EVT_LOOP(0)
|
|
EVT_IF_GE(RITUAL_VAR_STATE, RITUAL_STATE_B)
|
|
EVT_BREAK_LOOP
|
|
EVT_END_IF
|
|
EVT_WAIT(1)
|
|
EVT_END_LOOP
|
|
EVT_WAIT(15)
|
|
EVT_CALL(PlaySound, SOUND_205)
|
|
EVT_END_THREAD
|
|
EVT_LOOP(0)
|
|
EVT_IF_EQ(RITUAL_VAR_STATE, RITUAL_STATE_D)
|
|
EVT_BREAK_LOOP
|
|
EVT_END_IF
|
|
EVT_WAIT(1)
|
|
EVT_END_LOOP
|
|
EVT_CALL(SetPlayerPos, RITUAL_VAR_POS_X, RITUAL_VAR_POS_Y, RITUAL_VAR_POS_Z)
|
|
EVT_CALL(SetPlayerAnimation, ANIM_Mario1_UsePower)
|
|
EVT_WAIT(1)
|
|
EVT_CALL(SetPlayerPos, RITUAL_VAR_POS_X, RITUAL_VAR_POS_Y, RITUAL_VAR_POS_Z)
|
|
EVT_WAIT(1)
|
|
EVT_CALL(DisablePlayerPhysics, FALSE)
|
|
EVT_CALL(N(DestroyRitualCards))
|
|
EVT_THREAD
|
|
EVT_CALL(N(UndarkenWorld))
|
|
EVT_END_THREAD
|
|
EVT_RETURN
|
|
EVT_END
|
|
};
|
|
|
|
EvtScript N(EVS_BeginMerleeCamera) = {
|
|
EVT_CALL(GetNpcPos, NPC_Merlee, LVar0, LVar1, LVar2)
|
|
EVT_CALL(UseSettingsFrom, 0, LVar0, LVar1, LVar2)
|
|
EVT_CALL(SetCamDistance, 0, 200)
|
|
EVT_CALL(SetPanTarget, 0, LVar0, LVar1, LVar2)
|
|
EVT_CALL(SetCamSpeed, 0, EVT_FLOAT(8.0))
|
|
EVT_CALL(SetCamPitch, 0, 20, -15)
|
|
EVT_CALL(PanToTarget, 0, 0, 1)
|
|
EVT_CALL(WaitForCam, 0, EVT_FLOAT(1.0))
|
|
EVT_RETURN
|
|
EVT_END
|
|
};
|
|
|
|
EvtScript N(EVS_EndMerleeCamera) = {
|
|
EVT_CALL(PanToTarget, 0, 0, 0)
|
|
EVT_CALL(SetCamSpeed, 0, EVT_FLOAT(3.0))
|
|
EVT_CALL(WaitForCam, 0, EVT_FLOAT(1.0))
|
|
EVT_RETURN
|
|
EVT_END
|
|
};
|
|
|
|
|
|
EvtScript N(EVS_NpcInteract_Merlee) = {
|
|
EVT_CALL(func_802D2C14, 1)
|
|
EVT_EXEC_WAIT(N(EVS_BeginMerleeCamera))
|
|
EVT_SET(LVar0, 0)
|
|
EVT_IF_EQ(GB_KootFavor_Current, KOOT_FAVOR_CH4_1)
|
|
EVT_ADD(LVar0, 1)
|
|
EVT_END_IF
|
|
EVT_IF_EQ(GF_HOS06_MerluvleeRequestedCrystalBall, 1)
|
|
EVT_ADD(LVar0, 1)
|
|
EVT_END_IF
|
|
EVT_IF_EQ(GF_DRO01_Gift_CrystalBall, 0)
|
|
EVT_ADD(LVar0, 1)
|
|
EVT_END_IF
|
|
EVT_IF_EQ(LVar0, 3)
|
|
EVT_CALL(SpeakToPlayer, NPC_SELF, ANIM_WorldMerlee_Talk, ANIM_WorldMerlee_Idle, 0, MSG_CH2_00DC)
|
|
EVT_SET(LVar0, ITEM_CRYSTAL_BALL)
|
|
EVT_SET(LVar1, 1)
|
|
EVT_EXEC_WAIT(N(GiveItemReward))
|
|
EVT_CALL(AddKeyItem, ITEM_CRYSTAL_BALL)
|
|
EVT_SET(GF_DRO01_Gift_CrystalBall, 1)
|
|
EVT_WAIT(20)
|
|
EVT_CALL(func_802D2C14, 0)
|
|
EVT_EXEC_WAIT(N(EVS_EndMerleeCamera))
|
|
EVT_RETURN
|
|
EVT_END_IF
|
|
EVT_CALL(SpeakToPlayer, NPC_SELF, ANIM_WorldMerlee_Talk, ANIM_WorldMerlee_Idle, 0, MSG_CH2_00D6)
|
|
EVT_CALL(ShowChoice, MSG_Choice_0011)
|
|
EVT_IF_NE(LVar0, 0)
|
|
EVT_CALL(ContinueSpeech, -1, ANIM_WorldMerlee_Talk, ANIM_WorldMerlee_Idle, 0, MSG_CH2_00D7)
|
|
EVT_CALL(func_802D2C14, 0)
|
|
EVT_EXEC_WAIT(N(EVS_EndMerleeCamera))
|
|
EVT_RETURN
|
|
EVT_END_IF
|
|
EVT_CALL(ContinueSpeech, -1, ANIM_WorldMerlee_Talk, ANIM_WorldMerlee_Idle, 0, MSG_CH2_00D8)
|
|
EVT_CALL(ShowCoinCounter, 1)
|
|
EVT_CALL(ShowChoice, MSG_Choice_0018)
|
|
EVT_CALL(ShowCoinCounter, 0)
|
|
EVT_IF_EQ(LVar0, 3)
|
|
EVT_CALL(ContinueSpeech, -1, ANIM_WorldMerlee_Talk, ANIM_WorldMerlee_Idle, 0, MSG_CH2_00D7)
|
|
EVT_CALL(func_802D2C14, 0)
|
|
EVT_EXEC_WAIT(N(EVS_EndMerleeCamera))
|
|
EVT_RETURN
|
|
EVT_END_IF
|
|
EVT_CALL(N(TryEnchantPlayer), LVar0, LVar1)
|
|
EVT_IF_NE(LVar1, 0)
|
|
EVT_CALL(ContinueSpeech, -1, ANIM_WorldMerlee_Talk, ANIM_WorldMerlee_Idle, 0, MSG_CH2_00D9)
|
|
EVT_CALL(func_802D2C14, 0)
|
|
EVT_EXEC_WAIT(N(EVS_EndMerleeCamera))
|
|
EVT_RETURN
|
|
EVT_END_IF
|
|
EVT_CALL(ContinueSpeech, -1, ANIM_WorldMerlee_Talk, ANIM_WorldMerlee_Idle, 0, MSG_CH2_00DA)
|
|
EVT_CALL(SetMusicTrack, 0, SONG_MERLEE_SPELL, 0, 8)
|
|
EVT_CALL(DisablePartnerAI, 0)
|
|
EVT_CALL(SetNpcAnimation, NPC_PARTNER, PARTNER_ANIM_IDLE)
|
|
EVT_EXEC_GET_TID(N(EVS_PerformRitual), LVar9)
|
|
EVT_LOOP(0)
|
|
EVT_IS_THREAD_RUNNING(LVar9, LVar1)
|
|
EVT_IF_EQ(LVar1, 0)
|
|
EVT_BREAK_LOOP
|
|
EVT_END_IF
|
|
EVT_WAIT(1)
|
|
EVT_END_LOOP
|
|
EVT_WAIT(60)
|
|
EVT_CALL(SetNpcAnimation, 4, ANIM_WorldMerlee_Idle)
|
|
EVT_CALL(PlayerMoveTo, -100, -370, 8)
|
|
EVT_CALL(SpeakToPlayer, NPC_SELF, ANIM_WorldMerlee_Talk, ANIM_WorldMerlee_Idle, 0, MSG_CH2_00DB)
|
|
EVT_EXEC(N(EVS_SetupMusic))
|
|
EVT_CALL(EnablePartnerAI)
|
|
EVT_CALL(func_802D2C14, 0)
|
|
EVT_EXEC_WAIT(N(EVS_EndMerleeCamera))
|
|
EVT_RETURN
|
|
EVT_END
|
|
};
|
|
|
|
NpcSettings N(NpcSettings_Merlee) = {
|
|
.height = 32,
|
|
.radius = 32,
|
|
.otherAI = &N(EVS_NpcAuxAI_Merlee),
|
|
.onInteract = &N(EVS_NpcInteract_Merlee),
|
|
.ai = &N(EVS_NpcAI_Merlee),
|
|
.level = 99,
|
|
};
|