msg_copy_to_print_buffer (#962)

* wip

* wip

* update_camera_mode_unused

* PR comment

* fix warning

* wip

* wip

* msg_copy_to_print_buffer

* PR comments
This commit is contained in:
Ethan Roseman 2023-03-03 10:42:48 +09:00 committed by GitHub
parent fff7fa2e99
commit 209457a32a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 279 additions and 1434 deletions

View File

@ -1192,7 +1192,7 @@ typedef struct ItemEntity {
typedef struct MessagePrintState { typedef struct MessagePrintState {
/* 0x000 */ u8* srcBuffer; /* 0x000 */ u8* srcBuffer;
/* 0x004 */ s16 printBufferPos; /* 0x004 */ u16 printBufferPos;
/* 0x006 */ char unk_06[2]; /* 0x006 */ char unk_06[2];
/* 0x008 */ s32 msgID; /* 0x008 */ s32 msgID;
/* 0x00C */ u16 srcBufferPos; /* 0x00C */ u16 srcBufferPos;
@ -1204,13 +1204,13 @@ typedef struct MessagePrintState {
/* 0x455 */ u8 fontVariant; /* 0x455 */ u8 fontVariant;
/* 0x456 */ Vec2s windowOffsetPos; // offset from baseWindowPos. used to animated window pos? /* 0x456 */ Vec2s windowOffsetPos; // offset from baseWindowPos. used to animated window pos?
/* 0x45A */ Vec2s windowBasePos; // ex: set by the parameters for choice style /* 0x45A */ Vec2s windowBasePos; // ex: set by the parameters for choice style
/* 0x45E */ s8 printDelayTime; // delay to print each chunk /* 0x45E */ u8 printDelayTime; // delay to print each chunk
/* 0x45F */ u8 charsPerChunk; // how many chars to print at once /* 0x45F */ u8 charsPerChunk; // how many chars to print at once
/* 0x460 */ s32 curLinePos; // position along current line /* 0x460 */ s32 curLinePos; // position along current line
/* 0x464 */ u8 unk_464; /* 0x464 */ u8 unk_464;
/* 0x465 */ char unk_465; /* 0x465 */ char unk_465;
/* 0x466 */ u16 nextLinePos; // ? /* 0x466 */ u16 nextLinePos; // ?
/* 0x468 */ s8 lineCount; /* 0x468 */ u8 lineCount;
/* 0x469 */ char unk_469[0x3]; /* 0x469 */ char unk_469[0x3];
/* 0x46C */ s32 unk_46C; /* 0x46C */ s32 unk_46C;
/* 0x470 */ u8 currentAnimFrame[4]; /* 0x470 */ u8 currentAnimFrame[4];
@ -1260,7 +1260,7 @@ typedef struct MessagePrintState {
/* 0x51E */ char unk_51E[0x2]; /* 0x51E */ char unk_51E[0x2];
/* 0x520 */ s32 speedSoundIDA; /* 0x520 */ s32 speedSoundIDA;
/* 0x524 */ s32 speedSoundIDB; /* 0x524 */ s32 speedSoundIDB;
/* 0x528 */ s16 varBufferReadPos; /* 0x528 */ u16 varBufferReadPos;
/* 0x52A */ s8 unk_52A; /* 0x52A */ s8 unk_52A;
/* 0x52B */ u8 currentImageIndex; /* 0x52B */ u8 currentImageIndex;
/* 0x52C */ Vec2su varImageScreenPos; // in addition, posX=0 is taken as 'dont draw' /* 0x52C */ Vec2su varImageScreenPos; // in addition, posX=0 is taken as 'dont draw'

View File

@ -667,6 +667,7 @@ enum SoundIDs {
SOUND_MENU_CHANGE_TAB = 0x000000C8, SOUND_MENU_CHANGE_TAB = 0x000000C8,
SOUND_MENU_NEXT = 0x000000C9, SOUND_MENU_NEXT = 0x000000C9,
SOUND_MENU_BACK = 0x000000CA, SOUND_MENU_BACK = 0x000000CA,
SOUND_CB = 0x000000CB,
SOUND_CC = 0x000000CC, SOUND_CC = 0x000000CC,
SOUND_CD = 0x000000CD, SOUND_CD = 0x000000CD,
SOUND_CE = 0x000000CE, SOUND_CE = 0x000000CE,
@ -6580,12 +6581,15 @@ enum MsgStateFlags {
MSG_STATE_FLAG_80 = 0x000080, MSG_STATE_FLAG_80 = 0x000080,
MSG_STATE_FLAG_PRINT_QUICKLY = 0x000100, MSG_STATE_FLAG_PRINT_QUICKLY = 0x000100,
MSG_STATE_FLAG_400 = 0x000400, MSG_STATE_FLAG_400 = 0x000400,
MSG_STATE_FLAG_800 = 0x000800,
MSG_STATE_FLAG_1000 = 0x001000,
MSG_STATE_FLAG_4000 = 0x004000, MSG_STATE_FLAG_4000 = 0x004000,
MSG_STATE_FLAG_8000 = 0x008000, MSG_STATE_FLAG_8000 = 0x008000,
MSG_STATE_FLAG_10000 = 0x010000, MSG_STATE_FLAG_10000 = 0x010000,
MSG_STATE_FLAG_20000 = 0x020000, MSG_STATE_FLAG_20000 = 0x020000,
MSG_STATE_FLAG_40000 = 0x040000, MSG_STATE_FLAG_40000 = 0x040000,
MSG_STATE_FLAG_80000 = 0x080000, MSG_STATE_FLAG_80000 = 0x080000,
MSG_STATE_FLAG_100000 = 0x100000,
MSG_STATE_FLAG_800000 = 0x800000, MSG_STATE_FLAG_800000 = 0x800000,
}; };

View File

@ -2087,8 +2087,72 @@ ApiStatus RunPartTo(Evt* script, s32 isInitialCall) {
} }
} }
#ifdef NON_MATCHING
f32 update_lerp_battle(s32 easing, f32 start, f32 end, s32 elapsed, s32 duration) {
s32 timeLeft;
f32 absMag;
f64 start2;
f64 start3;
f32 len;
f64 len2;
f32 len3;
f64 len4;
f32 t1;
switch (easing) {
case EASING_LINEAR:
return start + (end - start) * elapsed / duration;
case EASING_QUADRATIC_IN:
return start + SQ(elapsed) * (end - start) / SQ(duration);
case EASING_CUBIC_IN:
return start + CUBE(elapsed) * (end - start) / CUBE(duration);
case EASING_QUARTIC_IN:
return start + QUART(elapsed) * (end - start) / QUART(duration);
case EASING_COS_SLOW_OVERSHOOT:
len = (end - start);
return end - (len * cos_rad(((f32)elapsed / duration) * PI_D * 4.0) * (duration - elapsed) *
(duration - elapsed)) / SQ((f32)duration);
case EASING_COS_FAST_OVERSHOOT:
len = (end - start);
return end - (len * cos_rad((((f32)SQ(elapsed) / duration) * PI_D * 4.0) / 15.0) * (duration - elapsed) *
(duration - elapsed)) / SQ((f32)duration);
case EASING_QUADRATIC_OUT:
timeLeft = duration - elapsed;
return start + (end - start) - ((SQ(timeLeft) * (end - start))) / SQ(duration);
case EASING_CUBIC_OUT:
len = end - start;
timeLeft = duration - elapsed;
return start + len - ((CUBE(timeLeft) * len)) / CUBE(duration);
case EASING_QUARTIC_OUT:
len = end - start;
timeLeft = duration - elapsed;
return start + len - ((QUART(timeLeft) * len)) / QUART(duration);
case EASING_COS_BOUNCE:
absMag = cos_rad((((f32)SQ(elapsed) / duration) * PI_D * 4.0) / 40.0) * (duration - elapsed) *
(duration - elapsed) / SQ((f32)duration);
if (absMag < 0.0f) {
absMag = -absMag;
}
return end - (end - start) * absMag;
case EASING_COS_IN_OUT:
len2 = end - start;
start2 = start;
return start2 + (len2 * (1.0 - cos_rad(((f32)elapsed * PI_D) / (f32)duration)) / 2);
case EASING_SIN_OUT:
len3 = end - start;
return start + (len3 * sin_rad((((f32) elapsed) * (3.141592 / 2)) / ((f32) duration)));
case EASING_COS_IN:
len4 = end - start;
start3 = start;
return start3 + (len4 * (1.0 - cos_rad(((f32)elapsed * (PI_D / 2)) / (f32)duration)));
}
return 0.0f;
}
#else
f32 update_lerp_battle(s32 easing, f32 start, f32 end, s32 elapsed, s32 duration); f32 update_lerp_battle(s32 easing, f32 start, f32 end, s32 elapsed, s32 duration);
INCLUDE_ASM(s32, "1A5830", update_lerp_battle); INCLUDE_ASM(s32, "1A5830", update_lerp_battle);
#endif
ApiStatus FlyToGoal(Evt* script, s32 isInitialCall) { ApiStatus FlyToGoal(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos; Bytecode* args = script->ptrReadPos;

View File

@ -39,8 +39,8 @@ void update_camera_mode_4(Camera* camera) {
camera->trueRotation.x = camera->unk_70; camera->trueRotation.x = camera->unk_70;
camera->currentBoomLength = camera->lookAt_dist * D_8009A5EC; camera->currentBoomLength = camera->lookAt_dist * D_8009A5EC;
camera->currentYOffset = camera->auxBoomPitch * D_8009A5EC; camera->currentYOffset = camera->auxBoomPitch * D_8009A5EC;
if (camera->unk_06 != 0) { if (camera->unk_06) {
camera->unk_06 = 0; camera->unk_06 = FALSE;
camera->unk_98 = 0.0f; camera->unk_98 = 0.0f;
camera->unk_9C = 0.0f; camera->unk_9C = 0.0f;
camera->lookAt_obj.x = camera->lookAt_obj_target.x; camera->lookAt_obj.x = camera->lookAt_obj_target.x;

View File

@ -239,13 +239,13 @@ void update_camera_from_controller(
f32 dx; f32 dx;
f32 x, y, z; f32 x, y, z;
configuration = oldConfiguration; configuration = oldConfiguration;
controller = *prevController; controller = *prevController;
x = x1; x = x1;
y = y1; y = y1;
z = z1; z = z1;
if ((s32)controller != CAMERA_SETTINGS_PTR_MINUS_2 && (s32)controller != CAMERA_SETTINGS_PTR_MINUS_1) { if ((s32)controller != CAMERA_SETTINGS_PTR_MINUS_2 && (s32)controller != CAMERA_SETTINGS_PTR_MINUS_1) {
if (controller == CAMERA_SETTINGS_PTR_NULL) { if (controller == CAMERA_SETTINGS_PTR_NULL) {
configuration->targetPos.x = x; configuration->targetPos.x = x;
@ -257,13 +257,13 @@ void update_camera_from_controller(
if (controller->flag != 0) { if (controller->flag != 0) {
f32 temp_f10 = -(controller->points.two.Az - controller->points.two.Bz) + controller->points.two.Bx; f32 temp_f10 = -(controller->points.two.Az - controller->points.two.Bz) + controller->points.two.Bx;
f32 temp_f6 = (controller->points.two.Ax - controller->points.two.Bx) + controller->points.two.Bz; f32 temp_f6 = (controller->points.two.Ax - controller->points.two.Bx) + controller->points.two.Bz;
f32 temp_f8 = controller->points.two.Bx - temp_f10; f32 temp_f8 = controller->points.two.Bx - temp_f10;
f32 temp_f12_2 = controller->points.two.Bz - temp_f6; f32 temp_f12_2 = controller->points.two.Bz - temp_f6;
f32 temp_f4 = (SQ(temp_f8) + SQ(temp_f12_2)); f32 temp_f4 = (SQ(temp_f8) + SQ(temp_f12_2));
temp_f4 = (((x - temp_f10) * temp_f8) + ((z - temp_f6) * temp_f12_2)) / temp_f4; temp_f4 = (((x - temp_f10) * temp_f8) + ((z - temp_f6) * temp_f12_2)) / temp_f4;
configuration->targetPos.x = temp_f4 * temp_f8 + temp_f10; configuration->targetPos.x = temp_f4 * temp_f8 + temp_f10;
configuration->targetPos.y = y; configuration->targetPos.y = y;
configuration->targetPos.z = temp_f4 * temp_f12_2 + temp_f6; configuration->targetPos.z = temp_f4 * temp_f12_2 + temp_f6;
@ -289,30 +289,30 @@ void update_camera_from_controller(
temp_f6_2 = bz - az; temp_f6_2 = bz - az;
var1 = x - ax; var1 = x - ax;
var2 = z - az; var2 = z - az;
temp_f20 = SQ(temp_f8_2); temp_f20 = SQ(temp_f8_2);
temp_f18 = SQ(temp_f6_2); temp_f18 = SQ(temp_f6_2);
f4_1 = temp_f20 + temp_f18; f4_1 = temp_f20 + temp_f18;
f4_1 = (var1 * temp_f8_2 + var2 * temp_f6_2) / f4_1; f4_1 = (var1 * temp_f8_2 + var2 * temp_f6_2) / f4_1;
var_f16 = f4_1 * temp_f8_2 + ax; var_f16 = f4_1 * temp_f8_2 + ax;
var_f10 = f4_1 * temp_f6_2 + az; var_f10 = f4_1 * temp_f6_2 + az;
f22_1 = controller->points.two.Ax; f22_1 = controller->points.two.Ax;
f4_2 = controller->points.two.Az; f4_2 = controller->points.two.Az;
sp10 = controller->points.two.Bx; sp10 = controller->points.two.Bx;
sp20 = controller->points.two.Bz; sp20 = controller->points.two.Bz;
ax = sp10 - f22_1; ax = sp10 - f22_1;
az = sp20 - f4_2; az = sp20 - f4_2;
temp_f8_2 = var_f16 - f22_1; temp_f8_2 = var_f16 - f22_1;
temp_f6_2 = var_f10 - f4_2; temp_f6_2 = var_f10 - f4_2;
temp_f20 = x - var_f16; temp_f20 = x - var_f16;
temp_f18 = z - var_f10; temp_f18 = z - var_f10;
if (ax * temp_f8_2 + az * temp_f6_2 < 0.0f) { if (ax * temp_f8_2 + az * temp_f6_2 < 0.0f) {
var_f16 = f22_1; var_f16 = f22_1;
var_f10 = f4_2; var_f10 = f4_2;
@ -335,7 +335,7 @@ void update_camera_from_controller(
dz = z - controller->points.two.Az; dz = z - controller->points.two.Az;
f24 = SQ(dx) + SQ(dz); f24 = SQ(dx) + SQ(dz);
if (f24 != 0.0f) { if (f24 != 0.0f) {
f24 = 1.0f / sqrtf(f24); f24 = 1.0f / sqrtf(f24);
temp_f2 = sqrtf(SQ(controller->points.two.Bx - controller->points.two.Ax) + SQ(controller->points.two.Bz - controller->points.two.Az)); temp_f2 = sqrtf(SQ(controller->points.two.Bx - controller->points.two.Ax) + SQ(controller->points.two.Bz - controller->points.two.Az));
temp_f2_2 = dx * temp_f2 * f24; temp_f2_2 = dx * temp_f2 * f24;
temp_f4_4 = dz * temp_f2 * f24; temp_f4_4 = dz * temp_f2 * f24;
@ -363,13 +363,13 @@ void update_camera_from_controller(
} }
} }
} }
configuration = newConfiguration; configuration = newConfiguration;
controller = *newController; controller = *newController;
x = tX; x = tX;
y = tY; y = tY;
z = tZ; z = tZ;
if (controller == NULL) { if (controller == NULL) {
configuration->targetPos.x = x; configuration->targetPos.x = x;
configuration->targetPos.y = y; configuration->targetPos.y = y;
@ -392,13 +392,13 @@ void update_camera_from_controller(
f32 ABz = controller->points.two.Az - controller->points.two.Bz; f32 ABz = controller->points.two.Az - controller->points.two.Bz;
f32 temp_f10 = -ABz + controller->points.two.Bx; f32 temp_f10 = -ABz + controller->points.two.Bx;
f32 temp_f6 = ABx + controller->points.two.Bz; f32 temp_f6 = ABx + controller->points.two.Bz;
f32 temp_f8 = controller->points.two.Bx - temp_f10; f32 temp_f8 = controller->points.two.Bx - temp_f10;
f32 temp_f12_2 = controller->points.two.Bz - temp_f6; f32 temp_f12_2 = controller->points.two.Bz - temp_f6;
f32 temp_f4 = SQ(temp_f8) + SQ(temp_f12_2); f32 temp_f4 = SQ(temp_f8) + SQ(temp_f12_2);
temp_f4 = (((x - temp_f10) * temp_f8) + ((z - temp_f6) * temp_f12_2)) / temp_f4; temp_f4 = (((x - temp_f10) * temp_f8) + ((z - temp_f6) * temp_f12_2)) / temp_f4;
configuration->targetPos.x = temp_f4 * temp_f8 + temp_f10; configuration->targetPos.x = temp_f4 * temp_f8 + temp_f10;
configuration->targetPos.y = y; configuration->targetPos.y = y;
configuration->targetPos.z = temp_f4 * temp_f12_2 + temp_f6; configuration->targetPos.z = temp_f4 * temp_f12_2 + temp_f6;
@ -449,30 +449,30 @@ void update_camera_from_controller(
temp_f6_2 = bz - az; temp_f6_2 = bz - az;
var1 = x - ax; var1 = x - ax;
var2 = z - az; var2 = z - az;
temp_f20 = temp_f8_2 * temp_f8_2; temp_f20 = temp_f8_2 * temp_f8_2;
temp_f18 = temp_f6_2 * temp_f6_2; temp_f18 = temp_f6_2 * temp_f6_2;
f4_1 = temp_f20 + temp_f18; f4_1 = temp_f20 + temp_f18;
f4_1 = (var1 * temp_f8_2 + var2 * temp_f6_2) / f4_1; f4_1 = (var1 * temp_f8_2 + var2 * temp_f6_2) / f4_1;
var_f16 = f4_1 * temp_f8_2 + ax; var_f16 = f4_1 * temp_f8_2 + ax;
var_f10 = f4_1 * temp_f6_2 + az; var_f10 = f4_1 * temp_f6_2 + az;
f22_1 = controller->points.two.Ax; f22_1 = controller->points.two.Ax;
f4_2 = controller->points.two.Az; f4_2 = controller->points.two.Az;
sp10 = controller->points.two.Bx; sp10 = controller->points.two.Bx;
sp20 = controller->points.two.Bz; sp20 = controller->points.two.Bz;
ax = sp10 - f22_1; ax = sp10 - f22_1;
az = sp20 - f4_2; az = sp20 - f4_2;
temp_f8_2 = var_f16 - f22_1; temp_f8_2 = var_f16 - f22_1;
temp_f6_2 = var_f10 - f4_2; temp_f6_2 = var_f10 - f4_2;
temp_f20 = x - var_f16; temp_f20 = x - var_f16;
temp_f18 = z - var_f10; temp_f18 = z - var_f10;
if (ax * temp_f8_2 + az * temp_f6_2 < 0.0f) { if (ax * temp_f8_2 + az * temp_f6_2 < 0.0f) {
var_f16 = f22_1; var_f16 = f22_1;
var_f10 = f4_2; var_f10 = f4_2;
@ -493,10 +493,10 @@ void update_camera_from_controller(
prevSettings = *prevController; prevSettings = *prevController;
if (((s32)prevSettings != CAMERA_SETTINGS_PTR_MINUS_2 if (((s32)prevSettings != CAMERA_SETTINGS_PTR_MINUS_2
&& (s32)prevSettings != CAMERA_SETTINGS_PTR_MINUS_1 && (s32)prevSettings != CAMERA_SETTINGS_PTR_MINUS_1
&& (s32)prevSettings != CAMERA_SETTINGS_PTR_NULL) && (s32)prevSettings != CAMERA_SETTINGS_PTR_NULL)
&& (prevSettings->type == controller->type) && (prevSettings->type == controller->type)
&& (prevSettings->boomLength == controller->boomLength) && (prevSettings->boomLength == controller->boomLength)
&& (prevSettings->boomPitch == controller->boomPitch) && (prevSettings->boomPitch == controller->boomPitch)
&& (prevSettings->viewPitch == controller->viewPitch) && (prevSettings->viewPitch == controller->viewPitch)
&& (prevSettings->flag != controller->flag) && (prevSettings->flag != controller->flag)
) { ) {
@ -545,12 +545,12 @@ void update_camera_from_controller(
if (((s32)prevSettings != CAMERA_SETTINGS_PTR_MINUS_2 if (((s32)prevSettings != CAMERA_SETTINGS_PTR_MINUS_2
&& (s32)prevSettings != CAMERA_SETTINGS_PTR_MINUS_1 && (s32)prevSettings != CAMERA_SETTINGS_PTR_MINUS_1
&& (s32)prevSettings != CAMERA_SETTINGS_PTR_NULL) && (s32)prevSettings != CAMERA_SETTINGS_PTR_NULL)
&& (prevSettings->type == controller->type) && (prevSettings->type == controller->type)
&& (prevSettings->boomLength == controller->boomLength) && (prevSettings->boomLength == controller->boomLength)
&& (prevSettings->boomPitch == controller->boomPitch) && (prevSettings->boomPitch == controller->boomPitch)
&& (prevSettings->viewPitch == controller->viewPitch) && (prevSettings->viewPitch == controller->viewPitch)
&& (prevSettings->flag != controller->flag) && (prevSettings->flag != controller->flag)
&& (prevSettings->points.two.Ax == controller->points.two.Ax) && (prevSettings->points.two.Ax == controller->points.two.Ax)
&& (prevSettings->points.two.Az == controller->points.two.Az) && (prevSettings->points.two.Az == controller->points.two.Az)
) { ) {
*interpAlpha = 1.0f; *interpAlpha = 1.0f;
@ -571,26 +571,26 @@ void update_camera_from_controller(
posAx = controller->points.three.Ax; posAx = controller->points.three.Ax;
posAz = controller->points.three.Az; posAz = controller->points.three.Az;
posBx = controller->points.three.Bx; posBx = controller->points.three.Bx;
posBz = controller->points.three.Bz; posBz = controller->points.three.Bz;
posCx = controller->points.three.Cx; posCx = controller->points.three.Cx;
posCz = controller->points.three.Cz; posCz = controller->points.three.Cz;
if (posAx == posBx && posAz == posBz) { if (posAx == posBx && posAz == posBz) {
posAx = posCx; posAx = posCx;
posAz = posCz; posAz = posCz;
} }
if ((posBx - posCx) == 0.0f) { if ((posBx - posCx) == 0.0f) {
f32 BAx = posBx - posAx; f32 BAx = posBx - posAx;
f32 BCx = posBx - posCx; f32 BCx = posBx - posCx;
f32 BCz = posBz - posCz; f32 BCz = posBz - posCz;
f32 ABz = posAz - posBz; f32 ABz = posAz - posBz;
f32 Q = BCx * BAx / BCz - ABz; f32 Q = BCx * BAx / BCz - ABz;
f32 V = (x - posBx) + (posBz - z) * BCx / BCz; f32 V = (x - posBx) + (posBz - z) * BCx / BCz;
Tx = ABz * V / Q + x; Tx = ABz * V / Q + x;
Tz = BAx * V / Q + z; Tz = BAx * V / Q + z;
} else { } else {
@ -600,12 +600,12 @@ void update_camera_from_controller(
f32 BCz = posBz - posCz; f32 BCz = posBz - posCz;
f32 Q = ABz * BCz / BCx - BAx; f32 Q = ABz * BCz / BCx - BAx;
f32 V = (z - posBz) + (posBx - x) * BCz / BCx; f32 V = (z - posBz) + (posBx - x) * BCz / BCx;
Tx = ABz * V / Q + x; Tx = ABz * V / Q + x;
Tz = BAx * V / Q + z; Tz = BAx * V / Q + z;
} }
configuration->targetPos.x = Tx; configuration->targetPos.x = Tx;
configuration->targetPos.y = y; configuration->targetPos.y = y;
configuration->targetPos.z = Tz; configuration->targetPos.z = Tz;
if (changingMap) { if (changingMap) {
@ -652,11 +652,11 @@ void update_camera_from_controller(
temp_f4_13 = (var3 * var1 + var4 * var2) / temp_f4_13; temp_f4_13 = (var3 * var1 + var4 * var2) / temp_f4_13;
temp_f2_7 = temp_f4_13 * var1 + controller->points.three.Cx; temp_f2_7 = temp_f4_13 * var1 + controller->points.three.Cx;
temp_f4_14 = temp_f4_13 * var2 + controller->points.three.Cz; temp_f4_14 = temp_f4_13 * var2 + controller->points.three.Cz;
configuration->targetPos.x = temp_f2_7; configuration->targetPos.x = temp_f2_7;
configuration->targetPos.y = y; configuration->targetPos.y = y;
configuration->targetPos.z = temp_f4_14; configuration->targetPos.z = temp_f4_14;
if (controller->boomLength < 0.0f) { if (controller->boomLength < 0.0f) {
dx = temp_f2_7 - controller->points.three.Ax; dx = temp_f2_7 - controller->points.three.Ax;
dz = temp_f4_14 - controller->points.three.Az; dz = temp_f4_14 - controller->points.three.Az;
@ -702,7 +702,7 @@ void update_camera_from_controller(
do { do {
dx = controller->points.two.Bx - controller->points.two.Ax; dx = controller->points.two.Bx - controller->points.two.Ax;
dz = controller->points.two.Bz - controller->points.two.Az; dz = controller->points.two.Bz - controller->points.two.Az;
configuration->boomYaw = atan2(0.0f, 0.0f, dx, dz); configuration->boomYaw = atan2(0.0f, 0.0f, dx, dz);
} while (0); } while (0);
boomLength = controller->boomLength; boomLength = controller->boomLength;
@ -894,11 +894,11 @@ void update_camera_zone_interp(Camera* camera) {
} }
break; break;
default: default:
if (cs2->points.two.Ax == currentController->points.two.Ax if (cs2->points.two.Ax == currentController->points.two.Ax
&& cs2->points.two.Az == currentController->points.two.Az && cs2->points.two.Az == currentController->points.two.Az
&& cs2->points.two.Ay == currentController->points.two.Ay && cs2->points.two.Ay == currentController->points.two.Ay
&& cs2->points.two.By == currentController->points.two.By && cs2->points.two.By == currentController->points.two.By
&& cs2->points.two.Bx == currentController->points.two.Bx && cs2->points.two.Bx == currentController->points.two.Bx
&& cs2->points.two.Bz == currentController->points.two.Bz && cs2->points.two.Bz == currentController->points.two.Bz
) { ) {
cond2 = TRUE; cond2 = TRUE;
@ -930,7 +930,7 @@ void update_camera_zone_interp(Camera* camera) {
camera->prevMovePos.z = camera->movePos.z; camera->prevMovePos.z = camera->movePos.z;
} }
} }
if (camera->prevPrevFollowFlags) { if (camera->prevPrevFollowFlags) {
posX = camera->prevPrevMovePos.x; posX = camera->prevPrevMovePos.x;
posY = camera->prevPrevMovePos.y; posY = camera->prevPrevMovePos.y;

View File

@ -1783,6 +1783,7 @@ s32 test_item_player_collision(ItemEntity* item) {
f32 playerZ; f32 playerZ;
f32 sp10; f32 sp10;
f32 new_var2;
f32 sp14; f32 sp14;
f32 sp1C; f32 sp1C;
f32 sp20; f32 sp20;
@ -1794,7 +1795,6 @@ s32 test_item_player_collision(ItemEntity* item) {
s32 cond; s32 cond;
f32 f1; f32 f1;
actionState = playerStatus->actionState; actionState = playerStatus->actionState;
if (item->flags & ITEM_ENTITY_FLAG_100) { if (item->flags & ITEM_ENTITY_FLAG_100) {
@ -1818,11 +1818,12 @@ s32 test_item_player_collision(ItemEntity* item) {
return FALSE; return FALSE;
} }
if (item->flags & ITEM_ENTITY_FLAG_HIDDEN) { cond = item->flags;
if (cond & ITEM_ENTITY_FLAG_HIDDEN) {
return FALSE; return FALSE;
} }
if (get_time_freeze_mode() != 0) { if (get_time_freeze_mode() != TIME_FREEZE_NORMAL) {
return FALSE; return FALSE;
} }
@ -1834,7 +1835,7 @@ s32 test_item_player_collision(ItemEntity* item) {
return FALSE; return FALSE;
} }
if (gOverrideFlags & GLOBAL_OVERRIDES_200000) { if (gOverrideFlags & GLOBAL_OVERRIDES_CANT_PICK_UP_ITEMS) {
return FALSE; return FALSE;
} }
@ -1850,6 +1851,8 @@ s32 test_item_player_collision(ItemEntity* item) {
} else { } else {
temp_f14 = clamp_angle(camera->currentYaw + 90.0f); temp_f14 = clamp_angle(camera->currentYaw + 90.0f);
} }
new_var2 = playerY;
sp10 = playerX; sp10 = playerX;
sp24 = playerY; sp24 = playerY;
sp14 = playerZ; sp14 = playerZ;
@ -1868,12 +1871,12 @@ s32 test_item_player_collision(ItemEntity* item) {
itemX = item->position.x; itemX = item->position.x;
itemY = item->position.y; itemY = item->position.y;
itemZ = item->position.z; itemZ = item->position.z;
t = 13.5f;
xDiff = itemX - playerX; xDiff = itemX - playerX;
zDiff = itemZ - playerZ; zDiff = itemZ - playerZ;
t = 13.5f;
f1 = sqrtf(SQ(xDiff) + SQ(zDiff)); f1 = sqrtf(SQ(xDiff) + SQ(zDiff));
if (!(sp20 + t <= f1) && if (!(sp20 + t <= f1) &&
!(itemY + 27.0f < playerY) && !(itemY + 27.0f < new_var2) &&
!(playerY + sp1C < itemY)) !(playerY + sp1C < itemY))
{ {
cond = TRUE; cond = TRUE;
@ -1885,7 +1888,7 @@ s32 test_item_player_collision(ItemEntity* item) {
f1 = sqrtf(SQ(xDiff) + SQ(zDiff)); f1 = sqrtf(SQ(xDiff) + SQ(zDiff));
if (!(14.0f + t <= f1) && if (!(14.0f + t <= f1) &&
!(itemY + 27.0f < sp24) && !(itemY + 27.0f < sp24) &&
!(sp24 + 18.0f < itemY)) !(playerY + 18.0f < itemY))
{ {
cond = TRUE; cond = TRUE;
} }

263
src/msg.c
View File

@ -2,6 +2,8 @@
#include "ld_addrs.h" #include "ld_addrs.h"
#include "message_ids.h" #include "message_ids.h"
#include "sprite.h" #include "sprite.h"
#include "charset/postcard.png.h"
#include "charset/letter_content_1.png.h"
enum RewindArrowStates { enum RewindArrowStates {
REWIND_ARROW_STATE_INIT = 0, REWIND_ARROW_STATE_INIT = 0,
@ -53,7 +55,7 @@ Gfx D_8014C2D8[] = {
}; };
// unsorted // unsorted
extern s32 D_8015131C; extern u8* D_8015131C;
extern MessageDrawState D_80155D20; extern MessageDrawState D_80155D20;
extern IMG_BIN D_80159B50[]; extern IMG_BIN D_80159B50[];
extern PAL_BIN D_8015C7E0[]; extern PAL_BIN D_8015C7E0[];
@ -414,14 +416,14 @@ s32 _update_message(MessagePrintState* printer) {
case MSG_WINDOW_STATE_SCROLLING_BACK: case MSG_WINDOW_STATE_SCROLLING_BACK:
printer->scrollingTime++; printer->scrollingTime++;
if (printer->scrollingTime >= 5) { if (printer->scrollingTime >= 5) {
printer->windowState = 7; printer->windowState = MSG_WINDOW_STATE_WAITING_FOR_CHOICE;
printer->currentOption = printer->targetOption; printer->currentOption = printer->targetOption;
printer->selectedOption = printer->currentOption; printer->selectedOption = printer->currentOption;
} }
break; break;
} }
} else if (!(printer->stateFlags & MSG_STATE_FLAG_20) && } else if (!(printer->stateFlags & MSG_STATE_FLAG_20) &&
printer->windowState == 5 && printer->windowState == MSG_WINDOW_STATE_WAITING &&
(gGameStatusPtr->pressedButtons[0] & BUTTON_A)) (gGameStatusPtr->pressedButtons[0] & BUTTON_A))
{ {
printer->windowState = MSG_WINDOW_STATE_PRINTING; printer->windowState = MSG_WINDOW_STATE_PRINTING;
@ -647,10 +649,13 @@ void msg_play_speech_sound(MessagePrintState* printer, u8 character) {
} }
} }
#ifdef NON_EQUIVALENT extern s32 gItemIconRasterOffsets[];
extern s32 gItemIconPaletteOffsets[];
extern s32 D_802EB5C0[];
extern s32 D_802EB5F0[];
extern struct_D_802EB620 D_802EB620[];
void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) { void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
u8 style;
u8 postcard;
u8 arg; u8 arg;
u8 argQ; u8 argQ;
u8 argW; u8 argW;
@ -660,9 +665,9 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
s16 offset; s16 offset;
s32 i; s32 i;
u8* romAddr; u8* romAddr;
u8* romEnd;
s32 temp; s32 temp;
s32 romEnd; void* a2;
s32 t;
s8 s8 = arg2 & 1; s8 s8 = arg2 & 1;
u8* printBuf = &printer->printBuffer[printer->printBufferPos]; u8* printBuf = &printer->printBuffer[printer->printBufferPos];
u8* srcBuf = &printer->srcBuffer[printer->srcBufferPos]; u8* srcBuf = &printer->srcBuffer[printer->srcBufferPos];
@ -676,22 +681,21 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
printer->lineCount += (u8)printer->sizeScale; printer->lineCount += (u8)printer->sizeScale;
break; break;
case MSG_CHAR_READ_WAIT: case MSG_CHAR_READ_WAIT:
printer->windowState = 5; printer->windowState = MSG_WINDOW_STATE_WAITING;
printer->windowState = 5; printer->delayFlags |= MSG_DELAY_FLAG_1;
printer->delayFlags |= 1;
printer->delayFlags &= ~2; printer->delayFlags &= ~2;
printer->rewindArrowAnimState = REWIND_ARROW_STATE_INIT; printer->rewindArrowAnimState = REWIND_ARROW_STATE_INIT;
printer->rewindArrowBlinkCounter = 0; printer->rewindArrowCounter = 0;
printer->stateFlags &= ~0x80; printer->stateFlags &= ~MSG_STATE_FLAG_80;
printer->stateFlags &= ~0x100; printer->stateFlags &= ~MSG_STATE_FLAG_PRINT_QUICKLY;
if (printer->style != 0xF) { if (printer->style != MSG_STYLE_F) {
sfx_play_sound_with_params(SOUND_CB, 0, 0, 0); sfx_play_sound_with_params(SOUND_CB, 0, 0, 0);
} }
break; break;
case MSG_CHAR_READ_PAUSE: case MSG_CHAR_READ_PAUSE:
printer->currentPrintDelay = *srcBuf++; printer->currentPrintDelay = *srcBuf++;
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
printer->stateFlags &= ~0x80; printer->stateFlags &= ~MSG_STATE_FLAG_80;
break; break;
case MSG_CHAR_READ_VARIANT0: case MSG_CHAR_READ_VARIANT0:
case MSG_CHAR_READ_VARIANT1: case MSG_CHAR_READ_VARIANT1:
@ -719,8 +723,8 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
printer->currentLine++; printer->currentLine++;
*printBuf++ = MSG_CHAR_PRINT_NEXT; *printBuf++ = MSG_CHAR_PRINT_NEXT;
printer->nextLinePos = printer->curLinePos + (gMsgCharsets[printer->font]->newLineY + D_802EB644[printer->style]) * printer->lineCount; printer->nextLinePos = printer->curLinePos + (gMsgCharsets[printer->font]->newLineY + D_802EB644[printer->style]) * printer->lineCount;
printer->windowState = 6; printer->windowState = MSG_WINDOW_STATE_SCROLLING;
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
} }
printer->lineCount = 0; printer->lineCount = 0;
break; break;
@ -738,22 +742,24 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
if (arg == MSG_STYLE_RIGHT || arg == MSG_STYLE_LEFT || arg == MSG_STYLE_CENTER) { if (arg == MSG_STYLE_RIGHT || arg == MSG_STYLE_LEFT || arg == MSG_STYLE_CENTER) {
printer->maxLinesPerPage = 3; printer->maxLinesPerPage = 3;
} }
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
printer->stateFlags |= 0x800800; printer->stateFlags |= MSG_STATE_FLAG_800000 | MSG_STATE_FLAG_800;
if (nextArg != 0xC3) { if (nextArg != MSG_CHAR_UNK_C3) {
printer->stateFlags |= 0x80; printer->stateFlags |= MSG_STATE_FLAG_80;
} }
printer->speedSoundIDA = SOUND_11; printer->speedSoundIDA = SOUND_11;
printer->speedSoundIDB = SOUND_12; printer->speedSoundIDB = SOUND_12;
printer->windowState = 2; printer->windowState = MSG_WINDOW_STATE_OPENING;
break; break;
case MSG_STYLE_CHOICE: case MSG_STYLE_CHOICE:
printer->windowBasePos.x = *srcBuf++; do {
printer->windowBasePos.y = *srcBuf++; printer->windowBasePos.x = *srcBuf++;
printer->windowSize.x = *srcBuf++; printer->windowBasePos.y = *srcBuf++;
printer->windowSize.y = *srcBuf++; printer->windowSize.x = *srcBuf++;
printer->windowState = 2; printer->windowSize.y = *srcBuf++;
printer->stateFlags |= 0x800; printer->windowState = MSG_WINDOW_STATE_OPENING;
printer->stateFlags |= MSG_STATE_FLAG_800;
} while (0);
break; break;
case MSG_STYLE_INSPECT: case MSG_STYLE_INSPECT:
case MSG_STYLE_NARRATE: case MSG_STYLE_NARRATE:
@ -763,9 +769,9 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
printer->windowBasePos.y = 28; printer->windowBasePos.y = 28;
printer->windowSize.y = 58; printer->windowSize.y = 58;
printer->windowSize.x = 280; printer->windowSize.x = 280;
printer->windowState = 2; printer->windowState = MSG_WINDOW_STATE_OPENING;
printer->stateFlags |= 0x800; printer->stateFlags |= MSG_STATE_FLAG_800;
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
if (arg == MSG_STYLE_INSPECT) { if (arg == MSG_STYLE_INSPECT) {
sfx_play_sound_with_params(SOUND_21C, 0, 0, 0); sfx_play_sound_with_params(SOUND_21C, 0, 0, 0);
} }
@ -777,76 +783,80 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
printer->windowSize.x = *srcBuf++; printer->windowSize.x = *srcBuf++;
printer->windowSize.y = *srcBuf++; printer->windowSize.y = *srcBuf++;
sfx_play_sound_with_params(SOUND_21C, 0, 0, 0); sfx_play_sound_with_params(SOUND_21C, 0, 0, 0);
printer->windowState = 2; printer->windowState = MSG_WINDOW_STATE_OPENING;
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
printer->stateFlags |= 0x800; printer->stateFlags |= MSG_STATE_FLAG_800;
break; break;
case MSG_STYLE_LAMPPOST: case MSG_STYLE_LAMPPOST:
printer->windowSize.y = *srcBuf++; printer->windowSize.y = *srcBuf++;
/* fallthrough */ /* fallthrough */
case MSG_STYLE_SIGN: case MSG_STYLE_SIGN:
if (!s8) { do {
printer->windowState = 2; if (!s8) {
printer->stateFlags |= 0x800; printer->windowState = MSG_WINDOW_STATE_OPENING;
printer->delayFlags |= 1; printer->stateFlags |= MSG_STATE_FLAG_800;
} printer->delayFlags |= MSG_DELAY_FLAG_1;
}
} while (0);
break; break;
case MSG_STYLE_POSTCARD: case MSG_STYLE_POSTCARD:
arg = *srcBuf++; arg = *srcBuf++;
printer->windowState = 2; printer->windowState = MSG_WINDOW_STATE_OPENING;
printer->stateFlags |= 0x800; printer->stateFlags |= MSG_STATE_FLAG_800;
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
printer->letterBackgroundImg = heap_malloc(7875); printer->letterBackgroundImg = heap_malloc(((charset_postcard_png_width * charset_postcard_png_height) / 2));
romAddr = charset_standard_OFFSET + (s32)(&D_0000B290); romAddr = charset_ROM_START + (s32)charset_postcard_OFFSET;
dma_copy(romAddr, romAddr + 7875, printer->letterBackgroundImg); dma_copy(romAddr, romAddr + ((charset_postcard_png_width * charset_postcard_png_height) / 2), printer->letterBackgroundImg);
printer->letterBackgroundPal = heap_malloc(0x20); printer->letterBackgroundPal = heap_malloc(0x20);
romAddr = charset_standard_OFFSET + (s32)(&D_0000D158); romAddr = charset_ROM_START + ((s32)charset_postcard_pal_OFFSET + 5);
dma_copy(romAddr, romAddr + 0x20, printer->letterBackgroundPal); dma_copy(romAddr, romAddr + 0x20, printer->letterBackgroundPal);
printer->letterContentImg = heap_malloc(0x19FA); printer->letterContentImg = heap_malloc(charset_letter_content_1_png_width * charset_letter_content_1_png_height);
romAddr = charset_standard_OFFSET + (s32)(D_802EB5C0[arg]); romAddr = charset_ROM_START + D_802EB5C0[arg];
dma_copy(romAddr, romAddr + 0x19FA, printer->letterContentImg); dma_copy(romAddr, romAddr + (charset_letter_content_1_png_width * charset_letter_content_1_png_height), printer->letterContentImg);
printer->letterContentPal = heap_malloc(0x200); printer->letterContentPal = heap_malloc(0x200);
romAddr = charset_standard_OFFSET + (s32)(D_802EB5F0[arg]); romAddr = charset_ROM_START + D_802EB5F0[arg];
dma_copy(romAddr, romAddr + 0x200, printer->letterContentPal); dma_copy(romAddr, romAddr + 0x200, printer->letterContentPal);
break; break;
case MSG_STYLE_POPUP: case MSG_STYLE_POPUP:
case MSG_STYLE_B: case MSG_STYLE_B:
printer->windowSize.x = printer->msgWidth + 32; printer->windowSize.x = printer->msgWidth + 32;
printer->windowSize.y = 40; printer->windowSize.y = 40;
printer->stateFlags |= 0x8000; printer->stateFlags |= MSG_STATE_FLAG_8000;
if (!s8) { do {
printer->stateFlags |= 0x8800; if (!s8) {
printer->windowState = 0xD; printer->stateFlags |= MSG_STATE_FLAG_8000 | MSG_STATE_FLAG_800;
printer->delayFlags |= 1; printer->windowState = MSG_WINDOW_STATE_D;
} printer->delayFlags |= MSG_DELAY_FLAG_1;
}
} while (0);
break; break;
case MSG_STYLE_EPILOGUE: case MSG_STYLE_EPILOGUE:
printer->windowState = 4; printer->windowState = MSG_WINDOW_STATE_PRINTING;
break; break;
} }
if ((printer->delayFlags & 1) && (printer->delayFlags & 6)) { if ((printer->delayFlags & MSG_DELAY_FLAG_1) && (printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2))) {
printer->delayFlags &= ~1; printer->delayFlags &= ~MSG_DELAY_FLAG_1;
} }
break; break;
case MSG_CHAR_READ_END: case MSG_CHAR_READ_END:
*printBuf++ = MSG_CHAR_PRINT_END; *printBuf++ = MSG_CHAR_PRINT_END;
if (printer->stateFlags & 0x800) { if (printer->stateFlags & MSG_STATE_FLAG_800) {
if (printer->stateFlags & 0x1000) { if (printer->stateFlags & MSG_STATE_FLAG_1000) {
if (printer->closedWritebackBool != NULL) { if (printer->closedWritebackBool != NULL) {
*printer->closedWritebackBool = TRUE; *printer->closedWritebackBool = TRUE;
} }
} }
if (printer->style != MSG_STYLE_POPUP && printer->style != MSG_STYLE_B) { if (printer->style != MSG_STYLE_POPUP && printer->style != MSG_STYLE_B) {
printer->windowState = 3; printer->windowState = MSG_WINDOW_STATE_CLOSING;
} else { } else {
printer->windowState = 0xE; printer->windowState = MSG_WINDOW_STATE_E;
} }
printer->fadeOutCounter = 0; printer->fadeOutCounter = 0;
} else { } else {
printer->stateFlags |= 1; printer->stateFlags |= MSG_STATE_FLAG_1;
} }
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
printer->delayFlags &= ~2; printer->delayFlags &= ~MSG_DELAY_FLAG_2;
break; break;
case MSG_CHAR_READ_FUNCTION: case MSG_CHAR_READ_FUNCTION:
switch (*srcBuf++) { switch (*srcBuf++) {
@ -866,14 +876,14 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
*printBuf++ = *srcBuf++; *printBuf++ = *srcBuf++;
break; break;
case MSG_READ_FUNC_NO_SKIP: case MSG_READ_FUNC_NO_SKIP:
printer->stateFlags |= 0x10; printer->stateFlags |= MSG_STATE_FLAG_10;
break; break;
case MSG_READ_FUNC_INPUT_OFF: case MSG_READ_FUNC_INPUT_OFF:
printer->stateFlags |= 0x20; printer->stateFlags |= MSG_STATE_FLAG_20;
printer->stateFlags &= ~0x100; printer->stateFlags &= ~MSG_STATE_FLAG_PRINT_QUICKLY;
break; break;
case MSG_READ_FUNC_INPUT_ON: case MSG_READ_FUNC_INPUT_ON:
printer->stateFlags &= ~0x20; printer->stateFlags &= ~MSG_STATE_FLAG_20;
break; break;
case MSG_READ_FUNC_SPACING: case MSG_READ_FUNC_SPACING:
*printBuf++ = MSG_CHAR_PRINT_FUNCTION; *printBuf++ = MSG_CHAR_PRINT_FUNCTION;
@ -881,11 +891,11 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
*printBuf++ = *srcBuf++; *printBuf++ = *srcBuf++;
break; break;
case MSG_READ_FUNC_DELAY_OFF: case MSG_READ_FUNC_DELAY_OFF:
printer->delayFlags |= 2; printer->delayFlags |= MSG_DELAY_FLAG_2;
break; break;
case MSG_READ_FUNC_DELAY_ON: case MSG_READ_FUNC_DELAY_ON:
printer->delayFlags &= ~2; printer->delayFlags &= ~MSG_DELAY_FLAG_2;
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
break; break;
case MSG_READ_FUNC_SCROLL: case MSG_READ_FUNC_SCROLL:
printer->lineEndPos[printer->currentLine] = printer->curLinePos; printer->lineEndPos[printer->currentLine] = printer->curLinePos;
@ -893,8 +903,8 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
*printBuf++ = MSG_CHAR_PRINT_NEXT; *printBuf++ = MSG_CHAR_PRINT_NEXT;
arg = *srcBuf++; arg = *srcBuf++;
printer->nextLinePos = printer->curLinePos + (gMsgCharsets[printer->font]->newLineY + D_802EB644[printer->style]) * arg; printer->nextLinePos = printer->curLinePos + (gMsgCharsets[printer->font]->newLineY + D_802EB644[printer->style]) * arg;
printer->windowState = 6; printer->windowState = MSG_WINDOW_STATE_SCROLLING;
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
printer->lineCount = 0; printer->lineCount = 0;
break; break;
case MSG_READ_FUNC_SIZE: case MSG_READ_FUNC_SIZE:
@ -944,12 +954,12 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
*printBuf++ = MSG_PRINT_FUNC_INLINE_IMAGE; *printBuf++ = MSG_PRINT_FUNC_INLINE_IMAGE;
*printBuf++ = *srcBuf++; *printBuf++ = *srcBuf++;
arg1--; arg1--;
printer->currentPrintDelay = (u8)printer->printDelayTime; printer->currentPrintDelay = printer->printDelayTime;
if (arg1 <= 0) { if (arg1 <= 0) {
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
} }
if (printer->delayFlags & 6) { if (printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) {
printer->delayFlags &= ~1; printer->delayFlags &= ~MSG_DELAY_FLAG_1;
} }
break; break;
case MSG_READ_FUNC_ANIM_SPRITE: case MSG_READ_FUNC_ANIM_SPRITE:
@ -958,12 +968,12 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
*printBuf++ = *srcBuf++; *printBuf++ = *srcBuf++;
*printBuf++ = *srcBuf++; *printBuf++ = *srcBuf++;
*printBuf++ = *srcBuf++; *printBuf++ = *srcBuf++;
printer->currentPrintDelay = (u8)printer->printDelayTime; printer->currentPrintDelay = printer->printDelayTime;
if (--arg1 <= 0) { if (--arg1 <= 0) {
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
} }
if (printer->delayFlags & 6) { if (printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) {
printer->delayFlags &= ~1; printer->delayFlags &= ~MSG_DELAY_FLAG_1;
} }
break; break;
case MSG_READ_FUNC_ITEM_ICON: case MSG_READ_FUNC_ITEM_ICON:
@ -972,18 +982,21 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
arg = *srcBuf++; arg = *srcBuf++;
argQ = *srcBuf++; argQ = *srcBuf++;
a2 = D_80159B50;
offset = arg << 8 | argQ; offset = arg << 8 | argQ;
D_8015131C = D_80159B50; D_8015131C = D_80159B50;
dma_copy(icon_present_ROM_START + gItemIconRasterOffsets[offset], icon_present_ROM_START + gItemIconRasterOffsets[offset] + 0x200, D_80159B50); dma_copy(icon_present_ROM_START + gItemIconRasterOffsets[offset], icon_present_ROM_START + gItemIconRasterOffsets[offset] + 0x200, a2);
romEnd = icon_present_ROM_START + gItemIconPaletteOffsets[offset] + 0x20; romEnd = icon_present_ROM_START + gItemIconPaletteOffsets[offset] + 0x20;
dma_copy(icon_present_ROM_START + gItemIconPaletteOffsets[offset], romEnd, D_8015C7E0); dma_copy(icon_present_ROM_START + gItemIconPaletteOffsets[offset],
romEnd, D_8015C7E0);
printer->currentPrintDelay = printer->printDelayTime; printer->currentPrintDelay = printer->printDelayTime;
if (--arg1 <= 0) { if (--arg1 <= 0) {
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
} }
if (printer->delayFlags & 6) { if (printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) {
printer->delayFlags &= ~1; printer->delayFlags &= ~MSG_DELAY_FLAG_1;
} }
break; break;
case MSG_READ_FUNC_IMAGE: case MSG_READ_FUNC_IMAGE:
@ -998,10 +1011,10 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
printer->varImageDisplayState = 0; printer->varImageDisplayState = 0;
printer->varImageFadeTimer = 0; printer->varImageFadeTimer = 0;
if (--arg1 <= 0) { if (--arg1 <= 0) {
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
} }
if (printer->delayFlags & 6) { if (printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) {
printer->delayFlags &= ~1; printer->delayFlags &= ~MSG_DELAY_FLAG_1;
} }
break; break;
case MSG_READ_FUNC_HIDE_IMAGE: case MSG_READ_FUNC_HIDE_IMAGE:
@ -1020,7 +1033,7 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
*printBuf++ = *srcBuf++; *printBuf++ = *srcBuf++;
*printBuf++ = *srcBuf++; *printBuf++ = *srcBuf++;
*printBuf++ = *srcBuf++; *printBuf++ = *srcBuf++;
printer->delayFlags |= 4; printer->delayFlags |= MSG_DELAY_FLAG_4;
break; break;
case MSG_READ_FUNC_ANIM_LOOP: case MSG_READ_FUNC_ANIM_LOOP:
*printBuf++ = MSG_CHAR_PRINT_FUNCTION; *printBuf++ = MSG_CHAR_PRINT_FUNCTION;
@ -1032,9 +1045,9 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
*printBuf++ = MSG_CHAR_PRINT_FUNCTION; *printBuf++ = MSG_CHAR_PRINT_FUNCTION;
*printBuf++ = MSG_PRINT_FUNC_ANIM_DONE; *printBuf++ = MSG_PRINT_FUNC_ANIM_DONE;
*printBuf++ = *srcBuf++; *printBuf++ = *srcBuf++;
printer->delayFlags &= ~4; printer->delayFlags &= ~MSG_DELAY_FLAG_4;
if (--arg1 <= 0) { if (--arg1 <= 0) {
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
} }
break; break;
case MSG_READ_FUNC_SET_CURSOR: case MSG_READ_FUNC_SET_CURSOR:
@ -1056,8 +1069,8 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
printer->madeChoice = 0; printer->madeChoice = 0;
printer->currentOption = 0; printer->currentOption = 0;
printer->selectedOption = 0; printer->selectedOption = 0;
printer->windowState = 7; printer->windowState = MSG_WINDOW_STATE_WAITING_FOR_CHOICE;
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
break; break;
case MSG_READ_FUNC_SET_CANCEL: case MSG_READ_FUNC_SET_CANCEL:
printer->cancelOption = *srcBuf++; printer->cancelOption = *srcBuf++;
@ -1072,10 +1085,10 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
*printBuf++ = MSG_PRINT_RESET_GFX; *printBuf++ = MSG_PRINT_RESET_GFX;
break; break;
case MSG_READ_FUNC_YIELD: case MSG_READ_FUNC_YIELD:
printer->stateFlags |= 0x100040; printer->stateFlags |= MSG_STATE_FLAG_100000 | MSG_STATE_FLAG_40;
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
printer->stateFlags &= ~0x80; printer->stateFlags &= ~MSG_STATE_FLAG_80;
printer->stateFlags &= ~0x100; printer->stateFlags &= ~MSG_STATE_FLAG_PRINT_QUICKLY;
break; break;
case MSG_READ_FUNC_SAVE_POS: case MSG_READ_FUNC_SAVE_POS:
*printBuf++ = MSG_CHAR_PRINT_FUNCTION; *printBuf++ = MSG_CHAR_PRINT_FUNCTION;
@ -1131,10 +1144,13 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
printer->unk_52A = printer->fontVariant; printer->unk_52A = printer->fontVariant;
*printBuf++ = MSG_CHAR_PRINT_VARIANT0; *printBuf++ = MSG_CHAR_PRINT_VARIANT0;
} }
do { do {
s32 a0 = 1; s32 a0 = 1;
argQ = gMessageMsgVars[arg][printer->varBufferReadPos++]; argQ = gMessageMsgVars[arg][printer->varBufferReadPos++];
if (argQ >= MSG_CONTROL_CHAR) { if (argQ >= MSG_CONTROL_CHAR) {
s32 tmp;
switch (argQ) { switch (argQ) {
case MSG_CHAR_READ_ENDL: case MSG_CHAR_READ_ENDL:
if (gMessageMsgVars[arg][printer->varBufferReadPos] != MSG_CHAR_READ_END) { if (gMessageMsgVars[arg][printer->varBufferReadPos] != MSG_CHAR_READ_END) {
@ -1180,6 +1196,7 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
arg1--; arg1--;
*printBuf++ = sp10[i]; *printBuf++ = sp10[i];
} }
if (gMessageMsgVars[arg][printer->varBufferReadPos] == MSG_CHAR_READ_END) { if (gMessageMsgVars[arg][printer->varBufferReadPos] == MSG_CHAR_READ_END) {
srcBuf += 3; srcBuf += 3;
printer->varBufferReadPos = 0; printer->varBufferReadPos = 0;
@ -1187,14 +1204,15 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
*printBuf++ = MSG_CHAR_PRINT_VARIANT0 + printer->fontVariant; *printBuf++ = MSG_CHAR_PRINT_VARIANT0 + printer->fontVariant;
break; break;
} }
} while ((printer->delayFlags & 6) || arg1 > 0); } while ((printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) || arg1 > 0);
if (!(printer->delayFlags & 6) && arg1 <= 0) {
printer->delayFlags |= 1; if (!(printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) && arg1 <= 0) {
printer->delayFlags |= MSG_DELAY_FLAG_1;
printer->currentPrintDelay = printer->printDelayTime; printer->currentPrintDelay = printer->printDelayTime;
} }
msg_play_speech_sound(printer, c); msg_play_speech_sound(printer, argQ);
if (printer->stateFlags & 0x800000) { if (printer->stateFlags & MSG_STATE_FLAG_800000) {
printer->stateFlags |= 0x80; printer->stateFlags |= MSG_STATE_FLAG_80;
} }
break; break;
case MSG_READ_FUNC_VOICE: case MSG_READ_FUNC_VOICE:
@ -1226,54 +1244,51 @@ void msg_copy_to_print_buffer(MessagePrintState* printer, s32 arg1, s32 arg2) {
break; break;
case MSG_READ_FUNC_SET_REWIND: case MSG_READ_FUNC_SET_REWIND:
if (*srcBuf++) { if (*srcBuf++) {
printer->stateFlags |= 0x40000; printer->stateFlags |= MSG_STATE_FLAG_40000;
} else { } else {
printer->stateFlags &= ~0x40000; printer->stateFlags &= ~MSG_STATE_FLAG_40000;
} }
break; break;
case MSG_READ_FUNC_ENABLE_CDOWN_NEXT: case MSG_READ_FUNC_ENABLE_CDOWN_NEXT:
printer->stateFlags |= 0x80000; printer->stateFlags |= MSG_STATE_FLAG_80000;
break; break;
} }
break; break;
default: default:
*printBuf++ = c; *printBuf++ = c;
arg1--; arg1--;
if (printer->fontVariant == 0 && c == 0xC3) { if (printer->fontVariant == 0 && c == MSG_CHAR_UNK_C3) {
printer->stateFlags &= ~0x80; printer->stateFlags &= ~MSG_STATE_FLAG_80;
} else { } else {
msg_play_speech_sound(printer, c); msg_play_speech_sound(printer, c);
if (printer->stateFlags & 0x800000) { if (printer->stateFlags & MSG_STATE_FLAG_800000) {
printer->stateFlags |= 0x80; printer->stateFlags |= MSG_STATE_FLAG_80;
} }
} }
break; break;
} }
if (!(printer->delayFlags & 6) && arg1 <= 0) { if (!(printer->delayFlags & (MSG_DELAY_FLAG_4 | MSG_DELAY_FLAG_2)) && arg1 <= 0) {
printer->delayFlags |= 1; printer->delayFlags |= MSG_DELAY_FLAG_1;
printer->currentPrintDelay = (u8)printer->printDelayTime; printer->currentPrintDelay = printer->printDelayTime;
} }
if (!(printer->delayFlags & 1)) { if (!(printer->delayFlags & MSG_DELAY_FLAG_1)) {
continue; continue;
} }
if (!s8) { if (!s8) {
break; break;
} }
arg1 = 10000;
if (srcBuf[-1] == MSG_CHAR_READ_END) { if (srcBuf[-1] == MSG_CHAR_READ_END) {
break; break;
} }
arg1 = 10000;
} while (TRUE); } while (TRUE);
printer->printBufferPos = printBuf - printer->printBuffer; printer->printBufferPos = printBuf - printer->printBuffer;
printer->delayFlags = 0; printer->delayFlags = 0;
printer->srcBufferPos = srcBuf - (s32)printer->srcBuffer; printer->srcBufferPos = (u16)(s32)(srcBuf - (s32)printer->srcBuffer);
*printBuf = MSG_CHAR_PRINT_END; *printBuf = MSG_CHAR_PRINT_END;
} }
#else
INCLUDE_ASM(s32, "msg", msg_copy_to_print_buffer);
#endif
void initialize_printer(MessagePrintState* printer, s32 arg1, s32 arg2) { void initialize_printer(MessagePrintState* printer, s32 arg1, s32 arg2) {
s32 i; s32 i;

View File

@ -51,7 +51,7 @@ API_CALLABLE(N(FireBarAI_Main)) {
data->settings = settings; data->settings = settings;
} }
if (get_time_freeze_mode() != 0) { if (get_time_freeze_mode() != TIME_FREEZE_NORMAL) {
return 0; return 0;
} }

File diff suppressed because it is too large Load Diff