- scriptified SW's 2D screens.

Compiles but not tested yet.
This commit is contained in:
Christoph Oelckers 2021-04-29 00:56:36 +02:00
parent d5db898236
commit aa148d602c
21 changed files with 1525 additions and 755 deletions

View file

@ -218,7 +218,7 @@ private:
stats.font = SmallFont;
stats.letterColor = CR_DARKRED;
stats.standardColor = CR_DARKGRAY;
stats.time = Scale(gFrameCount, 1000, kTicsPerSec);
stats.time = gFrameCount / GameTicRate;
if (automapMode == am_full)
{

View file

@ -1052,7 +1052,7 @@ void exitlevel(MapRecord* nextlevel)
info.maxkills = ps[0].max_actors_killed;
info.secrets = ps[0].secret_rooms;
info.maxsecrets = ps[0].max_secret_rooms;
info.time = ps[0].player_par;
info.time = ps[0].player_par / GameTicRate;
info.endofgame = endofgame;
Mus_Stop();

View file

@ -1,4 +1,3 @@
#include "src/2d.cpp"
#include "src/actor.cpp"
#include "src/ai.cpp"
#include "src/break.cpp"

View file

@ -1,692 +0,0 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
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
*/
//-------------------------------------------------------------------------
#include "ns.h"
#include "screenjob.h"
#include "game.h"
#include "sounds.h"
#include "v_draw.h"
#include "menus.h"
#include "gamecontrol.h"
#include "mapinfo.h"
#include "misc.h"
#include "network.h"
#include "pal.h"
BEGIN_SW_NS
#if 0
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
class DSWDRealmsScreen : public DSkippableScreenJob
{
public:
DSWDRealmsScreen() : DSkippableScreenJob(fadein | fadeout) {}
void OnTick() override
{
if (ticks > 5 * GameTicRate) state = finished;
}
void Draw(double) override
{
const auto tex = tileGetTexture(THREED_REALMS_PIC, true);
const int translation = TRANSLATION(Translation_BasePalettes, DREALMSPAL);
twod->ClearScreen();
DrawTexture(twod, tex, 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_TranslationIndex, translation, DTA_LegacyRenderStyle, STYLE_Normal, TAG_DONE);
}
};
#endif
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void Logo(const CompletionFunc& completion)
{
#if 0
StopSound();
PlaySong(nullptr, ThemeSongs[0], ThemeTrack[0]);
static const AnimSound logosound[] =
{
{ 1, DIGI_NOMESSWITHWANG },
{ 5, DIGI_INTRO_SLASH },
{ 15, DIGI_INTRO_WHIRL },
{ -1, -1 }
};
static const int logoframetimes[] = { 360, 8, 128 };
if (!userConfig.nologo)
{
TArray<DScreenJob*> jobs;
jobs.Push(Create<DSWDRealmsScreen>());
jobs.Push(PlayVideo("sw.anm", logosound, logoframetimes, true));
RunScreenJob(jobs, completion, SJ_BLOCKUI);
}
else completion(false);
#endif
}
#if 0
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
DScreenJob* GetFinishAnim(int num)
{
static const AnimSound serpsound[] =
{
{ 1, DIGI_SERPTAUNTWANG },
{ 16, DIGI_SHAREND_TELEPORT },
{ 35, DIGI_WANGTAUNTSERP1 },
{ 51, DIGI_SHAREND_UGLY1 },
{ 64, DIGI_SHAREND_UGLY2 },
{ -1, -1 }
};
static const int serpzillaframetimes[] = { 16, 16, 140 };
static const AnimSound sumosound[] =
{
{ 2, DIGI_JG41012 },
{ 30, DIGI_HOTHEADSWITCH },
{ 42, DIGI_HOTHEADSWITCH },
{ 59, DIGI_JG41028 },
{ -1, -1 }
};
static const int sumoframetimes[] = { 40, 10, 130 };
static const AnimSound zillasound[] =
{
{ 1, DIGI_ZC1 },
{ 5, DIGI_JG94024 },
{ 14, DIGI_ZC2 },
{ 30, DIGI_ZC3 },
{ 32, DIGI_ZC4 },
{ 37, DIGI_ZC5 },
{ 63, DIGI_Z16043 },
{ 63, DIGI_ZC6 },
{ 63, DIGI_ZC7 },
{ 72, DIGI_ZC7 },
{ 73, DIGI_ZC4 },
{ 77, DIGI_ZC5 },
{ 87, DIGI_ZC8 },
{ 103, DIGI_ZC7 },
{ 108, DIGI_ZC9 },
{ 120, DIGI_JG94039 },
{ -1, -1 }
};
static const char* const ANIMname[] =
{
"swend.anm",
"sumocinm.anm",
"zfcin.anm",
};
switch (num)
{
case ANIM_SERP: return PlayVideo("swend.anm", serpsound, serpzillaframetimes);
case ANIM_SUMO: return PlayVideo("sumocinm.anm", sumosound, sumoframetimes);
case ANIM_ZILLA:return PlayVideo("zfcin.anm", zillasound, serpzillaframetimes);
default: return nullptr;
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
class DSWCreditsScreen : public DSkippableScreenJob
{
enum
{
CREDITS1_PIC = 5111,
CREDITS2_PIC = 5118
};
int state = 0;
int starttime;
int curpic;
void Skipped() override
{
StopSound();
}
void Start() override
{
// Lo Wang feel like singing!
PlaySound(DIGI_JG95012, v3df_none, CHAN_VOICE, CHANF_UI);
}
void OnTick() override
{
if (state == 0)
{
if (!soundEngine->IsSourcePlayingSomething(SOURCE_None, nullptr, CHAN_VOICE))
{
starttime = ticks;
state = 1;
StopSound();
curpic = CREDITS1_PIC;
// try 14 then 2 then quit
if (!PlaySong(nullptr, ThemeSongs[5], ThemeTrack[5], true))
{
PlaySong(nullptr, nullptr, 2, true);
}
}
}
else
{
if (ticks >= starttime + 8 * GameTicRate)
{
curpic = CREDITS1_PIC + CREDITS2_PIC - curpic;
starttime = ticks;
}
}
}
void Draw(double) override
{
twod->ClearScreen();
if (state == 1)
DrawTexture(twod, tileGetTexture(curpic, true), 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_LegacyRenderStyle, STYLE_Normal, TAG_DONE);
}
};
#endif
//---------------------------------------------------------------------------
//
// Summary screen
//
//---------------------------------------------------------------------------
static int BonusPunchSound(short)
{
PlaySound(DIGI_PLAYERYELL3, v3df_none);
return 0;
}
static int BonusKickSound(short)
{
PlaySound(DIGI_PLAYERYELL2, v3df_none);
return 0;
}
static int BonusGrabSound(short)
{
PlaySound(DIGI_BONUS_GRAB, v3df_none);
return 0;
}
enum
{
BONUS_SCREEN_PIC = 5120,
BONUS_ANIM = 5121,
BONUS_ANIM_FRAMES = (5159 - 5121),
BREAK_LIGHT_RATE = 18,
BONUS_PUNCH = 5121,
BONUS_KICK = 5136,
BONUS_GRAB = 5151,
BONUS_REST = 5121,
BONUS_TICS = 8,
BONUS_GRAB_TICS = 20,
BONUS_REST_TICS = 50,
};
static STATE s_BonusPunch[] =
{
{BONUS_PUNCH + 0, BONUS_TICS, NULL, &s_BonusPunch[1]},
{BONUS_PUNCH + 1, BONUS_TICS, NULL, &s_BonusPunch[2]},
{BONUS_PUNCH + 2, BONUS_TICS, NULL, &s_BonusPunch[3]},
{BONUS_PUNCH + 2, 0 | SF_QUICK_CALL, BonusPunchSound, &s_BonusPunch[4]},
{BONUS_PUNCH + 3, BONUS_TICS, NULL, &s_BonusPunch[5]},
{BONUS_PUNCH + 4, BONUS_TICS, NULL, &s_BonusPunch[6]},
{BONUS_PUNCH + 5, BONUS_TICS, NULL, &s_BonusPunch[7]},
{BONUS_PUNCH + 6, BONUS_TICS, NULL, &s_BonusPunch[8]},
{BONUS_PUNCH + 7, BONUS_TICS, NULL, &s_BonusPunch[9]},
{BONUS_PUNCH + 8, BONUS_TICS, NULL, &s_BonusPunch[10]},
{BONUS_PUNCH + 9, BONUS_TICS, NULL, &s_BonusPunch[11]},
{BONUS_PUNCH + 10, BONUS_TICS, NULL, &s_BonusPunch[12]},
{BONUS_PUNCH + 11, BONUS_TICS, NULL, &s_BonusPunch[13]},
{BONUS_PUNCH + 12, BONUS_TICS, NULL, &s_BonusPunch[14]},
{BONUS_PUNCH + 14, 90, NULL, &s_BonusPunch[15]},
{BONUS_PUNCH + 14, BONUS_TICS, NULL, &s_BonusPunch[15]},
};
static STATE s_BonusKick[] =
{
{BONUS_KICK + 0, BONUS_TICS, NULL, &s_BonusKick[1]},
{BONUS_KICK + 1, BONUS_TICS, NULL, &s_BonusKick[2]},
{BONUS_KICK + 2, BONUS_TICS, NULL, &s_BonusKick[3]},
{BONUS_KICK + 2, 0 | SF_QUICK_CALL, BonusKickSound, &s_BonusKick[4]},
{BONUS_KICK + 3, BONUS_TICS, NULL, &s_BonusKick[5]},
{BONUS_KICK + 4, BONUS_TICS, NULL, &s_BonusKick[6]},
{BONUS_KICK + 5, BONUS_TICS, NULL, &s_BonusKick[7]},
{BONUS_KICK + 6, BONUS_TICS, NULL, &s_BonusKick[8]},
{BONUS_KICK + 7, BONUS_TICS, NULL, &s_BonusKick[9]},
{BONUS_KICK + 8, BONUS_TICS, NULL, &s_BonusKick[10]},
{BONUS_KICK + 9, BONUS_TICS, NULL, &s_BonusKick[11]},
{BONUS_KICK + 10, BONUS_TICS, NULL, &s_BonusKick[12]},
{BONUS_KICK + 11, BONUS_TICS, NULL, &s_BonusKick[13]},
{BONUS_KICK + 12, BONUS_TICS, NULL, &s_BonusKick[14]},
{BONUS_KICK + 14, 90, NULL, &s_BonusKick[15]},
{BONUS_KICK + 14, BONUS_TICS, NULL, &s_BonusKick[15]},
};
static STATE s_BonusGrab[] =
{
{BONUS_GRAB + 0, BONUS_GRAB_TICS, NULL, &s_BonusGrab[1]},
{BONUS_GRAB + 1, BONUS_GRAB_TICS, NULL, &s_BonusGrab[2]},
{BONUS_GRAB + 2, BONUS_GRAB_TICS, NULL, &s_BonusGrab[3]},
{BONUS_GRAB + 2, 0 | SF_QUICK_CALL, BonusGrabSound, &s_BonusGrab[4]},
{BONUS_GRAB + 3, BONUS_GRAB_TICS, NULL, &s_BonusGrab[5]},
{BONUS_GRAB + 4, BONUS_GRAB_TICS, NULL, &s_BonusGrab[6]},
{BONUS_GRAB + 5, BONUS_GRAB_TICS, NULL, &s_BonusGrab[7]},
{BONUS_GRAB + 6, BONUS_GRAB_TICS, NULL, &s_BonusGrab[8]},
{BONUS_GRAB + 7, BONUS_GRAB_TICS, NULL, &s_BonusGrab[9]},
{BONUS_GRAB + 8, BONUS_GRAB_TICS, NULL, &s_BonusGrab[10]},
{BONUS_GRAB + 9, 90, NULL, &s_BonusGrab[11]},
{BONUS_GRAB + 9, BONUS_GRAB_TICS, NULL, &s_BonusGrab[11]},
};
static STATE s_BonusRest[] =
{
{BONUS_REST + 0, BONUS_REST_TICS, NULL, &s_BonusRest[1]},
{BONUS_REST + 1, BONUS_REST_TICS, NULL, &s_BonusRest[2]},
{BONUS_REST + 2, BONUS_REST_TICS, NULL, &s_BonusRest[3]},
{BONUS_REST + 1, BONUS_REST_TICS, NULL, &s_BonusRest[0]},
};
static STATE * s_BonusAnim[] =
{
s_BonusPunch,
s_BonusKick,
s_BonusGrab
};
#if 0
class DSWLevelSummaryScreen : public DScreenJob
{
int minutes, seconds, second_tics;
int nextclock = synctics;
STATE * State = s_BonusRest;
int Tics = 0;
public:
DSWLevelSummaryScreen()
{
second_tics = (PlayClock / 120);
minutes = (second_tics / 60);
seconds = (second_tics % 60);
}
private:
static void gNextState(STATE** State)
{
// Transition to the next state
*State = (*State)->NextState;
if (TEST((*State)->Tics, SF_QUICK_CALL))
{
(*(*State)->Animator)(0);
*State = (*State)->NextState;
}
}
// Generic state control
static void gStateControl(STATE** State, int* tics)
{
*tics += synctics;
// Skip states if too much time has passed
while (*tics >= (*State)->Tics)
{
// Set Tics
*tics -= (*State)->Tics;
gNextState(State);
}
// Call the correct animator
if ((*State)->Animator)
(*(*State)->Animator)(0);
}
bool OnEvent(event_t* ev) override
{
if (ev->type == EV_KeyDown && !specialKeyEvent(ev))
{
if (State >= s_BonusRest && State < &s_BonusRest[countof(s_BonusRest)])
{
State = s_BonusAnim[STD_RANDOM_RANGE(countof(s_BonusAnim))];
Tics = 0;
nextclock = ticks;
}
}
return true;
}
void Start() override
{
FX_StopAllSounds();
PlaySong(nullptr, ThemeSongs[1], ThemeTrack[1]);
}
void OnTick() override
{
while (ticks > nextclock)
{
nextclock++;
gStateControl(&State, &Tics);
}
if (State == State->NextState)
{
state = finished;
StopSound();
}
}
void Draw(double) override
{
twod->ClearScreen();
DrawTexture(twod, tileGetTexture(BONUS_SCREEN_PIC, true), 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_LegacyRenderStyle, STYLE_Normal, TAG_DONE);
MNU_DrawString(160, 20, currentLevel->DisplayName(), 1, 19, 0);
MNU_DrawString(170, 30, GStrings("COMPLETED"), 1, 19, 0);
DrawTexture(twod, tileGetTexture(State->Pic), 158, 86, DTA_FullscreenScale, FSMode_Fit320x200,
DTA_TopLeft, true, DTA_LegacyRenderStyle, STYLE_Normal, TAG_DONE);
auto BONUS_LINE = [](int i) { return (50 + ((i) * 20)); };
int line = 0;
FString ds;
ds.Format("%s %2d:%02d", GStrings("TXT_YOURTIME"), minutes, seconds);
MNU_DrawString(60, BONUS_LINE(line++), ds, 1, 16);
if (currentLevel->designerTime > 0)
{
ds.Format("%s %d:%02d", GStrings("TXT_3DRTIME"), currentLevel->designerTime / 60, currentLevel->designerTime % 60);
MNU_DrawString(40, BONUS_LINE(line++), ds, 1, 16);
}
if (currentLevel->parTime > 0)
{
ds.Format("%s %d:%02d", GStrings("TXT_PARTIME"), currentLevel->parTime / 60, currentLevel->parTime % 60);
MNU_DrawString(40, BONUS_LINE(line++), ds, 1, 16);
}
// always read secrets and kills from the first player
ds.Format("%s: %d / %d", GStrings("TXT_SECRETS"), Player->SecretsFound, LevelSecrets);
MNU_DrawString(60, BONUS_LINE(line++), ds, 1, 16);
ds.Format("%s: %d / %d", GStrings("KILLS"), Player->Kills, TotalKillable);
MNU_DrawString(60, BONUS_LINE(line), ds, 1, 16);
MNU_DrawString(160, 185, GStrings("PRESSKEY"), 1, 19, 0);
}
};
#endif
//---------------------------------------------------------------------------
//
// Deathmatch summary screen
//
//---------------------------------------------------------------------------
static constexpr int SM_SIZ(int num) { return (num * 4); }
enum
{
STAT_SCREEN_PIC = 5114,
STAT_START_X = 20,
STAT_START_Y = 85,
STAT_OFF_Y = 9,
STAT_HEADER_Y = 14,
STAT_TABLE_X = (STAT_START_X + SM_SIZ(15)),
STAT_TABLE_XOFF = SM_SIZ(6)
};
#if 0
class DSWMultiSummaryScreen : public DSkippableScreenJob
{
short death_total[MAX_SW_PLAYERS_REG]{};
short kills[MAX_SW_PLAYERS_REG]{};
void Skipped() override
{
StopSound();
}
void Draw(double) override
{
if (clock == 0) PlaySong(nullptr, ThemeSongs[1], ThemeTrack[1]);
twod->ClearScreen();
DrawTexture(twod, tileGetTexture(STAT_SCREEN_PIC, true), 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_LegacyRenderStyle, STYLE_Normal, TAG_DONE);
MNU_DrawString(160, 68, GStrings("MULTIPLAYER TOTALS"), 0, 0);
MNU_DrawString(160, 189, GStrings("PRESSKEY"), 0, 0, 0);
int x = STAT_START_X;
int y = STAT_START_Y;
// Hm.... how to translate this without messing up the formatting?
MNU_DrawSmallString(x, y, " NAME 1 2 3 4 5 6 7 8 KILLS", 0, 0);
int rows = OrigCommPlayers;
int cols = OrigCommPlayers;
y += STAT_HEADER_Y;
FString ds;
for (int i = 0; i < rows; i++)
{
x = STAT_START_X;
auto pp = Player + i;
ds.Format("%d", i + 1);
MNU_DrawSmallString(x, y, ds, 0, 0);
ds.Format(" %-13s", pp->PlayerName);
MNU_DrawSmallString(x, y, ds, 0, User[pp->PlayerSprite]->spal);
x = STAT_TABLE_X;
for (int j = 0; j < cols; j++)
{
int pal = 0;
death_total[j] += pp->KilledPlayer[j];
if (i == j)
{
// don't add kill for self or team player
pal = PALETTE_PLAYER0 + 4;
kills[i] -= pp->KilledPlayer[j]; // subtract self kills
}
else if (gNet.TeamPlay)
{
if (User[pp->PlayerSprite]->spal == User[Player[j].PlayerSprite]->spal)
{
// don't add kill for self or team player
pal = PALETTE_PLAYER0 + 4;
kills[i] -= pp->KilledPlayer[j]; // subtract self kills
}
else
kills[i] += pp->KilledPlayer[j]; // kills added here
}
else
{
kills[i] += pp->KilledPlayer[j]; // kills added here
}
ds.Format("%d", pp->KilledPlayer[j]);
MNU_DrawSmallString(x, y, ds, 0, pal);
x += STAT_TABLE_XOFF;
}
y += STAT_OFF_Y;
}
// Deaths
x = STAT_START_X;
y += STAT_OFF_Y;
ds.Format(" %s", GStrings("DEATHS"));
MNU_DrawSmallString(x, y, ds, 0, 0);
x = STAT_TABLE_X;
for (int j = 0; j < cols; j++)
{
ds.Format("%d", death_total[j]);
MNU_DrawSmallString(x, y, ds, 0, 0);
x += STAT_TABLE_XOFF;
}
x = STAT_START_X;
y += STAT_OFF_Y;
// Kills
x = STAT_TABLE_X + SM_SIZ(50);
y = STAT_START_Y + STAT_HEADER_Y;
for (int i = 0; i < rows; i++)
{
auto pp = Player + i;
ds.Format("%d", kills[i]); //pp->Kills);
MNU_DrawSmallString(x, y, ds, 0, 0);
y += STAT_OFF_Y;
}
}
};
#endif
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void StatScreen(int FinishAnim, CompletionFunc completion)
{
#if 0
TArray<DScreenJob*> jobs;
if (FinishAnim)
{
StopSound();
jobs.Push(GetFinishAnim(FinishAnim));
jobs.Push(Create<DSWLevelSummaryScreen>());
if (FinishAnim == ANIM_ZILLA)
jobs.Push(Create<DSWCreditsScreen>());
}
else if (gNet.MultiGameType != MULTI_GAME_COMMBAT)
{
jobs.Push(Create<DSWLevelSummaryScreen>());
}
else
{
jobs.Push(Create<DSWMultiSummaryScreen>());
}
RunScreenJob(jobs, completion);
#endif
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void SybexScreen(CompletionFunc completion)
{
#if 0
if (!SW_SHAREWARE || CommEnabled) completion(false);
else
{
TArray<DScreenJob*> jobs(1, true);
jobs[0] = Create<DImageScreen>(tileGetTexture(5261), DScreenJob::fadein | DScreenJob::fadeout, 0x7fffffff);
RunScreenJob(jobs, completion, SJ_BLOCKUI);
}
#endif
}
#if 0
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
class DSWLoadScreen : public DScreenJob
{
MapRecord* rec;
public:
DSWLoadScreen(MapRecord* maprec) : DScreenJob(0), rec(maprec) {}
void Draw(double) override
{
const int TITLE_PIC = 2324;
twod->ClearScreen();
DrawTexture(twod, tileGetTexture(TITLE_PIC), 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_LegacyRenderStyle, STYLE_Normal, TAG_DONE);
MNU_DrawString(160, 170, /*DemoMode ? GStrings("TXT_LBDEMO") :*/ GStrings("TXT_ENTERING"), 1, 16, 0);
MNU_DrawString(160, 180, rec->DisplayName(), 1, 16, 0);
}
};
void loadscreen(MapRecord* rec, CompletionFunc func)
{
TArray<DScreenJob*> jobs(1, true);
jobs[0] = Create<DSWLoadScreen>(rec);
RunScreenJob(jobs, func);
}
#endif
END_SW_NS

View file

@ -1699,7 +1699,9 @@ drawscreen(PLAYERp pp, double smoothratio)
if (paused && !M_Active())
{
MNU_DrawString(160, 100, "Game Paused", 0, 0, 0);
auto str = GStrings("Game Paused");
int w = SmallFont->StringWidth(str);
DrawText(twod, SmallFont, CR_UNDEFINED, 160-w, 100, str, DTA_FullscreenScale, FSMode_Fit320x200, TAG_DONE);
}
if (!CommEnabled && TEST(pp->Flags, PF_DEAD))

View file

@ -154,7 +154,6 @@ FString ThemeSongs[6];
int ThemeTrack[6];
/// L O C A L P R O T O T Y P E S /////////////////////////////////////////////////////////
void SybexScreen(void);
/////////////////////////////////////////////////////////////////////////////////////////////
#define x(a, b) registerName(#a, b);
@ -256,12 +255,6 @@ void GameInterface::DrawBackground(void)
twod->ClearScreen();
DrawTexture(twod, tileGetTexture(TITLE_PIC), 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_LegacyRenderStyle, STYLE_Normal,
DTA_Color, shadeToLight(20), TAG_DONE);
if (CommEnabled)
{
MNU_DrawString(160, 170, "Lo Wang is waiting for other players...", 1, 16, 0);
MNU_DrawString(160, 180, "They are afraid!", 1, 16, 0);
}
}
//---------------------------------------------------------------------------
@ -553,6 +546,8 @@ void GameInterface::LevelCompleted(MapRecord *map, int skill)
StopSound();
STAT_Update(map == nullptr);
#if 0
// else if (gNet.MultiGameType != MULTI_GAME_COMMBAT)
StatScreen(FinishAnim, [=](bool)
{
if (map == nullptr)
@ -568,7 +563,7 @@ void GameInterface::LevelCompleted(MapRecord *map, int skill)
}
else gameaction = ga_nextlevel;
});
#endif
}
//---------------------------------------------------------------------------
//

View file

@ -77,7 +77,6 @@ extern GAME_SET gs;
enum
{
DREALMSPAL = 1,
THREED_REALMS_PIC = 2325,
MAXMIRRORS = 8,
// This is just some, high, blank tile number not used

View file

@ -222,30 +222,4 @@ void DoPaletteFlash(PLAYERp pp)
}
bool MNU_ShareWareMessage()
{
const char* extra_text;
short w, h;
if (SW_SHAREWARE)
{
extra_text = "Be sure to call 800-3DREALMS today";
MNU_DrawString(160, 110, extra_text, 1, 16, 0);
extra_text = "and order the game.";
MNU_DrawString(160, 120, extra_text, 1, 16, 0);
extra_text = "You are only playing the first ";
MNU_DrawString(160, 130, extra_text, 1, 16, 0);
extra_text = "four levels, and are missing most";
MNU_DrawString(160, 140, extra_text, 1, 16, 0);
extra_text = "of the game, weapons and monsters.";
MNU_DrawString(160, 150, extra_text, 1, 16, 0);
extra_text = "See the ordering information.";
MNU_DrawString(160, 160, extra_text, 1, 16, 0);
//SET(item->flags, mf_disabled);
}
return true;
}
END_SW_NS

View file

@ -32,7 +32,6 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
BEGIN_SW_NS
void MNU_DrawString(int x, int y, const char* string, int shade, int pal, int align = -1);
void MNU_DrawSmallString(int x, int y, const char* string, int shade, int pal, int align = -1, double alpha = 1);
END_SW_NS

View file

@ -66,6 +66,7 @@ x(BLACK___, 2306)
x(FragBarErase, 2375)
x(FragBarErase2, 2376)
x(MENUBAR, 2427)
x(THREED_REALMS_PIC, 2325)
x(MIRROR, 340)
x(FLOORMIRROR, 341)
@ -168,3 +169,50 @@ x(CREDITS2, 5118)
x(SUPPORT, 4979)
x(ONLINE, 5113)
x(STAT_SCREEN_PIC, 5114)
x(BONUS_SCREEN_PIC, 5120)
x(BONUS_PUNCH00, 5121)
x(BONUS_PUNCH01, 5122)
x(BONUS_PUNCH02, 5123)
x(BONUS_PUNCH03, 5124)
x(BONUS_PUNCH04, 5125)
x(BONUS_PUNCH05, 5126)
x(BONUS_PUNCH06, 5127)
x(BONUS_PUNCH07, 5128)
x(BONUS_PUNCH08, 5129)
x(BONUS_PUNCH09, 5130)
x(BONUS_PUNCH10, 5131)
x(BONUS_PUNCH11, 5132)
x(BONUS_PUNCH12, 5133)
x(BONUS_PUNCH13, 5134)
x(BONUS_PUNCH14, 5135)
x(BONUS_KICK00, 5136)
x(BONUS_KICK01, 5137)
x(BONUS_KICK02, 5138)
x(BONUS_KICK03, 5139)
x(BONUS_KICK04, 5140)
x(BONUS_KICK05, 5141)
x(BONUS_KICK06, 5142)
x(BONUS_KICK07, 5143)
x(BONUS_KICK08, 5144)
x(BONUS_KICK09, 5145)
x(BONUS_KICK10, 5146)
x(BONUS_KICK11, 5147)
x(BONUS_KICK12, 5148)
x(BONUS_KICK13, 5149)
x(BONUS_KICK14, 5150)
x(BONUS_GRAB00, 5151)
x(BONUS_GRAB01, 5152)
x(BONUS_GRAB02, 5153)
x(BONUS_GRAB03, 5154)
x(BONUS_GRAB04, 5155)
x(BONUS_GRAB05, 5156)
x(BONUS_GRAB06, 5157)
x(BONUS_GRAB07, 5158)
x(BONUS_GRAB08, 5159)
x(BONUS_GRAB09, 5160)
x(TITLE_PIC, 2324)

View file

@ -48,6 +48,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
#include "serializer.h"
#include "gamecontrol.h"
#include "gamestate.h"
#include "vm.h"
BEGIN_SW_NS
@ -981,5 +982,37 @@ void StopFX()
if (soundEngine) soundEngine->StopAllChannels();
}
DEFINE_ACTION_FUNCTION(_SW, PlaySound)
{
PARAM_PROLOGUE;
PARAM_INT(sound);
PARAM_INT(vflags);
PARAM_INT(channel);
PARAM_INT(cflags);
PlaySound(sound, Voc3D_Flags(vflags), channel, EChanFlags::FromInt(cflags));
return 0;
}
DEFINE_ACTION_FUNCTION_NATIVE(_SW, StopSound, StopSound)
{
StopSound();
return 0;
}
DEFINE_ACTION_FUNCTION(_SW, IsSoundPlaying)
{
PARAM_PROLOGUE;
PARAM_INT(channel);
ACTION_RETURN_BOOL(soundEngine->IsSourcePlayingSomething(SOURCE_None, nullptr, channel));
}
DEFINE_ACTION_FUNCTION(_SW, PlaySong)
{
PARAM_PROLOGUE;
PARAM_INT(song);
PlaySong(nullptr, ThemeSongs[song], ThemeTrack[song], true);
return 0;
}
END_SW_NS

