mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 09:11:48 +00:00
Merge branch 'next' of https://git.magicalgirl.moe/STJr/SRB2.git into marathonmode
# Conflicts: # src/doomdef.h
This commit is contained in:
commit
2aa542d2bf
21 changed files with 122 additions and 71 deletions
|
@ -1690,7 +1690,7 @@ static void CL_LoadReceivedSavegame(void)
|
|||
// load a base level
|
||||
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));
|
||||
if (strcmp(mapheaderinfo[gamemap-1]->lvlttl, ""))
|
||||
{
|
||||
|
|
|
@ -125,6 +125,9 @@ boolean advancedemo;
|
|||
INT32 debugload = 0;
|
||||
#endif
|
||||
|
||||
char savegamename[256];
|
||||
char liveeventbackup[256];
|
||||
|
||||
char srb2home[256] = ".";
|
||||
char srb2path[256] = ".";
|
||||
boolean usehome = true;
|
||||
|
|
|
@ -239,7 +239,8 @@ typedef enum
|
|||
CR_MACESPIN,
|
||||
CR_MINECART,
|
||||
CR_ROLLOUT,
|
||||
CR_PTERABYTE
|
||||
CR_PTERABYTE,
|
||||
CR_DUSTDEVIL
|
||||
} carrytype_t; // pw_carry
|
||||
|
||||
// Player powers. (don't edit this comment)
|
||||
|
|
|
@ -1557,7 +1557,7 @@ static void readlevelheader(MYFILE *f, INT32 num)
|
|||
}
|
||||
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;
|
||||
else
|
||||
deh_warning("Level header %d: invalid act number %d", num, i);
|
||||
|
@ -9521,6 +9521,7 @@ struct {
|
|||
{"CR_MINECART",CR_MINECART},
|
||||
{"CR_ROLLOUT",CR_ROLLOUT},
|
||||
{"CR_PTERABYTE",CR_PTERABYTE},
|
||||
{"CR_DUSTDEVIL",CR_DUSTDEVIL},
|
||||
|
||||
// Ring weapons (ringweapons_t)
|
||||
// Useful for A_GiveWeapon
|
||||
|
|
|
@ -458,8 +458,8 @@ void CONS_Debug(INT32 debugflags, const char *fmt, ...) FUNCDEBUG;
|
|||
|
||||
// Things that used to be in dstrings.h
|
||||
#define SAVEGAMENAME "srb2sav"
|
||||
char savegamename[256];
|
||||
char liveeventbackup[256];
|
||||
extern char savegamename[256];
|
||||
extern char liveeventbackup[256];
|
||||
|
||||
// m_misc.h
|
||||
#ifdef GETTEXT
|
||||
|
|
|
@ -557,7 +557,7 @@ extern recorddata_t *mainrecords[NUMMAPS];
|
|||
extern UINT8 mapvisited[NUMMAPS];
|
||||
|
||||
// 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 tokenlist; ///< List of tokens collected
|
||||
|
|
|
@ -4681,7 +4681,7 @@ char *G_BuildMapTitle(INT32 mapnum)
|
|||
{
|
||||
size_t len = 1;
|
||||
const char *zonetext = NULL;
|
||||
const INT32 actnum = mapheaderinfo[mapnum-1]->actnum;
|
||||
const UINT8 actnum = mapheaderinfo[mapnum-1]->actnum;
|
||||
|
||||
len += strlen(mapheaderinfo[mapnum-1]->lvlttl);
|
||||
if (!(mapheaderinfo[mapnum-1]->levelflags & LF_NOZONE))
|
||||
|
|
|
@ -68,7 +68,7 @@ patch_t *nightsnum[10]; // 0-9
|
|||
// Level title and credits fonts
|
||||
patch_t *lt_font[LT_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
|
||||
patch_t *ntb_font[NT_FONTSIZE];
|
||||
|
@ -243,7 +243,7 @@ void HU_LoadGraphics(void)
|
|||
tallinfin = (patch_t *)W_CachePatchName("STTINFIN", PU_HUDGFX);
|
||||
|
||||
// cache act numbers for level titles
|
||||
for (i = 0; i < 20; i++)
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
sprintf(buffer, "TTL%.2d", i);
|
||||
ttlnum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
|
||||
|
|
|
@ -85,7 +85,7 @@ extern patch_t *lt_font[LT_FONTSIZE];
|
|||
extern patch_t *cred_font[CRED_FONTSIZE];
|
||||
extern patch_t *ntb_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 *rflagico;
|
||||
extern patch_t *bflagico;
|
||||
|
|
|
@ -490,30 +490,29 @@ const UINT8 gifframe_gchead[4] = {0x21,0xF9,0x04,0x04}; // GCE, bytes, packed by
|
|||
static UINT8 *gifframe_data = NULL;
|
||||
static size_t gifframe_size = 8192;
|
||||
|
||||
//
|
||||
// GIF_rgbconvert
|
||||
// converts an RGB frame to a frame with a palette.
|
||||
//
|
||||
#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;
|
||||
INT32 x, y;
|
||||
size_t i = 0;
|
||||
size_t src = 0, dest = 0;
|
||||
size_t size = (vid.width * vid.height * 3);
|
||||
|
||||
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[i];
|
||||
g = (UINT8)linear[i + 1];
|
||||
b = (UINT8)linear[i + 2];
|
||||
dest[(y * vid.width) + x] = colorlookup[r >> SHIFTCOLORBITS][g >> SHIFTCOLORBITS][b >> SHIFTCOLORBITS];
|
||||
r = (UINT8)linear[src];
|
||||
g = (UINT8)linear[src + 1];
|
||||
b = (UINT8)linear[src + 2];
|
||||
scr[dest] = colorlookup[r >> SHIFTCOLORBITS][g >> SHIFTCOLORBITS][b >> SHIFTCOLORBITS];
|
||||
src += (3 * scrbuf_downscaleamt);
|
||||
dest += scrbuf_downscaleamt;
|
||||
}
|
||||
}
|
||||
|
||||
free(linear);
|
||||
}
|
||||
#endif
|
||||
|
||||
//
|
||||
|
@ -556,7 +555,11 @@ static void GIF_framewrite(void)
|
|||
I_ReadScreen(movie_screen);
|
||||
#ifdef HWRENDER
|
||||
else if (rendermode == render_opengl)
|
||||
hwrconvert();
|
||||
{
|
||||
UINT8 *linear = HWR_GetScreenshot();
|
||||
GIF_rgbconvert(linear, movie_screen);
|
||||
free(linear);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else
|
||||
|
@ -565,18 +568,20 @@ static void GIF_framewrite(void)
|
|||
blitw = vid.width;
|
||||
blith = vid.height;
|
||||
|
||||
if (gif_frames == 0)
|
||||
{
|
||||
if (rendermode == render_soft)
|
||||
I_ReadScreen(movie_screen);
|
||||
#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]);
|
||||
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];
|
||||
}
|
||||
|
|
|
@ -5237,7 +5237,7 @@ static boolean M_PrepareLevelPlatter(INT32 gt, boolean nextmappick)
|
|||
{
|
||||
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 wide = (mapheaderinfo[mapnum]->menuflags & LF2_WIDEICON);
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ extern consvar_t cv_masterserver, cv_servername;
|
|||
// < 0 to not connect (usually -1) (offline mode)
|
||||
// == 0 to show all rooms, not a valid hosting room
|
||||
// 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 *GetMasterServerIP(void);
|
||||
|
|
|
@ -13369,8 +13369,9 @@ static boolean PIT_DustDevilLaunch(mobj_t *thing)
|
|||
P_ResetPlayer(player);
|
||||
A_PlayActiveSound(dustdevil);
|
||||
}
|
||||
player->powers[pw_carry] = CR_DUSTDEVIL;
|
||||
player->powers[pw_nocontrol] = 2;
|
||||
player->drawangle += ANG20;
|
||||
P_SetTarget(&thing->tracer, dustdevil);
|
||||
P_SetPlayerMobjState(thing, S_PLAY_PAIN);
|
||||
|
||||
if (dist > dragamount)
|
||||
|
@ -13390,7 +13391,9 @@ static boolean PIT_DustDevilLaunch(mobj_t *thing)
|
|||
P_ResetPlayer(player);
|
||||
thing->z = dustdevil->z + dustdevil->height;
|
||||
thrust = 20 * FRACUNIT;
|
||||
player->powers[pw_carry] = CR_NONE;
|
||||
player->powers[pw_nocontrol] = 0;
|
||||
P_SetTarget(&thing->tracer, NULL);
|
||||
S_StartSound(thing, sfx_wdjump);
|
||||
P_SetPlayerMobjState(thing, S_PLAY_FALL);
|
||||
}
|
||||
|
|
16
src/p_user.c
16
src/p_user.c
|
@ -11918,6 +11918,9 @@ void P_PlayerThink(player_t *player)
|
|||
factor = 4;
|
||||
}
|
||||
break;
|
||||
case CR_DUSTDEVIL:
|
||||
player->drawangle += ANG20;
|
||||
break;
|
||||
/* -- in case we wanted to have the camera freely movable during zoom tubes
|
||||
case CR_ZOOMTUBE:*/
|
||||
case CR_ROPEHANG:
|
||||
|
@ -12690,6 +12693,19 @@ void P_PlayerAfterThink(player_t *player)
|
|||
}
|
||||
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:
|
||||
{
|
||||
mobj_t *mo = player->mo, *rock = player->mo->tracer;
|
||||
|
|
|
@ -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};
|
||||
|
||||
#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}};
|
||||
consvar_t cv_modfilter = {"modfilter", "0", CV_SAVE|CV_CALL, interpolationfilter_cons_t, ModFilter_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
#endif
|
||||
|
@ -1910,6 +1911,10 @@ UINT32 S_GetMusicPosition(void)
|
|||
/// 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 *last_music_stack = NULL;
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
#ifdef HAVE_OPENMPT
|
||||
#include "libopenmpt/libopenmpt.h"
|
||||
openmpt_module *openmpt_mhandle;
|
||||
extern openmpt_module *openmpt_mhandle;
|
||||
#endif
|
||||
|
||||
// mask used to indicate sound origin is player item pickup
|
||||
|
@ -262,10 +262,10 @@ typedef struct musicstack_s
|
|||
struct musicstack_s *next;
|
||||
} musicstack_t;
|
||||
|
||||
char music_stack_nextmusname[7];
|
||||
boolean music_stack_noposition;
|
||||
UINT32 music_stack_fadeout;
|
||||
UINT32 music_stack_fadein;
|
||||
extern char music_stack_nextmusname[7];
|
||||
extern boolean music_stack_noposition;
|
||||
extern UINT32 music_stack_fadeout;
|
||||
extern UINT32 music_stack_fadein;
|
||||
|
||||
void S_SetStackAdjustmentStart(void);
|
||||
void S_AdjustMusicStackTics(void);
|
||||
|
@ -333,7 +333,7 @@ void S_StopSoundByNum(sfxenum_t sfxnum);
|
|||
#ifdef MUSICSLOT_COMPATIBILITY
|
||||
// For compatibility with code/scripts relying on older versions
|
||||
// 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
|
||||
|
|
|
@ -217,7 +217,6 @@ static void SDLSetMode(INT32 width, INT32 height, SDL_bool fullscreen, SDL_bool
|
|||
else
|
||||
{
|
||||
Impl_CreateWindow(fullscreen);
|
||||
Impl_SetWindowIcon();
|
||||
wasfullscreen = fullscreen;
|
||||
SDL_SetWindowSize(window, width, height);
|
||||
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,
|
||||
realwidth, realheight, flags);
|
||||
|
||||
|
||||
if (window == NULL)
|
||||
{
|
||||
CONS_Printf(M_GetText("Couldn't create window: %s\n"), SDL_GetError());
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
Impl_SetWindowIcon();
|
||||
|
||||
return Impl_CreateContext();
|
||||
}
|
||||
|
||||
|
@ -1657,11 +1659,7 @@ static void Impl_SetWindowName(const char *title)
|
|||
|
||||
static void Impl_SetWindowIcon(void)
|
||||
{
|
||||
if (window == NULL || icoSurface == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
//SDL2STUB(); // Monster Iestyn: why is this stubbed?
|
||||
if (window && icoSurface)
|
||||
SDL_SetWindowIcon(window, icoSurface);
|
||||
}
|
||||
|
||||
|
@ -1769,6 +1767,11 @@ void I_StartupGraphics(void)
|
|||
VID_StartupOpenGL();
|
||||
#endif
|
||||
|
||||
// Window icon
|
||||
#ifdef HAVE_IMAGE
|
||||
icoSurface = IMG_ReadXPMFromArray(SDL_icon_xpm);
|
||||
#endif
|
||||
|
||||
// Fury: we do window initialization after GL setup to allow
|
||||
// SDL_GL_LoadLibrary to work well on Windows
|
||||
|
||||
|
@ -1787,11 +1790,6 @@ void I_StartupGraphics(void)
|
|||
#ifdef HAVE_TTF
|
||||
I_ShutdownTTF();
|
||||
#endif
|
||||
// Window icon
|
||||
#ifdef HAVE_IMAGE
|
||||
icoSurface = IMG_ReadXPMFromArray(SDL_icon_xpm);
|
||||
#endif
|
||||
Impl_SetWindowIcon();
|
||||
|
||||
VID_SetMode(VID_GetModeForSize(BASEVIDWIDTH, BASEVIDHEIGHT));
|
||||
|
||||
|
|
|
@ -1325,7 +1325,7 @@ void ST_drawTitleCard(void)
|
|||
{
|
||||
char *lvlttl = mapheaderinfo[gamemap-1]->lvlttl;
|
||||
char *subttl = mapheaderinfo[gamemap-1]->subttl;
|
||||
INT32 actnum = mapheaderinfo[gamemap-1]->actnum;
|
||||
UINT8 actnum = mapheaderinfo[gamemap-1]->actnum;
|
||||
INT32 lvlttlxpos, ttlnumxpos, zonexpos;
|
||||
INT32 subttlxpos = BASEVIDWIDTH/2;
|
||||
INT32 ttlscroll = FixedInt(lt_scroll);
|
||||
|
@ -1382,7 +1382,12 @@ void ST_drawTitleCard(void)
|
|||
if (actnum)
|
||||
{
|
||||
if (!splitscreen)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
// Todo: actually draw two-digit numbers as two act num patches
|
||||
void V_DrawLevelActNum(INT32 x, INT32 y, INT32 flags, INT32 num)
|
||||
void V_DrawLevelActNum(INT32 x, INT32 y, INT32 flags, UINT8 num)
|
||||
{
|
||||
if (num < 0 || num > 19)
|
||||
if (num > 99)
|
||||
return; // not supported
|
||||
|
||||
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
|
||||
|
@ -3345,13 +3351,21 @@ INT32 V_LevelNameHeight(const char *string)
|
|||
}
|
||||
|
||||
// For ST_drawTitleCard
|
||||
// Returns the width of the act num patch
|
||||
INT32 V_LevelActNumWidth(INT32 num)
|
||||
// Returns the width of the act num patch(es)
|
||||
INT16 V_LevelActNumWidth(UINT8 num)
|
||||
{
|
||||
if (num < 0 || num > 19)
|
||||
return 0; // not a valid number
|
||||
INT16 result = 0;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -238,12 +238,12 @@ void V_DrawRightAlignedSmallThinStringAtFixed(fixed_t x, fixed_t y, INT32 option
|
|||
// Draw tall nums, used for menu, HUD, intermission
|
||||
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_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
|
||||
INT32 V_LevelNameWidth(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);
|
||||
INT32 V_CreditStringWidth(const char *string);
|
||||
|
|
|
@ -73,7 +73,7 @@ typedef union
|
|||
UINT32 score, total; // fake score, total
|
||||
UINT32 tics; // time
|
||||
|
||||
INT32 actnum; // act number being displayed
|
||||
UINT8 actnum; // act number being displayed
|
||||
patch_t *ptotal; // TOTAL
|
||||
UINT8 gotlife; // Number of extra lives obtained
|
||||
} coop;
|
||||
|
|
Loading…
Reference in a new issue