2021-04-28 22:56:36 +00:00
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
/*
|
|
|
|
Copyright (C) 1997, 2005 - 3D Realms Entertainment
|
|
|
|
Copyright (C) 2019-2021 Christoph Oelckers
|
|
|
|
|
|
|
|
This file is part of Raze
|
|
|
|
|
|
|
|
Shadow Warrior is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public License
|
|
|
|
as published by the Free Software Foundation; either version 2
|
|
|
|
of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
|
|
|
|
Original Source: 1997 - Frank Maddin and Jim Norwood
|
|
|
|
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
|
|
|
|
*/
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
class SWDRealmsScreen : SkippableScreenJob
|
|
|
|
{
|
|
|
|
const DREALMSPAL = 1;
|
2021-12-30 09:30:21 +00:00
|
|
|
|
2021-04-28 22:56:36 +00:00
|
|
|
ScreenJob Init()
|
|
|
|
{
|
|
|
|
Super.Init(fadein | fadeout);
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
override void Start()
|
|
|
|
{
|
|
|
|
SW.PlaySong(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
override void OnTick()
|
|
|
|
{
|
|
|
|
if (ticks > 5 * GameTicRate) jobstate = finished;
|
|
|
|
}
|
|
|
|
|
|
|
|
override void Draw(double sm)
|
|
|
|
{
|
|
|
|
let tex = TexMan.CheckForTexture("THREED_REALMS_PIC", TexMan.Type_Any);
|
2021-07-05 20:43:23 +00:00
|
|
|
int translation = TexMan.UseGamePalette(tex) ? Translation.MakeID(Translation_BasePalette, DREALMSPAL) : 0;
|
2021-04-28 22:56:36 +00:00
|
|
|
Screen.DrawTexture(tex, false, 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_TranslationIndex, translation, DTA_LegacyRenderStyle, STYLE_Normal);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
class SWCreditsScreen : SkippableScreenJob
|
|
|
|
{
|
|
|
|
int mystate;
|
|
|
|
int starttime;
|
|
|
|
TextureID curpic;
|
|
|
|
TextureID pic1, pic2;
|
|
|
|
|
|
|
|
ScreenJob Init()
|
|
|
|
{
|
|
|
|
Super.Init(fadein|fadeout);
|
|
|
|
pic1 = TexMan.CheckForTexture("CREDITS1", TexMan.Type_Any);
|
|
|
|
pic2 = TexMan.CheckForTexture("CREDITS2", TexMan.Type_Any);
|
|
|
|
return self;
|
|
|
|
|
|
|
|
}
|
|
|
|
override void OnSkip()
|
|
|
|
{
|
|
|
|
SW.StopSound();
|
|
|
|
}
|
|
|
|
|
|
|
|
override void Start()
|
|
|
|
{
|
|
|
|
// Lo Wang feel like singing!
|
|
|
|
SW.PlaySound(SWSnd.DIGI_JG95012, SW.v3df_none, CHAN_VOICE, CHANF_UI);
|
|
|
|
}
|
|
|
|
|
|
|
|
override void OnTick()
|
|
|
|
{
|
|
|
|
if (mystate == 0)
|
|
|
|
{
|
|
|
|
if (!SW.IsSoundPlaying(CHAN_VOICE))
|
|
|
|
{
|
|
|
|
starttime = ticks;
|
|
|
|
mystate = 1;
|
|
|
|
SW.StopSound();
|
|
|
|
curpic = pic1;
|
|
|
|
SW.PlaySong(5); //) PlaySong(2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (ticks >= starttime + 8 * GameTicRate)
|
|
|
|
{
|
|
|
|
curpic = curpic == pic1? pic2 : pic1;
|
|
|
|
starttime = ticks;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override void Draw(double sr)
|
|
|
|
{
|
|
|
|
if (mystate == 1)
|
|
|
|
Screen.DrawTexture(curpic, false, 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_LegacyRenderStyle, STYLE_Normal);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Summary screen animation
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
struct SWSummaryAnimation
|
|
|
|
{
|
|
|
|
TextureID frames[15];
|
|
|
|
Sound snd;
|
|
|
|
int delay, length;
|
|
|
|
int tics;
|
|
|
|
|
|
|
|
int curframe;
|
|
|
|
|
|
|
|
void Init(String nametemplate, int length_, Sound sound_, int delay_)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < length_; i++)
|
|
|
|
{
|
|
|
|
String name = String.Format(nametemplate, i);
|
|
|
|
frames[i] = TexMan.CheckForTexture(name, TexMan.Type_Any);
|
|
|
|
}
|
|
|
|
snd = sound_;
|
|
|
|
delay = delay_;
|
|
|
|
length = length_;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Tick()
|
|
|
|
{
|
|
|
|
tics += 3;
|
|
|
|
if (curframe < length-1)
|
|
|
|
{
|
|
|
|
if (tics >= delay)
|
|
|
|
{
|
|
|
|
tics -= delay;
|
|
|
|
curframe++;
|
|
|
|
if (curframe == 3) SW.PlaySound(snd, SW.v3df_none);
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return tics >= 90;
|
|
|
|
}
|
|
|
|
|
|
|
|
TextureID getTex()
|
|
|
|
{
|
|
|
|
return frames[curframe];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Summary screen
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
class SWSummaryScreen : SummaryScreenBase
|
|
|
|
{
|
|
|
|
SWSummaryAnimation anim;
|
|
|
|
int animstate;
|
|
|
|
TextureID rest[4];
|
|
|
|
|
|
|
|
ScreenJob Init(MapRecord mr, SummaryInfo info)
|
|
|
|
{
|
|
|
|
Super.Init(fadein|fadeout);
|
|
|
|
SetParameters(mr, info);
|
|
|
|
switch (random(0, 2))
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
anim.Init("BONUS_PUNCH%02d", 15, SWSnd.DIGI_PLAYERYELL3, 8);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
anim.Init("BONUS_KICK%02d", 15, SWSnd.DIGI_PLAYERYELL2, 8);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
anim.Init("BONUS_GRAB%02d", 15, SWSnd.DIGI_BONUS_GRAB, 20);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
rest[0] = TexMan.CheckForTexture("BONUS_PUNCH00", TexMan.Type_Any);
|
|
|
|
rest[3] = rest[1] = TexMan.CheckForTexture("BONUS_PUNCH01", TexMan.Type_Any);
|
|
|
|
rest[2] = TexMan.CheckForTexture("BONUS_PUNCH02", TexMan.Type_Any);
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
override bool OnEvent(InputEvent ev)
|
|
|
|
{
|
2021-05-22 00:15:49 +00:00
|
|
|
if (ev.type == InputEvent.Type_KeyDown && !System.specialKeyEvent(ev))
|
2021-04-28 22:56:36 +00:00
|
|
|
{
|
|
|
|
if (animstate == 0) animstate = 1;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
override void Start()
|
|
|
|
{
|
2021-05-22 00:15:49 +00:00
|
|
|
System.StopAllSounds();
|
2021-04-28 22:56:36 +00:00
|
|
|
SW.PlaySong(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
override void OnTick()
|
|
|
|
{
|
|
|
|
if (animstate == 1)
|
|
|
|
{
|
|
|
|
if (anim.Tick())
|
|
|
|
{
|
|
|
|
SW.StopSound();
|
|
|
|
jobstate = finished;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
private static int BONUS_LINE(int i) { return (50 + ((i) * 20)); }
|
|
|
|
|
|
|
|
override void Draw(double sm)
|
|
|
|
{
|
|
|
|
Screen.DrawTexture(TexMan.CheckForTexture("BONUS_SCREEN_PIC", TexMan.Type_Any), true, 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_LegacyRenderStyle, STYLE_Normal);
|
|
|
|
SW.DrawString(160, 20, currentLevel.DisplayName(), 1, 19, 0);
|
|
|
|
SW.DrawString(170, 30, "$COMPLETED", 1, 19, 0);
|
|
|
|
|
|
|
|
Textureid animtex;
|
|
|
|
if (animstate == 0) animtex = rest[(ticks / 17) & 3];
|
|
|
|
else animtex = anim.getTex();
|
|
|
|
|
|
|
|
Screen.DrawTexture(animtex, false, 158, 86, DTA_FullscreenScale, FSMode_Fit320x200, DTA_TopLeft, true, DTA_LegacyRenderStyle, STYLE_Normal);
|
|
|
|
|
|
|
|
int line = 0;
|
|
|
|
String ds;
|
|
|
|
|
|
|
|
ds = String.Format("%s %s", StringTable.Localize("$TXT_YOURTIME"), FormatTime(stats.time));
|
|
|
|
SW.DrawString(60, BONUS_LINE(line++), ds, 1, 16);
|
|
|
|
|
|
|
|
if (currentLevel.designerTime > 0)
|
|
|
|
{
|
|
|
|
ds = String.Format("%s %d:%02d", StringTable.Localize("$TXT_3DRTIME"), currentLevel.designerTime / 60, currentLevel.designerTime % 60);
|
|
|
|
SW.DrawString(40, BONUS_LINE(line++), ds, 1, 16);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (currentLevel.parTime > 0)
|
|
|
|
{
|
|
|
|
ds = String.Format("%s %d:%02d", StringTable.Localize("$TXT_PARTIME"), currentLevel.parTime / 60, currentLevel.parTime % 60);
|
|
|
|
SW.DrawString(40, BONUS_LINE(line++), ds, 1, 16);
|
|
|
|
}
|
|
|
|
|
|
|
|
// always read secrets and kills from the first player
|
|
|
|
ds = String.Format("%s: %d / %d", StringTable.Localize("$TXT_SECRETS"), stats.Secrets, stats.MaxSecrets);
|
|
|
|
SW.DrawString(60, BONUS_LINE(line++), ds, 1, 16);
|
|
|
|
|
|
|
|
ds = String.Format("%s: %d / %d", StringTable.Localize("$KILLS"), stats.Kills, stats.MaxKills);
|
|
|
|
SW.DrawString(60, BONUS_LINE(line), ds, 1, 16);
|
|
|
|
|
|
|
|
SW.DrawString(160, 185, "$PRESSKEY", 1, 19, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Deathmatch summary screen
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
class SWMultiSummaryScreen : SkippableScreenJob
|
|
|
|
{
|
|
|
|
enum EConst
|
|
|
|
{
|
|
|
|
|
|
|
|
STAT_START_X = 20,
|
|
|
|
STAT_START_Y = 85,
|
|
|
|
STAT_OFF_Y = 9,
|
|
|
|
STAT_HEADER_Y = 14,
|
|
|
|
STAT_TABLE_X = (STAT_START_X + 15*4),
|
|
|
|
STAT_TABLE_XOFF = 6*4,
|
|
|
|
MAXPLAYERS = 8,
|
|
|
|
PALETTE_PLAYER0 = 16
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
int numplayers;
|
|
|
|
|
|
|
|
ScreenJob Init(int numplayer_)
|
|
|
|
{
|
|
|
|
numplayers = numplayer_;
|
|
|
|
Super.Init(fadein | fadeout);
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
override void Start()
|
|
|
|
{
|
|
|
|
SW.PlaySong(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
override void OnSkip()
|
|
|
|
{
|
|
|
|
SW.StopSound();
|
|
|
|
}
|
|
|
|
|
|
|
|
override void Draw(double sr)
|
|
|
|
{
|
|
|
|
Screen.DrawTexture(TexMan.CheckForTexture("STAT_SCREEN_PIC", TexMan.Type_Any), true, 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_LegacyRenderStyle, STYLE_Normal);
|
2021-05-26 22:32:57 +00:00
|
|
|
Raze.DrawScoreboard(60);
|
2021-04-28 22:56:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
class SWLoadScreen : ScreenJob
|
|
|
|
{
|
|
|
|
MapRecord rec;
|
|
|
|
|
|
|
|
ScreenJob Init(MapRecord maprec)
|
|
|
|
{
|
|
|
|
Super.Init(fadein);
|
|
|
|
rec = maprec;
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
override void OnTick()
|
|
|
|
{
|
|
|
|
if (fadestate == visible) jobstate = finished;
|
|
|
|
}
|
2021-12-30 09:30:21 +00:00
|
|
|
|
2021-04-28 22:56:36 +00:00
|
|
|
override void Draw(double sr)
|
|
|
|
{
|
|
|
|
Screen.DrawTexture(TexMan.CheckForTexture("TITLE_PIC", TexMan.Type_Any), true, 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_LegacyRenderStyle, STYLE_Normal);
|
|
|
|
SW.DrawString(160, 170, "$TXT_ENTERING", 1, 16, 0);
|
|
|
|
SW.DrawString(160, 180, rec.DisplayName(), 1, 16, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-04-25 15:26:17 +00:00
|
|
|
class SWCutscenes ui
|
2021-04-28 22:56:36 +00:00
|
|
|
{
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
static void BuildIntro(ScreenJobRunner runner)
|
|
|
|
{
|
|
|
|
if (!userConfig.nologo)
|
|
|
|
{
|
|
|
|
SW.StopSound();
|
|
|
|
SW.PlaySong(0);
|
|
|
|
Array<int> soundinfo;
|
|
|
|
soundinfo.Pushv(
|
|
|
|
1, SWSnd.DIGI_NOMESSWITHWANG,
|
|
|
|
5, SWSnd.DIGI_INTRO_SLASH,
|
|
|
|
15, SWSnd.DIGI_INTRO_WHIRL);
|
|
|
|
runner.Append(new("SWDRealmsScreen").Init());
|
2022-10-08 07:54:12 +00:00
|
|
|
runner.Append(MoviePlayerJob.CreateWithSoundinfo("sw.anm", soundinfo, MoviePlayer.NOSOUNDCUTOFF | MoviePlayer.NOMUSICCUTOFF, 8, 360, 128));
|
2021-04-28 22:56:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
static void BuildSerpentAnim(ScreenJobRunner runner)
|
|
|
|
{
|
|
|
|
Array<int> soundinfo;
|
|
|
|
soundinfo.Pushv(
|
|
|
|
1, SWSnd.DIGI_SERPTAUNTWANG,
|
|
|
|
16, SWSnd.DIGI_SHAREND_TELEPORT,
|
|
|
|
35, SWSnd.DIGI_WANGTAUNTSERP1,
|
|
|
|
51, SWSnd.DIGI_SHAREND_UGLY1,
|
|
|
|
64, SWSnd.DIGI_SHAREND_UGLY2);
|
|
|
|
runner.Append(MoviePlayerJob.CreateWithSoundinfo("swend.anm", soundinfo, MoviePlayer.NOSOUNDCUTOFF, 16, 16, 140));
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
static void BuildSumoAnim(ScreenJobRunner runner)
|
|
|
|
{
|
|
|
|
Array<int> soundinfo;
|
|
|
|
soundinfo.Pushv(
|
|
|
|
2, SWSnd.DIGI_JG41012,
|
|
|
|
30, SWSnd.DIGI_HOTHEADSWITCH,
|
|
|
|
42, SWSnd.DIGI_HOTHEADSWITCH,
|
|
|
|
59, SWSnd.DIGI_JG41028);
|
|
|
|
runner.Append(MoviePlayerJob.CreateWithSoundinfo("sumocinm.anm", soundinfo, MoviePlayer.NOSOUNDCUTOFF, 10, 40, 130));
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
static void BuildZillaAnim(ScreenJobRunner runner)
|
|
|
|
{
|
|
|
|
Array<int> soundinfo;
|
|
|
|
soundinfo.Pushv(
|
|
|
|
1, SWSnd.DIGI_ZC1,
|
|
|
|
5, SWSnd.DIGI_JG94024,
|
|
|
|
14, SWSnd.DIGI_ZC2,
|
|
|
|
30, SWSnd.DIGI_ZC3,
|
|
|
|
32, SWSnd.DIGI_ZC4,
|
|
|
|
37, SWSnd.DIGI_ZC5,
|
|
|
|
63, SWSnd.DIGI_Z16043,
|
|
|
|
63, SWSnd.DIGI_ZC6,
|
|
|
|
63, SWSnd.DIGI_ZC7,
|
|
|
|
72, SWSnd.DIGI_ZC7,
|
|
|
|
73, SWSnd.DIGI_ZC4,
|
|
|
|
77, SWSnd.DIGI_ZC5,
|
|
|
|
87, SWSnd.DIGI_ZC8,
|
|
|
|
103, SWSnd.DIGI_ZC7,
|
|
|
|
108, SWSnd.DIGI_ZC9,
|
|
|
|
120, SWSnd.DIGI_JG94039);
|
|
|
|
runner.Append(MoviePlayerJob.CreateWithSoundinfo("zfcin.anm", soundinfo, MoviePlayer.NOSOUNDCUTOFF, 16, 16, 140));
|
2021-05-01 18:31:51 +00:00
|
|
|
runner.Append(new("SWCreditsScreen").Init());
|
2021-04-28 22:56:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
static void BuildSybexScreen(ScreenJobRunner runner)
|
|
|
|
{
|
|
|
|
if (Raze.isShareware() && !netgame)
|
2022-12-07 16:10:27 +00:00
|
|
|
runner.Append(ImageScreen.CreateNamed("SYBEXSCREEN", TexMan.Type_Any));
|
2021-04-28 22:56:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
static void BuildMPSummary(ScreenJobRunner runner, MapRecord map, SummaryInfo stats)
|
|
|
|
{
|
|
|
|
runner.Append(new("SWMultiSummaryScreen").Init(stats.playercount));
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
static void BuildSPSummary(ScreenJobRunner runner, MapRecord map, SummaryInfo stats)
|
|
|
|
{
|
|
|
|
runner.Append(new("SWSummaryScreen").Init(map, stats));
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
static void BuildLoading(ScreenJobRunner runner, MapRecord map)
|
|
|
|
{
|
|
|
|
runner.Append(new("SWLoadScreen").Init(map));
|
|
|
|
}
|
|
|
|
}
|