diff --git a/src/alien.cpp b/src/alien.cpp
index 284dd98..0b0f3d2 100644
--- a/src/alien.cpp
+++ b/src/alien.cpp
@@ -813,7 +813,7 @@ bool alien_add()
aliens[index].deathCounter = 0 - (aliens[index].maxShield * 3);
aliens[index].hit = 0;
- limitInt(&aliens[index].deathCounter, -250, 0);
+ LIMIT(aliens[index].deathCounter, -250, 0);
// Attempts to place an alien. If it fails, the alien is deactivated.
for (int i = 0 ; i < 100 ; i++)
diff --git a/src/bullet.cpp b/src/bullet.cpp
index e6c3383..ca68793 100644
--- a/src/bullet.cpp
+++ b/src/bullet.cpp
@@ -200,7 +200,7 @@ char checkPlayerShockDamage(float x, float y)
player.shield -= (int)(10 - distX);
player.shield -= (int)(10 - distY);
- limitInt(&player.shield, 0, player.maxShield);
+ LIMIT(player.shield, 0, player.maxShield);
player.hit = 10;
return 1;
@@ -278,18 +278,18 @@ void doBullets()
if (bullet->target != NULL)
{
if (bullet->x < bullet->target->x)
- limitFloat(&(bullet->dx += homingMissileSpeed), -15, 15);
- if (bullet->x > bullet->target->x)
- limitFloat(&(bullet->dx -= homingMissileSpeed), -15, 15);
+ LIMIT_ADD(bullet->dx, homingMissileSpeed, -15, 15);
+ else if (bullet->x > bullet->target->x)
+ LIMIT_ADD(bullet->dx, -homingMissileSpeed, -15, 15);
//Rocket is (more or less) inline with target. Fly straight
if ((bullet->x > bullet->target->x - 1) && (bullet->x < bullet->target->x + 5))
bullet->dx = 0;
if (bullet->y < bullet->target->y)
- limitFloat(&(bullet->dy += homingMissileSpeed), -15, 15);
- if (bullet->y > bullet->target->y)
- limitFloat(&(bullet->dy -= homingMissileSpeed), -15, 15);
+ LIMIT_ADD(bullet->dy, homingMissileSpeed, -15, 15);
+ else if (bullet->y > bullet->target->y)
+ LIMIT_ADD(bullet->dy, -homingMissileSpeed, -15, 15);
//Rocket is (more or less) inline with target. Fly straight
if ((bullet->y > bullet->target->y - 1) && (bullet->y < bullet->target->y + 5))
@@ -388,7 +388,7 @@ void doBullets()
setInfoLine("!!! WARNING: SHIELD LOW !!!", FONT_RED);
player.shield -= bullet->damage;
- limitInt(&player.shield, 0, player.maxShield);
+ LIMIT(player.shield, 0, player.maxShield);
player.hit = 5;
}
diff --git a/src/cargo.cpp b/src/cargo.cpp
index b9be49d..9b16f07 100644
--- a/src/cargo.cpp
+++ b/src/cargo.cpp
@@ -101,8 +101,8 @@ void doCargo()
cargo[i].x += engine.ssx + engine.smx;
cargo[i].y += engine.ssy + engine.smy;
- limitFloat(&cargo[i].x, cargo[i].owner->x - 50, cargo[i].owner->x + 50);
- limitFloat(&cargo[i].y, cargo[i].owner->y - 50, cargo[i].owner->y + 50);
+ LIMIT(cargo[i].x, cargo[i].owner->x - 50, cargo[i].owner->x + 50);
+ LIMIT(cargo[i].y, cargo[i].owner->y - 50, cargo[i].owner->y + 50);
dx = (cargo[i].x - cargo[i].owner->x) / 10;
dy = (cargo[i].y - cargo[i].owner->y) / 10;
diff --git a/src/collectable.cpp b/src/collectable.cpp
index 8479d11..7c361b4 100644
--- a/src/collectable.cpp
+++ b/src/collectable.cpp
@@ -329,7 +329,7 @@ void doCollectables()
break;
case P_ROCKET:
- limitCharAdd(&player.ammo[1], collectable->value, 0,
+ LIMIT_ADD(player.ammo[1], collectable->value, 0,
currentGame.maxRocketAmmo);
if (player.ammo[1] == currentGame.maxRocketAmmo)
sprintf(temp, "Rocket Ammo at Maximum");
@@ -344,7 +344,7 @@ void doCollectables()
break;
case P_SHIELD:
- limitInt(&(player.shield += 10), 0, player.maxShield);
+ LIMIT_ADD(player.shield, 10, 0, player.maxShield);
currentGame.shieldPickups ++;
sprintf(temp, "Restored 10 shield points");
break;
@@ -405,7 +405,8 @@ void doCollectables()
sprintf(temp, "Plasma cells already at Maximum");
else
{
- limitCharAdd(&player.ammo[0], collectable->value, 0, currentGame.maxPlasmaAmmo);
+ LIMIT_ADD(player.ammo[0], collectable->value,
+ 0, currentGame.maxPlasmaAmmo);
if (collectable->value > 1)
{
sprintf(temp, "Got %d plasma cells", collectable->value);
diff --git a/src/debris.cpp b/src/debris.cpp
index db132ff..a592fa6 100644
--- a/src/debris.cpp
+++ b/src/debris.cpp
@@ -29,7 +29,7 @@ void addDebris(int x, int y, int amount)
object *debris;
amount = rrand(3, rand() % amount);
- limitInt(&amount, 3, 8);
+ LIMIT(amount, 3, 8);
for (int i = 0 ; i < amount ; i++)
{
diff --git a/src/defs.h b/src/defs.h
index 3dcb3d3..a76c58b 100644
--- a/src/defs.h
+++ b/src/defs.h
@@ -22,6 +22,10 @@ along with this program. If not, see .
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#define LIMIT(x, a, b) x = ((x) < (b) ? ((x) > (a) ? (x) : (a)) : (b))
+#define LIMIT_ADD(x, y, a, b) x = (((x) + (y)) < (b) ? \
+ (((x) + (y)) > (a) ? \
+ ((x) + (y)) : (a)) : (b))
// ALL
#define NONE 0
diff --git a/src/game.cpp b/src/game.cpp
index d1c07be..0d98977 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -395,7 +395,7 @@ int mainGameLoop()
{
aliens[i].systemPower = aliens[i].maxShield;
aliens[i].deathCounter = 0 - (aliens[i].maxShield * 3);
- limitInt(&aliens[i].deathCounter, -350, 0);
+ LIMIT(aliens[i].deathCounter, -350, 0);
}
// Set target energy meter
@@ -536,7 +536,7 @@ int mainGameLoop()
}
else if ((currentGame.area == 26) && (engine.musicVolume > 0))
{
- limitFloat(&(engine.musicVolume -= 0.2), 0, 100);
+ LIMIT_ADD(engine.musicVolume, -0.2, 0, 100);
audio_setMusicVolume((int)engine.musicVolume);
}
else
@@ -551,7 +551,7 @@ int mainGameLoop()
}
else
{
- limitFloat(&(engine.musicVolume -= 0.2), 0, 100);
+ LIMIT_ADD(engine.musicVolume, -0.2, 0, 100);
audio_setMusicVolume((int)engine.musicVolume);
if (SDL_GetTicks() >= engine.missionCompleteTimer)
{
@@ -615,7 +615,7 @@ int mainGameLoop()
canFire = true; // The alien is allowed to fire
- limitInt(&--alien->thinktime, 0, 250);
+ LIMIT_ADD(alien->thinktime, -1, 0, 250);
if (alien->target->shield < 1)
alien->target = alien;
@@ -659,8 +659,8 @@ int mainGameLoop()
alien->face = (alien->dx > 0);
}
- limitFloat(&alien->dx, 0 - alien->speed, alien->speed);
- limitFloat(&alien->dy, 0 - alien->speed, alien->speed);
+ LIMIT(alien->dx, -alien->speed, alien->speed);
+ LIMIT(alien->dy, -alien->speed, alien->speed);
}
@@ -678,7 +678,11 @@ int mainGameLoop()
if (alien->flags & FL_LEAVESECTOR)
{
- limitFloat(&(alien->dx -= 0.5), 0, -15);
+ // Note: The original version of this line incorrectly
+ // specified -15 as the *maximum* instead of the
+ // *minimum*, which at the time was equivalent to
+ // ``alien->dx = -15``.
+ LIMIT_ADD(alien->dx, -0.5, -15, 0);
alien->dy = 0;
alien->thinktime = 999;
alien->face = 0;
@@ -728,12 +732,12 @@ int mainGameLoop()
if (alien->classDef == CD_MOBILESHIELD)
{
- limitInt(&(++aliens[ALIEN_BOSS].shield), 0,
+ LIMIT_ADD(aliens[ALIEN_BOSS].shield, 1, 0,
aliens[ALIEN_BOSS].maxShield);
}
- limitCharAdd(&alien->reload[0], -1, 0, 999);
- limitCharAdd(&alien->reload[1], -1, 0, 999);
+ LIMIT_ADD(alien->reload[0], -1, 0, 999);
+ LIMIT_ADD(alien->reload[1], -1, 0, 999);
if ((!(alien->flags & FL_DISABLED)) &&
(!(alien->flags & FL_NOFIRE)))
@@ -788,7 +792,7 @@ int mainGameLoop()
}
else
{
- limitCharAdd(&alien->ammo[0], 1, 0, 250);
+ LIMIT_ADD(alien->ammo[0], 1, 0, 250);
}
if (alien->flags & FL_FIRELASER)
@@ -818,7 +822,7 @@ int mainGameLoop()
if (alien->hit)
shapeToUse += SHIP_HIT_INDEX;
- limitCharAdd(&alien->hit, -1, 0, 100);
+ LIMIT_ADD(alien->hit, -1, 0, 100);
if ((alien->x + alien->image[0]->w > 0) &&
(alien->x < screen->w) &&
diff --git a/src/intermission.cpp b/src/intermission.cpp
index 86d8adf..0e69c8a 100644
--- a/src/intermission.cpp
+++ b/src/intermission.cpp
@@ -33,8 +33,8 @@ static void doCursor()
{
getPlayerInput();
- limitInt(&engine.cursor_x, 10, screen->w - 10 - shape[0]->w);
- limitInt(&engine.cursor_y, 10, screen->h - 10 - shape[0]->h);
+ LIMIT(engine.cursor_x, 10, screen->w - 10 - shape[0]->w);
+ LIMIT(engine.cursor_y, 10, screen->h - 10 - shape[0]->h);
blit(shape[0], engine.cursor_x, engine.cursor_y);
}
diff --git a/src/math.h b/src/math.h
index b618191..14e4df1 100644
--- a/src/math.h
+++ b/src/math.h
@@ -20,58 +20,6 @@ along with this program. If not, see .
#ifndef MATH_H
#define MATH_H
-static inline void limitChar(signed char *in, int low, int high)
-{
- if (*in < low)
- *in = low;
- if (*in > high)
- *in = high;
-}
-
-static inline void limitChar(unsigned char *in, int low, int high)
-{
- if (*in < low)
- *in = low;
- if (*in > high)
- *in = high;
-}
-
-static inline void limitCharAdd(signed char *in, int add, int low, int high)
-{
- int tmp = (int)*in + add;
- if (tmp < low)
- tmp = low;
- if (tmp > high)
- tmp = high;
- *in = tmp;
-}
-
-static inline void limitCharAdd(unsigned char *in, int add, int low, int high)
-{
- int tmp = (int)*in + add;
- if (tmp < low)
- tmp = low;
- if (tmp > high)
- tmp = high;
- *in = tmp;
-}
-
-static inline void limitInt(int *in, int low, int high)
-{
- if (*in < low)
- *in = low;
- if (*in > high)
- *in = high;
-}
-
-static inline void limitFloat(float *in, float low, float high)
-{
- if (*in < low)
- *in = low;
- if (*in > high)
- *in = high;
-}
-
static inline void wrapChar(signed char *in, signed char low, signed char high)
{
if (*in < low)
diff --git a/src/misc.cpp b/src/misc.cpp
index 8489807..cafd04e 100644
--- a/src/misc.cpp
+++ b/src/misc.cpp
@@ -389,7 +389,7 @@ void doInfo()
return;
if ((!engine.keyState[KEY_ALTFIRE]) && (player.weaponType[1] == W_LASER) && (engine.eventTimer % 8 == 1))
- limitCharAdd(&player.ammo[1], -1, 1, 255);
+ LIMIT_ADD(player.ammo[1], -1, 1, 255);
if ((engine.eventTimer < 30) && (player.shield <= engine.lowShield))
return;
diff --git a/src/player.cpp b/src/player.cpp
index 94df121..3c9a372 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -133,7 +133,7 @@ void doPlayer()
{
if (!charger_fired)
{
- limitCharAdd(&player.ammo[1], 1, 0, 150);
+ LIMIT_ADD(player.ammo[1], 1, 0, 150);
if (player.ammo[1] >= 150)
{
ship_fireBullet(&player, 1);
@@ -171,8 +171,8 @@ void doPlayer()
engine.keyState[KEY_SWITCH] = 0;
}
- limitCharAdd(&player.reload[0], -1, 0, 999);
- limitCharAdd(&player.reload[1], -1, 0, 999);
+ LIMIT_ADD(player.reload[0], -1, 0, 999);
+ LIMIT_ADD(player.reload[1], -1, 0, 999);
if (engine.keyState[KEY_UP])
{
@@ -299,7 +299,7 @@ void doPlayer()
if (player.hit)
shapeToUse += SHIP_HIT_INDEX;
- limitCharAdd(&player.hit, -1, 0, 100);
+ LIMIT_ADD(player.hit, -1, 0, 100);
blit(shipShape[shapeToUse], (int)player.x, (int)player.y);
if ((player.maxShield > 1) && (player.shield <= engine.lowShield) &&
@@ -334,8 +334,8 @@ void doPlayer()
}
}
- limitFloat(&engine.ssx, -cameraMaxSpeed, cameraMaxSpeed);
- limitFloat(&engine.ssy, -cameraMaxSpeed, cameraMaxSpeed);
+ LIMIT(engine.ssx, -cameraMaxSpeed, cameraMaxSpeed);
+ LIMIT(engine.ssy, -cameraMaxSpeed, cameraMaxSpeed);
// Specific for the mission were you have to chase the Executive Transport
if ((currentGame.area == 18) && (aliens[ALIEN_BOSS].shield > 0) &&
diff --git a/src/shop.cpp b/src/shop.cpp
index 5c4cb3e..35ff3d8 100644
--- a/src/shop.cpp
+++ b/src/shop.cpp
@@ -549,7 +549,7 @@ static void buy(int i)
shopSelectedItem = -4;
return;
}
- limitCharAdd(&player.ammo[0], 10, 0, currentGame.maxPlasmaAmmo);
+ LIMIT_ADD(player.ammo[0], 10, 0, currentGame.maxPlasmaAmmo);
break;
case SHOP_ROCKET_AMMO:
@@ -668,7 +668,7 @@ static void buy(int i)
}
shop_sellSecondaryWeapon();
player.weaponType[1] = W_DOUBLE_ROCKETS;
- limitChar(¤tGame.maxRocketAmmo, 5, 50);
+ LIMIT(currentGame.maxRocketAmmo, 5, 50);
shopSelectedItem = -1;
break;
@@ -680,7 +680,7 @@ static void buy(int i)
}
shop_sellSecondaryWeapon();
player.weaponType[1] = W_MICRO_ROCKETS;
- limitChar(¤tGame.maxRocketAmmo, 5, 50);
+ LIMIT(currentGame.maxRocketAmmo, 5, 50);
shopSelectedItem = -1;
break;
@@ -713,7 +713,7 @@ static void buy(int i)
while (currentGame.maxRocketAmmo > maxHoming)
sell(SHOP_ROCKET_MAX_AMMO);
- limitChar(¤tGame.maxRocketAmmo, 5, maxHoming);
+ LIMIT(currentGame.maxRocketAmmo, 5, maxHoming);
shopSelectedItem = -1;
break;
@@ -746,7 +746,7 @@ static void buy(int i)
while (currentGame.maxRocketAmmo > maxDoubleHoming)
sell(SHOP_ROCKET_MAX_AMMO);
- limitChar(¤tGame.maxRocketAmmo, 5, maxDoubleHoming);
+ LIMIT(currentGame.maxRocketAmmo, 5, maxDoubleHoming);
shopSelectedItem = -1;
break;
@@ -762,7 +762,7 @@ static void buy(int i)
while (currentGame.maxRocketAmmo > maxMicroHoming)
sell(SHOP_ROCKET_MAX_AMMO);
- limitChar(¤tGame.maxRocketAmmo, 5, maxMicroHoming);
+ LIMIT(currentGame.maxRocketAmmo, 5, maxMicroHoming);
shopSelectedItem = -1;
break;
}