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 Classic difficulty is designed to emulate the experience of version 1.1
of the game (the last version released by Parallel Realities) as closely of the game (the last version released by Parallel Realities) as closely
as possible. However, there are a few minor differences in addition to as possible. However, there are several minor differences in addition to
the changes to graphics, sound, and dialog: 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 * The arrow pointing toward the current target is colored green if the
precisely indicates the target's position. In contrast, version 1.1's target is an ally, whereas version 1.1 always showed a red arrow.
optional target arrow rested in the middle of the screen and only The arrow is also positioned lower than in version 1.1 and does not
pointed in the general direction (north, south, east, west, northwest, disappear when radio messages are broadcast.
northeast, southwest, southeast) of the target.
* 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 * Selling your secondary weapon leaves you with standard Rockets. In
version 1.1, it instead left you with no secondary weapon at all (with version 1.1, it instead left you with no secondary weapon at all (with
no way to gain standard Rockets back). 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 * Travel in Spirit works the same as in every other system, except that
there is no chance of interceptions in Classic difficulty. Version there is no chance of interceptions in Classic difficulty. Version
1.1 instead instantly teleported you to the target planet as soon as 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 when he first appears in the Elamale mission is different from version
1.1. 1.1.
* Version 1.1 had a bug in the shop which caused selling something to * Several bugs present in version 1.1 have been fixed. Many of these
redeem half the cost of the next item, rather than half the cost of bugs affected gameplay in notable ways; such bugs include:
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).
* Version 1.1 had some overflow bugs, most notably with plasma ammo. * A bug in the shop that caused goods to be sold at the wrong price
The effect of this bug was that you could sometimes gain too much (notably exploitable to gain infinite cash by buying and selling
plasma ammo, resulting in the recorded amount being lower than before the permanent cooling upgrade)
the powerup was picked up. These bugs are fixed in the current * Overflow bugs that caused various numbers (especially plasma ammo)
release (including Classic difficulty). to "wrap around" to zero (leading to cases where gaining plasma
ammo would cause you to lose plasma ammo instead)
* A bug made it possible to occasionally get damaged after completing a * A broken event in the Odeon mission that showed a odd error message
mission, during the warp out sequence (the code was designed to * A bug that caused slaves rescued after the interception is destroyed
protect against this, but a mistake led to one case being uncovered). to not count toward the total for the purpose of the Eyananth
The current release fixes this bug. interception mission
* 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.
------------------------------------------------------------------------ ------------------------------------------------------------------------

View File

@ -1742,33 +1742,46 @@ static void game_doArrow(int i)
if (arrow != -1) if (arrow != -1)
{ {
arrowX = aliens[i].x + aliens[i].image[0]->w / 2 - gfx_sprites[arrow]->w; if (game.difficulty == DIFFICULTY_ORIGINAL)
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; indicator = SP_INDICATOR_TARGET;
indicatorX = MAX(indicatorX, gfx_sprites[arrow]->w + 5); indicatorX = (screen->w / 2) - (gfx_sprites[indicator]->w / 2);
indicatorX = MIN(indicatorX, screen->w - gfx_sprites[arrow]->w - gfx_sprites[indicator]->w - 5); indicatorY = 120;
indicatorY = arrowY + gfx_sprites[arrow]->h / 2 - gfx_sprites[indicator]->h / 2; arrowX = indicatorX + gfx_sprites[indicator]->w / 2 - (gfx_sprites[arrow]->w / 2);
indicatorY = MAX(indicatorY, gfx_sprites[arrow]->h + 5); arrowY = indicatorY + gfx_sprites[indicator]->h + 5;
indicatorY = MIN(indicatorY, screen->h - gfx_sprites[arrow]->h - gfx_sprites[indicator]->h - 5); screen_blit(gfx_sprites[arrow], arrowX, arrowY);
screen_blit(gfx_sprites[indicator], indicatorX, indicatorY); 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);
}
}
} }
} }