- updated common code from screenjob branch.

That is, all parts not related to cutscenes.
This commit is contained in:
Christoph Oelckers 2021-08-03 12:30:44 +02:00
parent f89e6950c3
commit c1a8776a15
16 changed files with 163 additions and 21 deletions

View file

@ -102,6 +102,11 @@ void S_SetMusicCallbacks(MusicCallbacks* cb)
if (mus_cb.OpenMusic == nullptr) mus_cb.OpenMusic = DefaultOpenMusic; // without this we are dead in the water. if (mus_cb.OpenMusic == nullptr) mus_cb.OpenMusic = DefaultOpenMusic; // without this we are dead in the water.
} }
int MusicEnabled() // int return is for scripting
{
return mus_enabled && !nomusic;
}
//========================================================================== //==========================================================================
// //
// //
@ -632,7 +637,7 @@ static void CheckReplayGain(const char *musicname, EMidiDevice playertype, const
bool S_ChangeMusic(const char* musicname, int order, bool looping, bool force) bool S_ChangeMusic(const char* musicname, int order, bool looping, bool force)
{ {
if (nomusic) return false; // skip the entire procedure if music is globally disabled. if (!MusicEnabled()) return false; // skip the entire procedure if music is globally disabled.
if (!force && PlayList.GetNumSongs()) if (!force && PlayList.GetNumSongs())
{ // Don't change if a playlist is active { // Don't change if a playlist is active
@ -854,7 +859,7 @@ void S_StopMusic (bool force)
CCMD (changemus) CCMD (changemus)
{ {
if (!nomusic) if (MusicEnabled())
{ {
if (argv.argc() > 1) if (argv.argc() > 1)
{ {

View file

@ -11,6 +11,7 @@ class FileReader;
class SoundStream; class SoundStream;
int MusicEnabled();
typedef bool(*StreamCallback)(SoundStream* stream, void* buff, int len, void* userdata); typedef bool(*StreamCallback)(SoundStream* stream, void* buff, int len, void* userdata);
SoundStream *S_CreateCustomStream(size_t size, int samplerate, int numchannels, StreamCallback cb, void *userdata); SoundStream *S_CreateCustomStream(size_t size, int samplerate, int numchannels, StreamCallback cb, void *userdata);
void S_StopCustomStream(SoundStream* stream); void S_StopCustomStream(SoundStream* stream);

View file

@ -43,7 +43,14 @@
#include "s_music.h" #include "s_music.h"
#include "m_random.h" #include "m_random.h"
#include "printf.h" #include "printf.h"
#include "c_cvars.h"
CVARD(Bool, snd_enabled, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "enables/disables sound effects")
int SoundEnabled()
{
return snd_enabled && !nosound && !nosfx;
}
enum enum
{ {
@ -382,7 +389,7 @@ FSoundChan *SoundEngine::StartSound(int type, const void *source,
FVector3 pos, vel; FVector3 pos, vel;
FRolloffInfo *rolloff; FRolloffInfo *rolloff;
if (sound_id <= 0 || volume <= 0 || nosfx || nosound || blockNewSounds) if (sound_id <= 0 || volume <= 0 || nosfx || !SoundEnabled() || blockNewSounds)
return NULL; return NULL;
// prevent crashes. // prevent crashes.

View file

@ -429,3 +429,5 @@ inline int S_FindSound(const char* name)
{ {
return soundEngine->FindSound(name); return soundEngine->FindSound(name);
} }
int SoundEnabled();

View file

@ -98,8 +98,7 @@ unsigned FCommandBuffer::CalcCellSize(unsigned length)
unsigned cellcount = 0; unsigned cellcount = 0;
for (unsigned i = 0; i < length; i++) for (unsigned i = 0; i < length; i++)
{ {
int w; int w = NewConsoleFont->GetCharWidth(Text[i]);
NewConsoleFont->GetChar(Text[i], CR_UNTRANSLATED, &w);
cellcount += w / 9; cellcount += w / 9;
} }
return cellcount; return cellcount;
@ -112,8 +111,7 @@ unsigned FCommandBuffer::CharsForCells(unsigned cellin, bool *overflow)
int cells = cellin; int cells = cellin;
while (cells > 0) while (cells > 0)
{ {
int w; int w = NewConsoleFont->GetCharWidth(Text[chars++]);
NewConsoleFont->GetChar(Text[chars++], CR_UNTRANSLATED, &w);
cells -= w / 9; cells -= w / 9;
} }
*overflow = (cells < 0); *overflow = (cells < 0);

View file

@ -592,8 +592,7 @@ void C_DrawConsole ()
oldbottom = ConBottom; oldbottom = ConBottom;
if (ConsoleState == c_up && gamestate != GS_INTRO && gamestate != GS_INTERMISSION && if (ConsoleState == c_up && gamestate == GS_LEVEL)
gamestate != GS_FULLCONSOLE && gamestate != GS_MENUSCREEN)
{ {
if (NotifyStrings) NotifyStrings->Draw(); if (NotifyStrings) NotifyStrings->Draw();
return; return;
@ -731,7 +730,7 @@ void C_ToggleConsole ()
} }
if (gamestate == GS_MENUSCREEN) if (gamestate == GS_MENUSCREEN)
{ {
gameaction = ga_fullconsole; if (sysCallbacks.ToggleFullConsole) sysCallbacks.ToggleFullConsole();
togglestate = c_down; togglestate = c_down;
} }
else if (!chatmodeon && (ConsoleState == c_up || ConsoleState == c_rising) && menuactive == MENU_Off) else if (!chatmodeon && (ConsoleState == c_up || ConsoleState == c_rising) && menuactive == MENU_Off)

View file

@ -32,6 +32,8 @@ struct SystemCallbacks
void (*ConsoleToggled)(int state); void (*ConsoleToggled)(int state);
bool (*PreBindTexture)(FRenderState* state, FGameTexture*& tex, EUpscaleFlags& flags, int& scaleflags, int& clampmode, int& translation, int& overrideshader); bool (*PreBindTexture)(FRenderState* state, FGameTexture*& tex, EUpscaleFlags& flags, int& scaleflags, int& clampmode, int& translation, int& overrideshader);
void (*FontCharCreated)(FGameTexture* base, FGameTexture* untranslated); void (*FontCharCreated)(FGameTexture* base, FGameTexture* untranslated);
void (*ToggleFullConsole)();
void (*StartCutscene)(bool blockui);
}; };
extern SystemCallbacks sysCallbacks; extern SystemCallbacks sysCallbacks;

View file

@ -635,7 +635,7 @@ int FileSystem::GetNumForFullName (const char *name)
// //
// FindFile // FindFile
// //
// Looks up a file by name, either eith or without path and extension // Looks up a file by name, either with or without path and extension
// //
//========================================================================== //==========================================================================

View file

@ -291,16 +291,19 @@ FMaterial* DFrameBuffer::CreateMaterial(FGameTexture* tex, int scaleflags)
// //
//========================================================================== //==========================================================================
DEFINE_ACTION_FUNCTION(_Screen, GetWidth) static int ScreenGetWidth() { return twod->GetWidth(); }
static int ScreenGetHeight() { return twod->GetHeight(); }
DEFINE_ACTION_FUNCTION_NATIVE(_Screen, GetWidth, ScreenGetWidth)
{ {
PARAM_PROLOGUE; PARAM_PROLOGUE;
ACTION_RETURN_INT(screen->GetWidth()); ACTION_RETURN_INT(twod->GetWidth());
} }
DEFINE_ACTION_FUNCTION(_Screen, GetHeight) DEFINE_ACTION_FUNCTION_NATIVE(_Screen, GetHeight, ScreenGetHeight)
{ {
PARAM_PROLOGUE; PARAM_PROLOGUE;
ACTION_RETURN_INT(screen->GetHeight()); ACTION_RETURN_INT(twod->GetHeight());
} }
DEFINE_ACTION_FUNCTION(_Screen, PaletteColor) DEFINE_ACTION_FUNCTION(_Screen, PaletteColor)

View file

@ -564,6 +564,20 @@ DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, Substitute, StringSubst)
return 0; return 0;
} }
static void StringStripRight(FString* self, const FString& junk)
{
if (junk.IsNotEmpty()) self->StripRight(junk);
else self->StripRight();
}
DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, StripRight, StringStripRight)
{
PARAM_SELF_STRUCT_PROLOGUE(FString);
PARAM_STRING(junk);
StringStripRight(self, junk);
return 0;
}
static void StringSplit(FString* self, TArray<FString>* tokens, const FString& delimiter, int keepEmpty) static void StringSplit(FString* self, TArray<FString>* tokens, const FString& delimiter, int keepEmpty)
{ {
self->Split(*tokens, delimiter, static_cast<FString::EmptyTokenType>(keepEmpty)); self->Split(*tokens, delimiter, static_cast<FString::EmptyTokenType>(keepEmpty));

View file

@ -50,6 +50,8 @@
#include "i_interface.h" #include "i_interface.h"
#include "base_sbar.h" #include "base_sbar.h"
#include "image.h" #include "image.h"
#include "s_soundinternal.h"
#include "i_time.h"
//========================================================================== //==========================================================================
// //
@ -696,6 +698,18 @@ DEFINE_ACTION_FUNCTION_NATIVE(FFont, GetGlyphHeight, GetGlyphHeight)
PARAM_INT(code); PARAM_INT(code);
ACTION_RETURN_INT(GetGlyphHeight(self, code)); ACTION_RETURN_INT(GetGlyphHeight(self, code));
} }
static int GetDefaultKerning(FFont* font)
{
return font->GetDefaultKerning();
}
DEFINE_ACTION_FUNCTION_NATIVE(FFont, GetDefaultKerning, GetDefaultKerning)
{
PARAM_SELF_STRUCT_PROLOGUE(FFont);
ACTION_RETURN_INT(self->GetDefaultKerning());
}
//========================================================================== //==========================================================================
// //
// file system // file system
@ -995,6 +1009,58 @@ DEFINE_ACTION_FUNCTION(_Console, Printf)
return 0; return 0;
} }
static void StopAllSounds()
{
soundEngine->StopAllChannels();
}
DEFINE_ACTION_FUNCTION_NATIVE(_System, StopAllSounds, StopAllSounds)
{
StopAllSounds();
return 0;
}
static int PlayMusic(const FString& musname, int order, int looped)
{
return S_ChangeMusic(musname, order, !!looped, true);
}
DEFINE_ACTION_FUNCTION_NATIVE(_System, PlayMusic, PlayMusic)
{
PARAM_PROLOGUE;
PARAM_STRING(name);
PARAM_INT(order);
PARAM_BOOL(looped);
ACTION_RETURN_BOOL(PlayMusic(name, order, looped));
}
static void Mus_Stop()
{
S_StopMusic(true);
}
DEFINE_ACTION_FUNCTION_NATIVE(_System, StopMusic, Mus_Stop)
{
Mus_Stop();
return 0;
}
DEFINE_ACTION_FUNCTION_NATIVE(_System, SoundEnabled, SoundEnabled)
{
ACTION_RETURN_INT(SoundEnabled());
}
DEFINE_ACTION_FUNCTION_NATIVE(_System, MusicEnabled, MusicEnabled)
{
ACTION_RETURN_INT(MusicEnabled());
}
DEFINE_ACTION_FUNCTION_NATIVE(_System, GetTimeFrac, I_GetTimeFrac)
{
ACTION_RETURN_FLOAT(I_GetTimeFrac());
}
DEFINE_GLOBAL_NAMED(mus_playing, musplaying); DEFINE_GLOBAL_NAMED(mus_playing, musplaying);
DEFINE_FIELD_X(MusPlayingInfo, MusPlayingInfo, name); DEFINE_FIELD_X(MusPlayingInfo, MusPlayingInfo, name);
DEFINE_FIELD_X(MusPlayingInfo, MusPlayingInfo, baseorder); DEFINE_FIELD_X(MusPlayingInfo, MusPlayingInfo, baseorder);

View file

@ -195,9 +195,16 @@ void I_FreezeTime(bool frozen)
else else
{ {
assert(FreezeTime != 0); assert(FreezeTime != 0);
FirstFrameStartTime += GetClockTimeNS() - FreezeTime; if (FirstFrameStartTime != 0) FirstFrameStartTime += GetClockTimeNS() - FreezeTime;
FreezeTime = 0; FreezeTime = 0;
I_SetFrameTime(); I_SetFrameTime();
} }
} }
void I_ResetFrameTime()
{
// Reset the starting point of the current frame to now. For use after lengthy operations that should not result in tic accumulation.
auto ft = CurrentFrameStartTime;
I_SetFrameTime();
FirstFrameStartTime += (CurrentFrameStartTime - ft);
}

View file

@ -38,3 +38,6 @@ uint64_t I_msTimeFS();
// Nanosecond-accurate time // Nanosecond-accurate time
uint64_t I_nsTime(); uint64_t I_nsTime();
// Reset the timer after a lengthy operation
void I_ResetFrameTime();

View file

@ -3043,6 +3043,11 @@ static void GC_MarkGameRoots()
GC::Mark(NextToThink); GC::Mark(NextToThink);
} }
static void System_ToggleFullConsole()
{
gameaction = ga_fullconsole;
}
bool CheckSkipGameOptionBlock(const char* str); bool CheckSkipGameOptionBlock(const char* str);
//========================================================================== //==========================================================================
@ -3091,6 +3096,10 @@ static int D_DoomMain_Internal (void)
nullptr, nullptr,
CheckSkipGameOptionBlock, CheckSkipGameOptionBlock,
System_ConsoleToggled, System_ConsoleToggled,
nullptr,
nullptr,
System_ToggleFullConsole,
nullptr,
}; };

