Rename fixed point math routines again
This commit is contained in:
+9
-9
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user