Implemented centering of the target arrow in Classic difficulty.

This commit is contained in:
Julie Marchant 2019-05-26 19:32:52 -04:00
parent e86e5210df
commit 7a066e08a0
2 changed files with 66 additions and 65 deletions

View File

@ -50,19 +50,29 @@ CLASSIC DIFFICULTY DIFFERENCES
Classic difficulty is designed to emulate the experience of version 1.1
of the game (the last version released by Parallel Realities) as closely
as possible. However, there are a few minor differences in addition to
the changes to graphics, sound, and dialog:
as possible. However, there are several minor differences in addition to
the changes to graphics, sound, and dialog. Here you can fine a list of
notable differences.
* The current target is shown by an arrow at the edge of the screen which
precisely indicates the target's position. In contrast, version 1.1's
optional target arrow rested in the middle of the screen and only
pointed in the general direction (north, south, east, west, northwest,
northeast, southwest, southeast) of the target.
* The arrow pointing toward the current target is colored green if the
target is an ally, whereas version 1.1 always showed a red arrow.
The arrow is also positioned lower than in version 1.1 and does not
disappear when radio messages are broadcast.
* Life bars for named characters are labeled with the respective
character's name instead of "Target".
* Selling your secondary weapon leaves you with standard Rockets. In
version 1.1, it instead left you with no secondary weapon at all (with
no way to gain standard Rockets back).
* If you buy a secondary weapon while one other than standard Rockets
is already equipped, the currently equipped secondary weapon is
automatically sold for you (which gives you money equal to half of
said weapon's cost). In version 1.1, the old secondary weapon would
simply disappear in this case, meaning the money was lost unless you
explicitly used the "Sell" button.
* Travel in Spirit works the same as in every other system, except that
there is no chance of interceptions in Classic difficulty. Version
1.1 instead instantly teleported you to the target planet as soon as
@ -79,41 +89,19 @@ the changes to graphics, sound, and dialog:
when he first appears in the Elamale mission is different from version
1.1.
* Version 1.1 had a bug in the shop which caused selling something to
redeem half the cost of the next item, rather than half the cost of
the item being sold. This led to the last item in a series being sold
for nothing (actually a result of undefined behavior), and it also
allowed the player to continuously gain money by buying and selling
the first permanent cooling upgrade. This bug is fixed in the current
release (including Classic difficulty).
* Several bugs present in version 1.1 have been fixed. Many of these
bugs affected gameplay in notable ways; such bugs include:
* Version 1.1 had some overflow bugs, most notably with plasma ammo.
The effect of this bug was that you could sometimes gain too much
plasma ammo, resulting in the recorded amount being lower than before
the powerup was picked up. These bugs are fixed in the current
release (including Classic difficulty).
* A bug made it possible to occasionally get damaged after completing a
mission, during the warp out sequence (the code was designed to
protect against this, but a mistake led to one case being uncovered).
The current release fixes this bug.
* The Odeon mission in version 1.1 had a broken event with undefined
behavior. Players saw it as a message from Sid Wilson saying that
Ursula was running away, followed by an error message. In fact the
source code never defined a fail condition for Ursula running away, so
if the event had been defined properly, all it would have done is
render the mission unwinnable. The current release simply removes the
broken event entirely (including for Classic difficulty).
* The "unlimited time" cheat option in version 1.1 caused the Mars
mission to be unwinnable. The current release fixes that by allowing
the timer to count down on the Mars mission only while this cheat is
enabled.
* The code checking for rescued slaves for the interception mission in
Eyananth failed to work after the interception was cleared in version
1.1. This bug is fixed in the current release.
* A bug in the shop that caused goods to be sold at the wrong price
(notably exploitable to gain infinite cash by buying and selling
the permanent cooling upgrade)
* Overflow bugs that caused various numbers (especially plasma ammo)
to "wrap around" to zero (leading to cases where gaining plasma
ammo would cause you to lose plasma ammo instead)
* A broken event in the Odeon mission that showed a odd error message
* A bug that caused slaves rescued after the interception is destroyed
to not count toward the total for the purpose of the Eyananth
interception mission
------------------------------------------------------------------------

View File

@ -1742,33 +1742,46 @@ static void game_doArrow(int i)
if (arrow != -1)
{
arrowX = aliens[i].x + aliens[i].image[0]->w / 2 - gfx_sprites[arrow]->w;
arrowX = MAX(0, MIN(arrowX, screen->w - gfx_sprites[arrow]->w));
arrowY = aliens[i].y + aliens[i].image[0]->h / 2 - gfx_sprites[arrow]->h;
arrowY = MAX(0, MIN(arrowY, screen->h - gfx_sprites[arrow]->h));
screen_blit(gfx_sprites[arrow], arrowX, arrowY);
if (i == ALIEN_SID)
indicator = SP_INDICATOR_SID;
else if (i == ALIEN_PHOEBE)
indicator = SP_INDICATOR_PHOEBE;
else if (i == ALIEN_URSULA)
indicator = SP_INDICATOR_URSULA;
else if (i == ALIEN_KLINE)
indicator = SP_INDICATOR_KLINE;
else if (i == engine.targetIndex)
indicator = SP_INDICATOR_TARGET;
if (indicator != -1)
if (game.difficulty == DIFFICULTY_ORIGINAL)
{
indicatorX = arrowX + gfx_sprites[arrow]->w / 2 - gfx_sprites[indicator]->w / 2;
indicatorX = MAX(indicatorX, gfx_sprites[arrow]->w + 5);
indicatorX = MIN(indicatorX, screen->w - gfx_sprites[arrow]->w - gfx_sprites[indicator]->w - 5);
indicatorY = arrowY + gfx_sprites[arrow]->h / 2 - gfx_sprites[indicator]->h / 2;
indicatorY = MAX(indicatorY, gfx_sprites[arrow]->h + 5);
indicatorY = MIN(indicatorY, screen->h - gfx_sprites[arrow]->h - gfx_sprites[indicator]->h - 5);
indicator = SP_INDICATOR_TARGET;
indicatorX = (screen->w / 2) - (gfx_sprites[indicator]->w / 2);
indicatorY = 120;
arrowX = indicatorX + gfx_sprites[indicator]->w / 2 - (gfx_sprites[arrow]->w / 2);
arrowY = indicatorY + gfx_sprites[indicator]->h + 5;
screen_blit(gfx_sprites[arrow], arrowX, arrowY);
screen_blit(gfx_sprites[indicator], indicatorX, indicatorY);
}
else
{
arrowX = aliens[i].x + aliens[i].image[0]->w / 2 - gfx_sprites[arrow]->w;
arrowX = MAX(0, MIN(arrowX, screen->w - gfx_sprites[arrow]->w));
arrowY = aliens[i].y + aliens[i].image[0]->h / 2 - gfx_sprites[arrow]->h;
arrowY = MAX(0, MIN(arrowY, screen->h - gfx_sprites[arrow]->h));
screen_blit(gfx_sprites[arrow], arrowX, arrowY);
if (i == ALIEN_SID)
indicator = SP_INDICATOR_SID;
else if (i == ALIEN_PHOEBE)
indicator = SP_INDICATOR_PHOEBE;
else if (i == ALIEN_URSULA)
indicator = SP_INDICATOR_URSULA;
else if (i == ALIEN_KLINE)
indicator = SP_INDICATOR_KLINE;
else if (i == engine.targetIndex)
indicator = SP_INDICATOR_TARGET;
if (indicator != -1)
{
indicatorX = arrowX + gfx_sprites[arrow]->w / 2 - gfx_sprites[indicator]->w / 2;
indicatorX = MAX(indicatorX, gfx_sprites[arrow]->w + 5);
indicatorX = MIN(indicatorX, screen->w - gfx_sprites[arrow]->w - gfx_sprites[indicator]->w - 5);
indicatorY = arrowY + gfx_sprites[arrow]->h / 2 - gfx_sprites[indicator]->h / 2;
indicatorY = MAX(indicatorY, gfx_sprites[arrow]->h + 5);
indicatorY = MIN(indicatorY, screen->h - gfx_sprites[arrow]->h - gfx_sprites[indicator]->h - 5);
screen_blit(gfx_sprites[indicator], indicatorX, indicatorY);
}
}
}
}