View file

@ -108,24 +108,6 @@ void InitFonts()
//
//---------------------------------------------------------------------------
void MNU_DrawString(int x, int y, const char* string, int shade, int pal, int align)
{
if (align > -1)
{
int w = SmallFont->StringWidth(string);
if (align == 0) x -= w / 2;
else x -= w;
}
DrawText(twod, SmallFont, CR_UNDEFINED, x, y, string, DTA_FullscreenScale, FSMode_Fit320x200,
DTA_Color, shadeToLight(shade), DTA_TranslationIndex, TRANSLATION(Translation_Remap, pal), TAG_DONE);
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void MNU_DrawSmallString(int x, int y, const char* string, int shade, int pal, int align, double alpha)
{
if (align > -1)

View file

@ -0,0 +1,44 @@
// Cutscene definitions for Duke
definecutscene intro
{
function SWCutscenes.BuildIntro
}
definecutscene map "$woods"
{
outro
{
function SWCutscenes.BuildSerpentAnim
}
}
definecutscene map "$plax1"
{
outro
{
function SWCutscenes.BuildSumoAnim
}
}
definecutscene map "$volcano"
{
outro
{
function SWCutscenes.BuildZillaAnim
}
}
definecutscene sharewareend
{
function SWCutscenes.BuildSybexScreen
}
definecutscene loading
{
function SWCutscenes.BuildLoading
}
definecutscene summary SWCutscenes.BuildSPSummary
definecutscene mpsummary SWCutscenes.BuildMPSummary

View file

@ -36,5 +36,7 @@ version "4.3"
#include "zscript/games/blood/bloodgame.zs"
#include "zscript/games/blood/ui/menu.zs"
#include "zscript/games/blood/ui/screens.zs"
#include "zscript/games/sw/swgame.zs"
#include "zscript/games/sw/ui/menu.zs"
#include "zscript/games/sw/ui/screens.zs"
#include "zscript/games/exhumed/ui/menu.zs"

View file

@ -1,3 +1,26 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 2010-2019 EDuke32 developers and contributors
Copyright (C) 2019 Nuke.YKT
Copyright (C) 2019-2021 Christoph Oelckers
This file is part of Raze.
NBlood is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.
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.
*/
//-------------------------------------------------------------------------
class BloodIntroImage : ImageScreen

View file

@ -1,3 +1,31 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1996, 2003 - 3D Realms Entertainment
Copyright (C) 2020-2021 Christoph Oelckers
This file is part of Raze.
Duke Nukem 3D 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
aint with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Original Source: 1996 - Todd Replogle
Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms
( not much left of the original code, though... ;) )
*/
//-------------------------------------------------------------------------
// contains all global Duke definitions
struct Duke native
{

View file

@ -1,3 +1,30 @@
//-------------------------------------------------------------------------
/*
Copyright (C) 1996, 2003 - 3D Realms Entertainment
Copyright (C) 2020-2021 Christoph Oelckers
This file is part of Raze.
Duke Nukem 3D 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
aint with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Original Source: 1996 - Todd Replogle
Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms
( not much left of the original code, though... ;) )
*/
//-------------------------------------------------------------------------
class DukeMenuDelegate : RazeMenuDelegate
{

View file

@ -681,12 +681,12 @@ class DukeLevelSummaryScreen : SummaryScreenBase
tempbuf = FormatTime(stats.time);
Duke.GameText((320 >> 2) + 71, 59 + 9, tempbuf, 0);
tempbuf = FormatTime(level.parTime);
tempbuf = FormatTime(level.parTime / 26); // Build weirdness again...
Duke.GameText((320 >> 2) + 71, 69 + 9, tempbuf, 0);
if (!Raze.isNamWW2GI())
{
tempbuf = FormatTime(level.designerTime);
tempbuf = FormatTime(level.designerTime / 26);
Duke.GameText((320 >> 2) + 71, 79 + 9, tempbuf, 0);
}
}
@ -911,10 +911,10 @@ class RRLevelSummaryScreen : SummaryScreenBase
tempbuf = FormatTime(stats.time);
Duke.BigText(191, 48, tempbuf, -1);
tempbuf = FormatTime(level.parTime);
tempbuf = FormatTime(level.parTime / 26);
Duke.BigText(191, 64, tempbuf, -1);
tempbuf = FormatTime(level.designerTime);
tempbuf = FormatTime(level.designerTime / 26);
Duke.BigText(191, 80, tempbuf, -1);
}
}

