Rename fixed point math routines again

This commit is contained in:
PikalaxALT
2021-05-24 14:59:35 -04:00
parent 23c07589f5
commit 5c965f5357
5 changed files with 50 additions and 50 deletions
+9 -9
View File
@@ -9,18 +9,18 @@ typedef s16 fxn16; // Fixed-point with arbitrary precision (QN.S)
typedef s32 fx32; // Fixed-point Q24.8 typedef s32 fx32; // Fixed-point Q24.8
// x * y // x * y
fx16 mulfx16(fx16 x, fx16 y); fx16 Q_8_8_mul(fx16 x, fx16 y);
fxn16 mulfxn16(u8 s, fxn16 x, fxn16 y); fxn16 Q_N_S_mul(u8 s, fxn16 x, fxn16 y);
fx32 mulfx32(fx32 x, fx32 y); fx32 Q_24_8_mul(fx32 x, fx32 y);
// x / y // x / y
fx16 divfx16(fx16 x, fx16 y); fx16 Q_8_8_div(fx16 x, fx16 y);
fxn16 divfxn16(u8 s, fxn16 x, fxn16 y); fxn16 Q_N_S_div(u8 s, fxn16 x, fxn16 y);
fx32 divfx32(fx32 x, fx32 y); fx32 Q_24_8_div(fx32 x, fx32 y);
// 1.0 / y // 1.0 / y
fx16 invfx16(fx16 y); fx16 Q_8_8_inv(fx16 y);
fxn16 invfxn16(u8 s, fxn16 y); fxn16 Q_N_S_inv(u8 s, fxn16 y);
fx32 invfx32(fx32 y); fx32 Q_24_8_inv(fx32 y);
#endif //GUARD_MATH_UTIL_H #endif //GUARD_MATH_UTIL_H
+7 -7
View File
@@ -1532,7 +1532,7 @@ void AnimAirWaveProjectile(struct Sprite *sprite)
{ {
sprite->data[0] = 8; sprite->data[0] = 8;
task->data[5] = 4; task->data[5] = 4;
a = invfx16(0x1000); a = Q_8_8_inv(0x1000);
sprite->pos1.x += sprite->pos2.x; sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y; sprite->pos1.y += sprite->pos2.y;
sprite->pos2.y = 0; sprite->pos2.y = 0;
@@ -1551,8 +1551,8 @@ void AnimAirWaveProjectile(struct Sprite *sprite)
sprite->data[1] = 0; sprite->data[1] = 0;
sprite->data[6] = 0; sprite->data[6] = 0;
sprite->data[5] = 0; sprite->data[5] = 0;
sprite->data[3] = mulfx16(mulfx16(b, a), invfx16(0x1C0)); sprite->data[3] = Q_8_8_mul(Q_8_8_mul(b, a), Q_8_8_inv(0x1C0));
sprite->data[4] = mulfx16(mulfx16(c, a), invfx16(0x1C0)); sprite->data[4] = Q_8_8_mul(Q_8_8_mul(c, a), Q_8_8_inv(0x1C0));
sprite->callback = AnimAirWaveProjectile_Step1; sprite->callback = AnimAirWaveProjectile_Step1;
} }
} }
@@ -1643,18 +1643,18 @@ void AnimTask_AirCutterProjectile(u8 taskId)
else else
xDiff = attackerX - targetX; xDiff = attackerX - targetX;
gTasks[taskId].data[5] = mulfx16(xDiff, invfx16(gBattleAnimArgs[2] & ~1)); gTasks[taskId].data[5] = Q_8_8_mul(xDiff, Q_8_8_inv(gBattleAnimArgs[2] & ~1));
gTasks[taskId].data[6] = mulfx16(gTasks[taskId].data[5], 0x80); gTasks[taskId].data[6] = Q_8_8_mul(gTasks[taskId].data[5], 0x80);
gTasks[taskId].data[7] = gBattleAnimArgs[2]; gTasks[taskId].data[7] = gBattleAnimArgs[2];
if (targetY >= attackerY) if (targetY >= attackerY)
{ {
yDiff = targetY - attackerY; yDiff = targetY - attackerY;
gTasks[taskId].data[8] = mulfx16(yDiff, invfx16(gTasks[taskId].data[5])) & ~1; gTasks[taskId].data[8] = Q_8_8_mul(yDiff, Q_8_8_inv(gTasks[taskId].data[5])) & ~1;
} }
else else
{ {
yDiff = attackerY - targetY; yDiff = attackerY - targetY;
gTasks[taskId].data[8] = mulfx16(yDiff, invfx16(gTasks[taskId].data[5])) | 1; gTasks[taskId].data[8] = Q_8_8_mul(yDiff, Q_8_8_inv(gTasks[taskId].data[5])) | 1;
} }
gTasks[taskId].data[3] = gBattleAnimArgs[3]; gTasks[taskId].data[3] = gBattleAnimArgs[3];
+23 -23
View File
@@ -1052,10 +1052,10 @@ static void SaveResults(void)
time = sGame->results.time; time = sGame->results.time;
time = Q_24_8(time); time = Q_24_8(time);
time = divfx32(time, Q_24_8(60)); time = Q_24_8_div(time, Q_24_8(60));
presses = sGame->results.totalAPresses; presses = sGame->results.totalAPresses;
presses = Q_24_8(presses); presses = Q_24_8(presses);
presses = divfx32(presses, time) & 0xFFFF; presses = Q_24_8_div(presses, time) & 0xFFFF;
sGame->pressingSpeed = presses; sGame->pressingSpeed = presses;
switch (sGame->playerCount) switch (sGame->playerCount)
@@ -1402,7 +1402,7 @@ static u32 Cmd_WaitForOthersToPickBerries(struct BerryCrushGame * game, u8 *args
} }
game->cmdTimer = 0; game->cmdTimer = 0;
ResetBlockReceivedFlags(); ResetBlockReceivedFlags();
game->targetDepth = divfx32(Q_24_8(game->targetAPresses), Q_24_8(32)); game->targetDepth = Q_24_8_div(Q_24_8(game->targetAPresses), Q_24_8(32));
break; break;
case 5: case 5:
ClearDialogWindowAndFrame(0, TRUE); ClearDialogWindowAndFrame(0, TRUE);
@@ -1630,7 +1630,7 @@ static void HandlePartnerInput(struct BerryCrushGame * game)
{ {
temp = game->totalAPresses; temp = game->totalAPresses;
temp = Q_24_8(temp); temp = Q_24_8(temp);
temp = divfx32(temp, game->targetDepth); temp = Q_24_8_div(temp, game->targetDepth);
temp = Q_24_8_TO_INT(temp); temp = Q_24_8_TO_INT(temp);
game->newDepth = (u8)temp; game->newDepth = (u8)temp;
return; return;
@@ -2030,16 +2030,16 @@ static u32 Cmd_TabulateResults(struct BerryCrushGame * game, UNUSED u8 *args)
// Silkiness is the percentage of times big sparkles were produced when possible, // Silkiness is the percentage of times big sparkles were produced when possible,
// which itself depends on the number of A presses every 30 frames // which itself depends on the number of A presses every 30 frames
// (numBigSparkles * 50 / numBigSparkleChecks) + 50 // (numBigSparkles * 50 / numBigSparkleChecks) + 50
temp1 = mulfx32(Q_24_8(game->numBigSparkles), Q_24_8(50)); temp1 = Q_24_8_mul(Q_24_8(game->numBigSparkles), Q_24_8(50));
temp1 = divfx32(temp1, Q_24_8(game->numBigSparkleChecks)) + Q_24_8(50); temp1 = Q_24_8_div(temp1, Q_24_8(game->numBigSparkleChecks)) + Q_24_8(50);
temp1 = Q_24_8_TO_INT(temp1); temp1 = Q_24_8_TO_INT(temp1);
game->results.silkiness = temp1 & 0x7F; game->results.silkiness = temp1 & 0x7F;
// Calculate amount of powder // Calculate amount of powder
temp1 = Q_24_8(temp1); temp1 = Q_24_8(temp1);
temp1 = divfx32(temp1, Q_24_8(100)); temp1 = Q_24_8_div(temp1, Q_24_8(100));
temp2 = Q_24_8(game->powder * game->playerCount); temp2 = Q_24_8(game->powder * game->playerCount);
temp2 = mulfx32(temp2, temp1); temp2 = Q_24_8_mul(temp2, temp1);
game->results.powder = Q_24_8_TO_INT(temp2); game->results.powder = Q_24_8_TO_INT(temp2);
// Choose random second results page // Choose random second results page
@@ -2061,10 +2061,10 @@ static u32 Cmd_TabulateResults(struct BerryCrushGame * game, UNUSED u8 *args)
// "Neat" inputs are those done at a regular interval // "Neat" inputs are those done at a regular interval
temp1 = game->players[i].maxNeatInputStreak; temp1 = game->players[i].maxNeatInputStreak;
temp1 = Q_24_8(temp1); temp1 = Q_24_8(temp1);
temp1 = mulfx32(temp1, Q_24_8(100)); temp1 = Q_24_8_mul(temp1, Q_24_8(100));
temp2 = game->players[i].numAPresses; temp2 = game->players[i].numAPresses;
temp2 = Q_24_8(temp2); temp2 = Q_24_8(temp2);
temp2 = divfx32(temp1, temp2); temp2 = Q_24_8_div(temp1, temp2);
} }
else else
{ {
@@ -2078,10 +2078,10 @@ static u32 Cmd_TabulateResults(struct BerryCrushGame * game, UNUSED u8 *args)
// done at the same time as another player // done at the same time as another player
temp1 = game->players[i].numSyncedAPresses; temp1 = game->players[i].numSyncedAPresses;
temp1 = Q_24_8(temp1); temp1 = Q_24_8(temp1);
temp1 = mulfx32(temp1, Q_24_8(100)); temp1 = Q_24_8_mul(temp1, Q_24_8(100));
temp2 = game->players[i].numAPresses; temp2 = game->players[i].numAPresses;
temp2 = Q_24_8(temp2); temp2 = Q_24_8(temp2);
temp2 = divfx32(temp1, temp2); temp2 = Q_24_8_div(temp1, temp2);
} }
else else
{ {
@@ -2104,10 +2104,10 @@ static u32 Cmd_TabulateResults(struct BerryCrushGame * game, UNUSED u8 *args)
// player spent pressing A // player spent pressing A
temp1 = game->players[i].timePressingA; temp1 = game->players[i].timePressingA;
temp1 = Q_24_8(temp1); temp1 = Q_24_8(temp1);
temp1 = mulfx32(temp1, Q_24_8(100)); temp1 = Q_24_8_mul(temp1, Q_24_8(100));
temp2 = game->timer; temp2 = game->timer;
temp2 = Q_24_8(temp2); temp2 = Q_24_8(temp2);
temp2 = divfx32(temp1, temp2); temp2 = Q_24_8_div(temp1, temp2);
} }
break; break;
} }
@@ -2716,12 +2716,12 @@ static void CreateBerrySprites(struct BerryCrushGame * game, struct BerryCrushGa
distance = Q_N_S(7, distance); distance = Q_N_S(7, distance);
var2 = speed + Q_8_8(0.125); var2 = speed + Q_8_8(0.125);
var2 = var2 / 2; // go from Q8.8 to Q9.7 var2 = var2 / 2; // go from Q8.8 to Q9.7
var1 = divfxn16(7, Q_N_S(7, 127), var2); var1 = Q_N_S_div(7, Q_N_S(7, 127), var2);
sX = Q_N_S(7, (u16)spritesManager->berrySprites[i]->pos1.x); sX = Q_N_S(7, (u16)spritesManager->berrySprites[i]->pos1.x);
sXSpeed = divfxn16(7, distance, var1); sXSpeed = Q_N_S_div(7, distance, var1);
var1 = mulfxn16(7, var1, Q_N_S(7, 0.666666667)); var1 = Q_N_S_mul(7, var1, Q_N_S(7, 0.666666667));
sSinIdx = 0; sSinIdx = 0;
sSinSpeed = divfxn16(7, Q_N_S(7, 127), var1); sSinSpeed = Q_N_S_div(7, Q_N_S(7, 127), var1);
sBitfield |= F_MOVE_HORIZ; sBitfield |= F_MOVE_HORIZ;
if (spritesManager->playerCoords[i]->berryXOffset < 0) if (spritesManager->playerCoords[i]->berryXOffset < 0)
StartSpriteAffineAnim(spritesManager->berrySprites[i], 1); StartSpriteAffineAnim(spritesManager->berrySprites[i], 1);
@@ -2883,7 +2883,7 @@ static void FramesToMinSec(struct BerryCrushGame_Gfx * gfx, u16 frames)
gfx->minutes = frames / 3600; gfx->minutes = frames / 3600;
gfx->secondsInt = (frames % 3600) / 60; gfx->secondsInt = (frames % 3600) / 60;
frac_secs = mulfx16(Q_8_8(frames % 60), Q_8_8(0.016666667)); frac_secs = Q_8_8_mul(Q_8_8(frames % 60), Q_8_8(0.016666667));
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
{ {
@@ -3461,12 +3461,12 @@ static void SpriteCB_Sparkle_Init(struct Sprite * sprite)
targetY = 168; targetY = 168;
sBitfield = targetY; sBitfield = targetY;
xMult = Q_N_S(7, sprite->pos2.x); xMult = Q_N_S(7, sprite->pos2.x);
var = divfxn16(7, Q_N_S(7, targetY - (u16)sprite->pos1.y), (speed + Q_8_8(0.125)) >> 1); var = Q_N_S_div(7, Q_N_S(7, targetY - (u16) sprite->pos1.y), (speed + Q_8_8(0.125)) >> 1);
sprite->sX = Q_N_S(7, (u16)sprite->pos1.x); sprite->sX = Q_N_S(7, (u16)sprite->pos1.x);
sXSpeed = divfxn16(7, xMult, var); sXSpeed = Q_N_S_div(7, xMult, var);
speed = mulfxn16(7, var, Q_N_S(7, 0.666666667)); speed = Q_N_S_mul(7, var, Q_N_S(7, 0.666666667));
sSinIdx = zero; sSinIdx = zero;
sSinSpeed = divfxn16(7, Q_N_S(7, 127), speed); sSinSpeed = Q_N_S_div(7, Q_N_S(7, 127), speed);
sAmplitude = sprite->pos2.x / 4; sAmplitude = sprite->pos2.x / 4;
sBitfield |= F_MOVE_HORIZ; sBitfield |= F_MOVE_HORIZ;
sprite->pos2.y = zero; sprite->pos2.y = zero;
+9 -9
View File
@@ -1,7 +1,7 @@
#include "global.h" #include "global.h"
#include "math_util.h" #include "math_util.h"
fx16 mulfx16(fx16 x, fx16 y) fx16 Q_8_8_mul(fx16 x, fx16 y)
{ {
s32 result; s32 result;
@@ -11,7 +11,7 @@ fx16 mulfx16(fx16 x, fx16 y)
return result; return result;
} }
fxn16 mulfxn16(u8 s, fxn16 x, fxn16 y) fxn16 Q_N_S_mul(u8 s, fxn16 x, fxn16 y)
{ {
s32 result; s32 result;
@@ -21,7 +21,7 @@ fxn16 mulfxn16(u8 s, fxn16 x, fxn16 y)
return result; return result;
} }
fx32 mulfx32(fx32 x, fx32 y) fx32 Q_24_8_mul(fx32 x, fx32 y)
{ {
s64 result; s64 result;
@@ -31,7 +31,7 @@ fx32 mulfx32(fx32 x, fx32 y)
return result; return result;
} }
fx16 divfx16(fx16 x, fx16 y) fx16 Q_8_8_div(fx16 x, fx16 y)
{ {
if (y == 0) if (y == 0)
{ {
@@ -40,7 +40,7 @@ fx16 divfx16(fx16 x, fx16 y)
return (x << 8) / y; return (x << 8) / y;
} }
fxn16 divfxn16(u8 s, fxn16 x, fxn16 y) fxn16 Q_N_S_div(u8 s, fxn16 x, fxn16 y)
{ {
if (y == 0) if (y == 0)
{ {
@@ -49,7 +49,7 @@ fxn16 divfxn16(u8 s, fxn16 x, fxn16 y)
return (x << s) / y; return (x << s) / y;
} }
fx32 divfx32(fx32 x, fx32 y) fx32 Q_24_8_div(fx32 x, fx32 y)
{ {
s64 _x; s64 _x;
@@ -62,7 +62,7 @@ fx32 divfx32(fx32 x, fx32 y)
return _x / y; return _x / y;
} }
fx16 invfx16(fx16 y) fx16 Q_8_8_inv(fx16 y)
{ {
s32 x; s32 x;
@@ -70,7 +70,7 @@ fx16 invfx16(fx16 y)
return x / y; return x / y;
} }
fxn16 invfxn16(u8 s, fxn16 y) fxn16 Q_N_S_inv(u8 s, fxn16 y)
{ {
s32 x; s32 x;
@@ -78,7 +78,7 @@ fxn16 invfxn16(u8 s, fxn16 y)
return x / y; return x / y;
} }
fx32 invfx32(fx32 y) fx32 Q_24_8_inv(fx32 y)
{ {
s64 x; s64 x;
+2 -2
View File
@@ -1418,8 +1418,8 @@ static void Task_OakSpeech39(u8 taskId)
PlaySE(SE_WARP_IN); PlaySE(SE_WARP_IN);
r0 = data[2]; r0 = data[2];
data[2] -= 32; data[2] -= 32;
x = invfx16(r0 - 8); x = Q_8_8_inv(r0 - 8);
y = invfx16(data[2] - 16); y = Q_8_8_inv(data[2] - 16);
SetBgAffine(2, 0x7800, 0x5400, 0x78, 0x54, x, y, 0); SetBgAffine(2, 0x7800, 0x5400, 0x78, 0x54, x, y, 0);
if (data[2] <= 96) if (data[2] <= 96)
{ {