mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-28 12:30:46 +00:00
- ported the final level's text screen and exported its text to the string table.
This commit is contained in:
parent
6f039164a3
commit
0843f5f04a
11 changed files with 248 additions and 325 deletions
|
@ -103,7 +103,7 @@ void FireProcess(void)
|
||||||
{
|
{
|
||||||
DoFireFrame();
|
DoFireFrame();
|
||||||
lastUpdate = totalclock;
|
lastUpdate = totalclock;
|
||||||
tileInvalidate(2342, -1, -1);
|
TileFiles.InvalidateTile(2342);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -497,7 +497,7 @@ void DoLensEffect(void)
|
||||||
for (int i = 0; i < kLensSize*kLensSize; i++, d++)
|
for (int i = 0; i < kLensSize*kLensSize; i++, d++)
|
||||||
if (lensTable[i] >= 0)
|
if (lensTable[i] >= 0)
|
||||||
*d = s[lensTable[i]];
|
*d = s[lensTable[i]];
|
||||||
tileInvalidate(4077, -1, -1);
|
TileFiles.InvalidateTile(4077);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateDacs(int nPalette, bool bNoTint)
|
void UpdateDacs(int nPalette, bool bNoTint)
|
||||||
|
|
|
@ -930,20 +930,6 @@ inline double calcSinTableValue(double index)
|
||||||
return 16384. * sin(BANG2RAD * index);
|
return 16384. * sin(BANG2RAD * index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// pal: pass -1 to invalidate all palettes for the tile, or >=0 for a particular palette
|
|
||||||
// how: pass -1 to invalidate all instances of the tile in texture memory, or a bitfield
|
|
||||||
// bit 0: opaque or masked (non-translucent) texture, using repeating
|
|
||||||
// bit 1: ignored
|
|
||||||
// bit 2: 33% translucence, using repeating
|
|
||||||
// bit 3: 67% translucence, using repeating
|
|
||||||
// bit 4: opaque or masked (non-translucent) texture, using clamping
|
|
||||||
// bit 5: ignored
|
|
||||||
// bit 6: 33% translucence, using clamping
|
|
||||||
// bit 7: 67% translucence, using clamping
|
|
||||||
// clamping is for sprites, repeating is for walls
|
|
||||||
void tileInvalidate(int tilenume, int32_t pal, int32_t how);
|
|
||||||
|
|
||||||
void PrecacheHardwareTextures(int nTile);
|
void PrecacheHardwareTextures(int nTile);
|
||||||
void Polymost_Startup();
|
void Polymost_Startup();
|
||||||
|
|
||||||
|
@ -1027,10 +1013,8 @@ static FORCE_INLINE int tilehasmodelorvoxel(int const tilenume, int pal)
|
||||||
{
|
{
|
||||||
UNREFERENCED_PARAMETER(pal);
|
UNREFERENCED_PARAMETER(pal);
|
||||||
return
|
return
|
||||||
#ifdef USE_OPENGL
|
(mdinited && hw_models && tile2model[Ptile2tile(tilenume, pal)].modelid != -1) ||
|
||||||
(videoGetRenderMode() >= REND_POLYMOST && mdinited && hw_models && tile2model[Ptile2tile(tilenume, pal)].modelid != -1) ||
|
(r_voxels && tiletovox[tilenume] != -1);
|
||||||
#endif
|
|
||||||
(videoGetRenderMode() <= REND_POLYMOST && r_voxels && tiletovox[tilenume] != -1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t md_defineframe(int32_t modelid, const char *framename, int32_t tilenume,
|
int32_t md_defineframe(int32_t modelid, const char *framename, int32_t tilenume,
|
||||||
|
|
|
@ -476,11 +476,6 @@ inline rottile_t& RotTile(int tile)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void tileInvalidate(int tilenume, int32_t, int32_t)
|
|
||||||
{
|
|
||||||
TileFiles.InvalidateTile(tilenume);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t animateoffs(int const tilenum, int fakevar);
|
int32_t animateoffs(int const tilenum, int fakevar);
|
||||||
|
|
||||||
inline FGameTexture* tileGetTexture(int tile, bool animate = false)
|
inline FGameTexture* tileGetTexture(int tile, bool animate = false)
|
||||||
|
|
|
@ -39,6 +39,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#include "sequence.h"
|
#include "sequence.h"
|
||||||
#include "v_draw.h"
|
#include "v_draw.h"
|
||||||
#include "m_random.h"
|
#include "m_random.h"
|
||||||
|
#include "gstrings.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -116,13 +117,12 @@ void InitFonts()
|
||||||
fontdata.Insert('\'', tileGetTexture(3654));
|
fontdata.Insert('\'', tileGetTexture(3654));
|
||||||
fontdata.Insert('`', tileGetTexture(3654));
|
fontdata.Insert('`', tileGetTexture(3654));
|
||||||
fontdata.Insert('.', tileGetTexture(3650));
|
fontdata.Insert('.', tileGetTexture(3650));
|
||||||
fontdata.Insert(',', tileGetTexture(3551));
|
fontdata.Insert(',', tileGetTexture(3653));
|
||||||
fontdata.Insert('-', tileGetTexture(3656));
|
fontdata.Insert('-', tileGetTexture(3656));
|
||||||
fontdata.Insert('?', tileGetTexture(3652));
|
fontdata.Insert('?', tileGetTexture(3652));
|
||||||
fontdata.Insert(127, TexMan.FindGameTexture("TINYBLAK")); // this is only here to widen the color range of the font to produce a better translation.
|
fontdata.Insert(127, TexMan.FindGameTexture("TINYBLAK")); // this is only here to widen the color range of the font to produce a better translation.
|
||||||
GlyphSet::Iterator it(fontdata);
|
GlyphSet::Iterator it2(fontdata);
|
||||||
GlyphSet::Pair* pair;
|
while (it2.NextPair(pair)) pair->Value->SetOffsetsNotForFont();
|
||||||
while (it.NextPair(pair)) pair->Value->SetOffsetsNotForFont();
|
|
||||||
SmallFont2 = new ::FFont("SmallFont2", nullptr, "defsmallfont2", 0, 0, 0, -1, 4, false, false, false, &fontdata);
|
SmallFont2 = new ::FFont("SmallFont2", nullptr, "defsmallfont2", 0, 0, 0, -1, 4, false, false, false, &fontdata);
|
||||||
SmallFont2->SetKerning(1);
|
SmallFont2->SetKerning(1);
|
||||||
}
|
}
|
||||||
|
@ -369,7 +369,7 @@ void menu_DoPlasma()
|
||||||
v28[nSmokeOffset] = 175;
|
v28[nSmokeOffset] = 175;
|
||||||
}
|
}
|
||||||
|
|
||||||
tileInvalidate(nPlasmaTile, -1, -1);
|
TileFiles.InvalidateTile(nPlasmaTile);
|
||||||
|
|
||||||
// flip between tile 4092 and 4093
|
// flip between tile 4092 and 4093
|
||||||
if (nPlasmaTile == kTile4092) {
|
if (nPlasmaTile == kTile4092) {
|
||||||
|
@ -1030,10 +1030,215 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// last level cinema
|
||||||
|
//
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class DLastLevelCinema : public DScreenJob
|
||||||
|
{
|
||||||
|
int var_24 = 16;
|
||||||
|
int var_28 = 12;
|
||||||
|
|
||||||
|
int ebp;
|
||||||
|
int nEndTime = 240;
|
||||||
|
int phase = 0;
|
||||||
|
int nextclock = 4;
|
||||||
|
unsigned int nStringTypeOn, nCharTypeOn;
|
||||||
|
int screencnt = 0;
|
||||||
|
|
||||||
|
TArray<FString> screentext;
|
||||||
|
|
||||||
|
public:
|
||||||
|
DLastLevelCinema() : DScreenJob(fadein | fadeout) {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void DoStatic(int a, int b)
|
||||||
|
{
|
||||||
|
auto pixels = TileFiles.tileMakeWritable(kTileLoboLaptop);
|
||||||
|
|
||||||
|
int v2 = 160 - a / 2;
|
||||||
|
int v4 = 81 - b / 2;
|
||||||
|
|
||||||
|
int var_18 = v2 + a;
|
||||||
|
int v5 = v4 + b;
|
||||||
|
|
||||||
|
auto pTile = (pixels + (200 * v2)) + v4;
|
||||||
|
|
||||||
|
TileFiles.InvalidateTile(kTileLoboLaptop);
|
||||||
|
|
||||||
|
while (v2 < var_18)
|
||||||
|
{
|
||||||
|
uint8_t* pStart = pTile;
|
||||||
|
pTile += 200;
|
||||||
|
|
||||||
|
int v7 = v4;
|
||||||
|
|
||||||
|
while (v7 < v5)
|
||||||
|
{
|
||||||
|
*pStart = RandomBit() * 16;
|
||||||
|
|
||||||
|
v7++;
|
||||||
|
pStart++;
|
||||||
|
}
|
||||||
|
v2++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Phase1()
|
||||||
|
{
|
||||||
|
if (var_24 >= 116)
|
||||||
|
{
|
||||||
|
if (var_28 < 192)
|
||||||
|
var_28 += 20;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var_24 += 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
DoStatic(var_28, var_24);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InitPhase2()
|
||||||
|
{
|
||||||
|
FStringf label("TXT_EX_LASTLEVEL%d", screencnt + 1);
|
||||||
|
label = GStrings(label);
|
||||||
|
screentext = label.Split("\n");
|
||||||
|
if (screentext.Size() == 0) return false;
|
||||||
|
|
||||||
|
nStringTypeOn = 0;
|
||||||
|
nCharTypeOn = 0;
|
||||||
|
|
||||||
|
ebp = screentext.Size() * 4; // half height of the entire text
|
||||||
|
ebp = 81 - ebp; // offset from the screen's center.
|
||||||
|
|
||||||
|
auto tex = dynamic_cast<FRestorableTile*>(tileGetTexture(kTileLoboLaptop)->GetTexture()->GetImage());
|
||||||
|
if (tex) tex->Reload();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Phase3()
|
||||||
|
{
|
||||||
|
DoStatic(var_28, var_24);
|
||||||
|
|
||||||
|
if (var_28 > 20) {
|
||||||
|
var_28 -= 20;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (var_24 > 20) {
|
||||||
|
var_24 -= 20;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplayPhase2()
|
||||||
|
{
|
||||||
|
DrawTexture(twod, tileGetTexture(kTileLoboLaptop), 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, TAG_DONE);
|
||||||
|
int yy = ebp;
|
||||||
|
for (int i = 0; i < nStringTypeOn; i++, yy += 8)
|
||||||
|
{
|
||||||
|
DrawText(twod, SmallFont2, CR_UNTRANSLATED, 70, yy, screentext[i], DTA_FullscreenScale, FSMode_ScaleToFit43, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200, TAG_DONE);
|
||||||
|
}
|
||||||
|
DrawText(twod, SmallFont2, CR_UNTRANSLATED, 70, yy, screentext[nStringTypeOn], DTA_FullscreenScale, FSMode_ScaleToFit43, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200, DTA_TextLen, nCharTypeOn, TAG_DONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Frame(uint64_t clock, bool skiprequest) override
|
||||||
|
{
|
||||||
|
if (clock == 0)
|
||||||
|
{
|
||||||
|
PlayLocalSound(StaticSound[kSound75], 0, false, CHANF_UI);
|
||||||
|
phase = 1;
|
||||||
|
}
|
||||||
|
int totalclock = clock * 120 / 1'000'000'000;
|
||||||
|
switch (phase)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
if (totalclock >= nextclock)
|
||||||
|
{
|
||||||
|
Phase1();
|
||||||
|
nextclock += 4;
|
||||||
|
}
|
||||||
|
DrawTexture(twod, tileGetTexture(kTileLoboLaptop), 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, TAG_DONE);
|
||||||
|
if (skiprequest || totalclock >= 240)
|
||||||
|
{
|
||||||
|
InitPhase2();
|
||||||
|
phase = 2;
|
||||||
|
skiprequest = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
if (totalclock >= nextclock)
|
||||||
|
{
|
||||||
|
if (screentext[nStringTypeOn][nCharTypeOn] != ' ')
|
||||||
|
PlayLocalSound(StaticSound[kSound71], 0, false, CHANF_UI);
|
||||||
|
|
||||||
|
nCharTypeOn++;
|
||||||
|
nextclock += 4;
|
||||||
|
if (screentext[nStringTypeOn][nCharTypeOn] == 0)
|
||||||
|
{
|
||||||
|
nCharTypeOn = 0;
|
||||||
|
nStringTypeOn++;
|
||||||
|
if (nStringTypeOn >= screentext.Size())
|
||||||
|
{
|
||||||
|
nextclock = (kTimerTicks * (screentext.Size() + 2)) + (int)totalclock;
|
||||||
|
phase = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DisplayPhase2();
|
||||||
|
if (skiprequest)
|
||||||
|
{
|
||||||
|
nextclock = (kTimerTicks * (screentext.Size() + 2)) + (int)totalclock;
|
||||||
|
phase = 3;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
DisplayPhase2();
|
||||||
|
if (totalclock >= nextclock || skiprequest)
|
||||||
|
{
|
||||||
|
PlayLocalSound(StaticSound[kSound75], 0, false, CHANF_UI);
|
||||||
|
phase = 4;
|
||||||
|
nextclock = totalclock + 240;
|
||||||
|
skiprequest = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
if (totalclock >= nextclock)
|
||||||
|
{
|
||||||
|
skiprequest |= !Phase3();
|
||||||
|
nextclock += 4;
|
||||||
|
}
|
||||||
|
if (skiprequest || totalclock >= 240)
|
||||||
|
{
|
||||||
|
// Go to the next text page.
|
||||||
|
if (screencnt != 2)
|
||||||
|
{
|
||||||
|
screencnt++;
|
||||||
|
nextclock = totalclock + 240;
|
||||||
|
skiprequest = 0;
|
||||||
|
phase = 1;
|
||||||
|
}
|
||||||
|
else return skiprequest ? -1 : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
// temporary.
|
// temporary.
|
||||||
void RunCinemaScene(int num)
|
void RunCinemaScene(int num)
|
||||||
{
|
{
|
||||||
JobDesc job = { Create<DCinema>(num) };
|
num = -1;
|
||||||
|
JobDesc job = { num == -1? (DScreenJob*)Create<DLastLevelCinema>() : Create<DCinema>(num) };
|
||||||
RunScreenJob(&job, 1, [](bool) { gamestate = GS_LEVEL; });
|
RunScreenJob(&job, 1, [](bool) { gamestate = GS_LEVEL; });
|
||||||
SyncScreenJob();
|
SyncScreenJob();
|
||||||
}
|
}
|
||||||
|
|
|
@ -228,32 +228,6 @@ const char *gString[] =
|
||||||
"LOBOTOMY SOFTWARE, INC.",
|
"LOBOTOMY SOFTWARE, INC.",
|
||||||
"3D ENGINE BY 3D REALMS",
|
"3D ENGINE BY 3D REALMS",
|
||||||
"",
|
"",
|
||||||
"LASTLEVEL",
|
|
||||||
"INCOMING MESSAGE",
|
|
||||||
"",
|
|
||||||
"OUR LATEST SCANS SHOW",
|
|
||||||
"THAT THE ALIEN CRAFT IS",
|
|
||||||
"POWERING UP, APPARENTLY",
|
|
||||||
"IN AN EFFORT TO LEAVE.",
|
|
||||||
"THE BAD NEWS IS THAT THEY",
|
|
||||||
"SEEM TO HAVE LEFT A DEVICE",
|
|
||||||
"BEHIND, AND ALL EVIDENCE",
|
|
||||||
"SAYS ITS GOING TO BLOW A",
|
|
||||||
"BIG HOLE IN OUR FINE PLANET.",
|
|
||||||
"A SQUAD IS TRYING TO DISMANTLE",
|
|
||||||
"IT RIGHT NOW, BUT NO LUCK SO",
|
|
||||||
"FAR, AND TIME IS RUNNING OUT.",
|
|
||||||
"",
|
|
||||||
"GET ABOARD THAT CRAFT NOW",
|
|
||||||
"BEFORE IT LEAVES, THEN FIND",
|
|
||||||
"AND SHOOT ALL THE ENERGY",
|
|
||||||
"TOWERS TO GAIN ACCESS TO THE",
|
|
||||||
"CONTROL ROOM. THERE YOU NEED TO",
|
|
||||||
"TAKE OUT THE CONTROL PANELS AND",
|
|
||||||
"THE CENTRAL POWER SOURCE. THIS",
|
|
||||||
"IS THE BIG ONE BUDDY, BEST OF",
|
|
||||||
"LUCK... FOR ALL OF US.",
|
|
||||||
"",
|
|
||||||
"",
|
"",
|
||||||
"CREDITS",
|
"CREDITS",
|
||||||
"EXHUMED",
|
"EXHUMED",
|
||||||
|
@ -2100,20 +2074,7 @@ void CopyTileToBitmap(short nSrcTile, short nDestTile, int xPos, int yPos)
|
||||||
pDestB = pDest;
|
pDestB = pDest;
|
||||||
}
|
}
|
||||||
|
|
||||||
tileInvalidate(nDestTile, -1, -1);
|
TileFiles.InvalidateTile(nDestTile);
|
||||||
}
|
|
||||||
|
|
||||||
int CopyCharToBitmap(char nChar, int nTile, int xPos, int yPos)
|
|
||||||
{
|
|
||||||
if (nChar == ' ') {
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
nChar = toupper(nChar);
|
|
||||||
int nFontTile = seq_GetSeqPicnum(kSeqFont2, 0, nChar - 32) + 102;
|
|
||||||
CopyTileToBitmap(nFontTile, nTile, xPos, yPos);
|
|
||||||
|
|
||||||
return tilesiz[nFontTile].x + 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EraseScreen(int nVal)
|
void EraseScreen(int nVal)
|
||||||
|
@ -2191,7 +2152,7 @@ void InitSpiritHead()
|
||||||
nHeadTimeStart = (int)totalclock;
|
nHeadTimeStart = (int)totalclock;
|
||||||
|
|
||||||
memset(Worktile, TRANSPARENT_INDEX, WorktileSize);
|
memset(Worktile, TRANSPARENT_INDEX, WorktileSize);
|
||||||
tileInvalidate(kTileRamsesWorkTile, -1, -1);
|
TileFiles.InvalidateTile(kTileRamsesWorkTile);
|
||||||
|
|
||||||
nPixelsToShow = 0;
|
nPixelsToShow = 0;
|
||||||
|
|
||||||
|
@ -2271,7 +2232,7 @@ int DoSpiritHead()
|
||||||
|
|
||||||
PlayerList[0].q16horiz = fix16_sadd(PlayerList[0].q16horiz, fix16_sdiv(fix16_ssub(nDestVertPan[0], PlayerList[0].q16horiz), fix16_from_int(4)));
|
PlayerList[0].q16horiz = fix16_sadd(PlayerList[0].q16horiz, fix16_sdiv(fix16_ssub(nDestVertPan[0], PlayerList[0].q16horiz), fix16_from_int(4)));
|
||||||
|
|
||||||
tileInvalidate(kTileRamsesWorkTile, -1, -1);
|
TileFiles.InvalidateTile(kTileRamsesWorkTile);
|
||||||
|
|
||||||
if (nHeadStage < 2)
|
if (nHeadStage < 2)
|
||||||
{
|
{
|
||||||
|
|
|
@ -150,8 +150,6 @@ void DoPassword(int nPassword);
|
||||||
|
|
||||||
void InitSpiritHead();
|
void InitSpiritHead();
|
||||||
|
|
||||||
int CopyCharToBitmap(char nChar, int nTile, int xPos, int yPos);
|
|
||||||
|
|
||||||
// TODO - relocate
|
// TODO - relocate
|
||||||
void StatusMessage(int messageTime, const char *fmt, ...);
|
void StatusMessage(int messageTime, const char *fmt, ...);
|
||||||
|
|
||||||
|
|
|
@ -934,7 +934,7 @@ void DrawWeapons(int smooth)
|
||||||
if (nWeapon < -1) {
|
if (nWeapon < -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
PspTwoDSetter set;
|
PspTwoDSetter set; // this is the last one.
|
||||||
|
|
||||||
short var_34 = PlayerList[nLocalPlayer].field_3A;
|
short var_34 = PlayerList[nLocalPlayer].field_3A;
|
||||||
|
|
||||||
|
|
|
@ -70,19 +70,6 @@ short word_9AB5B = 0;
|
||||||
|
|
||||||
int keytimer = 0;
|
int keytimer = 0;
|
||||||
|
|
||||||
short nMenuKeys[] = { sc_N, sc_L, sc_M, sc_V, sc_Q, sc_None }; // select a menu item using the keys. 'N' for New Gane, 'V' for voume etc. 'M' picks Training for some reason...
|
|
||||||
|
|
||||||
|
|
||||||
void menu_ResetKeyTimer();
|
|
||||||
|
|
||||||
enum {
|
|
||||||
kMenuNewGame = 0,
|
|
||||||
kMenuLoadGame,
|
|
||||||
kMenuTraining,
|
|
||||||
kMenuVolume,
|
|
||||||
kMenuQuitGame,
|
|
||||||
kMenuMaxItems
|
|
||||||
};
|
|
||||||
|
|
||||||
void RunCinemaScene(int num);
|
void RunCinemaScene(int num);
|
||||||
|
|
||||||
|
@ -141,7 +128,7 @@ void DoEnergyTile()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tileInvalidate(kEnergy1, -1, -1);
|
TileFiles.InvalidateTile(kEnergy1);
|
||||||
|
|
||||||
if (nSmokeSparks)
|
if (nSmokeSparks)
|
||||||
{
|
{
|
||||||
|
@ -269,7 +256,7 @@ void DoEnergyTile()
|
||||||
energytile[val] = 175;
|
energytile[val] = 175;
|
||||||
word_9AB5B = 1;
|
word_9AB5B = 1;
|
||||||
}
|
}
|
||||||
tileInvalidate(kEnergy2, -1, -1);
|
TileFiles.InvalidateTile(kEnergy2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -361,32 +348,6 @@ void menu_GameSave(int nSaveSlot)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define kMaxCinemaPals 16
|
|
||||||
const char *cinpalfname[kMaxCinemaPals] = {
|
|
||||||
"3454.pal",
|
|
||||||
"3452.pal",
|
|
||||||
"3449.pal",
|
|
||||||
"3445.pal",
|
|
||||||
"set.pal",
|
|
||||||
"3448.pal",
|
|
||||||
"3446.pal",
|
|
||||||
"hsc1.pal",
|
|
||||||
"2972.pal",
|
|
||||||
"2973.pal",
|
|
||||||
"2974.pal",
|
|
||||||
"2975.pal",
|
|
||||||
"2976.pal",
|
|
||||||
"heli.pal",
|
|
||||||
"2978.pal",
|
|
||||||
"terror.pal"
|
|
||||||
};
|
|
||||||
|
|
||||||
void CinemaFadeIn()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
short nBeforeScene[] = { 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 };
|
short nBeforeScene[] = { 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||||
|
|
||||||
|
|
||||||
|
@ -394,7 +355,7 @@ void CheckBeforeScene(int nLevel)
|
||||||
{
|
{
|
||||||
if (nLevel == kMap20)
|
if (nLevel == kMap20)
|
||||||
{
|
{
|
||||||
DoLastLevelCinema();
|
RunCinemaScene(-1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -483,209 +444,6 @@ uint8_t CheckForEscape()
|
||||||
return inputState.CheckAllInput();
|
return inputState.CheckAllInput();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DoStatic(int a, int b)
|
|
||||||
{
|
|
||||||
RandomLong(); // nothing done with the result of this?
|
|
||||||
|
|
||||||
auto pixels = TileFiles.tileMakeWritable(kTileLoboLaptop);
|
|
||||||
|
|
||||||
int v2 = 160 - a / 2;
|
|
||||||
int v4 = 81 - b / 2;
|
|
||||||
|
|
||||||
int var_18 = v2 + a;
|
|
||||||
int v5 = v4 + b;
|
|
||||||
|
|
||||||
auto pTile = (pixels + (200 * v2)) + v4;
|
|
||||||
|
|
||||||
tileInvalidate(kTileLoboLaptop, -1, -1);
|
|
||||||
|
|
||||||
while (v2 < var_18)
|
|
||||||
{
|
|
||||||
uint8_t *pStart = pTile;
|
|
||||||
pTile += 200;
|
|
||||||
|
|
||||||
int v7 = v4;
|
|
||||||
|
|
||||||
while (v7 < v5)
|
|
||||||
{
|
|
||||||
*pStart = RandomBit() * 16;
|
|
||||||
|
|
||||||
v7++;
|
|
||||||
pStart++;
|
|
||||||
}
|
|
||||||
v2++;
|
|
||||||
}
|
|
||||||
|
|
||||||
tileInvalidate(kTileLoboLaptop, 0, 0);
|
|
||||||
overwritesprite(0, 0, kTileLoboLaptop, 0, 2, kPalNormal);
|
|
||||||
videoNextPage();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DoLastLevelCinema()
|
|
||||||
{
|
|
||||||
FadeOut(0);
|
|
||||||
|
|
||||||
videoSetViewableArea(0, 0, xdim - 1, ydim - 1);
|
|
||||||
|
|
||||||
EraseScreen(-1);
|
|
||||||
RestorePalette();
|
|
||||||
|
|
||||||
int nString = FindGString("LASTLEVEL");
|
|
||||||
|
|
||||||
PlayLocalSound(StaticSound[kSound75], 0, false, CHANF_UI);
|
|
||||||
|
|
||||||
auto pixels = TileFiles.tileMakeWritable(kTileLoboLaptop);
|
|
||||||
// uh, what?
|
|
||||||
//memcpy((void*)waloff[kTileLoboLaptop], (void*)waloff[kTileLoboLaptop], tilesiz[kTileLoboLaptop].x * tilesiz[kTileLoboLaptop].y);
|
|
||||||
|
|
||||||
int var_24 = 16;
|
|
||||||
int var_28 = 12;
|
|
||||||
|
|
||||||
int nEndTime = (int)totalclock + 240;
|
|
||||||
|
|
||||||
while (inputState.keyBufferWaiting()) {
|
|
||||||
inputState.keyGetChar();
|
|
||||||
}
|
|
||||||
|
|
||||||
while (nEndTime > (int)totalclock)
|
|
||||||
{
|
|
||||||
HandleAsync();
|
|
||||||
|
|
||||||
if (var_24 >= 116)
|
|
||||||
{
|
|
||||||
if (var_28 < 192)
|
|
||||||
var_28 += 20;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var_24 += 20;
|
|
||||||
}
|
|
||||||
|
|
||||||
DoStatic(var_28, var_24);
|
|
||||||
|
|
||||||
// WaitVBL();
|
|
||||||
int time = (int)totalclock + 4;
|
|
||||||
while ((int)totalclock < time) {
|
|
||||||
HandleAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// loc_3AD75
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
LABEL_11:
|
|
||||||
|
|
||||||
HandleAsync();
|
|
||||||
|
|
||||||
if (strlen(gString[nString]) == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
int esi = nString;
|
|
||||||
|
|
||||||
while (strlen(gString[esi]) != 0)
|
|
||||||
esi++;
|
|
||||||
|
|
||||||
int ebp = esi;
|
|
||||||
|
|
||||||
ebp -= nString;
|
|
||||||
ebp <<= 2;
|
|
||||||
ebp = 81 - ebp;
|
|
||||||
|
|
||||||
int var_1C = esi - nString;
|
|
||||||
|
|
||||||
// loc_3ADD7
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
HandleAsync();
|
|
||||||
|
|
||||||
if (strlen(gString[nString]) == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
int xPos = 70;
|
|
||||||
|
|
||||||
const char *nChar = gString[nString];
|
|
||||||
|
|
||||||
nString++;
|
|
||||||
|
|
||||||
TileFiles.tileMakeWritable(kTileLoboLaptop);
|
|
||||||
while (*nChar)
|
|
||||||
{
|
|
||||||
HandleAsync();
|
|
||||||
|
|
||||||
if (*nChar != ' ') {
|
|
||||||
PlayLocalSound(StaticSound[kSound71], 0, false, CHANF_UI);
|
|
||||||
}
|
|
||||||
|
|
||||||
xPos += CopyCharToBitmap(*nChar, kTileLoboLaptop, xPos, ebp);
|
|
||||||
nChar++;
|
|
||||||
|
|
||||||
overwritesprite(0, 0, kTileLoboLaptop, 0, 2, kPalNormal);
|
|
||||||
videoNextPage();
|
|
||||||
|
|
||||||
// WaitVBL();
|
|
||||||
int time = (int)totalclock + 4;
|
|
||||||
while ((int)totalclock < time) {
|
|
||||||
HandleAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CheckForEscape())
|
|
||||||
goto LABEL_28;
|
|
||||||
}
|
|
||||||
|
|
||||||
ebp += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
nString++;
|
|
||||||
|
|
||||||
inputState.ClearAllInput();
|
|
||||||
|
|
||||||
int v11 = (kTimerTicks * (var_1C + 2)) + (int)totalclock;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
HandleAsync();
|
|
||||||
|
|
||||||
if (v11 <= (int)totalclock)
|
|
||||||
goto LABEL_11;
|
|
||||||
} while (!inputState.keyBufferWaiting());
|
|
||||||
}
|
|
||||||
while (inputState.keyGetChar() != 27);
|
|
||||||
|
|
||||||
LABEL_28:
|
|
||||||
PlayLocalSound(StaticSound[kSound75], 0, false, CHANF_UI);
|
|
||||||
|
|
||||||
nEndTime = (int)totalclock + 240;
|
|
||||||
|
|
||||||
while (nEndTime > (int)totalclock)
|
|
||||||
{
|
|
||||||
HandleAsync();
|
|
||||||
|
|
||||||
DoStatic(var_28, var_24);
|
|
||||||
|
|
||||||
// WaitVBL();
|
|
||||||
int time = (int)totalclock + 4;
|
|
||||||
while ((int)totalclock < time) {
|
|
||||||
HandleAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (var_28 > 20) {
|
|
||||||
var_28 -= 20;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (var_24 > 20) {
|
|
||||||
var_24 -= 20;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
EraseScreen(-1);
|
|
||||||
tileLoad(kTileLoboLaptop);
|
|
||||||
FadeOut(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static SavegameHelper sgh("menu",
|
static SavegameHelper sgh("menu",
|
||||||
SA(nCinemaSeen),
|
SA(nCinemaSeen),
|
||||||
|
|
|
@ -60,11 +60,8 @@ void menu_DrawTheMap(int nLevel, int nLevelNew, int nLevelBest, std::function<vo
|
||||||
|
|
||||||
void DoEnergyTile();
|
void DoEnergyTile();
|
||||||
|
|
||||||
void CinemaFadeIn();
|
|
||||||
|
|
||||||
void DoFailedFinalScene();
|
void DoFailedFinalScene();
|
||||||
|
|
||||||
void DoLastLevelCinema();
|
|
||||||
void DoAfterCinemaScene(int nLevel);
|
void DoAfterCinemaScene(int nLevel);
|
||||||
|
|
||||||
void InitEnergyTile();
|
void InitEnergyTile();
|
||||||
|
|
|
@ -2133,3 +2133,28 @@ Level 29,TXT_EX_MAP29,,,,,,,,,,,,,,,,,,,,,,
|
||||||
Level 30,TXT_EX_MAP30,,,,,,,,,,,,,,,,,,,,,,
|
Level 30,TXT_EX_MAP30,,,,,,,,,,,,,,,,,,,,,,
|
||||||
Level 31,TXT_EX_MAP31,,,,,,,,,,,,,,,,,,,,,,
|
Level 31,TXT_EX_MAP31,,,,,,,,,,,,,,,,,,,,,,
|
||||||
Level 32,TXT_EX_MAP32,,,,,,,,,,,,,,,,,,,,,,
|
Level 32,TXT_EX_MAP32,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
incoming Message,TXT_EX_LASTLEVEL1,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
"Our latest scans show
|
||||||
|
that the alien craft is
|
||||||
|
powering up, apparently
|
||||||
|
in an effort to leave.
|
||||||
|
The bad news is that they
|
||||||
|
seem to have left a device
|
||||||
|
behind, and all evidence
|
||||||
|
says its going to blow a
|
||||||
|
big hole in our fine planet.
|
||||||
|
A squad is trying to dismantle
|
||||||
|
it right now, but no luck so
|
||||||
|
far, and time is running out.
|
||||||
|
",TXT_EX_LASTLEVEL2,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
"Get aboard that craft now
|
||||||
|
before it leaves, then find
|
||||||
|
and shoot all the energy
|
||||||
|
towers to gain access to the
|
||||||
|
control room. There you need to
|
||||||
|
take out the control panels and
|
||||||
|
the central power source. This
|
||||||
|
is the big one buddy, best of
|
||||||
|
luck... For all of us.
|
||||||
|
",TXT_EX_LASTLEVEL3,,,,,,,,,,,,,,,,,,,,,,
|
|
Loading…
Reference in a new issue