View file

@ -0,0 +1,713 @@
//-------------------------------------------------------------------------
/*
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
*/
//-------------------------------------------------------------------------
struct SW native
{
enum ESWSoundFlag
{
v3df_none = 0, // Default, take no action, use all defaults
v3df_follow = 1, // 1 = Do coordinate updates on sound
// Use this only if the sprite won't be deleted soon
v3df_kill = 2, // 1 = Sound is to be deleted
v3df_doppler = 4, // 1 = Don't use doppler pitch variance
v3df_dontpan = 8, // 1 = Don't do panning of sound
v3df_ambient = 16, // 1 = Sound is ambient, use ambient struct info.
v3df_intermit = 32, // 1 = Intermittant sound
v3df_init = 64, // 1 = First pass of sound, don't play it.
// This is mainly used for intermittent sounds
v3df_nolookup = 128, // don't use ambient table lookup
}
native static void PlaySound(int sound, int flags, int channel = CHAN_AUTO, int cflags = 0);
native static void StopSound();
native static bool IsSoundPlaying(int channel); // soundEngine.IsSourcePlayingSomething(SOURCE_None, nullptr, CHAN_VOICE))
native static void PlaySong(int trackid);
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
static void DrawString(int x, int y, String text, int shade, int pal, int align = -1)
{
if (align != -1) x -= SmallFont.StringWidth(text) * (align == 0 ? 0.5 : 1);
Screen.DrawText(SmallFont, Font.CR_UNDEFINED, x, y, text, DTA_FullscreenScale, FSMode_Fit320x200,
DTA_Color, Raze.shadeToLight(shade), DTA_TranslationIndex, Translation.MakeID(Translation_Remap, pal));
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
static void DrawSmallString(int x, int y, String text, int shade, int pal, int align = -1, double alpha = 1.)
{
if (align != -1) x -= SmallFont2.StringWidth(text) * (align == 0 ? 0.5 : 1);
Screen.DrawText(SmallFont2, Font.CR_UNDEFINED, x, y, text, DTA_FullscreenScale, FSMode_Fit320x200,
DTA_Color, Raze.shadeToLight(shade), DTA_TranslationIndex, Translation.MakeID(Translation_Remap, pal), DTA_Alpha, alpha);
}
}
struct SWSnd native
{
enum ESounds
{
DIGI_NULL= 0,
DIGI_SWORDSWOOSH= 1,
DIGI_STAR= 2,
DIGI_STARCLINK= 3,
DIGI_STARWIZ= 4,
DIGI_UZIFIRE= 5,
DIGI_RICHOCHET1= 6,
DIGI_RICHOCHET2= 7,
DIGI_REMOVECLIP= 8,
DIGI_REPLACECLIP= 9,
DIGI_SHELL= 10,
DIGI_RIOTFIRE= 11,
DIGI_RIOTFIRE2= 12,
DIGI_RIOTRELOAD= 13,
DIGI_BOLTEXPLODE= 14,
DIGI_BOLTWIZ= 15,
DIGI_30MMFIRE= 16,
DIGI_30MMRELOAD= 17,
DIGI_30MMEXPLODE= 18,
DIGI_30MMWIZ= 19,
DIGI_HEADFIRE= 20,
DIGI_HEADSHOTWIZ= 21,
DIGI_HEADSHOTHIT= 22,
DIGI_MINETHROW= 23,
DIGI_MINEBOUNCE= 24,
DIGI_MINEBLOW= 25,
DIGI_MINEBEEP= 26,
DIGI_HEARTBEAT= 27,
DIGI_HEARTFIRE= 28,
DIGI_HEARTWIZ= 29,
DIGI_MISSLFIRE= 30,
DIGI_MISSLEXP= 31,
DIGI_RFWIZ= 32,
DIGI_NAPFIRE= 33,
DIGI_NAPWIZ= 34,
DIGI_NAPPUFF= 35,
DIGI_MIRVFIRE= 36,
DIGI_MIRVWIZ= 37,
DIGI_SPIRALFIRE= 38,
DIGI_SPIRALWIZ= 39,
DIGI_MAGIC1= 40,
DIGI_MAGIC2= 41,
DIGI_MAGIC3= 42,
DIGI_MAGIC4= 43,
DIGI_MAGIC5= 44,
DIGI_MAGIC6= 45,
DIGI_MAGIC7= 46,
DIGI_SWCLOAKUNCLOAK= 47,
DIGI_DHVOMIT= 48,
DIGI_DHCLUNK= 49,
DIGI_DHSQUISH= 50,
DIGI_NULL_DHSQUISH= 50,
DIGI_PROJECTILELAVAHIT=51,
DIGI_PROJECTILEWATERHIT=52,
DIGI_KEY= 53,
DIGI_ITEM= 54,
DIGI_BIGITEM= 55,
DIGI_BODYFALL1= 56,
DIGI_HITGROUND= 57,
DIGI_BODYSQUISH1= 58,
DIGI_BODYBURN= 59,
DIGI_BODYBURNSCREAM= 60,
DIGI_BODYCRUSHED1= 61,
DIGI_BODYHACKED1= 62,
DIGI_BODYSINGED= 63,
DIGI_DROWN= 64,
DIGI_SCREAM1= 65,
DIGI_SCREAM2= 66,
DIGI_SCREAM3= 67,
DIGI_HIT1= 68,
DIGI_ELECTRICUTE1= 69,
DIGI_REMOVEME= 70,
DIGI_IMPALED= 71,
DIGI_OOF1= 72,
DIGI_ACTORBODYFALL1= 73,
IGI_ACTORHITGROUND= 74,
DIGI_COOLIEEXPLODE= 75,
DIGI_COOLIESCREAM= 76,
DIGI_COOLIEALERT= 77,
DIGI_COOLIEAMBIENT= 78,
DIGI_COOLIEPAIN= 79,
DIGI_CGMATERIALIZE= 80,
DIGI_CGALERT= 81,
DIGI_CGTHIGHBONE= 82,
DIGI_CGAMBIENT= 83,
DIGI_CGPAIN= 84,
DIGI_CGMAGIC= 85,
DIGI_CGMAGICHIT= 86,
DIGI_CGSCREAM= 87,
DIGI_NINJAAMBIENT= 88,
DIGI_NINJASTAR= 89,
DIGI_NINJAPAIN= 90,
DIGI_NINJASCREAM= 91,
DIGI_NINJAALERT= 92,
DIGI_NINJAUZIATTACK= 93,
DIGI_NINJARIOTATTACK= 94,
DIGI_RIPPERAMBIENT= 95,
DIGI_RIPPERALERT= 96,
DIGI_RIPPERATTACK= 97,
DIGI_RIPPERPAIN= 98,
DIGI_RIPPERSCREAM= 99,
DIGI_RIPPERHEARTOUT= 100,
DIGI_GRDAMBIENT= 101,
DIGI_GRDALERT= 102,
DIGI_GRDPAIN= 103,
DIGI_GRDSCREAM= 104,
DIGI_GRDFIREBALL= 105,
DIGI_GRDSWINGAXE= 106,
DIGI_GRDAXEHIT= 107,
DIGI_SPAMBIENT= 108,
DIGI_SPALERT= 109,
DIGI_SPPAIN= 110,
DIGI_SPSCREAM= 111,
DIGI_SPBLADE= 112,
DIGI_SPELEC= 113,
DIGI_SPTELEPORT= 114,
DIGI_AHAMBIENT= 115,
DIGI_AHSCREAM= 116,
DIGI_AHEXPLODE= 117,
DIGI_AHSWOOSH= 118,
DIGI_HORNETBUZZ= 119,
DIGI_HORNETSTING= 120,
DIGI_HORNETPAIN= 121,
DIGI_HORNETDEATH= 122,
DIGI_SERPAMBIENT= 123,
DIGI_SERPALERT= 124,
DIGI_SERPPAIN= 125,
DIGI_SERPSCREAM= 126,
DIGI_SERPDEATHEXPLODE=127,
DIGI_SERPSWORDATTACK= 128,
DIGI_SERPMAGICLAUNCH= 129,
DIGI_SERPSUMMONHEADS= 130,
DIGI_SERPTAUNTYOU= 131,
DIGI_LAVABOSSAMBIENT= 132,
DIGI_LAVABOSSSWIM= 133,
DIGI_LAVABOSSRISE= 134,
DIGI_LAVABOSSALERT= 135,
DIGI_LAVABOSSFLAME= 136,
DIGI_LAVABOSSMETEOR= 137,
DIGI_LAVABOSSMETEXP= 138,
DIGI_LAVABOSSPAIN= 139,
DIGI_LAVABOSSSIZZLE= 140,
DIGI_LAVABOSSEXPLODE= 141,
DIGI_BOATSTART= 142,
DIGI_BOATRUN= 143,
DIGI_BOATSTOP= 144,
DIGI_BOATFIRE= 145,
DIGI_TANKSTART= 146,
DIGI_TANKRUN= 147,
DIGI_TANKSTOP= 148,
DIGI_TANKIDLE= 149,
DIGI_TANKFIRE= 150,
DIGI_TRUKRUN= 151,
DIGI_TRUKIDLE= 152,
DIGI_SUBRUN= 153,
DIGI_SUBIDLE= 154,
DIGI_SUBDOOR= 155,
DIGI_BOMBRFLYING= 156,
DIGI_BOMBRDROPBOMB= 157,
DIGI_BUBBLES= 158,
DIGI_CHAIN= 159,
DIGI_CHAINDOOR= 160,
DIGI_CRICKETS= 161,
DIGI_WOODDOOROPEN= 162,
DIGI_WOODDOORCLOSE= 163,
DIGI_METALDOOROPEN= 164,
DIGI_METALDOORCLOSE= 165,
DIGI_SLIDEDOOROPEN= 166,
DIGI_SLIDEDOORCLOSE= 167,
DIGI_STONEDOOROPEN= 168,
DIGI_STONEDOORCLOSE= 169,
DIGI_SQUEAKYDOOROPEN= 170,
DIGI_SQUEAKYDOORCLOSE=171,
DIGI_DRILL= 172,
DIGI_CAVEDRIP1= 173,
DIGI_CAVEDRIP2= 174,
DIGI_DRIP= 175,
DIGI_WATERFALL1= 176,
DIGI_WATERFALL2= 177,
DIGI_WATERFLOW1= 178,
DIGI_WATERFLOW2= 179,
DIGI_ELEVATOR= 180,
DIGI_SMALLEXP= 181,
DIGI_MEDIUMEXP= 182,
DIGI_LARGEEXP= 183,
DIGI_HUGEEXP= 184,
DIGI_NULL_HUGEEXP= 184,
DIGI_FIRE1= 185,
DIGI_FIRE2= 186,
DIGI_FIREBALL1= 187,
DIGI_FIREBALL2= 188,
DIGI_GEAR1= 189,
DIGI_GONG= 190,
DIGI_LAVAFLOW1= 191,
DIGI_MACHINE1= 192,
DIGI_MUBBUBBLES1= 193,
DIGI_EARTHQUAKE= 194,
DIGI_SEWERFLOW1= 195,
DIGI_SPLASH1= 196,
DIGI_STEAM1= 197,
DIGI_VOLCANOSTEAM1= 198,
DIGI_STOMPER= 199,
DIGI_SWAMP= 200,
DIGI_REGULARSWITCH= 201,
DIGI_BIGSWITCH= 202,
DIGI_STONESWITCH= 203,
DIGI_GLASSSWITCH= 204,
DIGI_HUGESWITCH= 205,
DIGI_THUNDER= 206,
DIGI_TELEPORT= 207,
DIGI_UNDERWATER= 208,
DIGI_UNLOCK= 209,
DIGI_SQUEAKYVALVE= 210,
DIGI_VOID1= 211,
DIGI_VOID2= 212,
DIGI_VOID3= 213,
DIGI_VOID4= 214,
DIGI_VOID5= 215,
DIGI_ERUPTION= 216,
DIGI_VOLCANOPROJECTILE= 217,
DIGI_LIGHTWIND= 218,
DIGI_STRONGWIND= 219,
DIGI_BREAKINGWOOD= 220,
DIGI_BREAKSTONES= 221,
DIGI_ENGROOM1= 222,
DIGI_ENGROOM2= 223,
DIGI_ENGROOM3= 224,
DIGI_ENGROOM4= 225,
DIGI_ENGROOM5= 226,
DIGI_BREAKGLASS= 227,
DIGI_MUSSTING= 228,
DIGI_HELI= 229,
DIGI_BIGHART= 230,
DIGI_WIND4= 231,
DIGI_SPOOKY1= 232,
DIGI_DRILL1= 233,
DIGI_JET= 234,
DIGI_DRUMCHANT= 235,
DIGI_BUZZZ= 236,
DIGI_CHOP_CLICK= 237,
DIGI_SWORD_UP= 238,
DIGI_UZI_UP= 239,
DIGI_SHOTGUN_UP= 240,
DIGI_ROCKET_UP= 241,
DIGI_GRENADE_UP= 242,
DIGI_RAIL_UP= 243,
DIGI_MINE_UP= 244,
DIGI_TAUNTAI1= 246,
DIGI_TAUNTAI2= 247,
DIGI_TAUNTAI3= 248,
DIGI_TAUNTAI4= 249,
DIGI_TAUNTAI5= 250,
DIGI_TAUNTAI6= 251,
DIGI_TAUNTAI7= 252,
DIGI_TAUNTAI8= 253,
DIGI_TAUNTAI9= 254,
DIGI_TAUNTAI10= 255,
DIGI_PLAYERPAIN1= 256,
DIGI_PLAYERPAIN2= 257,
DIGI_PLAYERPAIN3= 258,
DIGI_PLAYERPAIN4= 259,
DIGI_PLAYERPAIN5= 260,
DIGI_PLAYERYELL1= 261,
DIGI_PLAYERYELL2= 262,
DIGI_PLAYERYELL3= 263,
DIGI_SEARCHWALL= 264,
DIGI_NOURINAL= 265,
DIGI_FALLSCREAM= 266,
DIGI_GOTITEM1= 267,
DIGI_LASTPLAYERVOICE= 268,
DIGI_RAILFIRE= 269,
DIGI_NULL_RAILFIRE= 269,
DIGI_RAILREADY= 270,
DIGI_RAILPWRUP= 271,
DIGI_NUCLEAREXP= 272,
DIGI_NUKESTDBY= 273,
DIGI_NUKECDOWN= 274,
DIGI_NUKEREADY= 275,
DIGI_CHEMGAS= 276,
DIGI_CHEMBOUNCE= 277,
DIGI_THROW= 278,
DIGI_PULL= 279,
DIGI_MINEARM= 280,
DIGI_HEARTDOWN= 281,
DIGI_TOOLBOX= 282,
DIGI_NULL_TOOLBOX= 282,
DIGI_GASPOP= 283,
DIGI_40MMBNCE= 284,
DIGI_BURGLARALARM= 285,
DIGI_CARALARM= 286,
DIGI_CARALARMOFF= 287,
DIGI_CALTROPS= 288,
DIGI_NIGHTON= 289,
DIGI_NIGHTOFF= 290,
DIGI_SHOTSHELLSPENT= 291,
DIGI_BUSSKID= 292,
DIGI_BUSCRASH= 293,
DIGI_BUSENGINE= 294,
DIGI_ARMORHIT= 295,
DIGI_ASIREN1= 296,
DIGI_FIRETRK1= 297,
DIGI_TRAFFIC1= 298,
DIGI_TRAFFIC2= 299,
DIGI_TRAFFIC3= 300,
DIGI_TRAFFIC4= 301,
DIGI_TRAFFIC5= 302,
DIGI_TRAFFIC6= 303,
DIGI_HELI1= 304,
DIGI_JET1= 305,
DIGI_MOTO1= 306,
DIGI_MOTO2= 307,
DIGI_NEON1= 308,
DIGI_SUBWAY= 309,
DIGI_TRAIN1= 310,
DIGI_COINS= 311,
DIGI_SWORDCLANK= 312,
DIGI_RIPPER2AMBIENT= 313,
DIGI_RIPPER2ALERT= 314,
DIGI_RIPPER2ATTACK= 315,
DIGI_RIPPER2PAIN= 316,
DIGI_RIPPER2SCREAM= 317,
DIGI_RIPPER2HEARTOUT=318,
DIGI_M60= 319,
DIGI_SUMOSCREAM= 320,
DIGI_SUMOALERT= 321,
DIGI_SUMOAMBIENT= 322,
DIGI_SUMOPAIN= 323,
DIGI_RAMUNLOCK= 324,
DIGI_CARDUNLOCK= 325,
DIGI_ANCIENTSECRET= 326,
DIGI_AMERICANDRIVER= 327,
DIGI_DRIVELIKEBABOON= 328,
DIGI_BURNBABY= 329,
DIGI_LIKEBIGWEAPONS= 330,
DIGI_COWABUNGA= 331,
DIGI_NOCHARADE= 332,
DIGI_TIMETODIE= 333,
DIGI_EATTHIS= 334,
DIGI_FIRECRACKERUPASS=335,
DIGI_HOLYCOW= 336,
DIGI_HOLYPEICESOFCOW= 337,
DIGI_HOLYSHIT= 338,
DIGI_HOLYPEICESOFSHIT=339,
DIGI_PAYINGATTENTION= 340,
DIGI_EVERYBODYDEAD= 341,
DIGI_KUNGFU= 342,
DIGI_HOWYOULIKEMOVE= 343,
DIGI_NOMESSWITHWANG= 344,
DIGI_RAWREVENGE= 345,
DIGI_YOULOOKSTUPID= 346,
DIGI_TINYDICK= 347,
DIGI_NOTOURNAMENT= 348,
DIGI_WHOWANTSWANG= 349,
DIGI_MOVELIKEYAK= 350,
DIGI_ALLINREFLEXES= 351,
DIGI_EVADEFOREVER= 352,
DIGI_MRFLY= 353,
DIGI_SHISEISI= 354,
DIGI_LIKEFIREWORKS= 355,
DIGI_LIKEHIROSHIMA= 356,
DIGI_LIKENAGASAKI= 357,
DIGI_LIKEPEARL= 358,
DIGI_IAMSHADOW= 359,
DIGI_ILIKENUKES= 360,
DIGI_ILIKESWORD= 361,
DIGI_ILIKESHURIKEN= 362,
DIGI_BADLUCK= 363,
DIGI_NOMOVIEMRCHAN= 364,
DIGI_REALLIFEMRCHAN= 365,
DIGI_NOLIKEMUSIC= 366,
DIGI_NODIFFERENCE= 367,
DIGI_NOFEAR= 368,
DIGI_NOPAIN= 369,
DIGI_NOREPAIRMAN= 370,
DIGI_SONOFABITCH= 371,
DIGI_PAINFORWEAK= 372,
DIGI_GOSPEEDY= 373,
DIGI_GETTINGSTIFF= 374,
DIGI_TOMBRAIDER= 375,
DIGI_STICKYGOTU1= 376,
DIGI_STICKYGOTU2= 377,
DIGI_STICKYGOTU3= 378,
DIGI_STICKYGOTU4= 379,
DIGI_SWORDGOTU1= 380,
DIGI_SWORDGOTU2= 381,
DIGI_SWORDGOTU3= 382,
DIGI_HURTBAD1= 383,
DIGI_HURTBAD2= 384,
DIGI_HURTBAD3= 385,
DIGI_HURTBAD4= 386,
DIGI_HURTBAD5= 387,
DIGI_TOILETGIRLSCREAM= 388,
DIGI_TOILETGIRLALERT= 389,
DIGI_TOILETGIRLAMBIENT=390,
DIGI_TOILETGIRLPAIN= 391,
DIGI_TOILETGIRLTAUNT1= 392,
DIGI_TOILETGIRLTAUNT2= 393,
DIGI_SUMOFART= 394,
DIGI_GIBS1= 395,
DIGI_GIBS2= 396,
DIGI_BIRDS1= 397,
DIGI_BIRDS2= 398,
DIGI_TOILET= 399,
DIGI_FORKLIFTIDLE= 400,
DIGI_FORKLIFTRUN= 401,
DIGI_TOYCAR= 402,
DIGI_UZIMATIC= 403,
DIGI_COMPUTERPOWER= 404,
DIGI_GENERATORON= 405,
DIGI_GENERATORRUN= 406,
DIGI_BIGDRILL= 407,
DIGI_FLUORLIGHT= 408,
DIGI_AMOEBA= 409,
DIGI_BODYFALL2= 410,
DIGI_GIBS3= 411,
DIGI_NINJACHOKE= 412,
DIGI_TRAIN3= 413,
DIGI_TRAINR02= 414,
DIGI_TRAIN8= 415,
DIGI_TRASHLID= 416,
DIGI_GETMEDKIT= 417,
DIGI_AHH= 418,
DIGI_PALARM= 419,
DIGI_PFLIP= 420,
DIGI_PROLL1= 421,
DIGI_PROLL2= 422,
DIGI_PROLL3= 423,
DIGI_BUNNYATTACK= 424,
DIGI_BUNNYDIE1= 425,
DIGI_BUNNYDIE2= 426,
DIGI_BUNNYDIE3= 427,
DIGI_BUNNYAMBIENT= 428,
DIGI_STONESLIDE= 429,
DIGI_NINJAINHALF= 430,
DIGI_RIPPER2CHEST= 431,
DIGI_WHIPME= 432,
DIGI_ENDLEV= 433,
DIGI_MDALARM= 434,
DIGI_BREAKMETAL= 435,
DIGI_BREAKDEBRIS= 436,
DIGI_BREAKMARBELS= 437,
DIGI_BANZAI= 438,
DIGI_HAHA1= 439,
DIGI_HAHA2= 440,
DIGI_HAHA3= 441,
DIGI_ITEM_SPAWN= 442,
DIGI_NOREPAIRMAN2= 443,
DIGI_NOPOWER= 444,
DIGI_DOUBLEUZI= 445,
DIGI_NOTORDBUNNY= 446,
DIGI_CANBEONLYONE= 447,
DIGI_MIRROR1= 448,
DIGI_MIRROR2= 449,
DIGI_HITTINGWALLS= 450,
DIGI_GOTRAILGUN= 451,
DIGI_RABBITHUMP1= 452,
DIGI_RABBITHUMP2= 453,
DIGI_RABBITHUMP3= 454,
DIGI_RABBITHUMP4= 455,
DIGI_FAGRABBIT1= 456,
DIGI_FAGRABBIT2= 457,
DIGI_FAGRABBIT3= 458,
DIGI_STINKLIKEBABBOON= 459,
DIGI_WHATYOUEATBABY= 460,
DIGI_WHATDIEDUPTHERE= 461,
DIGI_YOUGOPOOPOO= 462,
DIGI_PULLMYFINGER= 463,
DIGI_SOAPYOUGOOD= 464,
DIGI_WASHWANG= 465,
DIGI_DROPSOAP= 466,
DIGI_REALTITS= 467,
DIGI_MSTRLEEP= 468,
DIGI_SEEKLEEPADVICE= 469,
DIGI_AVENGELEEPDEATH= 470,
DIGI_LEEPGHOST= 471,
DIGI_DOOR1= 472,
DIGI_DOOR2= 473,
DIGI_DOOR3= 474,
DIGI_FLAGWAVE= 475,
DIGI_SURFACE= 476,
DIGI_GASHURT= 477,
DIGI_BONUS_GRAB= 478,
DIGI_ANIMECRY= 479,
DIGI_ANIMESING1= 480,
DIGI_ANIMEMAD1= 481,
DIGI_ANIMESING2= 482,
DIGI_ANIMEMAD2= 483,
DIGI_PLAYER_TELEPORT= 484,
DIGI_INTRO_SLASH= 485,
DIGI_WARNING= 486,
DIGI_INTRO_WHIRL= 487,
DIGI_TOILETGIRLFART1= 488,
DIGI_TOILETGIRLFART2= 489,
DIGI_TOILETGIRLFART3= 490,
DIGI_WINDCHIMES= 491,
DIGI_MADATCARPET= 492,
DIGI_JUMPONCARPET= 493,
DIGI_USEBROKENVEHICLE= 494,
DIGI_STEPONCALTROPS= 495,
DIGI_WANGSEESERP= 496,
DIGI_SERPTAUNTWANG= 497,
DIGI_WANGTAUNTSERP1= 498,
DIGI_WANGTAUNTSERP2= 499,
DIGI_WANGORDER1= 500,
DIGI_WANGORDER2= 501,
DIGI_WANGDROWNING= 502,
DIGI_ZILLAREGARDS= 503,
DIGI_PMESSAGE= 504,
DIGI_SHAREND_UGLY1= 505,
DIGI_SHAREND_UGLY2= 506,
DIGI_SHAREND_TELEPORT= 507,
DIGI_HOTHEADSWITCH= 508,
DIGI_BOATCREAK= 509,
DIGI_BOATRUN2= 510,
DIGI_BOATIDLE= 511,
DIGI_SHIPBELL= 512,
DIGI_FOGHORN= 513,
DIGI_CANNON= 514,
DIGI_JG41001= 515,
DIGI_JG41012= 516,
DIGI_JG41018= 517,
DIGI_JG41028= 518,
DIGI_JG41048= 519,
DIGI_JG41052= 520,
DIGI_JG41058= 521,
DIGI_JG41060= 522,
DIGI_JG41075= 523,
DIGI_JG42004= 524,
DIGI_JG42019= 525,
DIGI_JG42021= 526,
DIGI_JG42028= 527,
DIGI_JG42033= 528,
DIGI_JG42034= 529,
DIGI_JG42050= 530,
DIGI_JG42056= 531,
DIGI_JG42061= 532,
DIGI_JG43004= 533,
DIGI_JG43015= 534,
DIGI_JG43019= 535,
DIGI_JG43021= 536,
DIGI_JG44011= 537,
DIGI_JG44014= 538,
DIGI_JG44027= 539,
DIGI_JG44038= 540,
DIGI_JG44039= 541,
DIGI_JG44048= 542,
DIGI_JG44052= 543,
DIGI_JG45014= 544,
DIGI_JG44068= 545,
DIGI_JG45010= 546,
DIGI_JG45018= 547,
DIGI_JG45030= 548,
DIGI_JG45033= 549,
DIGI_JG45043= 550,
DIGI_JG45053= 551,
DIGI_JG45067= 552,
DIGI_JG46005= 553,
DIGI_JG46010= 554,
DIGI_LANI049= 555,
DIGI_LANI051= 556,
DIGI_LANI052= 557,
DIGI_LANI054= 558,
DIGI_LANI060= 559,
DIGI_LANI063= 560,
DIGI_LANI065= 561,
DIGI_LANI066= 562,
DIGI_LANI073= 563,
DIGI_LANI075= 564,
DIGI_LANI077= 565,
DIGI_LANI079= 566,
DIGI_LANI089= 567,
DIGI_LANI091= 568,
DIGI_LANI093= 569,
DIGI_LANI095= 570,
DIGI_VENTWALK= 571,
DIGI_CARWALK= 572,
DIGI_JETSOAR= 573,
DIGI_VACUUM= 574,
DIGI_GIRLNINJAALERTT= 575,
DIGI_GIRLNINJASCREAM= 576,
DIGI_GIRLNINJAALERT= 577,
DIGI_PRUNECACKLE= 578,
DIGI_PRUNECACKLE2= 579,
DIGI_PRUNECACKLE3= 580,
DIGI_SUMOSTOMP= 581,
DIGI_VATOR= 582,
DIGI_JG9009= 583,
DIGI_Z16004= 584,
DIGI_Z16012= 585,
DIGI_Z16022= 586,
DIGI_Z16027= 587,
DIGI_JG93030= 588,
DIGI_JG94002= 589,
DIGI_Z17010= 590,
DIGI_Z17052= 591,
DIGI_Z17025= 592,
DIGI_ML25014= 593,
DIGI_ML250101= 594,
DIGI_JG9022= 595,
DIGI_JG9032= 596,
DIGI_JG9038= 597,
DIGI_JG9055= 598,
DIGI_JG9060= 599,
DIGI_JG92055= 600,
DIGI_ML25032= 601,
DIGI_JG92036= 602,
DIGI_JG92042= 603,
DIGI_ML26001= 604,
DIGI_JG93000= 605,
DIGI_JG93011= 606,
DIGI_JG93018= 607,
DIGI_JG93023= 608,
DIGI_ML26008= 609,
DIGI_ML26011= 610,
DIGI_JG94007= 611,
DIGI_JG94024= 612,
DIGI_JG94039= 613,
DIGI_JG95012= 614,
DIGI_ZILLASTOMP= 615,
DIGI_ZC1= 616,
DIGI_ZC2= 617,
DIGI_ZC3= 618,
DIGI_ZC4= 619,
DIGI_ZC5= 620,
DIGI_ZC6= 621,
DIGI_ZC7= 622,
DIGI_ZC8= 623,
DIGI_ZC9= 624,
DIGI_Z16043= 625,
}
}

View file

@ -0,0 +1,591 @@
//-------------------------------------------------------------------------
/*
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;
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);
int translation = Translation.MakeID(Translation_BasePalette, DREALMSPAL);
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)
{
if (ev.type == InputEvent.Type_KeyDown && !Raze.specialKeyEvent(ev))
{
if (animstate == 0) animstate = 1;
}
return true;
}
override void Start()
{
Raze.StopAllSounds();
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)
{
int death_total[MAXPLAYERS];
int kills[MAXPLAYERS];
Screen.DrawTexture(TexMan.CheckForTexture("STAT_SCREEN_PIC", TexMan.Type_Any), true, 0, 0, DTA_FullscreenEx, FSMode_ScaleToFit43, DTA_LegacyRenderStyle, STYLE_Normal);
SW.DrawString(160, 68, "$MULTIPLAYER TOTALS", 0, 0);
SW.DrawString(160, 189, "$PRESSKEY", 0, 0, 0);
int x = STAT_START_X;
int y = STAT_START_Y;
// Hm.... how to translate this without messing up the formatting?
SW.DrawSmallString(x, y, " NAME 1 2 3 4 5 6 7 8 KILLS", 0, 0);
int rows = numplayers;
int cols = numplayers;
y += STAT_HEADER_Y;
String ds;
for (int i = 0; i < rows; i++)
{
x = STAT_START_X;
ds = String.Format("%d", i + 1);
SW.DrawSmallString(x, y, ds, 0, 0);
ds = String.Format(" %-13s", Raze.PlayerName(i));
SW.DrawSmallString(x, y, ds, 0, Raze.playerPalette(i));
x = STAT_TABLE_X;
for (int j = 0; j < cols; j++)
{
int pal = 0;
int frags = Raze.PlayerFrags(i, j);
death_total[j] += frags;
if (i == j)
{
// don't add kill for self or team player
pal = PALETTE_PLAYER0 + 4;
kills[i] -= frags; // subtract self kills
}
else if (false/*gNet.TeamPlay*/)
{
if (Raze.playerPalette(i) == Raze.playerPalette(j))
{
// don't add kill for self or team player
pal = PALETTE_PLAYER0 + 4;
kills[i] -= frags; // subtract self kills
}
else
kills[i] += frags; // kills added here
}
else
{
kills[i] += frags; // kills added here
}
ds = String.Format("%d", frags);
SW.DrawSmallString(x, y, ds, 0, pal);
x += STAT_TABLE_XOFF;
}
y += STAT_OFF_Y;
}
// Deaths
x = STAT_START_X;
y += STAT_OFF_Y;
ds = String.Format(" %s", StringTable.Localize("$DEATHS"));
SW.DrawSmallString(x, y, ds, 0, 0);
x = STAT_TABLE_X;
for (int j = 0; j < cols; j++)
{
ds = String.Format("%d", death_total[j]);
SW.DrawSmallString(x, y, ds, 0, 0);
x += STAT_TABLE_XOFF;
}
x = STAT_START_X;
y += STAT_OFF_Y;
// Kills
x = STAT_TABLE_X + 200;
y = STAT_START_Y + STAT_HEADER_Y;
for (int i = 0; i < rows; i++)
{
ds = String.Format("%d", kills[i]); //pp.Kills);
SW.DrawSmallString(x, y, ds, 0, 0);
y += STAT_OFF_Y;
}
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
class SWLoadScreen : ScreenJob
{
MapRecord rec;
ScreenJob Init(MapRecord maprec)
{
Super.Init(fadein);
rec = maprec;
return self;
}
override void OnTick()
{
if (fadestate == visible) jobstate = finished;
}
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);
}
}
class SWCutscenes
{
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
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());
runner.Append(MoviePlayerJob.CreateWithSoundinfo("sw.anm", soundinfo, MoviePlayer.NOSOUNDCUTOFF, 8, 360, 128));
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
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);
static const int serpzillaframetimes[] = { 16, 16, 140 };
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));
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
static void BuildSybexScreen(ScreenJobRunner runner)
{
if (Raze.isShareware() && !netgame)
runner.Append(ImageScreen.CreateNamed("#05261", TexMan.Type_Any));
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
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));
}
}

View file

@ -204,7 +204,10 @@ class SummaryScreenBase : ScreenJob
String FormatTime(int time)
{
return String.Format("%02d:%02d", (time / (26 * 60)) % 60, (time / 26) % 60);
if (time >= 60 * 50)
return String.Format("%02d:%02d:%02d", time / (60*60), (time / 60) % 60, time % 60);
else
return String.Format("%02d:%02d", (time / 60) % 60, time % 60);
}
}