View file

@ -180,7 +180,7 @@ void DBot::Dofire (ticcmd_t *cmd)
if (player->ReadyWeapon == NULL) if (player->ReadyWeapon == NULL)
return; return;
if (player->damagecount > skill.isp) if (player->damagecount > (unsigned)skill.isp)
{ {
first_shot = true; first_shot = true;
return; return;

View file

@ -76,11 +76,14 @@ enum EGameState
GS_INTERMISSION, GS_INTERMISSION,
GS_FINALE, GS_FINALE,
GS_DEMOSCREEN, GS_DEMOSCREEN,
GS_FULLCONSOLE, // [RH] Fullscreen console
GS_HIDECONSOLE, // [RH] The menu just did something that should hide fs console
GS_STARTUP, // [RH] Console is fullscreen, and game is just starting
GS_TITLELEVEL, // [RH] A combination of GS_LEVEL and GS_DEMOSCREEN
GS_INTRO,
GS_CUTSCENE,
GS_MENUSCREEN = GS_DEMOSCREEN, GS_MENUSCREEN = GS_DEMOSCREEN,
GS_FULLCONSOLE,
GS_HIDECONSOLE,
GS_STARTUP,
GS_TITLELEVEL,
} }
const TEXTCOLOR_BRICK = "\034A"; const TEXTCOLOR_BRICK = "\034A";
@ -182,6 +185,26 @@ struct _ native // These are the global variables, the struct is only here to av
native readonly double NotifyFontScale; native readonly double NotifyFontScale;
} }
struct System native
{
native static void StopMusic();
native static void StopAllSounds();
native static bool SoundEnabled();
native static bool MusicEnabled();
native static double GetTimeFrac();
static bool specialKeyEvent(InputEvent ev)
{
if (ev.type == InputEvent.Type_KeyDown || ev.type == InputEvent.Type_KeyUp)
{
int key = ev.KeyScan;
if (key == InputEvent.KEY_VOLUMEDOWN || key == InputEvent.KEY_VOLUMEUP || (key > InputEvent.KEY_LASTJOYBUTTON && key < InputEvent.KEY_PAD_LTHUMB_RIGHT)) return true;
}
return false;
}
}
struct MusPlayingInfo native struct MusPlayingInfo native
{ {
native String name; native String name;
@ -389,6 +412,7 @@ struct Screen native
native static Color PaletteColor(int index); native static Color PaletteColor(int index);
native static int GetWidth(); native static int GetWidth();
native static int GetHeight(); native static int GetHeight();
native static Vector2 GetTextScreenSize();
native static void Clear(int left, int top, int right, int bottom, Color color, int palcolor = -1); native static void Clear(int left, int top, int right, int bottom, Color color, int palcolor = -1);
native static void Dim(Color col, double amount, int x, int y, int w, int h); native static void Dim(Color col, double amount, int x, int y, int w, int h);
@ -495,6 +519,7 @@ struct Font native
native static Font GetFont(Name fontname); native static Font GetFont(Name fontname);
native BrokenLines BreakLines(String text, int maxlen); native BrokenLines BreakLines(String text, int maxlen);
native int GetGlyphHeight(int code); native int GetGlyphHeight(int code);
native int GetDefaultKerning();
} }
struct Console native struct Console native
@ -665,6 +690,7 @@ struct StringStruct native
native int CodePointCount() const; native int CodePointCount() const;
native int, int GetNextCodePoint(int position) const; native int, int GetNextCodePoint(int position) const;
native void Substitute(String str, String replace); native void Substitute(String str, String replace);
native void StripRight(String junk = "");
} }
struct Translation version("2.4") struct Translation version("2.4")