Merge branch 'next' of https://git.magicalgirl.moe/STJr/SRB2.git into marathonmode

# Conflicts:
#	src/doomdef.h
This commit is contained in:
toaster 2020-05-15 13:23:37 +01:00
commit 2aa542d2bf
21 changed files with 122 additions and 71 deletions

View file

@ -1690,7 +1690,7 @@ static void CL_LoadReceivedSavegame(void)
// load a base level // load a base level
if (P_LoadNetGame()) if (P_LoadNetGame())
{ {
const INT32 actnum = mapheaderinfo[gamemap-1]->actnum; const UINT8 actnum = mapheaderinfo[gamemap-1]->actnum;
CONS_Printf(M_GetText("Map is now \"%s"), G_BuildMapName(gamemap)); CONS_Printf(M_GetText("Map is now \"%s"), G_BuildMapName(gamemap));
if (strcmp(mapheaderinfo[gamemap-1]->lvlttl, "")) if (strcmp(mapheaderinfo[gamemap-1]->lvlttl, ""))
{ {

View file

@ -125,6 +125,9 @@ boolean advancedemo;
INT32 debugload = 0; INT32 debugload = 0;
#endif #endif
char savegamename[256];
char liveeventbackup[256];
char srb2home[256] = "."; char srb2home[256] = ".";
char srb2path[256] = "."; char srb2path[256] = ".";
boolean usehome = true; boolean usehome = true;

View file

@ -239,7 +239,8 @@ typedef enum
CR_MACESPIN, CR_MACESPIN,
CR_MINECART, CR_MINECART,
CR_ROLLOUT, CR_ROLLOUT,
CR_PTERABYTE CR_PTERABYTE,
CR_DUSTDEVIL
} carrytype_t; // pw_carry } carrytype_t; // pw_carry
// Player powers. (don't edit this comment) // Player powers. (don't edit this comment)

View file

@ -1557,7 +1557,7 @@ static void readlevelheader(MYFILE *f, INT32 num)
} }
else if (fastcmp(word, "ACT")) else if (fastcmp(word, "ACT"))
{ {
if (i >= 0 && i < 20) // 0 for no act number, TTL1 through TTL19 if (i >= 0 && i <= 99) // 0 for no act number
mapheaderinfo[num-1]->actnum = (UINT8)i; mapheaderinfo[num-1]->actnum = (UINT8)i;
else else
deh_warning("Level header %d: invalid act number %d", num, i); deh_warning("Level header %d: invalid act number %d", num, i);
@ -9521,6 +9521,7 @@ struct {
{"CR_MINECART",CR_MINECART}, {"CR_MINECART",CR_MINECART},
{"CR_ROLLOUT",CR_ROLLOUT}, {"CR_ROLLOUT",CR_ROLLOUT},
{"CR_PTERABYTE",CR_PTERABYTE}, {"CR_PTERABYTE",CR_PTERABYTE},
{"CR_DUSTDEVIL",CR_DUSTDEVIL},
// Ring weapons (ringweapons_t) // Ring weapons (ringweapons_t)
// Useful for A_GiveWeapon // Useful for A_GiveWeapon

View file

@ -458,8 +458,8 @@ void CONS_Debug(INT32 debugflags, const char *fmt, ...) FUNCDEBUG;
// Things that used to be in dstrings.h // Things that used to be in dstrings.h
#define SAVEGAMENAME "srb2sav" #define SAVEGAMENAME "srb2sav"
char savegamename[256]; extern char savegamename[256];
char liveeventbackup[256]; extern char liveeventbackup[256];
// m_misc.h // m_misc.h
#ifdef GETTEXT #ifdef GETTEXT

View file

@ -557,7 +557,7 @@ extern recorddata_t *mainrecords[NUMMAPS];
extern UINT8 mapvisited[NUMMAPS]; extern UINT8 mapvisited[NUMMAPS];
// Temporary holding place for nights data for the current map // Temporary holding place for nights data for the current map
nightsdata_t ntemprecords; extern nightsdata_t ntemprecords;
extern UINT32 token; ///< Number of tokens collected in a level extern UINT32 token; ///< Number of tokens collected in a level
extern UINT32 tokenlist; ///< List of tokens collected extern UINT32 tokenlist; ///< List of tokens collected

View file

@ -4681,7 +4681,7 @@ char *G_BuildMapTitle(INT32 mapnum)
{ {
size_t len = 1; size_t len = 1;
const char *zonetext = NULL; const char *zonetext = NULL;
const INT32 actnum = mapheaderinfo[mapnum-1]->actnum; const UINT8 actnum = mapheaderinfo[mapnum-1]->actnum;
len += strlen(mapheaderinfo[mapnum-1]->lvlttl); len += strlen(mapheaderinfo[mapnum-1]->lvlttl);
if (!(mapheaderinfo[mapnum-1]->levelflags & LF_NOZONE)) if (!(mapheaderinfo[mapnum-1]->levelflags & LF_NOZONE))

View file

@ -68,7 +68,7 @@ patch_t *nightsnum[10]; // 0-9
// Level title and credits fonts // Level title and credits fonts
patch_t *lt_font[LT_FONTSIZE]; patch_t *lt_font[LT_FONTSIZE];
patch_t *cred_font[CRED_FONTSIZE]; patch_t *cred_font[CRED_FONTSIZE];
patch_t *ttlnum[20]; // act numbers (0-19) patch_t *ttlnum[10]; // act numbers (0-9)
// Name tag fonts // Name tag fonts
patch_t *ntb_font[NT_FONTSIZE]; patch_t *ntb_font[NT_FONTSIZE];
@ -243,7 +243,7 @@ void HU_LoadGraphics(void)
tallinfin = (patch_t *)W_CachePatchName("STTINFIN", PU_HUDGFX); tallinfin = (patch_t *)W_CachePatchName("STTINFIN", PU_HUDGFX);
// cache act numbers for level titles // cache act numbers for level titles
for (i = 0; i < 20; i++) for (i = 0; i < 10; i++)
{ {
sprintf(buffer, "TTL%.2d", i); sprintf(buffer, "TTL%.2d", i);
ttlnum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX); ttlnum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);

View file

@ -85,7 +85,7 @@ extern patch_t *lt_font[LT_FONTSIZE];
extern patch_t *cred_font[CRED_FONTSIZE]; extern patch_t *cred_font[CRED_FONTSIZE];
extern patch_t *ntb_font[NT_FONTSIZE]; extern patch_t *ntb_font[NT_FONTSIZE];
extern patch_t *nto_font[NT_FONTSIZE]; extern patch_t *nto_font[NT_FONTSIZE];
extern patch_t *ttlnum[20]; extern patch_t *ttlnum[10];
extern patch_t *emeraldpics[3][8]; extern patch_t *emeraldpics[3][8];
extern patch_t *rflagico; extern patch_t *rflagico;
extern patch_t *bflagico; extern patch_t *bflagico;

View file

@ -490,29 +490,28 @@ const UINT8 gifframe_gchead[4] = {0x21,0xF9,0x04,0x04}; // GCE, bytes, packed by
static UINT8 *gifframe_data = NULL; static UINT8 *gifframe_data = NULL;
static size_t gifframe_size = 8192; static size_t gifframe_size = 8192;
//
// GIF_rgbconvert
// converts an RGB frame to a frame with a palette.
//
#ifdef HWRENDER #ifdef HWRENDER
static void hwrconvert(void) static void GIF_rgbconvert(UINT8 *linear, UINT8 *scr)
{ {
UINT8 *linear = HWR_GetScreenshot();
UINT8 *dest = screens[2];
UINT8 r, g, b; UINT8 r, g, b;
INT32 x, y; size_t src = 0, dest = 0;
size_t i = 0; size_t size = (vid.width * vid.height * 3);
InitColorLUT(gif_framepalette); InitColorLUT(gif_framepalette);
for (y = 0; y < vid.height; y++) while (src < size)
{ {
for (x = 0; x < vid.width; x++, i += 3) r = (UINT8)linear[src];
{ g = (UINT8)linear[src + 1];
r = (UINT8)linear[i]; b = (UINT8)linear[src + 2];
g = (UINT8)linear[i + 1]; scr[dest] = colorlookup[r >> SHIFTCOLORBITS][g >> SHIFTCOLORBITS][b >> SHIFTCOLORBITS];
b = (UINT8)linear[i + 2]; src += (3 * scrbuf_downscaleamt);
dest[(y * vid.width) + x] = colorlookup[r >> SHIFTCOLORBITS][g >> SHIFTCOLORBITS][b >> SHIFTCOLORBITS]; dest += scrbuf_downscaleamt;
}
} }
free(linear);
} }
#endif #endif
@ -556,7 +555,11 @@ static void GIF_framewrite(void)
I_ReadScreen(movie_screen); I_ReadScreen(movie_screen);
#ifdef HWRENDER #ifdef HWRENDER
else if (rendermode == render_opengl) else if (rendermode == render_opengl)
hwrconvert(); {
UINT8 *linear = HWR_GetScreenshot();
GIF_rgbconvert(linear, movie_screen);
free(linear);
}
#endif #endif
} }
else else
@ -565,18 +568,20 @@ static void GIF_framewrite(void)
blitw = vid.width; blitw = vid.width;
blith = vid.height; blith = vid.height;
if (gif_frames == 0)
{
if (rendermode == render_soft)
I_ReadScreen(movie_screen);
#ifdef HWRENDER #ifdef HWRENDER
else if (rendermode == render_opengl) // Copy the current OpenGL frame into the base screen
{ if (rendermode == render_opengl)
hwrconvert(); {
VID_BlitLinearScreen(screens[2], screens[0], vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.rowbytes); UINT8 *linear = HWR_GetScreenshot();
} GIF_rgbconvert(linear, screens[0]);
#endif free(linear);
} }
#endif
// Copy the first frame into the movie screen
// OpenGL already does the same above.
if (gif_frames == 0 && rendermode == render_soft)
I_ReadScreen(movie_screen);
movie_screen = screens[0]; movie_screen = screens[0];
} }

View file

@ -5237,7 +5237,7 @@ static boolean M_PrepareLevelPlatter(INT32 gt, boolean nextmappick)
{ {
if (M_CanShowLevelOnPlatter(mapnum, gt)) if (M_CanShowLevelOnPlatter(mapnum, gt))
{ {
const INT32 actnum = mapheaderinfo[mapnum]->actnum; const UINT8 actnum = mapheaderinfo[mapnum]->actnum;
const boolean headingisname = (fastcmp(mapheaderinfo[mapnum]->selectheading, mapheaderinfo[mapnum]->lvlttl)); const boolean headingisname = (fastcmp(mapheaderinfo[mapnum]->selectheading, mapheaderinfo[mapnum]->lvlttl));
const boolean wide = (mapheaderinfo[mapnum]->menuflags & LF2_WIDEICON); const boolean wide = (mapheaderinfo[mapnum]->menuflags & LF2_WIDEICON);

View file

@ -68,7 +68,7 @@ extern consvar_t cv_masterserver, cv_servername;
// < 0 to not connect (usually -1) (offline mode) // < 0 to not connect (usually -1) (offline mode)
// == 0 to show all rooms, not a valid hosting room // == 0 to show all rooms, not a valid hosting room
// anything else is whatever room the MS assigns to that number (online mode) // anything else is whatever room the MS assigns to that number (online mode)
INT16 ms_RoomId; extern INT16 ms_RoomId;
const char *GetMasterServerPort(void); const char *GetMasterServerPort(void);
const char *GetMasterServerIP(void); const char *GetMasterServerIP(void);

View file

@ -13369,8 +13369,9 @@ static boolean PIT_DustDevilLaunch(mobj_t *thing)
P_ResetPlayer(player); P_ResetPlayer(player);
A_PlayActiveSound(dustdevil); A_PlayActiveSound(dustdevil);
} }
player->powers[pw_carry] = CR_DUSTDEVIL;
player->powers[pw_nocontrol] = 2; player->powers[pw_nocontrol] = 2;
player->drawangle += ANG20; P_SetTarget(&thing->tracer, dustdevil);
P_SetPlayerMobjState(thing, S_PLAY_PAIN); P_SetPlayerMobjState(thing, S_PLAY_PAIN);
if (dist > dragamount) if (dist > dragamount)
@ -13390,7 +13391,9 @@ static boolean PIT_DustDevilLaunch(mobj_t *thing)
P_ResetPlayer(player); P_ResetPlayer(player);
thing->z = dustdevil->z + dustdevil->height; thing->z = dustdevil->z + dustdevil->height;
thrust = 20 * FRACUNIT; thrust = 20 * FRACUNIT;
player->powers[pw_carry] = CR_NONE;
player->powers[pw_nocontrol] = 0; player->powers[pw_nocontrol] = 0;
P_SetTarget(&thing->tracer, NULL);
S_StartSound(thing, sfx_wdjump); S_StartSound(thing, sfx_wdjump);
P_SetPlayerMobjState(thing, S_PLAY_FALL); P_SetPlayerMobjState(thing, S_PLAY_FALL);
} }

View file

@ -11918,6 +11918,9 @@ void P_PlayerThink(player_t *player)
factor = 4; factor = 4;
} }
break; break;
case CR_DUSTDEVIL:
player->drawangle += ANG20;
break;
/* -- in case we wanted to have the camera freely movable during zoom tubes /* -- in case we wanted to have the camera freely movable during zoom tubes
case CR_ZOOMTUBE:*/ case CR_ZOOMTUBE:*/
case CR_ROPEHANG: case CR_ROPEHANG:
@ -12690,6 +12693,19 @@ void P_PlayerAfterThink(player_t *player)
} }
break; break;
} }
case CR_DUSTDEVIL:
{
mobj_t *mo = player->mo, *dustdevil = player->mo->tracer;
if (abs(mo->x - dustdevil->x) > dustdevil->radius || abs(mo->y - dustdevil->y) > dustdevil->radius)
{
P_SetTarget(&player->mo->tracer, NULL);
player->powers[pw_carry] = CR_NONE;
break;
}
break;
}
case CR_ROLLOUT: case CR_ROLLOUT:
{ {
mobj_t *mo = player->mo, *rock = player->mo->tracer; mobj_t *mo = player->mo, *rock = player->mo->tracer;

View file

@ -134,6 +134,7 @@ consvar_t cv_playmusicifunfocused = {"playmusicifunfocused", "No", CV_SAVE, CV_Y
consvar_t cv_playsoundsifunfocused = {"playsoundsifunfocused", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_playsoundsifunfocused = {"playsoundsifunfocused", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
#ifdef HAVE_OPENMPT #ifdef HAVE_OPENMPT
openmpt_module *openmpt_mhandle = NULL;
static CV_PossibleValue_t interpolationfilter_cons_t[] = {{0, "Default"}, {1, "None"}, {2, "Linear"}, {4, "Cubic"}, {8, "Windowed sinc"}, {0, NULL}}; static CV_PossibleValue_t interpolationfilter_cons_t[] = {{0, "Default"}, {1, "None"}, {2, "Linear"}, {4, "Cubic"}, {8, "Windowed sinc"}, {0, NULL}};
consvar_t cv_modfilter = {"modfilter", "0", CV_SAVE|CV_CALL, interpolationfilter_cons_t, ModFilter_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_modfilter = {"modfilter", "0", CV_SAVE|CV_CALL, interpolationfilter_cons_t, ModFilter_OnChange, 0, NULL, NULL, 0, 0, NULL};
#endif #endif
@ -1910,6 +1911,10 @@ UINT32 S_GetMusicPosition(void)
/// In this section: mazmazz doesn't know how to do dynamic arrays or struct pointers! /// In this section: mazmazz doesn't know how to do dynamic arrays or struct pointers!
/// ------------------------ /// ------------------------
char music_stack_nextmusname[7];
boolean music_stack_noposition = false;
UINT32 music_stack_fadeout = 0;
UINT32 music_stack_fadein = 0;
static musicstack_t *music_stacks = NULL; static musicstack_t *music_stacks = NULL;
static musicstack_t *last_music_stack = NULL; static musicstack_t *last_music_stack = NULL;

View file

@ -22,7 +22,7 @@
#ifdef HAVE_OPENMPT #ifdef HAVE_OPENMPT
#include "libopenmpt/libopenmpt.h" #include "libopenmpt/libopenmpt.h"
openmpt_module *openmpt_mhandle; extern openmpt_module *openmpt_mhandle;
#endif #endif
// mask used to indicate sound origin is player item pickup // mask used to indicate sound origin is player item pickup
@ -262,10 +262,10 @@ typedef struct musicstack_s
struct musicstack_s *next; struct musicstack_s *next;
} musicstack_t; } musicstack_t;
char music_stack_nextmusname[7]; extern char music_stack_nextmusname[7];
boolean music_stack_noposition; extern boolean music_stack_noposition;
UINT32 music_stack_fadeout; extern UINT32 music_stack_fadeout;
UINT32 music_stack_fadein; extern UINT32 music_stack_fadein;
void S_SetStackAdjustmentStart(void); void S_SetStackAdjustmentStart(void);
void S_AdjustMusicStackTics(void); void S_AdjustMusicStackTics(void);
@ -333,7 +333,7 @@ void S_StopSoundByNum(sfxenum_t sfxnum);
#ifdef MUSICSLOT_COMPATIBILITY #ifdef MUSICSLOT_COMPATIBILITY
// For compatibility with code/scripts relying on older versions // For compatibility with code/scripts relying on older versions
// This is a list of all the "special" slot names and their associated numbers // This is a list of all the "special" slot names and their associated numbers
const char *compat_special_music_slots[16]; extern const char *compat_special_music_slots[16];
#endif #endif
#endif #endif

View file

@ -217,7 +217,6 @@ static void SDLSetMode(INT32 width, INT32 height, SDL_bool fullscreen, SDL_bool
else else
{ {
Impl_CreateWindow(fullscreen); Impl_CreateWindow(fullscreen);
Impl_SetWindowIcon();
wasfullscreen = fullscreen; wasfullscreen = fullscreen;
SDL_SetWindowSize(window, width, height); SDL_SetWindowSize(window, width, height);
if (fullscreen) if (fullscreen)
@ -1635,12 +1634,15 @@ static SDL_bool Impl_CreateWindow(SDL_bool fullscreen)
window = SDL_CreateWindow("SRB2 "VERSIONSTRING, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, window = SDL_CreateWindow("SRB2 "VERSIONSTRING, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
realwidth, realheight, flags); realwidth, realheight, flags);
if (window == NULL) if (window == NULL)
{ {
CONS_Printf(M_GetText("Couldn't create window: %s\n"), SDL_GetError()); CONS_Printf(M_GetText("Couldn't create window: %s\n"), SDL_GetError());
return SDL_FALSE; return SDL_FALSE;
} }
Impl_SetWindowIcon();
return Impl_CreateContext(); return Impl_CreateContext();
} }
@ -1657,12 +1659,8 @@ static void Impl_SetWindowName(const char *title)
static void Impl_SetWindowIcon(void) static void Impl_SetWindowIcon(void)
{ {
if (window == NULL || icoSurface == NULL) if (window && icoSurface)
{ SDL_SetWindowIcon(window, icoSurface);
return;
}
//SDL2STUB(); // Monster Iestyn: why is this stubbed?
SDL_SetWindowIcon(window, icoSurface);
} }
static void Impl_VideoSetupSDLBuffer(void) static void Impl_VideoSetupSDLBuffer(void)
@ -1769,6 +1767,11 @@ void I_StartupGraphics(void)
VID_StartupOpenGL(); VID_StartupOpenGL();
#endif #endif
// Window icon
#ifdef HAVE_IMAGE
icoSurface = IMG_ReadXPMFromArray(SDL_icon_xpm);
#endif
// Fury: we do window initialization after GL setup to allow // Fury: we do window initialization after GL setup to allow
// SDL_GL_LoadLibrary to work well on Windows // SDL_GL_LoadLibrary to work well on Windows
@ -1787,11 +1790,6 @@ void I_StartupGraphics(void)
#ifdef HAVE_TTF #ifdef HAVE_TTF
I_ShutdownTTF(); I_ShutdownTTF();
#endif #endif
// Window icon
#ifdef HAVE_IMAGE
icoSurface = IMG_ReadXPMFromArray(SDL_icon_xpm);
#endif
Impl_SetWindowIcon();
VID_SetMode(VID_GetModeForSize(BASEVIDWIDTH, BASEVIDHEIGHT)); VID_SetMode(VID_GetModeForSize(BASEVIDWIDTH, BASEVIDHEIGHT));

View file

@ -1325,7 +1325,7 @@ void ST_drawTitleCard(void)
{ {
char *lvlttl = mapheaderinfo[gamemap-1]->lvlttl; char *lvlttl = mapheaderinfo[gamemap-1]->lvlttl;
char *subttl = mapheaderinfo[gamemap-1]->subttl; char *subttl = mapheaderinfo[gamemap-1]->subttl;
INT32 actnum = mapheaderinfo[gamemap-1]->actnum; UINT8 actnum = mapheaderinfo[gamemap-1]->actnum;
INT32 lvlttlxpos, ttlnumxpos, zonexpos; INT32 lvlttlxpos, ttlnumxpos, zonexpos;
INT32 subttlxpos = BASEVIDWIDTH/2; INT32 subttlxpos = BASEVIDWIDTH/2;
INT32 ttlscroll = FixedInt(lt_scroll); INT32 ttlscroll = FixedInt(lt_scroll);
@ -1382,7 +1382,12 @@ void ST_drawTitleCard(void)
if (actnum) if (actnum)
{ {
if (!splitscreen) if (!splitscreen)
V_DrawMappedPatch(ttlnumxpos + ttlscroll, 104 - ttlscroll, 0, actpat, colormap); {
if (actnum > 9) // slightly offset the act diamond for two-digit act numbers
V_DrawMappedPatch(ttlnumxpos + (V_LevelActNumWidth(actnum)/4) + ttlscroll, 104 - ttlscroll, 0, actpat, colormap);
else
V_DrawMappedPatch(ttlnumxpos + ttlscroll, 104 - ttlscroll, 0, actpat, colormap);
}
V_DrawLevelActNum(ttlnumxpos + ttlscroll, 104, V_PERPLAYER, actnum); V_DrawLevelActNum(ttlnumxpos + ttlscroll, 104, V_PERPLAYER, actnum);
} }

View file

@ -2958,13 +2958,19 @@ void V_DrawPaddedTallNum(INT32 x, INT32 y, INT32 flags, INT32 num, INT32 digits)
} }
// Draw an act number for a level title // Draw an act number for a level title
// Todo: actually draw two-digit numbers as two act num patches void V_DrawLevelActNum(INT32 x, INT32 y, INT32 flags, UINT8 num)
void V_DrawLevelActNum(INT32 x, INT32 y, INT32 flags, INT32 num)
{ {
if (num < 0 || num > 19) if (num > 99)
return; // not supported return; // not supported
V_DrawScaledPatch(x, y, flags, ttlnum[num]); while (num > 0)
{
if (num > 9) // if there are two digits, draw second digit first
V_DrawScaledPatch(x + (V_LevelActNumWidth(num) - V_LevelActNumWidth(num%10)), y, flags, ttlnum[num%10]);
else
V_DrawScaledPatch(x, y, flags, ttlnum[num]);
num = num/10;
}
} }
// Write a string using the credit font // Write a string using the credit font
@ -3345,13 +3351,21 @@ INT32 V_LevelNameHeight(const char *string)
} }
// For ST_drawTitleCard // For ST_drawTitleCard
// Returns the width of the act num patch // Returns the width of the act num patch(es)
INT32 V_LevelActNumWidth(INT32 num) INT16 V_LevelActNumWidth(UINT8 num)
{ {
if (num < 0 || num > 19) INT16 result = 0;
return 0; // not a valid number
return SHORT(ttlnum[num]->width); if (num == 0)
result = SHORT(ttlnum[num]->width);
while (num > 0 && num <= 99)
{
result = result + SHORT(ttlnum[num%10]->width);
num = num/10;
}
return result;
} }
// //

View file

@ -238,12 +238,12 @@ void V_DrawRightAlignedSmallThinStringAtFixed(fixed_t x, fixed_t y, INT32 option
// Draw tall nums, used for menu, HUD, intermission // Draw tall nums, used for menu, HUD, intermission
void V_DrawTallNum(INT32 x, INT32 y, INT32 flags, INT32 num); void V_DrawTallNum(INT32 x, INT32 y, INT32 flags, INT32 num);
void V_DrawPaddedTallNum(INT32 x, INT32 y, INT32 flags, INT32 num, INT32 digits); void V_DrawPaddedTallNum(INT32 x, INT32 y, INT32 flags, INT32 num, INT32 digits);
void V_DrawLevelActNum(INT32 x, INT32 y, INT32 flags, INT32 num); void V_DrawLevelActNum(INT32 x, INT32 y, INT32 flags, UINT8 num);
// Find string width from lt_font chars // Find string width from lt_font chars
INT32 V_LevelNameWidth(const char *string); INT32 V_LevelNameWidth(const char *string);
INT32 V_LevelNameHeight(const char *string); INT32 V_LevelNameHeight(const char *string);
INT32 V_LevelActNumWidth(INT32 num); // act number width INT16 V_LevelActNumWidth(UINT8 num); // act number width
void V_DrawCreditString(fixed_t x, fixed_t y, INT32 option, const char *string); void V_DrawCreditString(fixed_t x, fixed_t y, INT32 option, const char *string);
INT32 V_CreditStringWidth(const char *string); INT32 V_CreditStringWidth(const char *string);

View file

@ -73,7 +73,7 @@ typedef union
UINT32 score, total; // fake score, total UINT32 score, total; // fake score, total
UINT32 tics; // time UINT32 tics; // time
INT32 actnum; // act number being displayed UINT8 actnum; // act number being displayed
patch_t *ptotal; // TOTAL patch_t *ptotal; // TOTAL
UINT8 gotlife; // Number of extra lives obtained UINT8 gotlife; // Number of extra lives obtained
} coop; } coop;