mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-05-11 19:32:02 +00:00
Another round of fixing up
- gametyperules are now fitting for kart, not applied to the whole codebase though - a few more files compile
This commit is contained in:
parent
b7078fa8b6
commit
8731c6b7a4
51 changed files with 855 additions and 3249 deletions
|
|
@ -1959,13 +1959,13 @@ void CV_AddValue(consvar_t *var, INT32 increment)
|
|||
var->func();
|
||||
return;
|
||||
}
|
||||
else if (var == &cv_playercolor)
|
||||
else if (var == &cv_playercolor[0] || var == &cv_playercolor[1] || var == &cv_playercolor[2] || var == &cv_playercolor[3])
|
||||
{
|
||||
// Special case for the playercolor variable, used only directly from the menu
|
||||
if (increment > 0) // Going up!
|
||||
{
|
||||
newvalue = var->value + 1;
|
||||
if (newvalue > MAXSKINCOLORS-1)
|
||||
if (newvalue > numskincolors-1)
|
||||
newvalue = 1;
|
||||
var->value = newvalue;
|
||||
var->string = var->PossibleValue[var->value].strvalue;
|
||||
|
|
@ -1976,7 +1976,7 @@ void CV_AddValue(consvar_t *var, INT32 increment)
|
|||
{
|
||||
newvalue = var->value - 1;
|
||||
if (newvalue < 1)
|
||||
newvalue = MAXSKINCOLORS-1;
|
||||
newvalue = numskincolors-1;
|
||||
var->value = newvalue;
|
||||
var->string = var->PossibleValue[var->value].strvalue;
|
||||
var->func();
|
||||
|
|
@ -2077,13 +2077,13 @@ static boolean CV_FilterJoyAxisVars(consvar_t *v, const char *valstr)
|
|||
switch (i)
|
||||
{
|
||||
default:
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_turnaxis.name, cv_turnaxis.defaultvalue));
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_moveaxis.name, cv_moveaxis.defaultvalue));
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_brakeaxis.name, cv_brakeaxis.defaultvalue));
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_aimaxis.name, cv_aimaxis.defaultvalue));
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_lookaxis.name, cv_lookaxis.defaultvalue));
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_fireaxis.name, cv_fireaxis.defaultvalue));
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_driftaxis.name, cv_driftaxis.defaultvalue));
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_turnaxis[0].name, cv_turnaxis[0].defaultvalue));
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_moveaxis[0].name, cv_moveaxis[0].defaultvalue));
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_brakeaxis[0].name, cv_brakeaxis[0].defaultvalue));
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_aimaxis[0].name, cv_aimaxis[0].defaultvalue));
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_lookaxis[0].name, cv_lookaxis[0].defaultvalue));
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_fireaxis[0].name, cv_fireaxis[0].defaultvalue));
|
||||
COM_BufInsertText(va("%s \"%s\"\n", cv_driftaxis[0].name, cv_driftaxis[0].defaultvalue));
|
||||
break;
|
||||
}
|
||||
joyaxis_count[i]++;
|
||||
|
|
|
|||
|
|
@ -1013,8 +1013,6 @@ static void SV_SendResynch(INT32 node)
|
|||
netbuffer->packettype = PT_RESYNCHEND;
|
||||
|
||||
netbuffer->u.resynchend.randomseed = P_GetRandSeed();
|
||||
if (gametyperules & GTR_TEAMFLAGS)
|
||||
resynch_write_ctf(&netbuffer->u.resynchend);
|
||||
resynch_write_others(&netbuffer->u.resynchend);
|
||||
|
||||
HSendPacket(node, true, 0, (sizeof(resynchend_pak)));
|
||||
|
|
@ -2770,9 +2768,6 @@ void CL_RemovePlayer(INT32 playernum, kickreason_t reason)
|
|||
if (K_IsPlayerWanted(&players[playernum]))
|
||||
K_CalculateBattleWanted();
|
||||
|
||||
if (gametyperules & GTR_TEAMFLAGS)
|
||||
P_PlayerFlagBurst(&players[playernum], false); // Don't take the flag with you!
|
||||
|
||||
LUAh_PlayerQuit(&players[playernum], reason); // Lua hook for player quitting
|
||||
|
||||
// don't look through someone's view who isn't there
|
||||
|
|
@ -2808,10 +2803,8 @@ void CL_RemovePlayer(INT32 playernum, kickreason_t reason)
|
|||
|
||||
LUA_InvalidatePlayer(&players[playernum]);
|
||||
|
||||
if (G_BattleGametype()) // SRB2Kart
|
||||
K_CheckBumpers();
|
||||
else if (gametyperules & GTR_RACE)
|
||||
P_CheckRacers();
|
||||
K_CheckBumpers();
|
||||
P_CheckRacers();
|
||||
}
|
||||
|
||||
void CL_Reset(void)
|
||||
|
|
@ -3793,9 +3786,7 @@ static void Got_AddBot(UINT8 **p, INT32 playernum)
|
|||
HU_AddChatText(va("\x82*Bot %d has been added to the game", newplayernum+1), false);
|
||||
}
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
LUAh_PlayerJoin(newplayernum);
|
||||
#endif
|
||||
}
|
||||
|
||||
static boolean SV_AddWaitingPlayers(const char *name, const char *name2, const char *name3, const char *name4)
|
||||
|
|
@ -4835,8 +4826,6 @@ static void HandlePacketFromPlayer(SINT8 node)
|
|||
|
||||
P_SetRandSeed(netbuffer->u.resynchend.randomseed);
|
||||
|
||||
if (gametyperules & GTR_TEAMFLAGS)
|
||||
resynch_read_ctf(&netbuffer->u.resynchend);
|
||||
resynch_read_others(&netbuffer->u.resynchend);
|
||||
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ typedef enum
|
|||
ev_console,
|
||||
ev_mouse,
|
||||
ev_joystick,
|
||||
ev_mouse2,
|
||||
ev_joystick2,
|
||||
ev_joystick3,
|
||||
ev_joystick4,
|
||||
|
|
|
|||
|
|
@ -984,7 +984,7 @@ void D_StartTitle(void)
|
|||
|
||||
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||
{
|
||||
players[i].availabilities = R_GetSkinAvailabilities();
|
||||
players[g_localplayers[i]].availabilities = R_GetSkinAvailabilities();
|
||||
}
|
||||
|
||||
splitscreen = 0;
|
||||
|
|
|
|||
770
src/d_netcmd.c
770
src/d_netcmd.c
File diff suppressed because it is too large
Load diff
|
|
@ -28,36 +28,16 @@ extern consvar_t cv_splitplayers;
|
|||
extern consvar_t cv_seenames, cv_allowseenames;
|
||||
#endif
|
||||
extern consvar_t cv_usemouse;
|
||||
extern consvar_t cv_usejoystick;
|
||||
extern consvar_t cv_usejoystick2;
|
||||
extern consvar_t cv_usejoystick3;
|
||||
extern consvar_t cv_usejoystick4;
|
||||
extern consvar_t cv_usejoystick[MAXSPLITSCREENPLAYERS];
|
||||
extern consvar_t cv_joyscale[MAXSPLITSCREENPLAYERS];
|
||||
#ifdef LJOYSTICK
|
||||
extern consvar_t cv_joyport;
|
||||
extern consvar_t cv_joyport2;
|
||||
#endif
|
||||
extern consvar_t cv_joyscale;
|
||||
extern consvar_t cv_joyscale2;
|
||||
extern consvar_t cv_joyscale3;
|
||||
extern consvar_t cv_joyscale4;
|
||||
|
||||
// splitscreen with second mouse
|
||||
extern consvar_t cv_mouse2port;
|
||||
extern consvar_t cv_usemouse2;
|
||||
#if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON)
|
||||
extern consvar_t cv_mouse2opt;
|
||||
extern consvar_t cv_joyport[MAXSPLITSCREENPLAYERS];
|
||||
#endif
|
||||
|
||||
// normally in p_mobj but the .h is not read
|
||||
extern consvar_t cv_itemrespawntime;
|
||||
extern consvar_t cv_itemrespawn;
|
||||
|
||||
extern consvar_t cv_flagtime;
|
||||
|
||||
extern consvar_t cv_touchtag;
|
||||
extern consvar_t cv_hidetime;
|
||||
|
||||
extern consvar_t cv_friendlyfire;
|
||||
extern consvar_t cv_pointlimit;
|
||||
extern consvar_t cv_timelimit;
|
||||
extern consvar_t cv_numlaps;
|
||||
|
|
@ -82,11 +62,6 @@ extern consvar_t cv_pause;
|
|||
|
||||
extern consvar_t cv_restrictskinchange, cv_allowteamchange, cv_ingamecap, cv_respawntime;
|
||||
|
||||
/*extern consvar_t cv_teleporters, cv_superring, cv_supersneakers, cv_invincibility;
|
||||
extern consvar_t cv_jumpshield, cv_watershield, cv_ringshield, cv_forceshield, cv_bombshield;
|
||||
extern consvar_t cv_1up, cv_eggmanbox;
|
||||
extern consvar_t cv_recycler;*/
|
||||
|
||||
// SRB2kart items
|
||||
extern consvar_t cv_superring, cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana;
|
||||
extern consvar_t cv_eggmanmonitor, cv_orbinaut, cv_jawz, cv_mine;
|
||||
|
|
@ -120,16 +95,14 @@ extern consvar_t cv_kartdebugwaypoints;
|
|||
|
||||
extern consvar_t cv_itemfinder;
|
||||
|
||||
extern consvar_t cv_inttime, cv_coopstarposts, cv_cooplives, cv_advancemap, cv_playersforexit, cv_exitmove;
|
||||
extern consvar_t cv_inttime, cv_advancemap;
|
||||
extern consvar_t cv_overtime;
|
||||
extern consvar_t cv_startinglives;
|
||||
|
||||
// for F_finale.c
|
||||
extern consvar_t cv_rollingdemos;
|
||||
|
||||
extern consvar_t cv_ringslinger, cv_soundtest;
|
||||
|
||||
extern consvar_t cv_specialrings, cv_powerstones, cv_matchboxes, cv_competitionboxes;
|
||||
extern consvar_t cv_soundtest;
|
||||
|
||||
extern consvar_t cv_maxping;
|
||||
extern consvar_t cv_lagless;
|
||||
|
|
|
|||
|
|
@ -10810,7 +10810,6 @@ static const char *const POWERS_LIST[] = {
|
|||
"IGNORELATCH"
|
||||
};
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
static const char *const KARTSTUFF_LIST[] = {
|
||||
"POSITION",
|
||||
"OLDPOSITION",
|
||||
|
|
@ -10904,7 +10903,6 @@ static const char *const KARTSTUFF_LIST[] = {
|
|||
"KILLFIELD",
|
||||
"WRONGWAY"
|
||||
};
|
||||
#endif
|
||||
|
||||
static const char *const HUDITEMS_LIST[] = {
|
||||
"LIVES",
|
||||
|
|
@ -11133,20 +11131,9 @@ struct {
|
|||
{"NUMTRANSMAPS",NUMTRANSMAPS},
|
||||
|
||||
// Type of levels
|
||||
{"TOL_SP",TOL_SP},
|
||||
{"TOL_COOP",TOL_COOP},
|
||||
{"TOL_COMPETITION",TOL_COMPETITION},
|
||||
{"TOL_RACE",TOL_RACE},
|
||||
{"TOL_MATCH",TOL_MATCH},
|
||||
{"TOL_TAG",TOL_TAG},
|
||||
{"TOL_CTF",TOL_CTF},
|
||||
{"TOL_CUSTOM",TOL_CUSTOM},
|
||||
{"TOL_2D",TOL_2D},
|
||||
{"TOL_MARIO",TOL_MARIO},
|
||||
{"TOL_NIGHTS",TOL_NIGHTS},
|
||||
{"TOL_BATTLE",TOL_BATTLE},
|
||||
{"TOL_TV",TOL_TV},
|
||||
{"TOL_XMAS",TOL_XMAS},
|
||||
//{"TOL_KART",TOL_KART},
|
||||
|
||||
// Level flags
|
||||
{"LF_SCRIPTISFILE",LF_SCRIPTISFILE},
|
||||
|
|
@ -11800,7 +11787,8 @@ static menutype_t get_menutype(const char *word)
|
|||
return MN_NONE;
|
||||
}
|
||||
|
||||
/*static INT16 get_gametype(const char *word)
|
||||
/*
|
||||
static INT16 get_gametype(const char *word)
|
||||
{ // Returns the value of GT_ enumerations
|
||||
INT16 i;
|
||||
if (*word >= '0' && *word <= '9')
|
||||
|
|
@ -11826,7 +11814,8 @@ static powertype_t get_power(const char *word)
|
|||
return i;
|
||||
deh_warning("Couldn't find power named 'pw_%s'",word);
|
||||
return pw_invulnerability;
|
||||
}*/
|
||||
}
|
||||
*/
|
||||
|
||||
/// \todo Make ANY of this completely over-the-top math craziness obey the order of operations.
|
||||
static fixed_t op_mul(fixed_t a, fixed_t b) { return a*b; }
|
||||
|
|
@ -11854,7 +11843,8 @@ struct {
|
|||
};
|
||||
|
||||
// Returns the full word, cut at the first symbol or whitespace
|
||||
/*static char *read_word(const char *line)
|
||||
/*
|
||||
static char *read_word(const char *line)
|
||||
{
|
||||
// Part 1: You got the start of the word, now find the end.
|
||||
const char *p;
|
||||
|
|
@ -12078,7 +12068,8 @@ static fixed_t find_const(const char **rword)
|
|||
const_warning("constant",word);
|
||||
free(word);
|
||||
return 0;
|
||||
}*/
|
||||
}
|
||||
*/
|
||||
|
||||
// Loops through every constant and operation in word and performs its calculations, returning the final value.
|
||||
fixed_t get_number(const char *word)
|
||||
|
|
|
|||
|
|
@ -218,9 +218,6 @@ typedef struct
|
|||
|
||||
#define ZSHIFT 4
|
||||
|
||||
//extern const char *Color_Names[MAXSKINCOLORS];
|
||||
//extern const UINT8 Color_Opposite[MAXSKINCOLORS*2];
|
||||
|
||||
#define NUMMAPS 1035
|
||||
|
||||
#endif // __DOOMDATA__
|
||||
|
|
|
|||
|
|
@ -451,38 +451,31 @@ enum GameType
|
|||
// Gametype rules
|
||||
enum GameTypeRules
|
||||
{
|
||||
GTR_CAMPAIGN = 1, // Linear Co-op map progression, don't allow random maps
|
||||
GTR_RINGSLINGER = 1<<1, // Outside of Co-op, Competition, and Race (overriden by cv_ringslinger)
|
||||
GTR_SPECTATORS = 1<<2, // Outside of Co-op, Competition, and Race
|
||||
GTR_LIVES = 1<<3, // Co-op and Competition
|
||||
GTR_TEAMS = 1<<4, // Team Match, CTF
|
||||
GTR_FIRSTPERSON = 1<<5, // First person camera
|
||||
GTR_POWERSTONES = 1<<6, // Power stones (Match and CTF)
|
||||
GTR_TEAMFLAGS = 1<<7, // Gametype has team flags (CTF)
|
||||
GTR_FRIENDLY = 1<<8, // Co-op
|
||||
GTR_SPECIALSTAGES = 1<<9, // Allow special stages
|
||||
GTR_EMERALDTOKENS = 1<<10, // Spawn emerald tokens
|
||||
GTR_EMERALDHUNT = 1<<11, // Emerald Hunt
|
||||
GTR_RACE = 1<<12, // Race and Competition
|
||||
GTR_TAG = 1<<13, // Tag and Hide and Seek
|
||||
GTR_POINTLIMIT = 1<<14, // Ringslinger point limit
|
||||
GTR_TIMELIMIT = 1<<15, // Ringslinger time limit
|
||||
GTR_OVERTIME = 1<<16, // Allow overtime
|
||||
GTR_HURTMESSAGES = 1<<17, // Hit and death messages
|
||||
GTR_FRIENDLYFIRE = 1<<18, // Always allow friendly fire
|
||||
GTR_STARTCOUNTDOWN = 1<<19, // Hide time countdown (Tag and Hide and Seek)
|
||||
GTR_HIDEFROZEN = 1<<20, // Frozen after hide time (Hide and Seek, but not Tag)
|
||||
GTR_BLINDFOLDED = 1<<21, // Blindfolded view (Tag and Hide and Seek)
|
||||
GTR_RESPAWNDELAY = 1<<22, // Respawn delay
|
||||
GTR_PITYSHIELD = 1<<23, // Award pity shield
|
||||
GTR_DEATHPENALTY = 1<<24, // Death score penalty
|
||||
GTR_NOSPECTATORSPAWN = 1<<25, // Use with GTR_SPECTATORS, spawn in the map instead of with the spectators
|
||||
GTR_DEATHMATCHSTARTS = 1<<26, // Use deathmatch starts
|
||||
GTR_SPAWNINVUL = 1<<27, // Babysitting deterrent
|
||||
GTR_SPAWNENEMIES = 1<<28, // Spawn enemies
|
||||
GTR_ALLOWEXIT = 1<<29, // Allow exit sectors
|
||||
GTR_NOTITLECARD = 1<<30, // Don't show the title card
|
||||
GTR_CUTSCENES = 1<<31, // Play cutscenes, ending, credits, and evaluation
|
||||
// Race rules
|
||||
GTR_CIRCUIT = 1, // Enables the finish line, laps, and the waypoint system.
|
||||
GTR_RINGS = 1<<1, // Rings will be spawned in this mode. (Don't get too cheeky, ring sting is still enabled :])
|
||||
GTR_BOTS = 1<<2, // Allows bots in this gametype. Combine with BotTiccmd hooks to make bots support your gametype.
|
||||
|
||||
// Battle gametype rules
|
||||
GTR_BUMPERS = 1<<3, // Enables the bumper health system
|
||||
GTR_KARMA = 1<<4, // Enables the Karma system if you're out of bumpers
|
||||
GTR_ITEMARROWS = 1<<5, // Show item box arrows above players
|
||||
GTR_BATTLESTARTS = 1<<6, // Use Battle Mode start positions.
|
||||
GTR_POINTLIMIT = 1<<7, // Reaching point limit ends the round
|
||||
GTR_TIMELIMIT = 1<<8, // Reaching time limit ends the round
|
||||
GTR_OVERTIME = 1<<9, // Allow overtime behavior
|
||||
|
||||
// Custom gametype rules
|
||||
GTR_TEAMS = 1<<10, // Teams are forced on
|
||||
GTR_NOTEAMS = 1<<11, // Teams are forced off
|
||||
GTR_TEAMSTARTS = 1<<12, // Use team-based start positions
|
||||
|
||||
// Grand Prix rules
|
||||
GTR_CAMPAIGN = 1<<13, // Handles cup-based progression
|
||||
GTR_LIVES = 1<<14, // Lives system, players are forced to spectate during Game Over.
|
||||
GTR_SPECIALBOTS = 1<<15, // Bot difficulty gets stronger between rounds, and the rival system is enabled.
|
||||
|
||||
// free: to and including 1<<31
|
||||
};
|
||||
|
||||
// String names for gametypes
|
||||
|
|
@ -672,8 +665,6 @@ extern INT16 votelevels[5][2];
|
|||
extern SINT8 votes[MAXPLAYERS];
|
||||
extern SINT8 pickedvote;
|
||||
|
||||
extern tic_t hidetime;
|
||||
|
||||
extern UINT32 timesBeaten; // # of times the game has been beaten.
|
||||
extern UINT32 timesBeatenWithEmeralds;
|
||||
//extern UINT32 timesBeatenUltimate;
|
||||
|
|
|
|||
308
src/f_finale.c
308
src/f_finale.c
|
|
@ -3177,314 +3177,6 @@ void F_WaitingPlayersDrawer(void)
|
|||
V_DrawFixedPatch((160<<FRACBITS) - driver[frame]->width / 2, 150<<FRACBITS, 1<<FRACBITS, flags, driver[frame], waitcolormap);
|
||||
}
|
||||
|
||||
// ==========
|
||||
// CONTINUE
|
||||
// ==========
|
||||
|
||||
static skin_t *contskins[2];
|
||||
static UINT8 cont_spr2[2][6];
|
||||
static UINT8 *contcolormaps[2];
|
||||
|
||||
void F_StartContinue(void)
|
||||
{
|
||||
I_Assert(!netgame && !multiplayer);
|
||||
|
||||
if (continuesInSession && players[consoleplayer].continues <= 0)
|
||||
{
|
||||
Command_ExitGame_f();
|
||||
return;
|
||||
}
|
||||
|
||||
wipestyleflags = WSF_FADEOUT;
|
||||
G_SetGamestate(GS_CONTINUING);
|
||||
gameaction = ga_nothing;
|
||||
|
||||
keypressed = false;
|
||||
paused = false;
|
||||
CON_ToggleOff();
|
||||
|
||||
// In case menus are still up?!!
|
||||
M_ClearMenus(true);
|
||||
|
||||
S_ChangeMusicInternal("_conti", false);
|
||||
S_StopSounds();
|
||||
|
||||
contskins[0] = &skins[players[consoleplayer].skin];
|
||||
cont_spr2[0][0] = P_GetSkinSprite2(contskins[0], SPR2_CNT1, NULL);
|
||||
cont_spr2[0][2] = contskins[0]->contangle & 7;
|
||||
contcolormaps[0] = R_GetTranslationColormap(players[consoleplayer].skin, players[consoleplayer].skincolor, GTC_CACHE);
|
||||
cont_spr2[0][4] = contskins[0]->sprites[cont_spr2[0][0]].numframes;
|
||||
cont_spr2[0][5] = max(1, contskins[0]->contspeed);
|
||||
|
||||
if (botskin)
|
||||
{
|
||||
INT32 secondplaya;
|
||||
|
||||
if (secondarydisplayplayer != consoleplayer)
|
||||
secondplaya = secondarydisplayplayer;
|
||||
else // HACK
|
||||
secondplaya = 1;
|
||||
|
||||
contskins[1] = &skins[players[secondplaya].skin];
|
||||
cont_spr2[1][0] = P_GetSkinSprite2(contskins[1], SPR2_CNT4, NULL);
|
||||
cont_spr2[1][2] = (contskins[1]->contangle >> 3) & 7;
|
||||
contcolormaps[1] = R_GetTranslationColormap(players[secondplaya].skin, players[secondplaya].skincolor, GTC_CACHE);
|
||||
cont_spr2[1][4] = contskins[1]->sprites[cont_spr2[1][0]].numframes;
|
||||
if (cont_spr2[1][0] == SPR2_CNT4)
|
||||
cont_spr2[1][5] = 4; // sorry, this one is hardcoded
|
||||
else
|
||||
cont_spr2[1][5] = max(1, contskins[1]->contspeed);
|
||||
}
|
||||
else
|
||||
{
|
||||
contskins[1] = NULL;
|
||||
contcolormaps[1] = NULL;
|
||||
cont_spr2[1][0] = cont_spr2[1][2] = cont_spr2[1][4] = cont_spr2[1][5] = 0;
|
||||
}
|
||||
|
||||
cont_spr2[0][1] = cont_spr2[0][3] =\
|
||||
cont_spr2[1][1] = cont_spr2[1][3] = 0;
|
||||
|
||||
timetonext = (11*TICRATE)+11;
|
||||
continuetime = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// F_ContinueDrawer
|
||||
// Moved continuing out of the HUD (hack removal!!)
|
||||
//
|
||||
void F_ContinueDrawer(void)
|
||||
{
|
||||
spritedef_t *sprdef;
|
||||
spriteframe_t *sprframe;
|
||||
patch_t *patch;
|
||||
INT32 i, x = (BASEVIDWIDTH>>1), ncontinues = players[consoleplayer].continues;
|
||||
char numbuf[9] = "CONTNUM*";
|
||||
tic_t timeleft = (timetonext/TICRATE);
|
||||
INT32 offsx = 0, offsy = 0, lift[2] = {0, 0};
|
||||
|
||||
if (continuetime >= 3*TICRATE)
|
||||
{
|
||||
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31);
|
||||
|
||||
if (timetonext >= (11*TICRATE)+10)
|
||||
return;
|
||||
|
||||
V_DrawLevelTitle(x - (V_LevelNameWidth("Continue?")>>1), 16, 0, "Continue?");
|
||||
|
||||
// Two stars...
|
||||
patch = W_CachePatchName("CONTSTAR", PU_PATCH);
|
||||
V_DrawScaledPatch(x-32, 160, 0, patch);
|
||||
V_DrawScaledPatch(x+32, 160, 0, patch);
|
||||
|
||||
// Time left!
|
||||
if (timeleft > 9)
|
||||
{
|
||||
numbuf[7] = '1';
|
||||
V_DrawScaledPatch(x - 10, 160, 0, W_CachePatchName(numbuf, PU_PATCH));
|
||||
numbuf[7] = '0';
|
||||
V_DrawScaledPatch(x + 10, 160, 0, W_CachePatchName(numbuf, PU_PATCH));
|
||||
}
|
||||
else
|
||||
{
|
||||
numbuf[7] = '0'+timeleft;
|
||||
V_DrawScaledPatch(x, 160, 0, W_CachePatchName(numbuf, PU_PATCH));
|
||||
}
|
||||
|
||||
// Draw the continue markers! Show continues.
|
||||
if (!continuesInSession)
|
||||
;
|
||||
else if (ncontinues > 10)
|
||||
{
|
||||
if (!(continuetime & 1) || continuetime > 17)
|
||||
V_DrawContinueIcon(x, 68, 0, players[consoleplayer].skin, players[consoleplayer].skincolor);
|
||||
V_DrawScaledPatch(x+12, 66, 0, stlivex);
|
||||
V_DrawRightAlignedString(x+38, 64, 0,
|
||||
va("%d",(imcontinuing ? ncontinues-1 : ncontinues)));
|
||||
}
|
||||
else
|
||||
{
|
||||
x += (ncontinues/2) * 30;
|
||||
if (!(ncontinues & 1))
|
||||
x -= 15;
|
||||
for (i = 0; i < ncontinues; ++i)
|
||||
{
|
||||
if (i == (ncontinues/2) && ((continuetime & 1) || continuetime > 17))
|
||||
continue;
|
||||
V_DrawContinueIcon(x - (i*30), 68, 0, players[consoleplayer].skin, players[consoleplayer].skincolor);
|
||||
}
|
||||
x = BASEVIDWIDTH>>1;
|
||||
}
|
||||
|
||||
// Spotlight
|
||||
V_DrawScaledPatch(x, 140, 0, W_CachePatchName("CONTSPOT", PU_PATCH));
|
||||
|
||||
// warping laser
|
||||
if (continuetime)
|
||||
{
|
||||
INT32 w = min(continuetime, 28), brightness = (continuetime>>1) & 7;
|
||||
if (brightness > 3)
|
||||
brightness = 8-brightness;
|
||||
V_DrawFadeFill(x-w, 0, w<<1, 140, 0, 0, (3+brightness));
|
||||
}
|
||||
|
||||
if (contskins[1])
|
||||
{
|
||||
if (continuetime > 15)
|
||||
{
|
||||
angle_t work = FixedAngle((10*(continuetime-15))<<FRACBITS)>>ANGLETOFINESHIFT;
|
||||
offsy = FINESINE(work)<<1;
|
||||
offsx = (27*FINECOSINE(work))>>1;
|
||||
}
|
||||
else
|
||||
offsx = 27<<(FRACBITS-1);
|
||||
lift[1] = continuetime-10;
|
||||
if (lift[1] < 0)
|
||||
lift[1] = 0;
|
||||
else if (lift[1] > TICRATE+5)
|
||||
lift[1] = TICRATE+5;
|
||||
}
|
||||
|
||||
lift[0] = continuetime-5;
|
||||
if (lift[0] < 0)
|
||||
lift[0] = 0;
|
||||
else if (lift[0] > TICRATE+5)
|
||||
lift[0] = TICRATE+5;
|
||||
|
||||
#define drawchar(dx, dy, n) {\
|
||||
sprdef = &contskins[n]->sprites[cont_spr2[n][0]];\
|
||||
sprframe = &sprdef->spriteframes[cont_spr2[n][1]];\
|
||||
patch = W_CachePatchNum(sprframe->lumppat[cont_spr2[n][2]], PU_PATCH);\
|
||||
V_DrawFixedPatch((dx), (dy), contskins[n]->highresscale, (sprframe->flip & (1<<cont_spr2[n][2])) ? V_FLIP : 0, patch, contcolormaps[n]);\
|
||||
}
|
||||
|
||||
if (offsy < 0)
|
||||
drawchar((BASEVIDWIDTH<<(FRACBITS-1))-offsx, ((140-lift[0])<<FRACBITS)-offsy, 0);
|
||||
if (contskins[1])
|
||||
drawchar((BASEVIDWIDTH<<(FRACBITS-1))+offsx, ((140-lift[1])<<FRACBITS)+offsy, 1);
|
||||
if (offsy >= 0)
|
||||
drawchar((BASEVIDWIDTH<<(FRACBITS-1))-offsx, ((140-lift[0])<<FRACBITS)-offsy, 0);
|
||||
|
||||
#undef drawchar
|
||||
|
||||
if (timetonext > (11*TICRATE))
|
||||
V_DrawFadeScreen(31, timetonext-(11*TICRATE));
|
||||
if (continuetime > ((3*TICRATE) - 10))
|
||||
V_DrawFadeScreen(0, (continuetime - ((3*TICRATE) - 10)));
|
||||
}
|
||||
|
||||
void F_ContinueTicker(void)
|
||||
{
|
||||
if (!imcontinuing)
|
||||
{
|
||||
if (timetonext > 0)
|
||||
{
|
||||
if (!(--timetonext))
|
||||
{
|
||||
Command_ExitGame_f();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (++continuetime == 3*TICRATE)
|
||||
{
|
||||
G_Continue();
|
||||
return;
|
||||
}
|
||||
|
||||
if (continuetime > 5 && ((continuetime & 1) || continuetime > TICRATE) && (++cont_spr2[0][2]) >= 8)
|
||||
cont_spr2[0][2] = 0;
|
||||
|
||||
if (continuetime > 10 && (!(continuetime & 1) || continuetime > TICRATE+5) && (++cont_spr2[1][2]) >= 8)
|
||||
cont_spr2[1][2] = 0;
|
||||
|
||||
if (continuetime == (3*TICRATE)-10)
|
||||
S_StartSound(NULL, sfx_cdfm56); // or 31
|
||||
else if (continuetime == 5)
|
||||
{
|
||||
cont_spr2[0][0] = P_GetSkinSprite2(contskins[0], SPR2_CNT2, NULL);
|
||||
cont_spr2[0][4] = contskins[0]->sprites[cont_spr2[0][0]].numframes;
|
||||
cont_spr2[0][1] = cont_spr2[0][3] = 0;
|
||||
cont_spr2[0][5] = 2;
|
||||
}
|
||||
else if (continuetime == TICRATE)
|
||||
{
|
||||
cont_spr2[0][0] = P_GetSkinSprite2(contskins[0], SPR2_CNT3, NULL);
|
||||
cont_spr2[0][4] = contskins[0]->sprites[cont_spr2[0][0]].numframes;
|
||||
cont_spr2[0][1] = cont_spr2[0][3] = 0;
|
||||
}
|
||||
else if (contskins[1])
|
||||
{
|
||||
if (continuetime == 10)
|
||||
{
|
||||
cont_spr2[1][0] = P_GetSkinSprite2(contskins[1], SPR2_CNT2, NULL);
|
||||
cont_spr2[1][4] = contskins[1]->sprites[cont_spr2[1][0]].numframes;
|
||||
cont_spr2[1][1] = cont_spr2[1][3] = 0;
|
||||
cont_spr2[1][5] = 2;
|
||||
}
|
||||
else if (continuetime == TICRATE+5)
|
||||
{
|
||||
cont_spr2[1][0] = P_GetSkinSprite2(contskins[1], SPR2_CNT3, NULL);
|
||||
cont_spr2[1][4] = contskins[1]->sprites[cont_spr2[1][0]].numframes;
|
||||
cont_spr2[1][1] = cont_spr2[1][3] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((++cont_spr2[0][3]) >= cont_spr2[0][5])
|
||||
{
|
||||
cont_spr2[0][3] = 0;
|
||||
if (++cont_spr2[0][1] >= cont_spr2[0][4])
|
||||
cont_spr2[0][1] = 0;
|
||||
}
|
||||
|
||||
if (contskins[1] && (++cont_spr2[1][3]) >= cont_spr2[1][5])
|
||||
{
|
||||
cont_spr2[1][3] = 0;
|
||||
if (++cont_spr2[1][1] >= cont_spr2[1][4])
|
||||
cont_spr2[1][1] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
boolean F_ContinueResponder(event_t *event)
|
||||
{
|
||||
INT32 key = event->data1;
|
||||
|
||||
if (keypressed)
|
||||
return true;
|
||||
|
||||
if (timetonext >= 21*TICRATE/2)
|
||||
return false;
|
||||
if (event->type != ev_keydown)
|
||||
return false;
|
||||
|
||||
// remap virtual keys (mouse & joystick buttons)
|
||||
switch (key)
|
||||
{
|
||||
case KEY_ENTER:
|
||||
case KEY_SPACE:
|
||||
case KEY_MOUSE1:
|
||||
case KEY_JOY1:
|
||||
case KEY_JOY1 + 2:
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
keypressed = true;
|
||||
imcontinuing = true;
|
||||
S_StartSound(NULL, sfx_kc6b);
|
||||
I_FadeSong(0, MUSICRATE, &S_StopMusic);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// ==================
|
||||
// CUSTOM CUTSCENES
|
||||
// ==================
|
||||
|
|
|
|||
36
src/g_demo.c
36
src/g_demo.c
|
|
@ -268,8 +268,8 @@ void G_ReadDemoExtraData(void)
|
|||
// Color
|
||||
M_Memcpy(name, demo_p, 16);
|
||||
demo_p += 16;
|
||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
||||
if (!stricmp(KartColor_Names[i], name)) // SRB2kart
|
||||
for (i = 0; i < numskincolors; i++)
|
||||
if (!stricmp(skincolors[i].name, name)) // SRB2kart
|
||||
{
|
||||
players[p].skincolor = i;
|
||||
if (players[p].mo)
|
||||
|
|
@ -293,14 +293,12 @@ void G_ReadDemoExtraData(void)
|
|||
// Follower's color
|
||||
M_Memcpy(name, demo_p, 16);
|
||||
demo_p += 16;
|
||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
||||
if (!stricmp(KartColor_Names[i], name)) // SRB2kart
|
||||
for (i = 0; i < numskincolors; i++)
|
||||
if (!stricmp(skincolors[i].name, name)) // SRB2kart
|
||||
{
|
||||
players[p].followercolor = i;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
if (extradata & DXD_PLAYSTATE)
|
||||
{
|
||||
|
|
@ -342,10 +340,8 @@ void G_ReadDemoExtraData(void)
|
|||
G_ResetViews();
|
||||
|
||||
// maybe these are necessary?
|
||||
if (G_BattleGametype())
|
||||
K_CheckBumpers(); // SRB2Kart
|
||||
else if (G_RaceGametype())
|
||||
P_CheckRacers(); // also SRB2Kart
|
||||
K_CheckBumpers();
|
||||
P_CheckRacers();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -410,7 +406,7 @@ void G_WriteDemoExtraData(void)
|
|||
{
|
||||
// Color
|
||||
memset(name, 0, 16);
|
||||
strncpy(name, KartColor_Names[players[i].skincolor], 16);
|
||||
strncpy(name, skincolors[players[i].skincolor].name, 16);
|
||||
M_Memcpy(demo_p,name,16);
|
||||
demo_p += 16;
|
||||
}
|
||||
|
|
@ -2004,7 +2000,7 @@ void G_BeginRecording(void)
|
|||
|
||||
// Color
|
||||
memset(name, 0, 16);
|
||||
strncpy(name, KartColor_Names[player->skincolor], 16);
|
||||
strncpy(name, skincolors[player->skincolor].name, 16);
|
||||
M_Memcpy(demo_p,name,16);
|
||||
demo_p += 16;
|
||||
|
||||
|
|
@ -2031,7 +2027,7 @@ void G_BeginRecording(void)
|
|||
WRITEUINT32(demo_p, player->score);
|
||||
|
||||
// Power Levels
|
||||
WRITEUINT16(demo_p, clientpowerlevels[p][G_BattleGametype() ? PWRLV_BATTLE : PWRLV_RACE]);
|
||||
WRITEUINT16(demo_p, clientpowerlevels[p][gametype == GT_BATTLE ? PWRLV_BATTLE : PWRLV_RACE]);
|
||||
|
||||
// Kart speed and weight
|
||||
WRITEUINT8(demo_p, skins[player->skin].kartspeed);
|
||||
|
|
@ -2132,7 +2128,7 @@ void G_WriteStanding(UINT8 ranking, char *name, INT32 skinnum, UINT8 color, UINT
|
|||
|
||||
// Color
|
||||
memset(temp, 0, 16);
|
||||
strncpy(temp, KartColor_Names[color], 16);
|
||||
strncpy(temp, skincolors[color].name, 16);
|
||||
M_Memcpy(demo_p,temp,16);
|
||||
demo_p += 16;
|
||||
|
||||
|
|
@ -2595,8 +2591,8 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
|
|||
// Color
|
||||
M_Memcpy(temp,extrainfo_p,16);
|
||||
extrainfo_p += 16;
|
||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
||||
if (!stricmp(KartColor_Names[i],temp)) // SRB2kart
|
||||
for (i = 0; i < numskincolors; i++)
|
||||
if (!stricmp(skincolors[i].name,temp)) // SRB2kart
|
||||
{
|
||||
pdemo->standings[count].color = i;
|
||||
break;
|
||||
|
|
@ -2958,8 +2954,8 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
// Color
|
||||
M_Memcpy(color,demo_p,16);
|
||||
demo_p += 16;
|
||||
for (i = 0; i < MAXSKINCOLORS; i++)
|
||||
if (!stricmp(KartColor_Names[i],color)) // SRB2kart
|
||||
for (i = 0; i < numskincolors; i++)
|
||||
if (!stricmp(skincolors[i].name,color)) // SRB2kart
|
||||
{
|
||||
players[p].skincolor = i;
|
||||
break;
|
||||
|
|
@ -2973,7 +2969,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
// Follower colour
|
||||
M_Memcpy(color, demo_p, 16);
|
||||
demo_p += 16;
|
||||
for (i = 0; i < MAXSKINCOLORS +2; i++) // +2 because of Match and Opposite
|
||||
for (i = 0; i < numskincolors +2; i++) // +2 because of Match and Opposite
|
||||
{
|
||||
if (!stricmp(Followercolor_cons_t[i].strvalue, color))
|
||||
{
|
||||
|
|
@ -2986,7 +2982,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
players[p].score = READUINT32(demo_p);
|
||||
|
||||
// Power Levels
|
||||
clientpowerlevels[p][G_BattleGametype() ? PWRLV_BATTLE : PWRLV_RACE] = READUINT16(demo_p);
|
||||
clientpowerlevels[p][gametype == GT_BATTLE ? PWRLV_BATTLE : PWRLV_RACE] = READUINT16(demo_p);
|
||||
|
||||
// Kart stats, temporarily
|
||||
kartspeed[p] = READUINT8(demo_p);
|
||||
|
|
|
|||
288
src/g_game.c
288
src/g_game.c
|
|
@ -315,8 +315,6 @@ tic_t curlap; // Current lap time
|
|||
tic_t bestlap; // Best lap time
|
||||
static INT16 randmapbuffer[NUMMAPS+1]; // Buffer for maps RandMap is allowed to roll
|
||||
|
||||
tic_t hidetime;
|
||||
|
||||
// Grading
|
||||
UINT32 timesBeaten;
|
||||
UINT32 timesBeatenWithEmeralds;
|
||||
|
|
@ -1204,7 +1202,7 @@ ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n)
|
|||
//
|
||||
void G_DoLoadLevel(boolean resetplayer)
|
||||
{
|
||||
INT32 i;
|
||||
INT32 i, j;
|
||||
|
||||
// Make sure objectplace is OFF when you first start the level!
|
||||
OP_ResetObjectplace();
|
||||
|
|
@ -1277,13 +1275,10 @@ void G_DoLoadLevel(boolean resetplayer)
|
|||
memset(gamekeydown, 0, sizeof (gamekeydown));
|
||||
for (i = 0;i < JOYAXISSET; i++)
|
||||
{
|
||||
joyxmove[i] = joyymove[i] = 0;
|
||||
joy2xmove[i] = joy2ymove[i] = 0;
|
||||
joy3xmove[i] = joy3ymove[i] = 0;
|
||||
joy4xmove[i] = joy4ymove[i] = 0;
|
||||
for (j = 0; j < MAXSPLITSCREENPLAYERS; j++)
|
||||
joyxmove[j][i] = joyymove[j][i] = 0;
|
||||
}
|
||||
mousex = mousey = 0;
|
||||
mouse2x = mouse2y = 0;
|
||||
|
||||
// clear hud messages remains (usually from game startup)
|
||||
CON_ClearHUD();
|
||||
|
|
@ -1637,36 +1632,18 @@ boolean G_CouldView(INT32 playernum)
|
|||
return false;
|
||||
|
||||
// I don't know if we want this actually, but I'll humor the suggestion anyway
|
||||
if (G_BattleGametype() && !demo.playback)
|
||||
if ((gametyperules & GTR_BUMPERS) && !demo.playback)
|
||||
{
|
||||
if (player->kartstuff[k_bumper] <= 0)
|
||||
return false;
|
||||
}
|
||||
|
||||
// SRB2Kart: we have no team-based modes, YET...
|
||||
/*if (G_GametypeHasTeams())
|
||||
if (G_GametypeHasTeams())
|
||||
{
|
||||
if (players[consoleplayer].ctfteam
|
||||
&& player->ctfteam != players[consoleplayer].ctfteam)
|
||||
if (players[consoleplayer].ctfteam && player->ctfteam != players[consoleplayer].ctfteam)
|
||||
return false;
|
||||
}
|
||||
else if (gametype == GT_HIDEANDSEEK)
|
||||
{
|
||||
if (players[consoleplayer].pflags & PF_TAGIT)
|
||||
return false;
|
||||
}
|
||||
// Other Tag-based gametypes?
|
||||
else if (G_TagGametype())
|
||||
{
|
||||
if (!players[consoleplayer].spectator
|
||||
&& (players[consoleplayer].pflags & PF_TAGIT) != (player->pflags & PF_TAGIT))
|
||||
return false;
|
||||
}
|
||||
else if (G_GametypeHasSpectators() && G_BattleGametype())
|
||||
{
|
||||
if (!players[consoleplayer].spectator)
|
||||
return false;
|
||||
}*/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -2234,8 +2211,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
|
|||
itemtype = 0;
|
||||
itemamount = 0;
|
||||
growshrinktimer = 0;
|
||||
bumper = (G_BattleGametype() ? K_StartingBumperCount() : 0);
|
||||
rings = (G_BattleGametype() ? 0 : 5);
|
||||
bumper = ((gametyperules & GTR_BUMPERS) ? K_StartingBumperCount() : 0);
|
||||
rings = ((gametyperules & GTR_RINGS) ? 5 : 0);
|
||||
comebackpoints = 0;
|
||||
wanted = 0;
|
||||
}
|
||||
|
|
@ -2342,17 +2319,19 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
|
|||
{
|
||||
if (p->ctfteam == 1 && p->skincolor != skincolor_redteam)
|
||||
{
|
||||
if (p == &players[consoleplayer])
|
||||
CV_SetValue(&cv_playercolor, skincolor_redteam);
|
||||
else if (p == &players[secondarydisplayplayer])
|
||||
CV_SetValue(&cv_playercolor2, skincolor_redteam);
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (p == &players[g_localplayers[i]])
|
||||
CV_SetValue(&cv_playercolor[i], skincolor_redteam);
|
||||
}
|
||||
}
|
||||
else if (p->ctfteam == 2 && p->skincolor != skincolor_blueteam)
|
||||
{
|
||||
if (p == &players[consoleplayer])
|
||||
CV_SetValue(&cv_playercolor, skincolor_blueteam);
|
||||
else if (p == &players[secondarydisplayplayer])
|
||||
CV_SetValue(&cv_playercolor2, skincolor_blueteam);
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (p == &players[g_localplayers[i]])
|
||||
CV_SetValue(&cv_playercolor[i], skincolor_blueteam);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2384,9 +2363,6 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
|
|||
|
||||
if (leveltime > (starttime + (TICRATE/2)) && !p->spectator)
|
||||
p->kartstuff[k_respawn] = 48; // Respawn effect
|
||||
|
||||
if (gametype == GT_COOP)
|
||||
P_FindEmerald(); // scan for emeralds to hunt for
|
||||
}
|
||||
|
||||
//
|
||||
|
|
@ -2454,14 +2430,14 @@ void G_MovePlayerToSpawnOrStarpost(INT32 playernum)
|
|||
P_MovePlayerToSpawn(playernum, G_FindMapStart(playernum));
|
||||
}
|
||||
|
||||
mapthing_t *G_FindCTFStart(INT32 playernum)
|
||||
mapthing_t *G_FindTeamStart(INT32 playernum)
|
||||
{
|
||||
const boolean doprints = P_IsLocalPlayer(&players[playernum]);
|
||||
INT32 i,j;
|
||||
|
||||
if (!numredctfstarts && !numbluectfstarts) //why even bother, eh?
|
||||
{
|
||||
if ((gametyperules & GTR_TEAMFLAGS) && doprints))
|
||||
if ((gametyperules & GTR_TEAMSTARTS) && doprints))
|
||||
CONS_Alert(CONS_WARNING, M_GetText("No CTF starts in this map!\n"));
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -2509,7 +2485,7 @@ mapthing_t *G_FindCTFStart(INT32 playernum)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
mapthing_t *G_FindMatchStart(INT32 playernum)
|
||||
mapthing_t *G_FindBattleStart(INT32 playernum)
|
||||
{
|
||||
const boolean doprints = P_IsLocalPlayer(&players[playernum]);
|
||||
INT32 i, j;
|
||||
|
|
@ -2627,22 +2603,31 @@ mapthing_t *G_FindRaceStart(INT32 playernum)
|
|||
}
|
||||
|
||||
// Find a Co-op start, or fallback into other types of starts.
|
||||
static inline mapthing_t *G_FindCoopStartOrFallback(INT32 playernum)
|
||||
static inline mapthing_t *G_FindRaceStartOrFallback(INT32 playernum)
|
||||
{
|
||||
mapthing_t *spawnpoint = NULL;
|
||||
if (!(spawnpoint = G_FindCoopStart(playernum)) // find a Co-op start
|
||||
&& !(spawnpoint = G_FindMatchStart(playernum))) // find a DM start
|
||||
spawnpoint = G_FindCTFStart(playernum); // fallback
|
||||
if (!(spawnpoint = G_FindRaceStart(playernum)) // find a Race start
|
||||
&& !(spawnpoint = G_FindBattleStart(playernum))) // find a DM start
|
||||
spawnpoint = G_FindTeamStart(playernum); // fallback
|
||||
return spawnpoint;
|
||||
}
|
||||
|
||||
// Find a Match start, or fallback into other types of starts.
|
||||
static inline mapthing_t *G_FindMatchStartOrFallback(INT32 playernum)
|
||||
static inline mapthing_t *G_FindBattleStartOrFallback(INT32 playernum)
|
||||
{
|
||||
mapthing_t *spawnpoint = NULL;
|
||||
if (!(spawnpoint = G_FindMatchStart(playernum)) // find a DM start
|
||||
&& !(spawnpoint = G_FindCTFStart(playernum))) // find a CTF start
|
||||
spawnpoint = G_FindCoopStart(playernum); // fallback
|
||||
if (!(spawnpoint = G_FindBattleStart(playernum)) // find a DM start
|
||||
&& !(spawnpoint = G_FindTeamStart(playernum))) // find a CTF start
|
||||
spawnpoint = G_FindRaceStart(playernum); // fallback
|
||||
return spawnpoint;
|
||||
}
|
||||
|
||||
static inline mapthing_t *G_FindTeamStartOrFallback(INT32 playernum)
|
||||
{
|
||||
mapthing_t *spawnpoint = NULL;
|
||||
if (!(spawnpoint = G_FindTeamStart(playernum)) // find a CTF start
|
||||
&& !(spawnpoint = G_FindBattleStart(playernum))) // find a DM start
|
||||
spawnpoint = G_FindRaceStart(playernum); // fallback
|
||||
return spawnpoint;
|
||||
}
|
||||
|
||||
|
|
@ -2654,49 +2639,45 @@ mapthing_t *G_FindMapStart(INT32 playernum)
|
|||
return NULL;
|
||||
|
||||
// -- Spectators --
|
||||
// Order in platform gametypes: Coop->DM->CTF
|
||||
// And, with deathmatch starts: DM->CTF->Coop
|
||||
// Order in platform gametypes: Race->DM->CTF
|
||||
// And, with deathmatch starts: DM->CTF->Race
|
||||
if (players[playernum].spectator)
|
||||
{
|
||||
// In platform gametypes, spawn in Co-op starts first
|
||||
// Overriden by GTR_DEATHMATCHSTARTS.
|
||||
if (G_PlatformGametype() && !(gametyperules & GTR_DEATHMATCHSTARTS))
|
||||
spawnpoint = G_FindCoopStartOrFallback(playernum);
|
||||
else
|
||||
// Overriden by GTR_BATTLESTARTS.
|
||||
if (gametyperules & GTR_BATTLESTARTS)
|
||||
spawnpoint = G_FindMatchStartOrFallback(playernum);
|
||||
else
|
||||
spawnpoint = G_FindRaceStartOrFallback(playernum);
|
||||
}
|
||||
|
||||
// -- CTF --
|
||||
// Order: CTF->DM->Coop
|
||||
else if ((gametyperules & (GTR_TEAMFLAGS|GTR_TEAMS)) && players[playernum].ctfteam)
|
||||
{
|
||||
if (!(spawnpoint = G_FindCTFStart(playernum)) // find a CTF start
|
||||
&& !(spawnpoint = G_FindMatchStart(playernum))) // find a DM start
|
||||
spawnpoint = G_FindCoopStart(playernum); // fallback
|
||||
}
|
||||
// Order: CTF->DM->Race
|
||||
else if ((gametyperules & GTR_TEAMSTARTS) && players[playernum].ctfteam)
|
||||
spawnpoint = G_FindTeamStartOrFallback(playernum);
|
||||
|
||||
// -- DM/Tag/CTF-spectator/etc --
|
||||
// Order: DM->CTF->Coop
|
||||
else if (G_TagGametype() ? (!(players[playernum].pflags & PF_TAGIT)) : (gametyperules & GTR_DEATHMATCHSTARTS))
|
||||
spawnpoint = G_FindMatchStartOrFallback(playernum);
|
||||
// Order: DM->CTF->Race
|
||||
else if (gametyperules & GTR_BATTLESTARTS)
|
||||
spawnpoint = G_FindBattleStartOrFallback(playernum);
|
||||
|
||||
// -- Other game modes --
|
||||
// Order: Coop->DM->CTF
|
||||
// Order: Race->DM->CTF
|
||||
else
|
||||
spawnpoint = G_FindCoopStartOrFallback(playernum);
|
||||
spawnpoint = G_FindRaceStartOrFallback(playernum);
|
||||
|
||||
//No spawns found. ANYWHERE.
|
||||
if (!spawnpoint)
|
||||
{
|
||||
if (nummapthings)
|
||||
{
|
||||
if (playernum == consoleplayer || (splitscreen && playernum == secondarydisplayplayer))
|
||||
if (P_IsLocalPlayer(&players[playernum]))
|
||||
CONS_Alert(CONS_ERROR, M_GetText("No player spawns found, spawning at the first mapthing!\n"));
|
||||
spawnpoint = &mapthings[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (playernum == consoleplayer || (splitscreen && playernum == secondarydisplayplayer))
|
||||
if (P_IsLocalPlayer(&players[playernum]))
|
||||
CONS_Alert(CONS_ERROR, M_GetText("No player spawns found, spawning at the origin!\n"));
|
||||
}
|
||||
}
|
||||
|
|
@ -2806,33 +2787,6 @@ void G_AddPlayer(INT32 playernum)
|
|||
P_DoPlayerExit(p);
|
||||
}
|
||||
|
||||
boolean G_EnoughPlayersFinished(void)
|
||||
{
|
||||
UINT8 numneeded = (G_IsSpecialStage(gamemap) ? 4 : cv_playersforexit.value);
|
||||
INT32 total = 0;
|
||||
INT32 exiting = 0;
|
||||
INT32 i;
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (!playeringame[i] || players[i].spectator || players[i].bot)
|
||||
continue;
|
||||
if (players[i].quittime > 30 * TICRATE)
|
||||
continue;
|
||||
if (players[i].lives <= 0)
|
||||
continue;
|
||||
|
||||
total++;
|
||||
if ((players[i].pflags & PF_FINISHED) || players[i].exiting)
|
||||
exiting++;
|
||||
}
|
||||
|
||||
if (exiting)
|
||||
return exiting * 4 / total >= numneeded;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
void G_ExitLevel(void)
|
||||
{
|
||||
if (gamestate == GS_LEVEL)
|
||||
|
|
@ -2848,8 +2802,7 @@ void G_ExitLevel(void)
|
|||
CV_SetValue(&cv_teamscramble, cv_scrambleonchange.value);
|
||||
}
|
||||
|
||||
if (!(gametyperules & (GTR_FRIENDLY|GTR_CAMPAIGN)))
|
||||
CONS_Printf(M_GetText("The round has ended.\n"));
|
||||
CON_LogMessage(M_GetText("The round has ended.\n"));
|
||||
|
||||
// Remove CEcho text on round end.
|
||||
HU_ClearCEcho();
|
||||
|
|
@ -2884,9 +2837,9 @@ const char *Gametype_ConstantNames[NUMGAMETYPES] =
|
|||
UINT32 gametypedefaultrules[NUMGAMETYPES] =
|
||||
{
|
||||
// Race
|
||||
GTR_RACE|GTR_SPAWNENEMIES|GTR_SPAWNINVUL|GTR_ALLOWEXIT,
|
||||
GTR_CIRCUIT|GTR_RINGS|GTR_BOTS,
|
||||
// Battle
|
||||
GTR_RINGSLINGER|GTR_FIRSTPERSON|GTR_SPECTATORS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_OVERTIME|GTR_POWERSTONES|GTR_DEATHMATCHSTARTS|GTR_SPAWNINVUL|GTR_RESPAWNDELAY|GTR_PITYSHIELD|GTR_DEATHPENALTY
|
||||
GTR_BUMPERS|GTR_KARMA|GTR_ITEMARROWS|GTR_BATTLESTARTS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_OVERTIME
|
||||
};
|
||||
|
||||
//
|
||||
|
|
@ -3037,15 +2990,17 @@ UINT32 gametypetol[NUMGAMETYPES] =
|
|||
{
|
||||
TOL_RACE, // Race
|
||||
TOL_BATTLE, // Battle
|
||||
TOL_TV, // Midnight Channel effect
|
||||
};
|
||||
|
||||
tolinfo_t TYPEOFLEVEL[NUMTOLNAMES] = {
|
||||
{"RACE",TOL_RACE},
|
||||
{"BATTLE",TOL_BATTLE},
|
||||
{"TV",TOL_TV},
|
||||
{NULL, 0}
|
||||
};
|
||||
|
||||
UINT32 lastcustomtol = (TOL_XMAS<<1);
|
||||
UINT32 lastcustomtol = (TOL_TV<<1);
|
||||
|
||||
//
|
||||
// G_AddTOL
|
||||
|
|
@ -3099,7 +3054,7 @@ boolean G_IsSpecialStage(INT32 mapnum)
|
|||
#if 1
|
||||
(void)mapnum;
|
||||
#else
|
||||
if (gametype != GT_COOP || modeattacking == ATTACKING_RECORD)
|
||||
if (modeattacking == ATTACKING_RECORD)
|
||||
return false;
|
||||
if (mapnum >= sstage_start && mapnum <= sstage_end)
|
||||
return true;
|
||||
|
|
@ -3118,41 +3073,15 @@ boolean G_IsSpecialStage(INT32 mapnum)
|
|||
//
|
||||
boolean G_GametypeUsesLives(void)
|
||||
{
|
||||
// SRB2kart NEEDS no lives
|
||||
#if 0
|
||||
// Coop, Competitive
|
||||
if ((gametyperules & GTR_LIVES)
|
||||
&& !(modeattacking || metalrecording) // No lives in Time Attack
|
||||
&& !G_IsSpecialStage(gamemap)
|
||||
&& !(maptol & TOL_NIGHTS)) // No lives in NiGHTS
|
||||
&& !battlecapsules // No lives in bonus game
|
||||
&& !G_IsSpecialStage(gamemap)) // No lives in special stage
|
||||
return true;
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// G_GametypeUsesCoopLives
|
||||
//
|
||||
// Returns true if the current gametype uses
|
||||
// the cooplives CVAR. False otherwise.
|
||||
//
|
||||
boolean G_GametypeUsesCoopLives(void)
|
||||
{
|
||||
return (gametyperules & (GTR_LIVES|GTR_FRIENDLY)) == (GTR_LIVES|GTR_FRIENDLY);
|
||||
}
|
||||
|
||||
//
|
||||
// G_GametypeUsesCoopStarposts
|
||||
//
|
||||
// Returns true if the current gametype uses
|
||||
// the coopstarposts CVAR. False otherwise.
|
||||
//
|
||||
boolean G_GametypeUsesCoopStarposts(void)
|
||||
{
|
||||
return (gametyperules & GTR_FRIENDLY);
|
||||
}
|
||||
|
||||
//
|
||||
// G_GametypeHasTeams
|
||||
//
|
||||
|
|
@ -3161,7 +3090,19 @@ boolean G_GametypeUsesCoopStarposts(void)
|
|||
//
|
||||
boolean G_GametypeHasTeams(void)
|
||||
{
|
||||
return (gametyperules & GTR_TEAMS);
|
||||
if (gametyperules & GTR_TEAMS)
|
||||
{
|
||||
// Teams forced on by this gametype
|
||||
return true;
|
||||
}
|
||||
else if (gametyperules & GTR_NOTEAMS)
|
||||
{
|
||||
// Teams forced off by this gametype
|
||||
return false;
|
||||
}
|
||||
|
||||
// Teams are determined by the "teamplay" modifier!
|
||||
return false; // teamplay
|
||||
}
|
||||
|
||||
//
|
||||
|
|
@ -3172,12 +3113,7 @@ boolean G_GametypeHasTeams(void)
|
|||
//
|
||||
boolean G_GametypeHasSpectators(void)
|
||||
{
|
||||
// SRB2Kart: We don't have any exceptions to not being able to spectate yet. Maybe when SP & bots roll around.
|
||||
#if 0
|
||||
return (gametyperules & GTR_SPECTATORS);
|
||||
#else
|
||||
return (netgame || (multiplayer && demo.playback)); //true
|
||||
#endif
|
||||
return (netgame || (multiplayer && demo.playback));
|
||||
}
|
||||
|
||||
//
|
||||
|
|
@ -3187,7 +3123,7 @@ boolean G_GametypeHasSpectators(void)
|
|||
//
|
||||
INT16 G_SometimesGetDifferentGametype(void)
|
||||
{
|
||||
boolean encorepossible = ((M_SecretUnlocked(SECRET_ENCORE) || encorescramble == 1) && G_RaceGametype());
|
||||
boolean encorepossible = ((M_SecretUnlocked(SECRET_ENCORE) || encorescramble == 1) && (gametyperules & GTR_CIRCUIT));
|
||||
|
||||
if (!cv_kartvoterulechanges.value // never
|
||||
&& encorescramble != 1) // destroying the code for this one instance
|
||||
|
|
@ -3240,9 +3176,9 @@ INT16 G_SometimesGetDifferentGametype(void)
|
|||
break;
|
||||
}
|
||||
|
||||
if (gametype == GT_MATCH)
|
||||
if (gametype == GT_BATTLE)
|
||||
return GT_RACE;
|
||||
return GT_MATCH;
|
||||
return GT_BATTLE;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
@ -3256,64 +3192,16 @@ UINT8 G_GetGametypeColor(INT16 gt)
|
|||
if (modeattacking // == ATTACKING_RECORD
|
||||
|| gamestate == GS_TIMEATTACK)
|
||||
return orangemap[0];
|
||||
|
||||
if (gt == GT_MATCH)
|
||||
return redmap[0];
|
||||
|
||||
if (gt == GT_RACE)
|
||||
return skymap[0];
|
||||
|
||||
return 255; // FALLBACK
|
||||
}
|
||||
|
||||
//
|
||||
// G_RaceGametype
|
||||
//
|
||||
// Returns true in Race gamemodes, previously was G_PlatformGametype.
|
||||
//
|
||||
boolean G_RaceGametype(void)
|
||||
{
|
||||
return (gametype == GT_RACE);
|
||||
}
|
||||
|
||||
//
|
||||
// G_BattleGametype
|
||||
//
|
||||
// Returns true in Battle gamemodes, previously was G_RingslingerGametype.
|
||||
//
|
||||
boolean G_BattleGametype(void)
|
||||
{
|
||||
return (gametype == GT_BATTLE);
|
||||
}
|
||||
|
||||
//
|
||||
// G_CoopGametype
|
||||
//
|
||||
// Returns true if a gametype is a Co-op gametype.
|
||||
//
|
||||
boolean G_CoopGametype(void)
|
||||
{
|
||||
return ((gametyperules & (GTR_FRIENDLY|GTR_CAMPAIGN)) == (GTR_FRIENDLY|GTR_CAMPAIGN));
|
||||
}
|
||||
|
||||
//
|
||||
// G_TagGametype
|
||||
//
|
||||
// For Jazz's Tag/HnS modes that have a lot of special cases...
|
||||
// SRB2Kart: do we actually want to add Kart tag later? :V
|
||||
//
|
||||
boolean G_TagGametype(void)
|
||||
{
|
||||
return (gametyperules & GTR_TAG);
|
||||
}
|
||||
|
||||
//
|
||||
// G_CompetitionGametype
|
||||
//
|
||||
// For gametypes that are race gametypes, and have lives.
|
||||
//
|
||||
boolean G_CompetitionGametype(void)
|
||||
{
|
||||
return ((gametyperules & GTR_RACE) && (gametyperules & GTR_LIVES));
|
||||
}
|
||||
|
||||
/** Get the typeoflevel flag needed to indicate support of a gametype.
|
||||
* In single-player, this always returns TOL_SP.
|
||||
* \param gametype The gametype for which support is desired.
|
||||
|
|
@ -3500,7 +3388,7 @@ static void G_UpdateVisited(void)
|
|||
boolean spec = G_IsSpecialStage(gamemap);
|
||||
// Update visitation flags?
|
||||
if ((!modifiedgame || savemoddata) // Not modified
|
||||
&& !multiplayer && !demo.playback && (gametype == GT_COOP) // SP/RA/NiGHTS mode
|
||||
&& !multiplayer && !demo.playback // SP/RA/NiGHTS mode
|
||||
&& !(spec && stagefailed)) // Not failed the special stage
|
||||
{
|
||||
UINT8 earnedEmblems;
|
||||
|
|
@ -3614,7 +3502,7 @@ static void G_DoCompleted(void)
|
|||
}
|
||||
|
||||
// play some generic music if there's no win/cool/lose music going on (for exitlevel commands)
|
||||
if (G_RaceGametype() && ((multiplayer && demo.playback) || j == r_splitscreen+1) && (cv_inttime.value > 0))
|
||||
if ((gametyperules & GTR_CIRCUIT) && ((multiplayer && demo.playback) || j == r_splitscreen+1) && (cv_inttime.value > 0))
|
||||
S_ChangeMusicInternal("racent", true);
|
||||
|
||||
if (automapactive)
|
||||
|
|
@ -3740,9 +3628,9 @@ static void G_DoCompleted(void)
|
|||
// Set up power level gametype scrambles
|
||||
if (netgame && cv_kartusepwrlv.value)
|
||||
{
|
||||
if (G_RaceGametype())
|
||||
if ((gametyperules & GTR_CIRCUIT))
|
||||
powertype = PWRLV_RACE;
|
||||
else if (G_BattleGametype())
|
||||
else if ((gametyperules & GTR_BUMPERS))
|
||||
powertype = PWRLV_BATTLE;
|
||||
}
|
||||
|
||||
|
|
@ -4571,7 +4459,7 @@ void G_DeferedInitNew(boolean pencoremode, const char *mapname, INT32 pickedchar
|
|||
|
||||
if (color != SKINCOLOR_NONE)
|
||||
{
|
||||
CV_StealthSetValue(&cv_playercolor, color);
|
||||
CV_StealthSetValue(&cv_playercolor[0], color);
|
||||
}
|
||||
|
||||
if (mapname)
|
||||
|
|
|
|||
|
|
@ -191,16 +191,10 @@ void G_SetGametypeDescription(INT16 gtype, char *descriptiontext, UINT8 leftcolo
|
|||
INT32 G_GetGametypeByName(const char *gametypestr);
|
||||
boolean G_IsSpecialStage(INT32 mapnum);
|
||||
boolean G_GametypeUsesLives(void);
|
||||
boolean G_GametypeUsesCoopLives(void);
|
||||
boolean G_GametypeUsesCoopStarposts(void);
|
||||
boolean G_GametypeHasTeams(void);
|
||||
boolean G_GametypeHasSpectators(void);
|
||||
boolean G_BattleGametype(void);
|
||||
INT16 G_SometimesGetDifferentGametype(void);
|
||||
UINT8 G_GetGametypeColor(INT16 gt);
|
||||
boolean G_RaceGametype(void);
|
||||
boolean G_TagGametype(void);
|
||||
boolean G_CompetitionGametype(void);
|
||||
boolean G_EnoughPlayersFinished(void);
|
||||
void G_ExitLevel(void);
|
||||
void G_NextLevel(void);
|
||||
|
|
|
|||
|
|
@ -34,11 +34,8 @@ consvar_t cv_controlperkey = {"controlperkey", "One", CV_SAVE, onecontrolperkey_
|
|||
INT32 mousex, mousey;
|
||||
INT32 mlooky; // like mousey but with a custom sensitivity for mlook
|
||||
|
||||
INT32 mouse2x, mouse2y, mlook2y;
|
||||
|
||||
// joystick values are repeated
|
||||
INT32 joyxmove[JOYAXISSET], joyymove[JOYAXISSET], joy2xmove[JOYAXISSET], joy2ymove[JOYAXISSET],
|
||||
joy3xmove[JOYAXISSET], joy3ymove[JOYAXISSET], joy4xmove[JOYAXISSET], joy4ymove[JOYAXISSET];
|
||||
INT32 joyxmove[MAXSPLITSCREENPLAYERS][JOYAXISSET], joyymove[MAXSPLITSCREENPLAYERS][JOYAXISSET];
|
||||
|
||||
// current state of the keys: true if pushed
|
||||
UINT8 gamekeydown[NUMINPUTS];
|
||||
|
|
@ -79,11 +76,7 @@ typedef struct
|
|||
UINT8 clicks;
|
||||
} dclick_t;
|
||||
static dclick_t mousedclicks[MOUSEBUTTONS];
|
||||
static dclick_t joydclicks[JOYBUTTONS + JOYHATS*4];
|
||||
static dclick_t mouse2dclicks[MOUSEBUTTONS];
|
||||
static dclick_t joy2dclicks[JOYBUTTONS + JOYHATS*4];
|
||||
static dclick_t joy3dclicks[JOYBUTTONS + JOYHATS*4];
|
||||
static dclick_t joy4dclicks[JOYBUTTONS + JOYHATS*4];
|
||||
static dclick_t joydclicks[MAXSPLITSCREENPLAYERS][JOYBUTTONS + JOYHATS*4];
|
||||
|
||||
// protos
|
||||
static UINT8 G_CheckDoubleClick(UINT8 state, dclick_t *dt);
|
||||
|
|
@ -137,40 +130,32 @@ void G_MapEventsToControls(event_t *ev)
|
|||
i = ev->data1;
|
||||
if (i >= JOYAXISSET || menuactive || CON_Ready() || chat_on)
|
||||
break;
|
||||
if (ev->data2 != INT32_MAX) joyxmove[i] = ev->data2;
|
||||
if (ev->data3 != INT32_MAX) joyymove[i] = ev->data3;
|
||||
if (ev->data2 != INT32_MAX) joyxmove[0][i] = ev->data2;
|
||||
if (ev->data3 != INT32_MAX) joyymove[0][i] = ev->data3;
|
||||
break;
|
||||
|
||||
case ev_joystick2: // buttons are virtual keys
|
||||
i = ev->data1;
|
||||
if (i >= JOYAXISSET || menuactive)
|
||||
break;
|
||||
if (ev->data2 != INT32_MAX) joy2xmove[i] = ev->data2;
|
||||
if (ev->data3 != INT32_MAX) joy2ymove[i] = ev->data3;
|
||||
if (ev->data2 != INT32_MAX) joyxmove[1][i] = ev->data2;
|
||||
if (ev->data3 != INT32_MAX) joyymove[1][i] = ev->data3;
|
||||
break;
|
||||
|
||||
case ev_joystick3:
|
||||
i = ev->data1;
|
||||
if (i >= JOYAXISSET)
|
||||
break;
|
||||
if (ev->data2 != INT32_MAX) joy3xmove[i] = ev->data2;
|
||||
if (ev->data3 != INT32_MAX) joy3ymove[i] = ev->data3;
|
||||
if (ev->data2 != INT32_MAX) joyxmove[2][i] = ev->data2;
|
||||
if (ev->data3 != INT32_MAX) joyymove[2][i] = ev->data3;
|
||||
break;
|
||||
|
||||
case ev_joystick4:
|
||||
i = ev->data1;
|
||||
if (i >= JOYAXISSET)
|
||||
break;
|
||||
if (ev->data2 != INT32_MAX) joy4xmove[i] = ev->data2;
|
||||
if (ev->data3 != INT32_MAX) joy4ymove[i] = ev->data3;
|
||||
break;
|
||||
|
||||
case ev_mouse2: // buttons are virtual keys
|
||||
if (menuactive || CON_Ready() || chat_on)
|
||||
break;
|
||||
mouse2x = (INT32)(ev->data2*((cv_mousesens2.value*cv_mousesens2.value)/110.0f + 0.1f));
|
||||
mouse2y = (INT32)(ev->data3*((cv_mousesens2.value*cv_mousesens2.value)/110.0f + 0.1f));
|
||||
mlook2y = (INT32)(ev->data3*((cv_mouseysens2.value*cv_mousesens2.value)/110.0f + 0.1f));
|
||||
if (ev->data2 != INT32_MAX) joyxmove[3][i] = ev->data2;
|
||||
if (ev->data3 != INT32_MAX) joyymove[3][i] = ev->data3;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
@ -186,31 +171,25 @@ void G_MapEventsToControls(event_t *ev)
|
|||
|
||||
for (i = 0; i < JOYBUTTONS + JOYHATS*4; i++)
|
||||
{
|
||||
flag = G_CheckDoubleClick(gamekeydown[KEY_JOY1+i], &joydclicks[i]);
|
||||
flag = G_CheckDoubleClick(gamekeydown[KEY_JOY1+i], &joydclicks[0][i]);
|
||||
gamekeydown[KEY_DBLJOY1+i] = flag;
|
||||
}
|
||||
|
||||
for (i = 0; i < MOUSEBUTTONS; i++)
|
||||
{
|
||||
flag = G_CheckDoubleClick(gamekeydown[KEY_2MOUSE1+i], &mouse2dclicks[i]);
|
||||
gamekeydown[KEY_DBL2MOUSE1+i] = flag;
|
||||
}
|
||||
|
||||
for (i = 0; i < JOYBUTTONS + JOYHATS*4; i++)
|
||||
{
|
||||
flag = G_CheckDoubleClick(gamekeydown[KEY_2JOY1+i], &joy2dclicks[i]);
|
||||
flag = G_CheckDoubleClick(gamekeydown[KEY_2JOY1+i], &joydclicks[1][i]);
|
||||
gamekeydown[KEY_DBL2JOY1+i] = flag;
|
||||
}
|
||||
|
||||
for (i = 0; i < JOYBUTTONS + JOYHATS*4; i++)
|
||||
{
|
||||
flag = G_CheckDoubleClick(gamekeydown[KEY_3JOY1+i], &joy3dclicks[i]);
|
||||
flag = G_CheckDoubleClick(gamekeydown[KEY_3JOY1+i], &joydclicks[2][i]);
|
||||
gamekeydown[KEY_DBL3JOY1+i] = flag;
|
||||
}
|
||||
|
||||
for (i = 0; i < JOYBUTTONS + JOYHATS*4; i++)
|
||||
{
|
||||
flag = G_CheckDoubleClick(gamekeydown[KEY_4JOY1+i], &joy4dclicks[i]);
|
||||
flag = G_CheckDoubleClick(gamekeydown[KEY_4JOY1+i], &joydclicks[3][i]);
|
||||
gamekeydown[KEY_DBL4JOY1+i] = flag;
|
||||
}
|
||||
}
|
||||
|
|
@ -333,14 +312,6 @@ static keyname_t keynames[] =
|
|||
{KEY_MOUSE1+5,"MOUSE6"},
|
||||
{KEY_MOUSE1+6,"MOUSE7"},
|
||||
{KEY_MOUSE1+7,"MOUSE8"},
|
||||
{KEY_2MOUSE1+0,"SEC_MOUSE2"}, // BP: sorry my mouse handler swap button 1 and 2
|
||||
{KEY_2MOUSE1+1,"SEC_MOUSE1"},
|
||||
{KEY_2MOUSE1+2,"SEC_MOUSE3"},
|
||||
{KEY_2MOUSE1+3,"SEC_MOUSE4"},
|
||||
{KEY_2MOUSE1+4,"SEC_MOUSE5"},
|
||||
{KEY_2MOUSE1+5,"SEC_MOUSE6"},
|
||||
{KEY_2MOUSE1+6,"SEC_MOUSE7"},
|
||||
{KEY_2MOUSE1+7,"SEC_MOUSE8"},
|
||||
{KEY_MOUSEWHEELUP, "Wheel 1 UP"},
|
||||
{KEY_MOUSEWHEELDOWN, "Wheel 1 Down"},
|
||||
{KEY_2MOUSEWHEELUP, "Wheel 2 UP"},
|
||||
|
|
@ -407,14 +378,6 @@ static keyname_t keynames[] =
|
|||
{KEY_DBLMOUSE1+5, "DBLMOUSE6"},
|
||||
{KEY_DBLMOUSE1+6, "DBLMOUSE7"},
|
||||
{KEY_DBLMOUSE1+7, "DBLMOUSE8"},
|
||||
{KEY_DBL2MOUSE1+0, "DBLSEC_MOUSE2"}, // BP: sorry my mouse handler swap button 1 and 2
|
||||
{KEY_DBL2MOUSE1+1, "DBLSEC_MOUSE1"},
|
||||
{KEY_DBL2MOUSE1+2, "DBLSEC_MOUSE3"},
|
||||
{KEY_DBL2MOUSE1+3, "DBLSEC_MOUSE4"},
|
||||
{KEY_DBL2MOUSE1+4, "DBLSEC_MOUSE5"},
|
||||
{KEY_DBL2MOUSE1+5, "DBLSEC_MOUSE6"},
|
||||
{KEY_DBL2MOUSE1+6, "DBLSEC_MOUSE7"},
|
||||
{KEY_DBL2MOUSE1+7, "DBLSEC_MOUSE8"},
|
||||
|
||||
{KEY_DBLJOY1+0, "DBLJOY1"},
|
||||
{KEY_DBLJOY1+1, "DBLJOY2"},
|
||||
|
|
|
|||
|
|
@ -115,10 +115,8 @@ extern consvar_t cv_controlperkey;
|
|||
|
||||
extern INT32 mousex, mousey;
|
||||
extern INT32 mlooky; //mousey with mlookSensitivity
|
||||
extern INT32 mouse2x, mouse2y, mlook2y;
|
||||
|
||||
extern INT32 joyxmove[JOYAXISSET], joyymove[JOYAXISSET], joy2xmove[JOYAXISSET], joy2ymove[JOYAXISSET],
|
||||
joy3xmove[JOYAXISSET], joy3ymove[JOYAXISSET], joy4xmove[JOYAXISSET], joy4ymove[JOYAXISSET];
|
||||
extern INT32 joyxmove[MAXSPLITSCREENPLAYERS][JOYAXISSET], joyymove[MAXSPLITSCREENPLAYERS][JOYAXISSET];
|
||||
|
||||
// current state of the keys: true if pushed
|
||||
extern UINT8 gamekeydown[NUMINPUTS];
|
||||
|
|
|
|||
|
|
@ -1471,5 +1471,4 @@ void HWR_CreateStaticLightmaps(int bspnum)
|
|||
- finalement virer le hack splitscreen, il n'est plus necessaire !
|
||||
*/
|
||||
#endif
|
||||
>>>>>>> srb2/next
|
||||
#endif // HWRENDER
|
||||
|
|
|
|||
|
|
@ -91,5 +91,4 @@ typedef enum
|
|||
|
||||
extern light_t lspr[NUMLIGHTS];
|
||||
extern light_t *t_lspr[NUMSPRITES];
|
||||
>>>>>>> srb2/next
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -38,8 +38,6 @@
|
|||
#include "../r_draw.h"
|
||||
#include "../p_tick.h"
|
||||
|
||||
#include "../k_color.h" // colortranslations
|
||||
|
||||
#include "hw_model.h"
|
||||
|
||||
#include "hw_main.h"
|
||||
|
|
|
|||
|
|
@ -2415,18 +2415,12 @@ static void HU_DrawRankings(void)
|
|||
|
||||
if (G_GametypeHasTeams())
|
||||
{
|
||||
if (gametype == GT_CTF)
|
||||
p = bflagico;
|
||||
else
|
||||
p = bmatcico;
|
||||
p = bmatcico;
|
||||
|
||||
V_DrawSmallScaledPatch(128 - SHORT(p->width)/4, 4, 0, p);
|
||||
V_DrawCenteredString(128, 16, 0, va("%u", bluescore));
|
||||
|
||||
if (gametype == GT_CTF)
|
||||
p = rflagico;
|
||||
else
|
||||
p = rmatcico;
|
||||
p = rmatcico;
|
||||
|
||||
V_DrawSmallScaledPatch(192 - SHORT(p->width)/4, 4, 0, p);
|
||||
V_DrawCenteredString(192, 16, 0, va("%u", redscore));
|
||||
|
|
@ -2515,7 +2509,7 @@ static void HU_DrawRankings(void)
|
|||
|
||||
tab[scorelines].name = player_names[i];
|
||||
|
||||
if (G_RaceGametype())
|
||||
if ((gametyperules & GTR_CIRCUIT))
|
||||
{
|
||||
if (circuitmap)
|
||||
tab[scorelines].count = players[i].laps;
|
||||
|
|
|
|||
|
|
@ -220,14 +220,10 @@ const char *I_GetJoyName(INT32 joyindex);
|
|||
void I_UpdateMumble(const mobj_t *mobj, const listener_t listener);
|
||||
#endif
|
||||
|
||||
/** \brief Startup the first mouse
|
||||
/** \brief Startup the mouse
|
||||
*/
|
||||
void I_StartupMouse(void);
|
||||
|
||||
/** \brief Startup the second mouse
|
||||
*/
|
||||
void I_StartupMouse2(void);
|
||||
|
||||
/** \brief setup timer irq and user timer routine.
|
||||
*/
|
||||
void I_StartupTimer(void);
|
||||
|
|
|
|||
|
|
@ -42,8 +42,10 @@ INT32 K_StartingBumperCount(void)
|
|||
boolean K_IsPlayerWanted(player_t *player)
|
||||
{
|
||||
UINT8 i;
|
||||
if (!(G_BattleGametype()))
|
||||
|
||||
if (!(gametyperules & GTR_WANTED))
|
||||
return false;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if (battlewanted[i] == -1)
|
||||
|
|
@ -63,7 +65,7 @@ void K_CalculateBattleWanted(void)
|
|||
boolean setbumper = false;
|
||||
UINT8 i, j;
|
||||
|
||||
if (!G_BattleGametype())
|
||||
if (!(gametyperules & GTR_WANTED))
|
||||
{
|
||||
for (i = 0; i < 4; i++)
|
||||
battlewanted[i] = -1;
|
||||
|
|
@ -211,7 +213,7 @@ void K_CheckBumpers(void)
|
|||
INT32 winnerscoreadd = 0;
|
||||
boolean nobumpers = false;
|
||||
|
||||
if (!G_BattleGametype())
|
||||
if (!(gametyperules & GTR_BUMPERS))
|
||||
return;
|
||||
|
||||
if (gameaction == ga_completed)
|
||||
|
|
@ -560,7 +562,7 @@ void K_SpawnBattleCapsules(void)
|
|||
if (battlecapsules)
|
||||
return;
|
||||
|
||||
if (!G_BattleGametype())
|
||||
if (!(gametyperules & GTR_CAPSULES))
|
||||
return;
|
||||
|
||||
if (modeattacking != ATTACKING_CAPSULES)
|
||||
|
|
|
|||
|
|
@ -651,11 +651,9 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
// Complete override of all ticcmd functionality
|
||||
if (LUAh_BotTiccmd(player, cmd))
|
||||
return;
|
||||
#endif
|
||||
|
||||
// Start boost handler
|
||||
if (leveltime <= starttime)
|
||||
|
|
|
|||
|
|
@ -219,7 +219,7 @@ boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2)
|
|||
if (!P_CanPickupItem(t2->player, 2))
|
||||
return true;
|
||||
|
||||
if (G_BattleGametype() && t2->player->kartstuff[k_bumper] <= 0)
|
||||
if ((gametyperules & GTR_BUMPERS) && t2->player->kartstuff[k_bumper] <= 0)
|
||||
{
|
||||
if (t2->player->kartstuff[k_comebackmode] || t2->player->kartstuff[k_comebacktimer])
|
||||
return true;
|
||||
|
|
@ -253,7 +253,7 @@ boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2)
|
|||
|
||||
if (t1->target && t1->target->player)
|
||||
{
|
||||
if (G_RaceGametype() || t1->target->player->kartstuff[k_bumper] > 0)
|
||||
if ((gametyperules & GTR_CIRCUIT) || t1->target->player->kartstuff[k_bumper] > 0)
|
||||
t2->player->kartstuff[k_eggmanblame] = t1->target->player-players;
|
||||
else
|
||||
t2->player->kartstuff[k_eggmanblame] = t2->player-players;
|
||||
|
|
|
|||
|
|
@ -32,6 +32,17 @@ UINT8 K_ColorRelativeLuminance(UINT8 r, UINT8 g, UINT8 b)
|
|||
return min(brightness, UINT8_MAX);
|
||||
}
|
||||
|
||||
/*--------------------------------------------------
|
||||
UINT16 K_RainbowColor(tic_t time)
|
||||
|
||||
See header file for description.
|
||||
--------------------------------------------------*/
|
||||
|
||||
UINT16 K_RainbowColor(tic_t time)
|
||||
{
|
||||
return (UINT16)(SKINCOLOR_PINK + (time % (numskincolors - SKINCOLOR_PINK)));
|
||||
}
|
||||
|
||||
/*--------------------------------------------------
|
||||
void K_RainbowColormap(UINT8 *dest_colormap, UINT8 skincolor)
|
||||
|
||||
|
|
@ -51,7 +62,7 @@ void K_RainbowColormap(UINT8 *dest_colormap, UINT8 skincolor)
|
|||
// first generate the brightness of all the colours of that skincolour
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
color = V_GetColor(colortranslations[skincolor][i]);
|
||||
color = V_GetColor(skincolors[skincolor].ramp[i]);
|
||||
colorbrightnesses[i] = K_ColorRelativeLuminance(color.s.red, color.s.green, color.s.blue);
|
||||
}
|
||||
|
||||
|
|
@ -75,7 +86,7 @@ void K_RainbowColormap(UINT8 *dest_colormap, UINT8 skincolor)
|
|||
if (temp < brightdif)
|
||||
{
|
||||
brightdif = (UINT16)temp;
|
||||
dest_colormap[i] = colortranslations[skincolor][j];
|
||||
dest_colormap[i] = skincolors[skincolor].ramp[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -106,7 +117,7 @@ void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color)
|
|||
if (skinnum == TC_ALLWHITE)
|
||||
dest_colormap[i] = 0;
|
||||
else if (skinnum == TC_BLINK)
|
||||
dest_colormap[i] = colortranslations[color][3];
|
||||
dest_colormap[i] = skincolors[color].ramp[3];
|
||||
else
|
||||
dest_colormap[i] = (UINT8)i;
|
||||
}
|
||||
|
|
@ -138,25 +149,8 @@ void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color)
|
|||
for (i = 0; i < SKIN_RAMP_LENGTH; i++)
|
||||
{
|
||||
// Sryder 2017-10-26: What was here before was most definitely not particularly readable, check above for new color translation table
|
||||
dest_colormap[starttranscolor + i] = colortranslations[color][i];
|
||||
dest_colormap[starttranscolor + i] = skincolors[color].ramp[i];
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Pulls kart color by name, to replace R_GetColorByName in r_draw.c
|
||||
|
||||
\param name color name
|
||||
|
||||
\return 0
|
||||
*/
|
||||
UINT8 K_GetKartColorByName(const char *name)
|
||||
{
|
||||
UINT8 color = (UINT8)atoi(name);
|
||||
if (color > 0 && color < MAXSKINCOLORS)
|
||||
return color;
|
||||
for (color = 1; color < MAXSKINCOLORS; color++)
|
||||
if (!stricmp(KartColor_Names[color], name))
|
||||
return color;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//}
|
||||
|
|
|
|||
|
|
@ -19,10 +19,6 @@
|
|||
#define DEFAULT_STARTTRANSCOLOR 96
|
||||
#define NUM_PALETTE_ENTRIES 256
|
||||
|
||||
extern UINT8 colortranslations[MAXTRANSLATIONS][16];
|
||||
extern const char *KartColor_Names[MAXSKINCOLORS];
|
||||
extern const UINT8 KartColor_Opposite[MAXSKINCOLORS*2];
|
||||
|
||||
/*--------------------------------------------------
|
||||
UINT8 K_ColorRelativeLuminance(UINT8 r, UINT8 g, UINT8 b);
|
||||
|
||||
|
|
|
|||
310
src/k_kart.c
310
src/k_kart.c
|
|
@ -365,7 +365,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp
|
|||
if (!KartItemCVars[item-1]->value && !modeattacking)
|
||||
return 0;
|
||||
|
||||
if (G_BattleGametype())
|
||||
if (gametype == GT_BATTLE)
|
||||
{
|
||||
I_Assert(pos < 6); // DO NOT allow positions past the bounds of the table
|
||||
newodds = K_KartItemOddsBattle[item-1][pos];
|
||||
|
|
@ -386,7 +386,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp
|
|||
if (!playeringame[i] || players[i].spectator)
|
||||
continue;
|
||||
|
||||
if (!G_BattleGametype() || players[i].kartstuff[k_bumper])
|
||||
if (!(gametyperules & GTR_BUMPERS) || players[i].kartstuff[k_bumper])
|
||||
pingame++;
|
||||
|
||||
if (players[i].exiting)
|
||||
|
|
@ -398,7 +398,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (players[i].mo && G_RaceGametype())
|
||||
if (players[i].mo && gametype == GT_RACE)
|
||||
{
|
||||
if (players[i].kartstuff[k_position] == 1 && first == -1)
|
||||
first = i;
|
||||
|
|
@ -559,7 +559,7 @@ static UINT8 K_FindUseodds(player_t *player, fixed_t mashed, UINT32 pdis, UINT8
|
|||
UINT8 j;
|
||||
boolean available = false;
|
||||
|
||||
if (G_BattleGametype() && i > 5)
|
||||
if (gametype == GT_BATTLE && i > 5)
|
||||
{
|
||||
oddsvalid[i] = false;
|
||||
break;
|
||||
|
|
@ -583,7 +583,7 @@ static UINT8 K_FindUseodds(player_t *player, fixed_t mashed, UINT32 pdis, UINT8
|
|||
disttable[distlen++] = odds; \
|
||||
totallen += num;
|
||||
|
||||
if (G_BattleGametype()) // Battle Mode
|
||||
if (gametype == GT_BATTLE) // Battle Mode
|
||||
{
|
||||
SETUPDISTTABLE(0,1);
|
||||
SETUPDISTTABLE(1,1);
|
||||
|
|
@ -772,7 +772,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
|||
// Record Attack / alone mashing behavior
|
||||
if (modeattacking || pingame == 1)
|
||||
{
|
||||
if (G_RaceGametype())
|
||||
if (gametype == GT_RACE)
|
||||
{
|
||||
if (mashed && (modeattacking || cv_superring.value)) // ANY mashed value? You get rings.
|
||||
{
|
||||
|
|
@ -792,7 +792,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
|||
S_StartSound(NULL, sfx_itrolf);
|
||||
}
|
||||
}
|
||||
else if (G_BattleGametype())
|
||||
else if (gametype == GT_BATTLE)
|
||||
{
|
||||
if (mashed && (modeattacking || cv_banana.value)) // ANY mashed value? You get a banana.
|
||||
{
|
||||
|
|
@ -819,43 +819,40 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
|||
return;
|
||||
}
|
||||
|
||||
if (G_RaceGametype())
|
||||
// SPECIAL CASE No. 4:
|
||||
// Being in ring debt occasionally forces Super Ring on you if you mashed
|
||||
if ((gametyperules & GTR_RINGS) && mashed && player->kartstuff[k_rings] < 0 && cv_superring.value)
|
||||
{
|
||||
// SPECIAL CASE No. 4:
|
||||
// Being in ring debt occasionally forces Super Ring on you if you mashed
|
||||
if (mashed && player->kartstuff[k_rings] < 0 && cv_superring.value)
|
||||
INT32 debtamount = min(20, abs(player->kartstuff[k_rings]));
|
||||
if (P_RandomChance((debtamount*FRACUNIT)/20))
|
||||
{
|
||||
INT32 debtamount = min(20, abs(player->kartstuff[k_rings]));
|
||||
if (P_RandomChance((debtamount*FRACUNIT)/20))
|
||||
{
|
||||
K_KartGetItemResult(player, KITEM_SUPERRING);
|
||||
player->karthud[khud_itemblink] = TICRATE;
|
||||
player->karthud[khud_itemblinkmode] = 1;
|
||||
player->kartstuff[k_itemroulette] = 0;
|
||||
player->kartstuff[k_roulettetype] = 0;
|
||||
if (P_IsDisplayPlayer(player))
|
||||
S_StartSound(NULL, sfx_itrolm);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// SPECIAL CASE No. 5:
|
||||
// Force SPB onto 2nd if they get too far behind
|
||||
if (player->kartstuff[k_position] == 2 && pdis > (DISTVAR*8)
|
||||
&& spbplace == -1 && !indirectitemcooldown && !dontforcespb
|
||||
&& cv_selfpropelledbomb.value)
|
||||
{
|
||||
K_KartGetItemResult(player, KITEM_SPB);
|
||||
K_KartGetItemResult(player, KITEM_SUPERRING);
|
||||
player->karthud[khud_itemblink] = TICRATE;
|
||||
player->karthud[khud_itemblinkmode] = (mashed ? 1 : 0);
|
||||
player->karthud[khud_itemblinkmode] = 1;
|
||||
player->kartstuff[k_itemroulette] = 0;
|
||||
player->kartstuff[k_roulettetype] = 0;
|
||||
if (P_IsDisplayPlayer(player))
|
||||
S_StartSound(NULL, (mashed ? sfx_itrolm : sfx_itrolf));
|
||||
S_StartSound(NULL, sfx_itrolm);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// SPECIAL CASE No. 5:
|
||||
// Force SPB onto 2nd if they get too far behind
|
||||
if ((gametyperules & GTR_CIRCUIT) && player->kartstuff[k_position] == 2 && pdis > (DISTVAR*8)
|
||||
&& spbplace == -1 && !indirectitemcooldown && !dontforcespb
|
||||
&& cv_selfpropelledbomb.value)
|
||||
{
|
||||
K_KartGetItemResult(player, KITEM_SPB);
|
||||
player->karthud[khud_itemblink] = TICRATE;
|
||||
player->karthud[khud_itemblinkmode] = (mashed ? 1 : 0);
|
||||
player->kartstuff[k_itemroulette] = 0;
|
||||
player->kartstuff[k_roulettetype] = 0;
|
||||
if (P_IsDisplayPlayer(player))
|
||||
S_StartSound(NULL, (mashed ? sfx_itrolm : sfx_itrolf));
|
||||
return;
|
||||
}
|
||||
|
||||
// NOW that we're done with all of those specialized cases, we can move onto the REAL item roulette tables.
|
||||
// Initializes existing spawnchance values
|
||||
for (i = 0; i < NUMKARTRESULTS; i++)
|
||||
|
|
@ -971,7 +968,7 @@ static void K_DebtStingPlayer(player_t *player, INT32 length)
|
|||
|
||||
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_spinouttimer] > 0
|
||||
|| player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0
|
||||
|| (G_BattleGametype() && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
||||
|| ((gametyperules & GTR_BUMPERS) && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
||||
return;
|
||||
|
||||
player->kartstuff[k_ringboost] = 0;
|
||||
|
|
@ -1602,17 +1599,38 @@ void K_DoIngameRespawn(player_t *player)
|
|||
UINT32 bestdist = UINT32_MAX;
|
||||
mapthing_t *beststart = NULL;
|
||||
UINT8 numstarts = 0;
|
||||
UINT8 starttype = 0;
|
||||
|
||||
if (G_RaceGametype())
|
||||
if (gametyperules & GTR_TEAMSTARTS)
|
||||
{
|
||||
numstarts = numcoopstarts;
|
||||
if (player->ctfteam == 1)
|
||||
{
|
||||
starttype = 3;
|
||||
numstarts = numredctfstarts;
|
||||
}
|
||||
else if (player->ctfteam == 2)
|
||||
{
|
||||
starttype = 4;
|
||||
numstarts = numbluectfstarts;
|
||||
}
|
||||
else
|
||||
{
|
||||
starttype = 2;
|
||||
numstarts = numdmstarts;
|
||||
}
|
||||
}
|
||||
else if (G_BattleGametype())
|
||||
else if (gametyperules & GTR_BATTLESTARTS)
|
||||
{
|
||||
starttype = 2;
|
||||
numstarts = numdmstarts;
|
||||
}
|
||||
else
|
||||
{
|
||||
starttype = 1;
|
||||
numstarts = numcoopstarts;
|
||||
}
|
||||
|
||||
if (numstarts > 0)
|
||||
if (starttype > 0 && numstarts > 0)
|
||||
{
|
||||
UINT8 i = 0;
|
||||
|
||||
|
|
@ -1621,19 +1639,24 @@ void K_DoIngameRespawn(player_t *player)
|
|||
UINT32 dist = UINT32_MAX;
|
||||
mapthing_t *checkstart = NULL;
|
||||
|
||||
if (G_RaceGametype())
|
||||
switch (starttype)
|
||||
{
|
||||
checkstart = playerstarts[i];
|
||||
}
|
||||
else if (G_BattleGametype())
|
||||
{
|
||||
checkstart = deathmatchstarts[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
case 4:
|
||||
checkstart = bluectfstarts[i];
|
||||
break;
|
||||
case 3:
|
||||
checkstart = redctfstarts[i];
|
||||
break;
|
||||
case 2:
|
||||
checkstart = deathmatchstarts[i];
|
||||
break;
|
||||
case 1:
|
||||
checkstart = playerstarts[i];
|
||||
break;
|
||||
}
|
||||
|
||||
I_Assert(checkstart != NULL);
|
||||
|
||||
dist = (UINT32)P_AproxDistance((player->mo->x >> FRACBITS) - checkstart->x,
|
||||
(player->mo->y >> FRACBITS) - checkstart->y);
|
||||
|
||||
|
|
@ -1902,7 +1925,7 @@ void K_RespawnChecker(player_t *player)
|
|||
//P_PlayRinglossSound(player->mo);
|
||||
P_PlayerRingBurst(player, 3);
|
||||
|
||||
if (G_BattleGametype())
|
||||
if (gametyperules & GTR_BUMPERS)
|
||||
{
|
||||
if (player->kartstuff[k_bumper] > 0)
|
||||
{
|
||||
|
|
@ -2175,7 +2198,7 @@ void K_PlayOvertakeSound(mobj_t *source)
|
|||
{
|
||||
boolean tasteful = (!source->player || !source->player->karthud[khud_voices]);
|
||||
|
||||
if (!G_RaceGametype()) // Only in race
|
||||
if (!gametype == GT_RACE) // Only in race
|
||||
return;
|
||||
|
||||
// 4 seconds from before race begins, 10 seconds afterwards
|
||||
|
|
@ -2338,7 +2361,7 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower)
|
|||
fixed_t finalspeed;
|
||||
UINT8 kartspeed = player->kartspeed;
|
||||
|
||||
if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0)
|
||||
if ((gametyperules & (GTR_BUMPERS|GTR_KARMA)) == (GTR_BUMPERS|GTR_KARMA) && player->kartstuff[k_bumper] <= 0)
|
||||
kartspeed = 1;
|
||||
|
||||
finalspeed = K_GetKartSpeedFromStat(kartspeed);
|
||||
|
|
@ -2371,7 +2394,7 @@ fixed_t K_GetKartAccel(player_t *player)
|
|||
fixed_t k_accel = 32; // 36;
|
||||
UINT8 kartspeed = player->kartspeed;
|
||||
|
||||
if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0)
|
||||
if ((gametyperules & (GTR_BUMPERS|GTR_KARMA)) == (GTR_BUMPERS|GTR_KARMA) && player->kartstuff[k_bumper] <= 0)
|
||||
kartspeed = 1;
|
||||
|
||||
//k_accel += 3 * (9 - kartspeed); // 36 - 60
|
||||
|
|
@ -2392,7 +2415,7 @@ UINT16 K_GetKartFlashing(player_t *player)
|
|||
if (!player)
|
||||
return tics;
|
||||
|
||||
if (G_BattleGametype())
|
||||
if (gametyperules & GTR_BUMPERS)
|
||||
tics *= 2;
|
||||
|
||||
tics += (flashingtics/8) * (player->kartspeed);
|
||||
|
|
@ -2475,7 +2498,6 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
|
|||
{
|
||||
UINT8 scoremultiply = 1;
|
||||
// PS: Inflictor is unused for all purposes here and is actually only ever relevant to Lua. It may be nil too.
|
||||
#ifdef HAVE_BLUA
|
||||
boolean force = false; // Used to check if Lua ShouldSpin should get us damaged reguardless of flashtics or heck knows what.
|
||||
UINT8 shouldForce = LUAh_ShouldSpin(player, inflictor, source);
|
||||
if (P_MobjWasRemoved(player->mo))
|
||||
|
|
@ -2484,16 +2506,12 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
|
|||
force = true;
|
||||
else if (shouldForce == 2)
|
||||
return;
|
||||
#else
|
||||
static const boolean force = false;
|
||||
(void)inflictor; // in case some weirdo doesn't want Lua.
|
||||
#endif
|
||||
|
||||
if (!trapitem && G_BattleGametype())
|
||||
if ((gametyperules & GTR_POINTLIMIT) && !trapitem)
|
||||
{
|
||||
if (K_IsPlayerWanted(player))
|
||||
scoremultiply = 3;
|
||||
else if (player->kartstuff[k_bumper] == 1)
|
||||
else if ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] == 1)
|
||||
scoremultiply = 2;
|
||||
}
|
||||
|
||||
|
|
@ -2502,7 +2520,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
|
|||
|
||||
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinouttype] != 2)
|
||||
|| player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0
|
||||
|| (G_BattleGametype() && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
||||
|| ((gametyperules & GTR_BUMPERS) && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
||||
{
|
||||
if (!force) // if shoulddamage force, we go THROUGH that.
|
||||
{
|
||||
|
|
@ -2511,10 +2529,8 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUAh_PlayerSpin(player, inflictor, source)) // Let Lua do its thing or overwrite if it wants to. Make sure to let any possible instashield happen because we didn't get "damaged" in this case.
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (source && source != player->mo && source->player)
|
||||
K_PlayHitEmSound(source);
|
||||
|
|
@ -2528,7 +2544,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
|
|||
player->kartstuff[k_driftcharge] = 0;
|
||||
player->kartstuff[k_pogospring] = 0;
|
||||
|
||||
if (G_BattleGametype())
|
||||
if (gametyperules & GTR_BUMPERS)
|
||||
{
|
||||
if (source && source->player && player != source->player)
|
||||
{
|
||||
|
|
@ -2625,7 +2641,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor)
|
|||
{
|
||||
UINT8 scoremultiply = 1;
|
||||
// PS: Inflictor is unused for all purposes here and is actually only ever relevant to Lua. It may be nil too.
|
||||
#ifdef HAVE_BLUA
|
||||
|
||||
boolean force = false; // Used to check if Lua ShouldSquish should get us damaged reguardless of flashtics or heck knows what.
|
||||
UINT8 shouldForce = LUAh_ShouldSquish(player, inflictor, source);
|
||||
if (P_MobjWasRemoved(player->mo))
|
||||
|
|
@ -2634,16 +2650,12 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor)
|
|||
force = true;
|
||||
else if (shouldForce == 2)
|
||||
return;
|
||||
#else
|
||||
static const boolean force = false;
|
||||
(void)inflictor; // Please stop forgetting to put inflictor in yer functions thank -Lat'
|
||||
#endif
|
||||
|
||||
if (G_BattleGametype())
|
||||
if (gametyperules & GTR_POINTLIMIT)
|
||||
{
|
||||
if (K_IsPlayerWanted(player))
|
||||
scoremultiply = 3;
|
||||
else if (player->kartstuff[k_bumper] == 1)
|
||||
else if ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] == 1)
|
||||
scoremultiply = 2;
|
||||
}
|
||||
|
||||
|
|
@ -2652,7 +2664,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor)
|
|||
|
||||
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_invincibilitytimer] > 0
|
||||
|| player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0
|
||||
|| (G_BattleGametype() && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
||||
|| ((gametyperules & GTR_BUMPERS) && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
||||
{
|
||||
if (!force) // You know the drill by now.
|
||||
{
|
||||
|
|
@ -2661,10 +2673,8 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUAh_PlayerSquish(player, inflictor, source)) // Let Lua do its thing or overwrite if it wants to. Make sure to let any possible instashield happen because we didn't get "damaged" in this case.
|
||||
return;
|
||||
#endif
|
||||
|
||||
player->kartstuff[k_sneakertimer] = 0;
|
||||
player->kartstuff[k_levelbooster] = 0;
|
||||
|
|
@ -2675,7 +2685,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor)
|
|||
player->kartstuff[k_driftcharge] = 0;
|
||||
player->kartstuff[k_pogospring] = 0;
|
||||
|
||||
if (G_BattleGametype())
|
||||
if (gametyperules & GTR_BUMPERS)
|
||||
{
|
||||
if (source && source->player && player != source->player)
|
||||
{
|
||||
|
|
@ -2746,7 +2756,6 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor)
|
|||
void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A bit of a hack, we just throw the player up higher here and extend their spinout timer
|
||||
{
|
||||
UINT8 scoremultiply = 1;
|
||||
#ifdef HAVE_BLUA
|
||||
boolean force = false; // Used to check if Lua ShouldExplode should get us damaged reguardless of flashtics or heck knows what.
|
||||
UINT8 shouldForce = LUAh_ShouldExplode(player, inflictor, source);
|
||||
|
||||
|
|
@ -2757,11 +2766,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
|
|||
else if (shouldForce == 2)
|
||||
return;
|
||||
|
||||
#else
|
||||
static const boolean force = false;
|
||||
#endif
|
||||
|
||||
if (G_BattleGametype())
|
||||
if (gametyperules & GTR_BUMPERS)
|
||||
{
|
||||
if (K_IsPlayerWanted(player))
|
||||
scoremultiply = 3;
|
||||
|
|
@ -2773,7 +2778,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
|
|||
return;
|
||||
|
||||
if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0 // Do not check spinout, because SPB and Eggman should combo
|
||||
|| (G_BattleGametype() && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
||||
|| ((gametyperules & GTR_BUMPERS) && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
||||
{
|
||||
if (!force) // ShouldDamage can bypass that, again.
|
||||
{
|
||||
|
|
@ -2782,10 +2787,8 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUAh_PlayerExplode(player, inflictor, source)) // Same thing. Also make sure to let Instashield happen blah blah
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (source && source != player->mo && source->player)
|
||||
K_PlayHitEmSound(source);
|
||||
|
|
@ -2803,7 +2806,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
|
|||
player->kartstuff[k_pogospring] = 0;
|
||||
|
||||
// This is the only part that SHOULDN'T combo :VVVVV
|
||||
if (G_BattleGametype() && !(player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinouttype] != 2)))
|
||||
if ((gametyperules & GTR_BUMPERS) && !(player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinouttype] != 2)))
|
||||
{
|
||||
if (source && source->player && player != source->player)
|
||||
{
|
||||
|
|
@ -2879,7 +2882,7 @@ void K_StealBumper(player_t *player, player_t *victim, boolean force)
|
|||
fixed_t newx, newy;
|
||||
mobj_t *newmo;
|
||||
|
||||
if (!G_BattleGametype())
|
||||
if (!(gametyperules & GTR_BUMPERS))
|
||||
return;
|
||||
|
||||
if (player->health <= 0 || victim->health <= 0)
|
||||
|
|
@ -3247,10 +3250,10 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I
|
|||
return NULL;
|
||||
}
|
||||
|
||||
UINT8 K_DriftSparkColor(player_t *player, INT32 charge)
|
||||
UINT16 K_DriftSparkColor(player_t *player, INT32 charge)
|
||||
{
|
||||
INT32 ds = K_GetKartDriftSparkValue(player);
|
||||
UINT8 color = SKINCOLOR_NONE;
|
||||
UINT16 color = SKINCOLOR_NONE;
|
||||
|
||||
if (charge < 0)
|
||||
{
|
||||
|
|
@ -3267,7 +3270,7 @@ UINT8 K_DriftSparkColor(player_t *player, INT32 charge)
|
|||
}
|
||||
else
|
||||
{
|
||||
color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1)));
|
||||
color = K_RainbowColor(leveltime);
|
||||
}
|
||||
}
|
||||
else if (charge >= ds*2)
|
||||
|
|
@ -3481,7 +3484,7 @@ void K_SpawnBoostTrail(player_t *player)
|
|||
|
||||
if (!P_IsObjectOnGround(player->mo)
|
||||
|| player->kartstuff[k_hyudorotimer] != 0
|
||||
|| (G_BattleGametype() && player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]))
|
||||
|| ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]))
|
||||
return;
|
||||
|
||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||
|
|
@ -4143,7 +4146,7 @@ static void K_DoHyudoroSteal(player_t *player)
|
|||
boolean sink = P_RandomChance(FRACUNIT/64);
|
||||
INT32 hyu = hyudorotime;
|
||||
|
||||
if (G_RaceGametype())
|
||||
if (gametype == GT_RACE)
|
||||
hyu *= 2; // double in race
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
|
|
@ -4152,8 +4155,8 @@ static void K_DoHyudoroSteal(player_t *player)
|
|||
&& player != &players[i] && !players[i].exiting && !players[i].spectator // Player in-game
|
||||
|
||||
// Can steal from this player
|
||||
&& (G_RaceGametype() //&& players[i].kartstuff[k_position] < player->kartstuff[k_position])
|
||||
|| (G_BattleGametype() && players[i].kartstuff[k_bumper] > 0))
|
||||
&& (gametype == GT_RACE //&& players[i].kartstuff[k_position] < player->kartstuff[k_position])
|
||||
|| ((gametyperules & GTR_BUMPERS) && players[i].kartstuff[k_bumper] > 0))
|
||||
|
||||
// Has an item
|
||||
&& (players[i].kartstuff[k_itemtype]
|
||||
|
|
@ -4179,7 +4182,7 @@ static void K_DoHyudoroSteal(player_t *player)
|
|||
player->kartstuff[k_itemheld] = 0;
|
||||
return;
|
||||
}
|
||||
else if ((G_RaceGametype() && player->kartstuff[k_position] == 1) || numplayers == 0) // No-one can be stolen from? Oh well...
|
||||
else if ((gametype == GT_RACE && player->kartstuff[k_position] == 1) || numplayers == 0) // No-one can be stolen from? Oh well...
|
||||
{
|
||||
player->kartstuff[k_hyudorotimer] = hyu;
|
||||
player->kartstuff[k_stealingtimer] = stealtime;
|
||||
|
|
@ -5185,7 +5188,7 @@ player_t *K_FindJawzTarget(mobj_t *actor, player_t *source)
|
|||
thisang = InvAngle(thisang);
|
||||
|
||||
// Jawz only go after the person directly ahead of you in race... sort of literally now!
|
||||
if (G_RaceGametype())
|
||||
if (gametype == GT_RACE)
|
||||
{
|
||||
// Don't go for people who are behind you
|
||||
if (thisang > ANGLE_67h)
|
||||
|
|
@ -5385,7 +5388,7 @@ void K_KartPlayerHUDUpdate(player_t *player)
|
|||
if (player->karthud[khud_tauntvoices])
|
||||
player->karthud[khud_tauntvoices]--;
|
||||
|
||||
if (G_RaceGametype())
|
||||
if (gametype == GT_RACE)
|
||||
{
|
||||
// 0 is the fast spin animation, set at 30 tics of ring boost or higher!
|
||||
if (player->kartstuff[k_ringboost] >= 30)
|
||||
|
|
@ -5438,7 +5441,7 @@ void K_KartPlayerHUDUpdate(player_t *player)
|
|||
player->karthud[khud_ringspblock] = (leveltime % 14); // reset to normal anim next time
|
||||
}
|
||||
|
||||
if (G_BattleGametype() && (player->exiting || player->kartstuff[k_comebacktimer]))
|
||||
if ((gametyperules & GTR_BUMPERS) && (player->exiting || player->kartstuff[k_comebacktimer]))
|
||||
{
|
||||
if (player->exiting)
|
||||
{
|
||||
|
|
@ -5462,7 +5465,7 @@ void K_KartPlayerHUDUpdate(player_t *player)
|
|||
if (player->karthud[khud_cardanimation] < 0)
|
||||
player->karthud[khud_cardanimation] = 0;
|
||||
}
|
||||
else if (G_RaceGametype() && player->exiting)
|
||||
else if (gametype == GT_RACE && player->exiting)
|
||||
{
|
||||
if (player->karthud[khud_cardanimation] < 2*TICRATE)
|
||||
player->karthud[khud_cardanimation]++;
|
||||
|
|
@ -5633,7 +5636,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
}
|
||||
}
|
||||
|
||||
if (G_RaceGametype() && player->kartstuff[k_rings] <= 0) // spawn ring debt indicator
|
||||
if (gametype == GT_RACE && player->kartstuff[k_rings] <= 0) // spawn ring debt indicator
|
||||
{
|
||||
mobj_t *debtflag = P_SpawnMobj(player->mo->x + player->mo->momx, player->mo->y + player->mo->momy,
|
||||
player->mo->z + player->mo->momz + player->mo->height + (24*player->mo->scale), MT_THOK);
|
||||
|
|
@ -5917,7 +5920,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
|
||||
K_KartPlayerHUDUpdate(player);
|
||||
|
||||
if (G_BattleGametype() && player->kartstuff[k_bumper] > 0
|
||||
if (gametype == GT_BATTLE && player->kartstuff[k_bumper] > 0
|
||||
&& !player->kartstuff[k_spinouttimer] && !player->kartstuff[k_squishedtimer]
|
||||
&& !player->kartstuff[k_respawn] && !player->powers[pw_flashing])
|
||||
{
|
||||
|
|
@ -5948,7 +5951,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
|
||||
if (player->kartstuff[k_eggmanexplode])
|
||||
{
|
||||
if (player->spectator || (G_BattleGametype() && !player->kartstuff[k_bumper]))
|
||||
if (player->spectator || (gametype == GT_BATTLE && !player->kartstuff[k_bumper]))
|
||||
player->kartstuff[k_eggmanexplode] = 0;
|
||||
else
|
||||
{
|
||||
|
|
@ -6569,7 +6572,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue)
|
|||
|
||||
INT32 K_GetKartDriftSparkValue(player_t *player)
|
||||
{
|
||||
UINT8 kartspeed = (G_BattleGametype() && player->kartstuff[k_bumper] <= 0)
|
||||
UINT8 kartspeed = (gametype == GT_BATTLE && player->kartstuff[k_bumper] <= 0)
|
||||
? 1
|
||||
: player->kartspeed;
|
||||
return (26*4 + kartspeed*2 + (9 - player->kartweight))*8;
|
||||
|
|
@ -6830,7 +6833,7 @@ void K_KartUpdatePosition(player_t *player)
|
|||
if (!playeringame[i] || players[i].spectator || !players[i].mo)
|
||||
continue;
|
||||
|
||||
if (G_RaceGametype())
|
||||
if (gametype == GT_RACE)
|
||||
{
|
||||
if (player->exiting) // End of match standings
|
||||
{
|
||||
|
|
@ -6849,7 +6852,7 @@ void K_KartUpdatePosition(player_t *player)
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (G_BattleGametype())
|
||||
else if (gametype == GT_BATTLE)
|
||||
{
|
||||
if (player->exiting) // End of match standings
|
||||
{
|
||||
|
|
@ -7597,7 +7600,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
|||
{
|
||||
INT32 hyu = hyudorotime;
|
||||
|
||||
if (G_RaceGametype())
|
||||
if (gametype == GT_RACE)
|
||||
hyu *= 2; // double in race
|
||||
|
||||
if (r_splitscreen)
|
||||
|
|
@ -7645,14 +7648,14 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
|||
player->mo->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4);
|
||||
}
|
||||
|
||||
if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) // dead in match? you da bomb
|
||||
if (gametype == GT_BATTLE && player->kartstuff[k_bumper] <= 0) // dead in match? you da bomb
|
||||
{
|
||||
K_DropItems(player); //K_StripItems(player);
|
||||
K_StripOther(player);
|
||||
player->mo->flags2 |= MF2_SHADOW;
|
||||
player->powers[pw_flashing] = player->kartstuff[k_comebacktimer];
|
||||
}
|
||||
else if (G_RaceGametype() || player->kartstuff[k_bumper] > 0)
|
||||
else if (gametype == GT_RACE || player->kartstuff[k_bumper] > 0)
|
||||
{
|
||||
player->mo->flags2 &= ~MF2_SHADOW;
|
||||
}
|
||||
|
|
@ -7677,7 +7680,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
|||
player->mo->friction -= 2048;
|
||||
|
||||
// Karma ice physics
|
||||
if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0)
|
||||
if (gametype == GT_BATTLE && player->kartstuff[k_bumper] <= 0)
|
||||
player->mo->friction += 1228;
|
||||
|
||||
if (player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER))
|
||||
|
|
@ -7855,7 +7858,7 @@ void K_CheckSpectateStatus(void)
|
|||
continue;
|
||||
if (leveltime > (starttime + 20*TICRATE)) // DON'T allow if the match is 20 seconds in
|
||||
return;
|
||||
if (G_RaceGametype() && players[i].laps >= 2) // DON'T allow if the race is at 2 laps
|
||||
if (gametype == GT_RACE && players[i].laps >= 2) // DON'T allow if the race is at 2 laps
|
||||
return;
|
||||
continue;
|
||||
}
|
||||
|
|
@ -8632,7 +8635,7 @@ static void K_drawKartItem(void)
|
|||
INT32 itembar = 0;
|
||||
INT32 maxl = 0; // itembar's normal highest value
|
||||
const INT32 barlength = (r_splitscreen > 1 ? 12 : 26);
|
||||
UINT8 localcolor = SKINCOLOR_NONE;
|
||||
UINT16 localcolor = SKINCOLOR_NONE;
|
||||
SINT8 colormode = TC_RAINBOW;
|
||||
UINT8 *colmap = NULL;
|
||||
boolean flipamount = false; // Used for 3P/4P splitscreen to flip item amount stuff
|
||||
|
|
@ -8845,7 +8848,7 @@ static void K_drawKartItem(void)
|
|||
switch (stplyr->karthud[khud_itemblinkmode])
|
||||
{
|
||||
case 2:
|
||||
localcolor = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1)));
|
||||
localcolor = K_RainbowColor(leveltime);
|
||||
break;
|
||||
case 1:
|
||||
localcolor = SKINCOLOR_RED;
|
||||
|
|
@ -9278,10 +9281,8 @@ static boolean K_drawKartPositionFaces(void)
|
|||
if (numplayersingame <= 1)
|
||||
return true;
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (!LUA_HudEnabled(hud_minirankings))
|
||||
return false; // Don't proceed but still return true for free play above if HUD is disabled.
|
||||
#endif
|
||||
|
||||
for (j = 0; j < numplayersingame; j++)
|
||||
{
|
||||
|
|
@ -9316,7 +9317,7 @@ static boolean K_drawKartPositionFaces(void)
|
|||
else
|
||||
Y -= (9*5);
|
||||
|
||||
if (G_BattleGametype() || strank <= 2) // too close to the top, or playing battle, or a spectator? would have had (strank == -1) called out, but already caught by (strank <= 2)
|
||||
if (gametype == GT_BATTLE || strank <= 2) // too close to the top, or playing battle, or a spectator? would have had (strank == -1) called out, but already caught by (strank <= 2)
|
||||
{
|
||||
i = 0;
|
||||
if (ranklines > 5) // could be both...
|
||||
|
|
@ -9352,11 +9353,9 @@ static boolean K_drawKartPositionFaces(void)
|
|||
|
||||
V_DrawMappedPatch(FACE_X, Y, V_HUDTRANS|V_SNAPTOLEFT, facerankprefix[players[rankplayer[i]].skin], colormap);
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_battlebumpers))
|
||||
{
|
||||
#endif
|
||||
if (G_BattleGametype() && players[rankplayer[i]].kartstuff[k_bumper] > 0)
|
||||
if (gametype == GT_BATTLE && players[rankplayer[i]].kartstuff[k_bumper] > 0)
|
||||
{
|
||||
V_DrawMappedPatch(bumperx-2, Y, V_HUDTRANS|V_SNAPTOLEFT, kp_tinybumper[0], colormap);
|
||||
for (j = 1; j < players[rankplayer[i]].kartstuff[k_bumper]; j++)
|
||||
|
|
@ -9365,15 +9364,13 @@ static boolean K_drawKartPositionFaces(void)
|
|||
V_DrawMappedPatch(bumperx, Y, V_HUDTRANS|V_SNAPTOLEFT, kp_tinybumper[1], colormap);
|
||||
}
|
||||
}
|
||||
#ifdef HAVE_BLUA
|
||||
} // A new level of stupidity: checking if lua is enabled to close a bracket. :Fascinating:
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (i == strank)
|
||||
V_DrawScaledPatch(FACE_X, Y, V_HUDTRANS|V_SNAPTOLEFT, kp_facehighlight[(leveltime / 4) % 8]);
|
||||
|
||||
if (G_BattleGametype() && players[rankplayer[i]].kartstuff[k_bumper] <= 0)
|
||||
if (gametype == GT_BATTLE && players[rankplayer[i]].kartstuff[k_bumper] <= 0)
|
||||
V_DrawScaledPatch(FACE_X-4, Y-3, V_HUDTRANS|V_SNAPTOLEFT, kp_ranknobumpers);
|
||||
else
|
||||
{
|
||||
|
|
@ -9471,7 +9468,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
|||
colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo->color, GTC_CACHE);
|
||||
|
||||
V_DrawMappedPatch(x, y-4, 0, facerankprefix[players[tab[i].num].skin], colormap);
|
||||
/*if (G_BattleGametype() && players[tab[i].num].kartstuff[k_bumper] > 0) -- not enough space for this
|
||||
/*if (gametype == GT_BATTLE && players[tab[i].num].kartstuff[k_bumper] > 0) -- not enough space for this
|
||||
{
|
||||
INT32 bumperx = x+19;
|
||||
V_DrawMappedPatch(bumperx-2, y-4, 0, kp_tinybumper[0], colormap);
|
||||
|
|
@ -9486,7 +9483,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
|||
if (tab[i].num == whiteplayer)
|
||||
V_DrawScaledPatch(x, y-4, 0, kp_facehighlight[(leveltime / 4) % 8]);
|
||||
|
||||
if (G_BattleGametype() && players[tab[i].num].kartstuff[k_bumper] <= 0)
|
||||
if (gametype == GT_BATTLE && players[tab[i].num].kartstuff[k_bumper] <= 0)
|
||||
V_DrawScaledPatch(x-4, y-7, 0, kp_ranknobumpers);
|
||||
else
|
||||
{
|
||||
|
|
@ -9497,7 +9494,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
|
|||
V_DrawScaledPatch(x-5, y+6, 0, kp_facenum[pos]);
|
||||
}
|
||||
|
||||
if (G_RaceGametype())
|
||||
if (gametype == GT_RACE)
|
||||
{
|
||||
#define timestring(time) va("%i'%02i\"%02i", G_TicsToMinutes(time, true), G_TicsToSeconds(time), G_TicsToCentiseconds(time))
|
||||
if (scorelines > 8)
|
||||
|
|
@ -9736,7 +9733,7 @@ static void K_drawKartSpeedometer(void)
|
|||
numbers[1] = ((convSpeed / 10) % 10);
|
||||
numbers[2] = (convSpeed % 10);
|
||||
|
||||
if (G_BattleGametype())
|
||||
if (gametype == GT_BATTLE)
|
||||
battleoffset = 8;
|
||||
|
||||
V_DrawScaledPatch(LAPS_X, LAPS_Y-25 + battleoffset, V_HUDTRANS|splitflags, kp_speedometersticker);
|
||||
|
|
@ -10165,14 +10162,14 @@ static void K_drawKartMinimap(void)
|
|||
y -= SHORT(AutomapPic->topoffset);
|
||||
|
||||
// Draw the super item in Battle
|
||||
if (G_BattleGametype() && battleovertime.enabled)
|
||||
if (gametype == GT_BATTLE && battleovertime.enabled)
|
||||
{
|
||||
if (battleovertime.enabled >= 10*TICRATE || (battleovertime.enabled & 1))
|
||||
{
|
||||
const INT32 prevsplitflags = splitflags;
|
||||
splitflags &= ~V_HUDTRANSHALF;
|
||||
splitflags |= V_HUDTRANS;
|
||||
colormap = R_GetTranslationColormap(TC_RAINBOW, (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))), GTC_CACHE);
|
||||
colormap = R_GetTranslationColormap(TC_RAINBOW, K_RainbowColor(leveltime), GTC_CACHE);
|
||||
K_drawKartMinimapIcon(battleovertime.x, battleovertime.y, x, y, splitflags, kp_itemminimap, colormap, AutomapPic);
|
||||
splitflags = prevsplitflags;
|
||||
}
|
||||
|
|
@ -10222,7 +10219,7 @@ static void K_drawKartMinimap(void)
|
|||
|
||||
if (i != displayplayers[0] || r_splitscreen)
|
||||
{
|
||||
if (G_BattleGametype() && players[i].kartstuff[k_bumper] <= 0)
|
||||
if (gametype == GT_BATTLE && players[i].kartstuff[k_bumper] <= 0)
|
||||
continue;
|
||||
|
||||
if (players[i].kartstuff[k_hyudorotimer] > 0)
|
||||
|
|
@ -10259,8 +10256,8 @@ static void K_drawKartMinimap(void)
|
|||
|
||||
K_drawKartMinimapIcon(players[i].mo->x, players[i].mo->y, x, y, splitflags, facemmapprefix[skin], colormap, AutomapPic);
|
||||
// Target reticule
|
||||
if ((G_RaceGametype() && players[i].kartstuff[k_position] == spbplace)
|
||||
|| (G_BattleGametype() && K_IsPlayerWanted(&players[i])))
|
||||
if ((gametype == GT_RACE && players[i].kartstuff[k_position] == spbplace)
|
||||
|| (gametype == GT_BATTLE && K_IsPlayerWanted(&players[i])))
|
||||
K_drawKartMinimapIcon(players[i].mo->x, players[i].mo->y, x, y, splitflags, kp_wantedreticle, NULL, AutomapPic);
|
||||
}
|
||||
}
|
||||
|
|
@ -10312,8 +10309,8 @@ static void K_drawKartMinimap(void)
|
|||
K_drawKartMinimapIcon(players[localplayers[i]].mo->x, players[localplayers[i]].mo->y, x, y, splitflags, facemmapprefix[skin], colormap, AutomapPic);
|
||||
|
||||
// Target reticule
|
||||
if ((G_RaceGametype() && players[localplayers[i]].kartstuff[k_position] == spbplace)
|
||||
|| (G_BattleGametype() && K_IsPlayerWanted(&players[localplayers[i]])))
|
||||
if ((gametype == GT_RACE && players[localplayers[i]].kartstuff[k_position] == spbplace)
|
||||
|| (gametype == GT_BATTLE && K_IsPlayerWanted(&players[localplayers[i]])))
|
||||
K_drawKartMinimapIcon(players[localplayers[i]].mo->x, players[localplayers[i]].mo->y, x, y, splitflags, kp_wantedreticle, NULL, AutomapPic);
|
||||
}
|
||||
}
|
||||
|
|
@ -10381,10 +10378,9 @@ static void K_drawBattleFullscreen(void)
|
|||
INT32 splitflags = V_SNAPTOTOP; // I don't feel like properly supporting non-green resolutions, so you can have a misuse of SNAPTO instead
|
||||
fixed_t scale = FRACUNIT;
|
||||
boolean drawcomebacktimer = true; // lazy hack because it's cleaner in the long run.
|
||||
#ifdef HAVE_BLUA
|
||||
|
||||
if (!LUA_HudEnabled(hud_battlecomebacktimer))
|
||||
drawcomebacktimer = false;
|
||||
#endif
|
||||
|
||||
if (r_splitscreen)
|
||||
{
|
||||
|
|
@ -10493,9 +10489,7 @@ static void K_drawBattleFullscreen(void)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_freeplay))
|
||||
#endif
|
||||
K_drawKartFreePlay(leveltime);
|
||||
}
|
||||
}
|
||||
|
|
@ -10645,8 +10639,8 @@ static void K_drawInput(void)
|
|||
static INT32 pn = 0;
|
||||
INT32 target = 0, splitflags = (V_SNAPTOBOTTOM|V_SNAPTORIGHT);
|
||||
INT32 x = BASEVIDWIDTH - 32, y = BASEVIDHEIGHT-24, offs, col;
|
||||
const INT32 accent1 = splitflags|colortranslations[stplyr->skincolor][5];
|
||||
const INT32 accent2 = splitflags|colortranslations[stplyr->skincolor][9];
|
||||
const INT32 accent1 = splitflags|skincolors[stplyr->skincolor].ramp[5];
|
||||
const INT32 accent2 = splitflags|skincolors[stplyr->skincolor].ramp[9];
|
||||
ticcmd_t *cmd = &stplyr->cmd;
|
||||
|
||||
if (timeinmap <= 105)
|
||||
|
|
@ -11012,7 +11006,7 @@ void K_drawKartHUD(void)
|
|||
return;
|
||||
}
|
||||
|
||||
battlefullscreen = ((G_BattleGametype())
|
||||
battlefullscreen = ((gametype == GT_BATTLE)
|
||||
&& (stplyr->exiting
|
||||
|| (stplyr->kartstuff[k_bumper] <= 0
|
||||
&& stplyr->kartstuff[k_comebacktimer]
|
||||
|
|
@ -11022,52 +11016,40 @@ void K_drawKartHUD(void)
|
|||
if (!demo.title && (!battlefullscreen || r_splitscreen))
|
||||
{
|
||||
// Draw the CHECK indicator before the other items, so it's overlapped by everything else
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_check)) // delete lua when?
|
||||
#endif
|
||||
if (cv_kartcheck.value && !splitscreen && !players[displayplayers[0]].exiting && !freecam)
|
||||
K_drawKartPlayerCheck();
|
||||
|
||||
// Draw WANTED status
|
||||
if (G_BattleGametype())
|
||||
if (gametype == GT_BATTLE)
|
||||
{
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_wanted))
|
||||
#endif
|
||||
K_drawKartWanted();
|
||||
}
|
||||
|
||||
if (cv_kartminimap.value)
|
||||
{
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_minimap))
|
||||
#endif
|
||||
K_drawKartMinimap();
|
||||
}
|
||||
}
|
||||
|
||||
if (battlefullscreen && !freecam)
|
||||
{
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_battlefullscreen))
|
||||
#endif
|
||||
K_drawBattleFullscreen();
|
||||
return;
|
||||
}
|
||||
|
||||
// Draw the item window
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_item) && !freecam)
|
||||
#endif
|
||||
K_drawKartItem();
|
||||
|
||||
// If not splitscreen, draw...
|
||||
if (!r_splitscreen && !demo.title)
|
||||
{
|
||||
// Draw the timestamp
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_time))
|
||||
#endif
|
||||
K_drawKartTimestamp(stplyr->realtime, TIME_X, TIME_Y, gamemap, 0);
|
||||
|
||||
if (!modeattacking)
|
||||
|
|
@ -11085,9 +11067,7 @@ void K_drawKartHUD(void)
|
|||
// Draw the speedometer
|
||||
if (cv_kartspeedometer.value && !r_splitscreen)
|
||||
{
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_speedometer))
|
||||
#endif
|
||||
K_drawKartSpeedometer();
|
||||
}
|
||||
|
||||
|
|
@ -11113,12 +11093,10 @@ void K_drawKartHUD(void)
|
|||
V_DrawTinyScaledPatch(x-54, y, 0, W_CachePatchName("TTKBANNR", PU_CACHE));
|
||||
V_DrawTinyScaledPatch(x-54, y+25, 0, W_CachePatchName("TTKART", PU_CACHE));
|
||||
}
|
||||
else if (G_RaceGametype()) // Race-only elements
|
||||
else if (gametype == GT_RACE) // Race-only elements
|
||||
{
|
||||
// Draw the lap counter
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_gametypeinfo))
|
||||
#endif
|
||||
K_drawKartLapsAndRings();
|
||||
|
||||
if (isfreeplay)
|
||||
|
|
@ -11126,26 +11104,20 @@ void K_drawKartHUD(void)
|
|||
else if (!modeattacking)
|
||||
{
|
||||
// Draw the numerical position
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_position))
|
||||
#endif
|
||||
K_DrawKartPositionNum(stplyr->kartstuff[k_position]);
|
||||
}
|
||||
else //if (!(demo.playback && hu_showscores))
|
||||
{
|
||||
// Draw the input UI
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_position))
|
||||
#endif
|
||||
K_drawInput();
|
||||
}
|
||||
}
|
||||
else if (G_BattleGametype()) // Battle-only
|
||||
else if (gametype == GT_BATTLE) // Battle-only
|
||||
{
|
||||
// Draw the hits left!
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_gametypeinfo))
|
||||
#endif
|
||||
K_drawKartBumpersOrKarma();
|
||||
}
|
||||
}
|
||||
|
|
@ -11168,7 +11140,7 @@ void K_drawKartHUD(void)
|
|||
}
|
||||
|
||||
// Race overlays
|
||||
if (G_RaceGametype() && !freecam)
|
||||
if (gametype == GT_RACE && !freecam)
|
||||
{
|
||||
if (stplyr->exiting)
|
||||
K_drawKartFinish();
|
||||
|
|
@ -11179,15 +11151,13 @@ void K_drawKartHUD(void)
|
|||
if (modeattacking || freecam) // everything after here is MP and debug only
|
||||
return;
|
||||
|
||||
if (G_BattleGametype() && !r_splitscreen && (stplyr->karthud[khud_yougotem] % 2)) // * YOU GOT EM *
|
||||
if (gametype == GT_BATTLE && !r_splitscreen && (stplyr->karthud[khud_yougotem] % 2)) // * YOU GOT EM *
|
||||
V_DrawScaledPatch(BASEVIDWIDTH/2 - (SHORT(kp_yougotem->width)/2), 32, V_HUDTRANS, kp_yougotem);
|
||||
|
||||
// Draw FREE PLAY.
|
||||
if (isfreeplay && !stplyr->spectator && timeinmap > 113)
|
||||
{
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_HudEnabled(hud_freeplay))
|
||||
#endif
|
||||
K_drawKartFreePlay(leveltime);
|
||||
}
|
||||
|
||||
|
|
@ -11219,7 +11189,7 @@ void K_drawKartHUD(void)
|
|||
INT32 x = 0, y = 0;
|
||||
UINT8 c;
|
||||
|
||||
for (c = 1; c < MAXSKINCOLORS; c++)
|
||||
for (c = 1; c < numskincolors; c++)
|
||||
{
|
||||
UINT8 *cm = R_GetTranslationColormap(TC_RAINBOW, c, GTC_CACHE);
|
||||
V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, FRACUNIT>>1, 0, facewantprefix[stplyr->skin], cm);
|
||||
|
|
|
|||
|
|
@ -88,9 +88,9 @@ INT16 K_CalculatePowerLevelAvg(void)
|
|||
return 0; // No average.
|
||||
}
|
||||
|
||||
if (G_RaceGametype())
|
||||
if ((gametyperules & GTR_CIRCUIT))
|
||||
t = PWRLV_RACE;
|
||||
else if (G_BattleGametype())
|
||||
else if ((gametyperules & GTR_BUMPERS))
|
||||
t = PWRLV_BATTLE;
|
||||
|
||||
if (t == PWRLV_DISABLED)
|
||||
|
|
@ -282,9 +282,9 @@ void K_PlayerForfeit(UINT8 playernum, boolean pointloss)
|
|||
if (p < 2) // no players
|
||||
return;
|
||||
|
||||
if (G_RaceGametype())
|
||||
if ((gametyperules & GTR_CIRCUIT))
|
||||
powertype = PWRLV_RACE;
|
||||
else if (G_BattleGametype())
|
||||
else if ((gametyperules & GTR_BUMPERS))
|
||||
powertype = PWRLV_BATTLE;
|
||||
|
||||
if (powertype == PWRLV_DISABLED) // No power type?!
|
||||
|
|
|
|||
|
|
@ -3425,22 +3425,6 @@ static int lib_gGametypeUsesLives(lua_State *L)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int lib_gGametypeUsesCoopLives(lua_State *L)
|
||||
{
|
||||
//HUDSAFE
|
||||
INLEVEL
|
||||
lua_pushboolean(L, G_GametypeUsesCoopLives());
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lib_gGametypeUsesCoopStarposts(lua_State *L)
|
||||
{
|
||||
//HUDSAFE
|
||||
INLEVEL
|
||||
lua_pushboolean(L, G_GametypeUsesCoopStarposts());
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lib_gGametypeHasTeams(lua_State *L)
|
||||
{
|
||||
//HUDSAFE
|
||||
|
|
@ -3457,30 +3441,6 @@ static int lib_gGametypeHasSpectators(lua_State *L)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int lib_gBattleGametype(lua_State *L)
|
||||
{
|
||||
//HUDSAFE
|
||||
INLEVEL
|
||||
lua_pushboolean(L, G_BattleGametype());
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lib_gRaceGametype(lua_State *L)
|
||||
{
|
||||
//HUDSAFE
|
||||
INLEVEL
|
||||
lua_pushboolean(L, G_RaceGametype());
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lib_gTagGametype(lua_State *L)
|
||||
{
|
||||
//HUDSAFE
|
||||
INLEVEL
|
||||
lua_pushboolean(L, G_TagGametype());
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lib_gTicsToHours(lua_State *L)
|
||||
{
|
||||
tic_t rtic = luaL_checkinteger(L, 1);
|
||||
|
|
@ -4251,13 +4211,8 @@ static luaL_Reg lib[] = {
|
|||
{"G_ExitLevel",lib_gExitLevel},
|
||||
{"G_IsSpecialStage",lib_gIsSpecialStage},
|
||||
{"G_GametypeUsesLives",lib_gGametypeUsesLives},
|
||||
{"G_GametypeUsesCoopLives",lib_gGametypeUsesCoopLives},
|
||||
{"G_GametypeUsesCoopStarposts",lib_gGametypeUsesCoopStarposts},
|
||||
{"G_GametypeHasTeams",lib_gGametypeHasTeams},
|
||||
{"G_GametypeHasSpectators",lib_gGametypeHasSpectators},
|
||||
{"G_BattleGametype",lib_gBattleGametype},
|
||||
{"G_RaceGametype",lib_gRaceGametype},
|
||||
{"G_TagGametype",lib_gTagGametype},
|
||||
{"G_TicsToHours",lib_gTicsToHours},
|
||||
{"G_TicsToMinutes",lib_gTicsToMinutes},
|
||||
{"G_TicsToSeconds",lib_gTicsToSeconds},
|
||||
|
|
|
|||
|
|
@ -2213,7 +2213,8 @@ boolean LUAh_PlayerExplode(player_t *player, mobj_t *inflictor, mobj_t *source)
|
|||
}
|
||||
lua_settop(gL, 0);
|
||||
return hooked;
|
||||
=======
|
||||
}
|
||||
|
||||
// Hook for game quitting
|
||||
void LUAh_GameQuit(void)
|
||||
{
|
||||
|
|
@ -2238,5 +2239,4 @@ void LUAh_GameQuit(void)
|
|||
}
|
||||
|
||||
lua_pop(gL, 1); // Pop error handler
|
||||
>>>>>>> srb2/next
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@
|
|||
#include "tables.h"
|
||||
#include "p_local.h"
|
||||
#include "doomstat.h" // for ALL7EMERALDS
|
||||
#include "k_color.h" // KartColor_Opposite
|
||||
|
||||
#include "lua_script.h"
|
||||
#include "lua_libs.h"
|
||||
|
|
|
|||
|
|
@ -320,14 +320,14 @@ int LUA_PushGlobals(lua_State *L, const char *word)
|
|||
LUA_PushUserdata(L, &players[consoleplayer], META_PLAYER);
|
||||
return 1;
|
||||
} else if (fastcmp(word,"displayplayer")) { // player visible on screen (aka display player 1)
|
||||
if (displayplayer < 0 || !playeringame[displayplayer])
|
||||
if (displayplayers[0] < 0 || !playeringame[displayplayers[0]])
|
||||
return 0;
|
||||
LUA_PushUserdata(L, &players[displayplayer], META_PLAYER);
|
||||
LUA_PushUserdata(L, &players[displayplayers[0]], META_PLAYER);
|
||||
return 1;
|
||||
} else if (fastcmp(word,"secondarydisplayplayer")) { // local/display player 2, for splitscreen
|
||||
if (!splitscreen || secondarydisplayplayer < 0 || !playeringame[secondarydisplayplayer])
|
||||
if (splitscreen < 1 || displayplayers[1] < 0 || !playeringame[displayplayers[1]])
|
||||
return 0;
|
||||
LUA_PushUserdata(L, &players[secondarydisplayplayer], META_PLAYER);
|
||||
LUA_PushUserdata(L, &players[displayplayers[1]], META_PLAYER);
|
||||
return 1;
|
||||
} else if (fastcmp(word,"isserver")) {
|
||||
lua_pushboolean(L, server);
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ enum skin {
|
|||
skin_wadnum,
|
||||
skin_flags,
|
||||
skin_realname,
|
||||
skin_hudname,
|
||||
skin_facerank,
|
||||
skin_facewant,
|
||||
skin_facemmap,
|
||||
|
|
@ -36,9 +35,11 @@ enum skin {
|
|||
skin_followitem,
|
||||
skin_starttranscolor,
|
||||
skin_prefcolor,
|
||||
skin_highresscale,
|
||||
skin_soundsid,
|
||||
skin_availability
|
||||
skin_supercolor,
|
||||
skin_prefoppositecolor,
|
||||
skin_highresscale,
|
||||
skin_rivals,
|
||||
skin_soundsid
|
||||
};
|
||||
static const char *const skin_opt[] = {
|
||||
"valid",
|
||||
|
|
@ -47,20 +48,19 @@ static const char *const skin_opt[] = {
|
|||
"wadnum",
|
||||
"flags",
|
||||
"realname",
|
||||
"hudname",
|
||||
"facerank",
|
||||
"facewant",
|
||||
"facemmap",
|
||||
// SRB2kart
|
||||
"kartspeed",
|
||||
"kartweight",
|
||||
//
|
||||
"followitem",
|
||||
"starttranscolor",
|
||||
"prefcolor",
|
||||
"supercolor",
|
||||
"prefoppositecolor",
|
||||
"highresscale",
|
||||
"rivals",
|
||||
"soundsid",
|
||||
"availability",
|
||||
NULL};
|
||||
|
||||
#define UNIMPLEMENTED luaL_error(L, LUA_QL("skin_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", skin_opt[field])
|
||||
|
|
@ -93,9 +93,6 @@ static int skin_get(lua_State *L)
|
|||
case skin_realname:
|
||||
lua_pushstring(L, skin->realname);
|
||||
break;
|
||||
case skin_hudname:
|
||||
lua_pushstring(L, skin->hudname);
|
||||
break;
|
||||
case skin_facerank:
|
||||
for (i = 0; i < 8; i++)
|
||||
if (!skin->facerank[i])
|
||||
|
|
@ -131,15 +128,21 @@ static int skin_get(lua_State *L)
|
|||
case skin_prefcolor:
|
||||
lua_pushinteger(L, skin->prefcolor);
|
||||
break;
|
||||
case skin_supercolor:
|
||||
lua_pushinteger(L, skin->supercolor);
|
||||
break;
|
||||
case skin_prefoppositecolor:
|
||||
lua_pushinteger(L, skin->prefoppositecolor);
|
||||
break;
|
||||
case skin_highresscale:
|
||||
lua_pushinteger(L, skin->highresscale);
|
||||
break;
|
||||
case skin_rivals:
|
||||
// This would be pretty cool to push
|
||||
return UNIMPLEMENTED;
|
||||
case skin_soundsid:
|
||||
LUA_PushUserdata(L, skin->soundsid, META_SOUNDSID);
|
||||
break;
|
||||
case skin_availability:
|
||||
lua_pushinteger(L, skin->availability);
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -804,21 +804,6 @@ void Command_CauseCfail_f(void)
|
|||
players[consoleplayer].rings = 1337;
|
||||
players[consoleplayer].mo->destscale = 25;
|
||||
P_SetThingPosition(players[consoleplayer].mo);
|
||||
|
||||
// CTF consistency test
|
||||
if (gametyperules & GTR_TEAMFLAGS)
|
||||
{
|
||||
if (blueflag) {
|
||||
P_RemoveMobj(blueflag);
|
||||
blueflag = NULL;
|
||||
}
|
||||
if (redflag)
|
||||
{
|
||||
redflag->x = 423423;
|
||||
redflag->y = 666;
|
||||
redflag->z = 123311;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -271,7 +271,10 @@ void M_SilentUpdateUnlockablesAndEmblems(void)
|
|||
unlockables[i].unlocked = M_Achieved(unlockables[i].conditionset - 1);
|
||||
}
|
||||
|
||||
players[consoleplayer].availabilities = players[1].availabilities = R_GetSkinAvailabilities(); // players[1] is supposed to be for 2p
|
||||
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||
{
|
||||
players[g_localplayers[i]].availabilities = R_GetSkinAvailabilities();
|
||||
}
|
||||
}
|
||||
|
||||
// Emblem unlocking shit
|
||||
|
|
|
|||
517
src/m_menu.c
517
src/m_menu.c
|
|
@ -272,7 +272,7 @@ static void M_SetupMultiHandler(INT32 choice);
|
|||
// Split into multiple parts due to size
|
||||
// Controls
|
||||
menu_t OP_ControlsDef, OP_AllControlsDef;
|
||||
menu_t OP_MouseOptionsDef, OP_Mouse2OptionsDef;
|
||||
menu_t OP_MouseOptionsDef;
|
||||
menu_t OP_Joystick1Def, OP_Joystick2Def, OP_Joystick3Def, OP_Joystick4Def;
|
||||
static void M_VideoModeMenu(INT32 choice);
|
||||
static void M_Setup1PControlsMenu(INT32 choice);
|
||||
|
|
@ -390,6 +390,9 @@ static void M_HandleMonitorToggles(INT32 choice);
|
|||
// Consvar onchange functions
|
||||
static void Nextmap_OnChange(void);
|
||||
static void Newgametype_OnChange(void);
|
||||
#ifdef HWRENDER
|
||||
static void Newrenderer_OnChange(void);
|
||||
#endif
|
||||
static void Dummymenuplayer_OnChange(void);
|
||||
//static void Dummymares_OnChange(void);
|
||||
static void Dummystaff_OnChange(void);
|
||||
|
|
@ -732,6 +735,7 @@ static menuitem_t MISC_HelpMenu[] =
|
|||
// Pause Menu Pandora's Box Options
|
||||
static menuitem_t SR_PandorasBox[] =
|
||||
{
|
||||
/*
|
||||
{IT_STRING | IT_CVAR, NULL, "Rings", &cv_dummyrings, 20},
|
||||
{IT_STRING | IT_CVAR, NULL, "Lives", &cv_dummylives, 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Continues", &cv_dummycontinues, 40},
|
||||
|
|
@ -743,6 +747,7 @@ static menuitem_t SR_PandorasBox[] =
|
|||
{IT_STRING | IT_CALL, NULL, "Destroy All Robots", M_DestroyRobots, 100},
|
||||
|
||||
{IT_STRING | IT_CALL, NULL, "Ultimate Cheat", M_UltimateCheat, 130},
|
||||
*/
|
||||
};
|
||||
|
||||
// Sky Room Custom Unlocks
|
||||
|
|
@ -829,7 +834,7 @@ enum
|
|||
static menuitem_t SP_GrandPrixPlaceholderMenu[] =
|
||||
{
|
||||
{IT_STRING|IT_CVAR, NULL, "Character", &cv_chooseskin, 10},
|
||||
{IT_STRING|IT_CVAR, NULL, "Color", &cv_playercolor, 20},
|
||||
{IT_STRING|IT_CVAR, NULL, "Color", &cv_playercolor[0], 20},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Difficulty", &cv_dummygpdifficulty, 40},
|
||||
{IT_STRING|IT_CVAR, NULL, "Encore Mode", &cv_dummygpencore, 50},
|
||||
|
|
@ -1168,49 +1173,49 @@ static menuitem_t OP_AllControlsMenu[] =
|
|||
static menuitem_t OP_Joystick1Menu[] =
|
||||
{
|
||||
{IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup1PJoystickMenu, 10},
|
||||
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis , 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis , 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis , 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis , 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis , 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis , 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis , 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[0] , 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[0] , 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[0] , 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[0] , 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[0] , 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[0] , 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[0] , 90},
|
||||
};
|
||||
|
||||
static menuitem_t OP_Joystick2Menu[] =
|
||||
{
|
||||
{IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup2PJoystickMenu, 10},
|
||||
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis2 , 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis2 , 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis2 , 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis2 , 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis2 , 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis2 , 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis2 , 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[1] , 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[1] , 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[1] , 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[1] , 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[1] , 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[1] , 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[1] , 90},
|
||||
};
|
||||
|
||||
static menuitem_t OP_Joystick3Menu[] =
|
||||
{
|
||||
{IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup3PJoystickMenu, 10},
|
||||
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis3 , 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis3 , 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis3 , 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis3 , 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis3 , 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis3 , 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis3 , 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[2] , 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[2] , 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[2] , 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[2] , 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[2] , 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[2] , 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[2] , 90},
|
||||
};
|
||||
|
||||
static menuitem_t OP_Joystick4Menu[] =
|
||||
{
|
||||
{IT_STRING | IT_CALL, NULL, "Select Gamepad..." , M_Setup4PJoystickMenu, 10},
|
||||
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis4 , 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis4 , 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis4 , 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis4 , 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis4 , 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis4 , 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis4 , 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[3] , 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[3] , 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[3] , 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[3] , 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[3] , 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[3] , 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[3] , 90},
|
||||
};
|
||||
|
||||
static menuitem_t OP_JoystickSetMenu[] =
|
||||
|
|
@ -1225,7 +1230,8 @@ static menuitem_t OP_JoystickSetMenu[] =
|
|||
{IT_CALL | IT_NOTHING, "", NULL, M_AssignJoystick, (LINEHEIGHT*8)+5},
|
||||
};
|
||||
|
||||
/*static menuitem_t OP_MouseOptionsMenu[] =
|
||||
/*
|
||||
static menuitem_t OP_MouseOptionsMenu[] =
|
||||
{
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Mouse", &cv_usemouse, 10},
|
||||
|
||||
|
|
@ -1239,21 +1245,7 @@ static menuitem_t OP_JoystickSetMenu[] =
|
|||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "Mouse Y Speed", &cv_mouseysens, 80},
|
||||
};
|
||||
|
||||
static menuitem_t OP_Mouse2OptionsMenu[] =
|
||||
{
|
||||
{IT_STRING | IT_CVAR, NULL, "Use Mouse 2", &cv_usemouse2, 10},
|
||||
{IT_STRING | IT_CVAR, NULL, "Second Mouse Serial Port",
|
||||
&cv_mouse2port, 20},
|
||||
{IT_STRING | IT_CVAR, NULL, "First-Person MouseLook", &cv_alwaysfreelook2, 30},
|
||||
{IT_STRING | IT_CVAR, NULL, "Third-Person MouseLook", &cv_chasefreelook2, 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Mouse Move", &cv_mousemove2, 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Invert Mouse", &cv_invertmouse2, 60},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "Mouse X Speed", &cv_mousesens2, 70},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "Mouse Y Speed", &cv_mouseysens2, 80},
|
||||
};*/
|
||||
*/
|
||||
|
||||
static menuitem_t OP_VideoOptionsMenu[] =
|
||||
{
|
||||
|
|
@ -2230,51 +2222,61 @@ static void Dummystaff_OnChange(void)
|
|||
// Newgametype. Used for gametype changes.
|
||||
static void Newgametype_OnChange(void)
|
||||
{
|
||||
if (cv_nextmap.value && menuactive)
|
||||
if (menuactive && cv_nextmap.value)
|
||||
{
|
||||
if (!mapheaderinfo[cv_nextmap.value-1])
|
||||
if(!mapheaderinfo[cv_nextmap.value-1])
|
||||
P_AllocMapHeader((INT16)(cv_nextmap.value-1));
|
||||
|
||||
if ((cv_newgametype.value == GT_RACE && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_RACE)) || // SRB2kart
|
||||
//(cv_newgametype.value == GT_COMPETITION && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_COMPETITION)) ||
|
||||
//(cv_newgametype.value == GT_RACE && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_RACE)) ||
|
||||
((cv_newgametype.value == GT_MATCH || cv_newgametype.value == GT_TEAMMATCH) && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_MATCH))) // ||
|
||||
//((cv_newgametype.value == GT_TAG || cv_newgametype.value == GT_HIDEANDSEEK) && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_TAG)) ||
|
||||
//(cv_newgametype.value == GT_CTF && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_CTF)))
|
||||
{
|
||||
INT32 value = 0;
|
||||
|
||||
switch (cv_newgametype.value)
|
||||
{
|
||||
case GT_COOP:
|
||||
value = TOL_RACE; // SRB2kart
|
||||
break;
|
||||
case GT_COMPETITION:
|
||||
value = TOL_COMPETITION;
|
||||
break;
|
||||
case GT_RACE:
|
||||
value = TOL_RACE;
|
||||
break;
|
||||
case GT_MATCH:
|
||||
case GT_TEAMMATCH:
|
||||
value = TOL_MATCH;
|
||||
break;
|
||||
case GT_TAG:
|
||||
case GT_HIDEANDSEEK:
|
||||
value = TOL_TAG;
|
||||
break;
|
||||
case GT_CTF:
|
||||
value = TOL_CTF;
|
||||
break;
|
||||
}
|
||||
|
||||
CV_SetValue(&cv_nextmap, M_FindFirstMap(value));
|
||||
//CV_AddValue(&cv_nextmap, -1);
|
||||
//CV_AddValue(&cv_nextmap, 1);
|
||||
}
|
||||
if (!(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & gametypetol[cv_newgametype.value]))
|
||||
CV_SetValue(&cv_nextmap, M_GetFirstLevelInList(cv_newgametype.value));
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HWRENDER
|
||||
static void Newrenderer_AREYOUSURE(INT32 c)
|
||||
{
|
||||
int n;
|
||||
switch (c)
|
||||
{
|
||||
case 'y':
|
||||
case KEY_ENTER:
|
||||
n = cv_newrenderer.value;
|
||||
newrenderer_set |= n;
|
||||
CV_SetValue(&cv_renderer, n);
|
||||
break;
|
||||
default:
|
||||
CV_StealthSetValue(&cv_newrenderer, cv_renderer.value);
|
||||
}
|
||||
}
|
||||
|
||||
static void Newrenderer_OnChange(void)
|
||||
{
|
||||
#if 0
|
||||
/* Well this works for now because there's only two options. */
|
||||
int n;
|
||||
n = cv_newrenderer.value;
|
||||
newrenderer_set |= cv_renderer.value;
|
||||
if (( newrenderer_set & n ))
|
||||
CV_SetValue(&cv_renderer, n);
|
||||
else
|
||||
{
|
||||
M_StartMessage(
|
||||
"The OpenGL renderer is incomplete.\n"
|
||||
"Some visuals may fail to appear, or\n"
|
||||
"appear incorrectly.\n"
|
||||
"Do you still want to switch to it?\n"
|
||||
"\n"
|
||||
"(Press 'y' or 'n')",
|
||||
Newrenderer_AREYOUSURE, MM_YESNO
|
||||
);
|
||||
}
|
||||
#else
|
||||
// SRB2Kart: don't want the warning
|
||||
CV_SetValue(&cv_renderer, n);
|
||||
#endif
|
||||
}
|
||||
#endif/*HWRENDER*/
|
||||
|
||||
void Screenshot_option_Onchange(void)
|
||||
{
|
||||
OP_ScreenshotOptionsMenu[op_screenshot_folder].status =
|
||||
|
|
@ -2327,7 +2329,7 @@ static void M_ChangeCvar(INT32 choice)
|
|||
|
||||
if (choice == -1)
|
||||
{
|
||||
if (cv == &cv_playercolor)
|
||||
if (cv == &cv_playercolor[0])
|
||||
{
|
||||
SINT8 skinno = R_SkinAvailable(cv_chooseskin.string);
|
||||
if (skinno != -1)
|
||||
|
|
@ -2513,7 +2515,7 @@ boolean M_Responder(event_t *ev)
|
|||
{
|
||||
if (ev->type == ev_joystick && ev->data1 == 0 && joywait < I_GetTime())
|
||||
{
|
||||
const INT32 jdeadzone = ((JOYAXISRANGE-1) * cv_deadzone.value) >> FRACBITS;
|
||||
const INT32 jdeadzone = ((JOYAXISRANGE-1) * cv_deadzone[0].value) >> FRACBITS;
|
||||
if (ev->data3 != INT32_MAX)
|
||||
{
|
||||
if (Joystick.bGamepadStyle || abs(ev->data3) > jdeadzone)
|
||||
|
|
@ -2699,8 +2701,11 @@ boolean M_Responder(event_t *ev)
|
|||
else
|
||||
{
|
||||
// dirty hack: for customising controls, I want only buttons/keys, not moves
|
||||
if (ev->type == ev_mouse || ev->type == ev_mouse2 || ev->type == ev_joystick
|
||||
|| ev->type == ev_joystick2 || ev->type == ev_joystick3 || ev->type == ev_joystick4)
|
||||
if (ev->type == ev_mouse
|
||||
|| ev->type == ev_joystick
|
||||
|| ev->type == ev_joystick2
|
||||
|| ev->type == ev_joystick3
|
||||
|| ev->type == ev_joystick4)
|
||||
return true;
|
||||
if (routine)
|
||||
{
|
||||
|
|
@ -4229,7 +4234,7 @@ static void M_PatchSkinNameTable(void)
|
|||
}
|
||||
}
|
||||
|
||||
j = R_SkinAvailable(cv_skin.string);
|
||||
j = R_SkinAvailable(cv_skin[0].string);
|
||||
if (j == -1)
|
||||
j = 0;
|
||||
|
||||
|
|
@ -4306,22 +4311,7 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt)
|
|||
if (M_MapLocked(mapnum+1))
|
||||
return false; // not unlocked
|
||||
|
||||
/*if (gt == GT_COOP && (mapheaderinfo[mapnum]->typeoflevel & TOL_COOP))
|
||||
return true;
|
||||
|
||||
if (gt == GT_COMPETITION && (mapheaderinfo[mapnum]->typeoflevel & TOL_COMPETITION))
|
||||
return true;
|
||||
|
||||
if (gt == GT_CTF && (mapheaderinfo[mapnum]->typeoflevel & TOL_CTF))
|
||||
return true;
|
||||
|
||||
if ((gt == GT_TAG || gt == GT_HIDEANDSEEK) && (mapheaderinfo[mapnum]->typeoflevel & TOL_TAG))
|
||||
return true;*/
|
||||
|
||||
if ((gt == GT_MATCH || gt == GT_TEAMMATCH) && (mapheaderinfo[mapnum]->typeoflevel & TOL_MATCH))
|
||||
return true;
|
||||
|
||||
if (gt == GT_RACE && (mapheaderinfo[mapnum]->typeoflevel & TOL_RACE))
|
||||
if (mapheaderinfo[mapnum]->typeoflevel & gametypetol[gt])
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
|
@ -4340,7 +4330,7 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt)
|
|||
return false;*/
|
||||
|
||||
if ((levellistmode == LLM_TIMEATTACK && !(mapheaderinfo[mapnum]->typeoflevel & TOL_RACE))
|
||||
|| (levellistmode == LLM_BREAKTHECAPSULES && !(mapheaderinfo[mapnum]->typeoflevel & TOL_MATCH)))
|
||||
|| (levellistmode == LLM_BREAKTHECAPSULES && !(mapheaderinfo[mapnum]->typeoflevel & TOL_BATTLE)))
|
||||
return false;
|
||||
|
||||
if (M_MapLocked(mapnum+1))
|
||||
|
|
@ -7706,7 +7696,7 @@ void M_DrawTimeAttackMenu(void)
|
|||
// Character face!
|
||||
if (W_CheckNumForName(skins[cv_chooseskin.value-1].facewant) != LUMPERROR)
|
||||
{
|
||||
UINT8 *colormap = R_GetTranslationColormap(cv_chooseskin.value-1, cv_playercolor.value, GTC_MENUCACHE);
|
||||
UINT8 *colormap = R_GetTranslationColormap(cv_chooseskin.value-1, cv_playercolor[0].value, GTC_MENUCACHE);
|
||||
V_DrawMappedPatch(BASEVIDWIDTH-x - SHORT(facewantprefix[cv_chooseskin.value-1]->width), y, 0, facewantprefix[cv_chooseskin.value-1], colormap);
|
||||
}
|
||||
|
||||
|
|
@ -9088,25 +9078,8 @@ Update the maxplayers label...
|
|||
|
||||
while (++i <= 4)
|
||||
{
|
||||
switch (i)
|
||||
{
|
||||
default:
|
||||
pskin = R_SkinAvailable(cv_skin.string);
|
||||
pcol = cv_playercolor.value;
|
||||
break;
|
||||
case 2:
|
||||
pskin = R_SkinAvailable(cv_skin2.string);
|
||||
pcol = cv_playercolor2.value;
|
||||
break;
|
||||
case 3:
|
||||
pskin = R_SkinAvailable(cv_skin3.string);
|
||||
pcol = cv_playercolor3.value;
|
||||
break;
|
||||
case 4:
|
||||
pskin = R_SkinAvailable(cv_skin4.string);
|
||||
pcol = cv_playercolor4.value;
|
||||
break;
|
||||
}
|
||||
pskin = R_SkinAvailable(cv_skin[i-1].string);
|
||||
pcol = cv_playercolor[i-1].value;
|
||||
|
||||
if (pskin >= MAXSKINS)
|
||||
pskin = 0;
|
||||
|
|
@ -9411,8 +9384,8 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
|||
|
||||
// draw the name of the color you have chosen
|
||||
// Just so people don't go thinking that "Default" is Green.
|
||||
st = V_StringWidth(KartColor_Names[setupm_fakecolor], 0);
|
||||
V_DrawString(BASEVIDWIDTH - mx - st, my + 152, highlightflags|V_ALLOWLOWERCASE, KartColor_Names[setupm_fakecolor]); // SRB2kart
|
||||
st = V_StringWidth(skincolors[setupm_fakecolor].name, 0);
|
||||
V_DrawString(BASEVIDWIDTH - mx - st, my + 152, highlightflags|V_ALLOWLOWERCASE, skincolors[setupm_fakecolor].name); // SRB2kart
|
||||
if (itemOn == 3)
|
||||
{
|
||||
V_DrawCharacter(BASEVIDWIDTH - mx - 10 - st - (skullAnimCounter/5), my + 152,
|
||||
|
|
@ -9468,7 +9441,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
|||
UINT8 h;
|
||||
|
||||
while (col < 1)
|
||||
col += MAXSKINCOLORS-1;
|
||||
col += numskincolors-1;
|
||||
while (j <= colwidth)
|
||||
{
|
||||
if (!(j++))
|
||||
|
|
@ -9476,9 +9449,9 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
|||
else
|
||||
w = indexwidth;
|
||||
for (h = 0; h < 16; h++)
|
||||
V_DrawFill(x, my+162+h, w, 1, colortranslations[col][h]);
|
||||
if (++col >= MAXSKINCOLORS)
|
||||
col -= MAXSKINCOLORS-1;
|
||||
V_DrawFill(x, my+162+h, w, 1, skincolors[col].ramp[h]);
|
||||
if (++col >= numskincolors)
|
||||
col -= numskincolors-1;
|
||||
x += w;
|
||||
}
|
||||
}
|
||||
|
|
@ -9794,8 +9767,8 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
|
|||
|
||||
// check color
|
||||
if (setupm_fakecolor < 1)
|
||||
setupm_fakecolor = MAXSKINCOLORS-1;
|
||||
if (setupm_fakecolor > MAXSKINCOLORS-1)
|
||||
setupm_fakecolor = numskincolors-1;
|
||||
if (setupm_fakecolor > numskincolors-1)
|
||||
setupm_fakecolor = 1;
|
||||
|
||||
if (exitmenu)
|
||||
|
|
@ -10052,7 +10025,8 @@ static void M_ScreenshotOptions(INT32 choice)
|
|||
|
||||
static void M_DrawJoystick(void)
|
||||
{
|
||||
INT32 i, compareval4, compareval3, compareval2, compareval;
|
||||
INT32 i;
|
||||
INT32 compareval[MAXSPLITSCREENPLAYERS];
|
||||
|
||||
M_DrawGenericMenu();
|
||||
|
||||
|
|
@ -10062,47 +10036,24 @@ static void M_DrawJoystick(void)
|
|||
//M_DrawSaveLoadBorder(OP_JoystickSetDef.x, OP_JoystickSetDef.y+LINEHEIGHT*i);
|
||||
|
||||
#ifdef JOYSTICK_HOTPLUG
|
||||
if (atoi(cv_usejoystick4.string) > I_NumJoys())
|
||||
compareval4 = atoi(cv_usejoystick4.string);
|
||||
if (atoi(cv_usejoystick[setupcontrolplayer-1].string) > I_NumJoys())
|
||||
compareval = atoi(cv_usejoystick[setupcontrolplayer-1].string);
|
||||
else
|
||||
compareval4 = cv_usejoystick4.value;
|
||||
|
||||
if (atoi(cv_usejoystick3.string) > I_NumJoys())
|
||||
compareval3 = atoi(cv_usejoystick3.string);
|
||||
else
|
||||
compareval3 = cv_usejoystick3.value;
|
||||
|
||||
if (atoi(cv_usejoystick2.string) > I_NumJoys())
|
||||
compareval2 = atoi(cv_usejoystick2.string);
|
||||
else
|
||||
compareval2 = cv_usejoystick2.value;
|
||||
|
||||
if (atoi(cv_usejoystick.string) > I_NumJoys())
|
||||
compareval = atoi(cv_usejoystick.string);
|
||||
else
|
||||
compareval = cv_usejoystick.value;
|
||||
#else
|
||||
compareval4 = cv_usejoystick4.value;
|
||||
compareval3 = cv_usejoystick3.value;
|
||||
compareval2 = cv_usejoystick2.value;
|
||||
compareval = cv_usejoystick.value
|
||||
#endif
|
||||
compareval = cv_usejoystick[setupcontrolplayer-1].value;
|
||||
|
||||
if ((setupcontrolplayer == 4 && (i == compareval4))
|
||||
|| (setupcontrolplayer == 3 && (i == compareval3))
|
||||
|| (setupcontrolplayer == 2 && (i == compareval2))
|
||||
|| (setupcontrolplayer == 1 && (i == compareval)))
|
||||
V_DrawString(OP_JoystickSetDef.x, OP_JoystickSetDef.y+LINEHEIGHT*i-4,V_GREENMAP,joystickInfo[i]);
|
||||
else
|
||||
V_DrawString(OP_JoystickSetDef.x, OP_JoystickSetDef.y+LINEHEIGHT*i-4,0,joystickInfo[i]);
|
||||
V_DrawString(OP_JoystickSetDef.x, OP_JoystickSetDef.y+LINEHEIGHT*i-4, (i == compareval) ? V_GREENMAP : 0, joystickInfo[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void M_SetupJoystickMenu(INT32 choice)
|
||||
{
|
||||
INT32 i = 0;
|
||||
const char *joyNA = "Unavailable";
|
||||
INT32 n = I_NumJoys();
|
||||
const INT32 n = I_NumJoys();
|
||||
|
||||
INT32 i = 0;
|
||||
INT32 j;
|
||||
|
||||
(void)choice;
|
||||
|
||||
strcpy(joystickInfo[i], "None");
|
||||
|
|
@ -10123,14 +10074,11 @@ void M_SetupJoystickMenu(INT32 choice)
|
|||
//
|
||||
// Update cv_usejoystick.string here so that the user can
|
||||
// properly change this value.
|
||||
if (i == cv_usejoystick.value)
|
||||
CV_SetValue(&cv_usejoystick, i);
|
||||
if (i == cv_usejoystick2.value)
|
||||
CV_SetValue(&cv_usejoystick2, i);
|
||||
if (i == cv_usejoystick3.value)
|
||||
CV_SetValue(&cv_usejoystick3, i);
|
||||
if (i == cv_usejoystick4.value)
|
||||
CV_SetValue(&cv_usejoystick4, i);
|
||||
for (j = 0; j < MAXSPLITSCREENPLAYERS; j++)
|
||||
{
|
||||
if (i == cv_usejoystick[j].value)
|
||||
CV_SetValue(&cv_usejoystick[j], i);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -10167,139 +10115,41 @@ static void M_Setup4PJoystickMenu(INT32 choice)
|
|||
|
||||
static void M_AssignJoystick(INT32 choice)
|
||||
{
|
||||
const UINT8 p = setupcontrolplayer-1;
|
||||
|
||||
#ifdef JOYSTICK_HOTPLUG
|
||||
INT32 oldchoice, oldstringchoice;
|
||||
INT32 numjoys = I_NumJoys();
|
||||
|
||||
if (setupcontrolplayer == 4)
|
||||
oldchoice = oldstringchoice = atoi(cv_usejoystick[p].string) > numjoys ? atoi(cv_usejoystick[p].string) : cv_usejoystick[p].value;
|
||||
CV_SetValue(&cv_usejoystick[p], choice);
|
||||
|
||||
// Just in case last-minute changes were made to cv_usejoystick.value,
|
||||
// update the string too
|
||||
// But don't do this if we're intentionally setting higher than numjoys
|
||||
if (choice <= numjoys)
|
||||
{
|
||||
oldchoice = oldstringchoice = atoi(cv_usejoystick4.string) > numjoys ? atoi(cv_usejoystick4.string) : cv_usejoystick4.value;
|
||||
CV_SetValue(&cv_usejoystick4, choice);
|
||||
CV_SetValue(&cv_usejoystick[p], cv_usejoystick[p].value);
|
||||
|
||||
// Just in case last-minute changes were made to cv_usejoystick.value,
|
||||
// update the string too
|
||||
// But don't do this if we're intentionally setting higher than numjoys
|
||||
if (choice <= numjoys)
|
||||
// reset this so the comparison is valid
|
||||
if (oldchoice > numjoys)
|
||||
oldchoice = cv_usejoystick[p].value;
|
||||
|
||||
if (oldchoice != choice)
|
||||
{
|
||||
CV_SetValue(&cv_usejoystick4, cv_usejoystick4.value);
|
||||
if (choice && oldstringchoice > numjoys) // if we did not select "None", we likely selected a used device
|
||||
CV_SetValue(&cv_usejoystick[p], (oldstringchoice > numjoys ? oldstringchoice : oldchoice));
|
||||
|
||||
// reset this so the comparison is valid
|
||||
if (oldchoice > numjoys)
|
||||
oldchoice = cv_usejoystick4.value;
|
||||
|
||||
if (oldchoice != choice)
|
||||
{
|
||||
if (choice && oldstringchoice > numjoys) // if we did not select "None", we likely selected a used device
|
||||
CV_SetValue(&cv_usejoystick4, (oldstringchoice > numjoys ? oldstringchoice : oldchoice));
|
||||
|
||||
if (oldstringchoice ==
|
||||
(atoi(cv_usejoystick4.string) > numjoys ? atoi(cv_usejoystick4.string) : cv_usejoystick4.value))
|
||||
M_StartMessage("This joystick is used by another\n"
|
||||
"player. Reset the joystick\n"
|
||||
"for that player first.\n\n"
|
||||
"(Press a key)\n", NULL, MM_NOTHING);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (setupcontrolplayer == 3)
|
||||
{
|
||||
oldchoice = oldstringchoice = atoi(cv_usejoystick3.string) > numjoys ? atoi(cv_usejoystick3.string) : cv_usejoystick3.value;
|
||||
CV_SetValue(&cv_usejoystick3, choice);
|
||||
|
||||
// Just in case last-minute changes were made to cv_usejoystick.value,
|
||||
// update the string too
|
||||
// But don't do this if we're intentionally setting higher than numjoys
|
||||
if (choice <= numjoys)
|
||||
{
|
||||
CV_SetValue(&cv_usejoystick3, cv_usejoystick3.value);
|
||||
|
||||
// reset this so the comparison is valid
|
||||
if (oldchoice > numjoys)
|
||||
oldchoice = cv_usejoystick3.value;
|
||||
|
||||
if (oldchoice != choice)
|
||||
{
|
||||
if (choice && oldstringchoice > numjoys) // if we did not select "None", we likely selected a used device
|
||||
CV_SetValue(&cv_usejoystick3, (oldstringchoice > numjoys ? oldstringchoice : oldchoice));
|
||||
|
||||
if (oldstringchoice ==
|
||||
(atoi(cv_usejoystick3.string) > numjoys ? atoi(cv_usejoystick3.string) : cv_usejoystick3.value))
|
||||
M_StartMessage("This joystick is used by another\n"
|
||||
"player. Reset the joystick\n"
|
||||
"for that player first.\n\n"
|
||||
"(Press a key)\n", NULL, MM_NOTHING);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (setupcontrolplayer == 2)
|
||||
{
|
||||
oldchoice = oldstringchoice = atoi(cv_usejoystick2.string) > numjoys ? atoi(cv_usejoystick2.string) : cv_usejoystick2.value;
|
||||
CV_SetValue(&cv_usejoystick2, choice);
|
||||
|
||||
// Just in case last-minute changes were made to cv_usejoystick.value,
|
||||
// update the string too
|
||||
// But don't do this if we're intentionally setting higher than numjoys
|
||||
if (choice <= numjoys)
|
||||
{
|
||||
CV_SetValue(&cv_usejoystick2, cv_usejoystick2.value);
|
||||
|
||||
// reset this so the comparison is valid
|
||||
if (oldchoice > numjoys)
|
||||
oldchoice = cv_usejoystick2.value;
|
||||
|
||||
if (oldchoice != choice)
|
||||
{
|
||||
if (choice && oldstringchoice > numjoys) // if we did not select "None", we likely selected a used device
|
||||
CV_SetValue(&cv_usejoystick2, (oldstringchoice > numjoys ? oldstringchoice : oldchoice));
|
||||
|
||||
if (oldstringchoice ==
|
||||
(atoi(cv_usejoystick2.string) > numjoys ? atoi(cv_usejoystick2.string) : cv_usejoystick2.value))
|
||||
M_StartMessage("This joystick is used by another\n"
|
||||
"player. Reset the joystick\n"
|
||||
"for that player first.\n\n"
|
||||
"(Press a key)\n", NULL, MM_NOTHING);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (setupcontrolplayer == 1)
|
||||
{
|
||||
oldchoice = oldstringchoice = atoi(cv_usejoystick.string) > numjoys ? atoi(cv_usejoystick.string) : cv_usejoystick.value;
|
||||
CV_SetValue(&cv_usejoystick, choice);
|
||||
|
||||
// Just in case last-minute changes were made to cv_usejoystick.value,
|
||||
// update the string too
|
||||
// But don't do this if we're intentionally setting higher than numjoys
|
||||
if (choice <= numjoys)
|
||||
{
|
||||
CV_SetValue(&cv_usejoystick, cv_usejoystick.value);
|
||||
|
||||
// reset this so the comparison is valid
|
||||
if (oldchoice > numjoys)
|
||||
oldchoice = cv_usejoystick.value;
|
||||
|
||||
if (oldchoice != choice)
|
||||
{
|
||||
if (choice && oldstringchoice > numjoys) // if we did not select "None", we likely selected a used device
|
||||
CV_SetValue(&cv_usejoystick, (oldstringchoice > numjoys ? oldstringchoice : oldchoice));
|
||||
|
||||
if (oldstringchoice ==
|
||||
(atoi(cv_usejoystick.string) > numjoys ? atoi(cv_usejoystick.string) : cv_usejoystick.value))
|
||||
M_StartMessage("This joystick is used by another\n"
|
||||
"player. Reset the joystick\n"
|
||||
"for that player first.\n\n"
|
||||
"(Press a key)\n", NULL, MM_NOTHING);
|
||||
}
|
||||
if (oldstringchoice ==
|
||||
(atoi(cv_usejoystick[p].string) > numjoys ? atoi(cv_usejoystick[p].string) : cv_usejoystick[p].value))
|
||||
M_StartMessage("This joystick is used by another\n"
|
||||
"player. Reset the joystick\n"
|
||||
"for that player first.\n\n"
|
||||
"(Press a key)\n", NULL, MM_NOTHING);
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (setupcontrolplayer == 4)
|
||||
CV_SetValue(&cv_usejoystick4, choice);
|
||||
else if (setupcontrolplayer == 3)
|
||||
CV_SetValue(&cv_usejoystick3, choice);
|
||||
else if (setupcontrolplayer == 2)
|
||||
CV_SetValue(&cv_usejoystick2, choice);
|
||||
else if (setupcontrolplayer == 1)
|
||||
CV_SetValue(&cv_usejoystick, choice);
|
||||
CV_SetValue(&cv_usejoystick[p], choice);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -10568,7 +10418,6 @@ static void M_ChangecontrolResponse(event_t *ev)
|
|||
{
|
||||
// ignore mouse/joy movements, just get buttons
|
||||
case ev_mouse:
|
||||
case ev_mouse2:
|
||||
case ev_joystick:
|
||||
case ev_joystick2:
|
||||
case ev_joystick3:
|
||||
|
|
@ -10669,6 +10518,7 @@ static void M_ChangeControl(INT32 choice)
|
|||
|
||||
static void M_ResetControlsResponse(INT32 ch)
|
||||
{
|
||||
const UINT8 p = setupcontrolplayer-1;
|
||||
INT32 i;
|
||||
|
||||
if (ch != 'y' && ch != KEY_ENTER)
|
||||
|
|
@ -10677,72 +10527,21 @@ static void M_ResetControlsResponse(INT32 ch)
|
|||
// clear all controls
|
||||
for (i = 0; i < num_gamecontrols; i++)
|
||||
{
|
||||
switch (setupcontrolplayer)
|
||||
{
|
||||
case 4:
|
||||
G_ClearControlKeys(gamecontrol[3], i);
|
||||
break;
|
||||
case 3:
|
||||
G_ClearControlKeys(gamecontrol[2], i);
|
||||
break;
|
||||
case 2:
|
||||
G_ClearControlKeys(gamecontrol[1], i);
|
||||
break;
|
||||
case 1:
|
||||
default:
|
||||
G_ClearControlKeys(gamecontrol[0], i);
|
||||
break;
|
||||
}
|
||||
G_ClearControlKeys(gamecontrol[p], i);
|
||||
}
|
||||
|
||||
// Setup original defaults
|
||||
G_Controldefault(setupcontrolplayer);
|
||||
|
||||
// Setup gamepad option defaults (yucky)
|
||||
switch (setupcontrolplayer)
|
||||
{
|
||||
case 4:
|
||||
CV_StealthSet(&cv_usejoystick4, cv_usejoystick4.defaultvalue);
|
||||
CV_StealthSet(&cv_turnaxis4, cv_turnaxis4.defaultvalue);
|
||||
CV_StealthSet(&cv_moveaxis4, cv_moveaxis4.defaultvalue);
|
||||
CV_StealthSet(&cv_brakeaxis4, cv_brakeaxis4.defaultvalue);
|
||||
CV_StealthSet(&cv_aimaxis4, cv_aimaxis4.defaultvalue);
|
||||
CV_StealthSet(&cv_lookaxis4, cv_lookaxis4.defaultvalue);
|
||||
CV_StealthSet(&cv_fireaxis4, cv_fireaxis4.defaultvalue);
|
||||
CV_StealthSet(&cv_driftaxis4, cv_driftaxis4.defaultvalue);
|
||||
break;
|
||||
case 3:
|
||||
CV_StealthSet(&cv_usejoystick3, cv_usejoystick3.defaultvalue);
|
||||
CV_StealthSet(&cv_turnaxis3, cv_turnaxis3.defaultvalue);
|
||||
CV_StealthSet(&cv_moveaxis3, cv_moveaxis3.defaultvalue);
|
||||
CV_StealthSet(&cv_brakeaxis3, cv_brakeaxis3.defaultvalue);
|
||||
CV_StealthSet(&cv_aimaxis3, cv_aimaxis3.defaultvalue);
|
||||
CV_StealthSet(&cv_lookaxis3, cv_lookaxis3.defaultvalue);
|
||||
CV_StealthSet(&cv_fireaxis3, cv_fireaxis3.defaultvalue);
|
||||
CV_StealthSet(&cv_driftaxis3, cv_driftaxis3.defaultvalue);
|
||||
break;
|
||||
case 2:
|
||||
CV_StealthSet(&cv_usejoystick2, cv_usejoystick2.defaultvalue);
|
||||
CV_StealthSet(&cv_turnaxis2, cv_turnaxis2.defaultvalue);
|
||||
CV_StealthSet(&cv_moveaxis2, cv_moveaxis2.defaultvalue);
|
||||
CV_StealthSet(&cv_brakeaxis2, cv_brakeaxis2.defaultvalue);
|
||||
CV_StealthSet(&cv_aimaxis2, cv_aimaxis2.defaultvalue);
|
||||
CV_StealthSet(&cv_lookaxis2, cv_lookaxis2.defaultvalue);
|
||||
CV_StealthSet(&cv_fireaxis2, cv_fireaxis2.defaultvalue);
|
||||
CV_StealthSet(&cv_driftaxis2, cv_driftaxis2.defaultvalue);
|
||||
break;
|
||||
case 1:
|
||||
default:
|
||||
CV_StealthSet(&cv_usejoystick, cv_usejoystick.defaultvalue);
|
||||
CV_StealthSet(&cv_turnaxis, cv_turnaxis.defaultvalue);
|
||||
CV_StealthSet(&cv_moveaxis, cv_moveaxis.defaultvalue);
|
||||
CV_StealthSet(&cv_brakeaxis, cv_brakeaxis.defaultvalue);
|
||||
CV_StealthSet(&cv_aimaxis, cv_aimaxis.defaultvalue);
|
||||
CV_StealthSet(&cv_lookaxis, cv_lookaxis.defaultvalue);
|
||||
CV_StealthSet(&cv_fireaxis, cv_fireaxis.defaultvalue);
|
||||
CV_StealthSet(&cv_driftaxis, cv_driftaxis.defaultvalue);
|
||||
break;
|
||||
}
|
||||
CV_StealthSet(&cv_usejoystick[p], cv_usejoystick[p].defaultvalue);
|
||||
CV_StealthSet(&cv_turnaxis[p], cv_turnaxis[p].defaultvalue);
|
||||
CV_StealthSet(&cv_moveaxis[p], cv_moveaxis[p].defaultvalue);
|
||||
CV_StealthSet(&cv_brakeaxis[p], cv_brakeaxis[p].defaultvalue);
|
||||
CV_StealthSet(&cv_aimaxis[p], cv_aimaxis[p].defaultvalue);
|
||||
CV_StealthSet(&cv_lookaxis[p], cv_lookaxis[p].defaultvalue);
|
||||
CV_StealthSet(&cv_fireaxis[p], cv_fireaxis[p].defaultvalue);
|
||||
CV_StealthSet(&cv_driftaxis[p], cv_driftaxis[p].defaultvalue);
|
||||
|
||||
S_StartSound(NULL, sfx_s224);
|
||||
}
|
||||
|
|
|
|||
10
src/m_misc.c
10
src/m_misc.c
|
|
@ -106,7 +106,6 @@ consvar_t cv_screenshot_option = {"screenshot_option", "Default", CV_SAVE|CV_CAL
|
|||
consvar_t cv_screenshot_folder = {"screenshot_folder", "", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_screenshot_colorprofile = {"screenshot_colorprofile", "Yes", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
>>>>>>> srb2/next
|
||||
|
||||
static CV_PossibleValue_t moviemode_cons_t[] = {{MM_GIF, "GIF"}, {MM_APNG, "aPNG"}, {MM_SCREENSHOT, "Screenshots"}, {0, NULL}};
|
||||
consvar_t cv_moviemode = {"moviemode_mode", "GIF", CV_SAVE|CV_CALL, moviemode_cons_t, Moviemode_mode_Onchange, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
|
@ -572,10 +571,11 @@ void M_FirstLoadConfig(void)
|
|||
gameconfig_loaded = true;
|
||||
|
||||
// reset to default player stuff
|
||||
COM_BufAddText (va("%s \"%s\"\n",cv_skin.name,cv_defaultskin.string));
|
||||
COM_BufAddText (va("%s \"%s\"\n",cv_playercolor.name,cv_defaultplayercolor.string));
|
||||
COM_BufAddText (va("%s \"%s\"\n",cv_skin2.name,cv_defaultskin2.string));
|
||||
COM_BufAddText (va("%s \"%s\"\n",cv_playercolor2.name,cv_defaultplayercolor2.string));
|
||||
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||
{
|
||||
COM_BufAddText (va("%s \"%s\"\n",cv_skin[i].name,cv_skin[i].defaultvalue));
|
||||
COM_BufAddText (va("%s \"%s\"\n",cv_playercolor[i].name,cv_skin[i].defaultvalue));
|
||||
}
|
||||
}
|
||||
|
||||
/** Saves the game configuration.
|
||||
|
|
|
|||
|
|
@ -804,7 +804,7 @@ static int P_RecycleCompare(const void *p1, const void *p2)
|
|||
player_t *player2 = &players[*(const UINT8 *)p2];
|
||||
|
||||
// Non-shooting gametypes
|
||||
if (!G_RaceGametype())
|
||||
if (!(gametyperules & GTR_CIRCUIT))
|
||||
{
|
||||
// Invincibility.
|
||||
if (player1->powers[pw_invulnerability] > player2->powers[pw_invulnerability]) return -1;
|
||||
|
|
@ -5083,7 +5083,7 @@ static inline boolean PIT_GrenadeRing(mobj_t *thing)
|
|||
return true;
|
||||
|
||||
if (thing->player && (thing->player->kartstuff[k_hyudorotimer]
|
||||
|| (G_BattleGametype() && thing->player && thing->player->kartstuff[k_bumper] <= 0 && thing->player->kartstuff[k_comebacktimer])))
|
||||
|| ((gametyperules & GTR_BUMPERS) && thing->player && thing->player->kartstuff[k_bumper] <= 0 && thing->player->kartstuff[k_comebacktimer])))
|
||||
return true;
|
||||
|
||||
if ((gametype == GT_CTF || gametype == GT_TEAMMATCH)
|
||||
|
|
@ -5110,10 +5110,9 @@ void A_GrenadeRing(mobj_t *actor)
|
|||
{
|
||||
INT32 bx, by, xl, xh, yl, yh;
|
||||
explodedist = FixedMul(actor->info->painchance, mapobjectscale);
|
||||
#ifdef HAVE_BLUA
|
||||
|
||||
if (LUA_CallAction("A_GrenadeRing", actor))
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (actor->flags2 & MF2_DEBRIS)
|
||||
return;
|
||||
|
|
@ -5154,7 +5153,7 @@ static inline boolean PIT_MineExplode(mobj_t *thing)
|
|||
if (netgame && thing->player && thing->player->spectator)
|
||||
return true;
|
||||
|
||||
if (G_BattleGametype() && grenade->target && grenade->target->player && grenade->target->player->kartstuff[k_bumper] <= 0 && thing == grenade->target)
|
||||
if ((gametyperules & GTR_BUMPERS) && grenade->target && grenade->target->player && grenade->target->player->kartstuff[k_bumper] <= 0 && thing == grenade->target)
|
||||
return true;
|
||||
|
||||
// see if it went over / under
|
||||
|
|
@ -5182,10 +5181,9 @@ void A_MineExplode(mobj_t *actor)
|
|||
INT32 locvar1 = var1;
|
||||
mobjtype_t type;
|
||||
explodedist = FixedMul((3*actor->info->painchance)/2, mapobjectscale);
|
||||
#ifdef HAVE_BLUA
|
||||
|
||||
if (LUA_CallAction("A_MineExplode", actor))
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (actor->flags2 & MF2_DEBRIS)
|
||||
return;
|
||||
|
|
@ -6629,9 +6627,8 @@ void A_MixUp(mobj_t *actor)
|
|||
if (!multiplayer)
|
||||
return;
|
||||
|
||||
// No mix-up monitors in hide and seek or time only race.
|
||||
// The random factor is okay for other game modes, but in these, it is cripplingly unfair.
|
||||
if (gametype == GT_HIDEANDSEEK || gametype == GT_RACE)
|
||||
if (gametyperules & GTR_CIRCUIT)
|
||||
{
|
||||
S_StartSound(actor, sfx_lose);
|
||||
return;
|
||||
|
|
@ -9494,12 +9491,12 @@ void A_ItemPop(mobj_t *actor)
|
|||
if (actor->info->deathsound)
|
||||
S_StartSound(remains, actor->info->deathsound);
|
||||
|
||||
if (!(G_BattleGametype() && actor->target->player->kartstuff[k_bumper] <= 0))
|
||||
if (!((gametyperules & GTR_BUMPERS) && actor->target->player->kartstuff[k_bumper] <= 0))
|
||||
actor->target->player->kartstuff[k_itemroulette] = 1;
|
||||
|
||||
remains->flags2 &= ~MF2_AMBUSH;
|
||||
|
||||
if (G_BattleGametype() && (actor->threshold != 69 && actor->threshold != 70))
|
||||
if ((gametyperules & GTR_BUMPERS) && (actor->threshold != 69 && actor->threshold != 70))
|
||||
numgotboxes++;
|
||||
|
||||
P_RemoveMobj(actor);
|
||||
|
|
@ -9512,14 +9509,13 @@ void A_JawzChase(mobj_t *actor)
|
|||
fixed_t thrustamount = 0;
|
||||
fixed_t frictionsafety = (actor->friction == 0) ? 1 : actor->friction;
|
||||
fixed_t topspeed = actor->movefactor;
|
||||
#ifdef HAVE_BLUA
|
||||
|
||||
if (LUA_CallAction("A_JawzChase", actor))
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (actor->tracer)
|
||||
{
|
||||
/*if (G_RaceGametype()) // Stop looking after first target in race
|
||||
/*if ((gametyperules & GTR_CIRCUIT)) // Stop looking after first target in race
|
||||
actor->extravalue1 = 1;*/
|
||||
|
||||
if (actor->tracer->health)
|
||||
|
|
@ -9529,7 +9525,7 @@ void A_JawzChase(mobj_t *actor)
|
|||
angle_t angledelta = actor->angle - targetangle;
|
||||
boolean turnclockwise = true;
|
||||
|
||||
if (G_RaceGametype())
|
||||
if ((gametyperules & GTR_CIRCUIT))
|
||||
{
|
||||
const fixed_t distbarrier = FixedMul(512*mapobjectscale, FRACUNIT + ((gamespeed-1) * (FRACUNIT/4)));
|
||||
const fixed_t distaway = P_AproxDistance(actor->tracer->x - actor->x, actor->tracer->y - actor->y);
|
||||
|
|
@ -9636,10 +9632,8 @@ void A_JawzExplode(mobj_t *actor)
|
|||
INT32 shrapnel = 2;
|
||||
mobj_t *truc;
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_CallAction("A_JawzExplode", actor))
|
||||
return;
|
||||
#endif
|
||||
|
||||
truc = P_SpawnMobj(actor->x, actor->y, actor->z, MT_BOOMEXPLODE);
|
||||
truc->scale = actor->scale*2;
|
||||
|
|
@ -9791,10 +9785,8 @@ void A_SPBChase(mobj_t *actor)
|
|||
fixed_t pdist = 1536<<FRACBITS; // best player distance when seeking
|
||||
angle_t pangle; // angle between us and the player
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_CallAction("A_SPBChase", actor))
|
||||
return;
|
||||
#endif
|
||||
|
||||
// Default speed
|
||||
wspeed = FixedMul(mapobjectscale, K_GetKartSpeedFromStat(5)*2); // Go at twice the average speed a player would be going at!
|
||||
|
|
@ -10178,10 +10170,9 @@ void A_SPBChase(mobj_t *actor)
|
|||
void A_BallhogExplode(mobj_t *actor)
|
||||
{
|
||||
mobj_t *mo2;
|
||||
#ifdef HAVE_BLUA
|
||||
|
||||
if (LUA_CallAction("A_BallhogExplode", actor))
|
||||
return;
|
||||
#endif
|
||||
|
||||
mo2 = P_SpawnMobj(actor->x, actor->y, actor->z, MT_BALLHOGBOOM);
|
||||
P_SetScale(mo2, actor->scale*2);
|
||||
|
|
@ -10195,10 +10186,10 @@ void A_BallhogExplode(mobj_t *actor)
|
|||
void A_LightningFollowPlayer(mobj_t *actor)
|
||||
{
|
||||
fixed_t sx, sy;
|
||||
#ifdef HAVE_BLUA
|
||||
|
||||
if (LUA_CallAction("A_LightningFollowPlayer", actor))
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (!actor->target)
|
||||
return;
|
||||
|
||||
|
|
@ -10224,10 +10215,10 @@ void A_LightningFollowPlayer(mobj_t *actor)
|
|||
void A_FZBoomFlash(mobj_t *actor)
|
||||
{
|
||||
UINT8 i;
|
||||
#ifdef HAVE_BLUA
|
||||
|
||||
if (LUA_CallAction("A_FZBoomFlash", actor))
|
||||
return;
|
||||
#endif
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
fixed_t dist;
|
||||
|
|
@ -10247,10 +10238,10 @@ void A_FZBoomSmoke(mobj_t *actor)
|
|||
{
|
||||
INT32 i;
|
||||
INT32 rad = 47+(23*var1);
|
||||
#ifdef HAVE_BLUA
|
||||
|
||||
if (LUA_CallAction("A_FZBoomSmoke", actor))
|
||||
return;
|
||||
#endif
|
||||
|
||||
for (i = 0; i < 8+(4*var1); i++)
|
||||
{
|
||||
mobj_t *smoke = P_SpawnMobj(actor->x + (P_RandomRange(-rad, rad)*actor->scale), actor->y + (P_RandomRange(-rad, rad)*actor->scale),
|
||||
|
|
@ -10269,10 +10260,9 @@ void A_RandomShadowFrame(mobj_t *actor)
|
|||
{
|
||||
mobj_t *fire;
|
||||
mobj_t *fake;
|
||||
#ifdef HAVE_BLUA
|
||||
|
||||
if (LUA_CallAction("A_RandomShadowFrame", (actor)))
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (!actor->extravalue1) // Hack that spawns thoks that look like random shadows. Otherwise the state would overwrite our frame and that's a pain.
|
||||
{
|
||||
|
|
@ -10318,10 +10308,9 @@ void A_RoamingShadowThinker(mobj_t *actor)
|
|||
{
|
||||
mobj_t *wind;
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_CallAction("A_RoamingShadowThinker", (actor)))
|
||||
return;
|
||||
#endif
|
||||
|
||||
// extravalue1 replaces "movetimer"
|
||||
// extravalue2 replaces "stoptimer"
|
||||
|
||||
|
|
@ -10376,10 +10365,9 @@ void A_MayonakaArrow(mobj_t *actor)
|
|||
{
|
||||
INT32 flip = 0;
|
||||
INT32 iswarning;
|
||||
#ifdef HAVE_BLUA
|
||||
|
||||
if (LUA_CallAction("A_MayonakaArrow", (actor)))
|
||||
return;
|
||||
#endif
|
||||
|
||||
iswarning = actor->spawnpoint->options & MTF_OBJECTSPECIAL; // is our object a warning sign?
|
||||
// "animtimer" is replaced by "extravalue1" here.
|
||||
|
|
@ -10418,10 +10406,8 @@ void A_MementosTPParticles(mobj_t *actor)
|
|||
int i = 0;
|
||||
thinker_t *th;
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_CallAction("A_MementosTPParticles", (actor)))
|
||||
return;
|
||||
#endif
|
||||
|
||||
for (; i<4; i++)
|
||||
{
|
||||
|
|
@ -10469,11 +10455,8 @@ void A_ReaperThinker(mobj_t *actor)
|
|||
player_t *player; // used as a shortcut in a loop.
|
||||
mobj_t *targetplayermo = NULL; // the player mo we can eventually target, or whatever.
|
||||
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_CallAction("A_ReaperThinker", (actor)))
|
||||
return;
|
||||
#endif
|
||||
|
||||
// We don't have custom variables or whatever so we'll do with whatever the fuck we have left.
|
||||
|
||||
|
|
@ -10642,10 +10625,9 @@ void A_FlameParticle(mobj_t *actor)
|
|||
{
|
||||
fixed_t rad = actor->radius>>FRACBITS, hei = actor->radius>>FRACBITS;
|
||||
mobj_t *par;
|
||||
#ifdef HAVE_BLUA
|
||||
|
||||
if (LUA_CallAction("A_FlameParticle", actor))
|
||||
return;
|
||||
#endif
|
||||
|
||||
par = P_SpawnMobj(
|
||||
actor->x + (P_RandomRange(-rad, rad)<<FRACBITS),
|
||||
|
|
@ -10663,10 +10645,8 @@ void A_FlameShieldPaper(mobj_t *actor)
|
|||
INT32 locvar2 = var2;
|
||||
UINT8 i;
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_CallAction("A_FlameShieldPaper", actor))
|
||||
return;
|
||||
#endif
|
||||
|
||||
framea = (locvar1 & FF_FRAMEMASK);
|
||||
frameb = (locvar2 & FF_FRAMEMASK);
|
||||
|
|
|
|||
216
src/p_inter.c
216
src/p_inter.c
|
|
@ -108,7 +108,7 @@ boolean P_CanPickupItem(player_t *player, UINT8 weapon)
|
|||
if (player->exiting || mapreset)
|
||||
return false;
|
||||
|
||||
/*if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) // No bumpers in Match
|
||||
/*if ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] <= 0) // No bumpers in Match
|
||||
return false;*/
|
||||
|
||||
if (weapon)
|
||||
|
|
@ -237,7 +237,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
if (!P_CanPickupItem(player, 3) || (player->kartstuff[k_itemamount] && player->kartstuff[k_itemtype] != special->threshold))
|
||||
return;
|
||||
|
||||
if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0)
|
||||
if ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] <= 0)
|
||||
return;
|
||||
|
||||
player->kartstuff[k_itemtype] = special->threshold;
|
||||
|
|
@ -258,7 +258,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
if (!P_CanPickupItem(player, 1))
|
||||
return;
|
||||
|
||||
if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0)
|
||||
if ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] <= 0)
|
||||
{
|
||||
if (player->kartstuff[k_comebackmode] || player->kartstuff[k_comebacktimer])
|
||||
return;
|
||||
|
|
@ -476,7 +476,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
S_StartSound(special, sfx_s1a2);
|
||||
return;
|
||||
case MT_CDUFO: // SRB2kart
|
||||
if (special->fuse || !P_CanPickupItem(player, 1) || (G_BattleGametype() && player->kartstuff[k_bumper] <= 0))
|
||||
if (special->fuse || !P_CanPickupItem(player, 1) || ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] <= 0))
|
||||
return;
|
||||
|
||||
player->kartstuff[k_itemroulette] = 1;
|
||||
|
|
@ -732,208 +732,6 @@ void P_TouchStarPost(mobj_t *post, player_t *player, boolean snaptopost)
|
|||
P_ClearStarPost(post->health);
|
||||
}
|
||||
|
||||
/** Prints death messages relating to a dying or hit player.
|
||||
*
|
||||
* \param player Affected player.
|
||||
* \param inflictor The attack weapon used, can be NULL.
|
||||
* \param source The attacker, can be NULL.
|
||||
* \param damagetype The type of damage dealt to the player. If bit 7 (0x80) is set, this was an instant-kill.
|
||||
*/
|
||||
static void P_HitDeathMessages(player_t *player, mobj_t *inflictor, mobj_t *source, UINT8 damagetype)
|
||||
{
|
||||
const char *str = NULL;
|
||||
boolean deathonly = false;
|
||||
boolean deadsource = false;
|
||||
boolean deadtarget = false;
|
||||
// player names complete with control codes
|
||||
char targetname[MAXPLAYERNAME+4];
|
||||
char sourcename[MAXPLAYERNAME+4];
|
||||
|
||||
if (!(gametyperules & (GTR_RINGSLINGER|GTR_HURTMESSAGES)))
|
||||
return; // Not in coop, etc.
|
||||
|
||||
if (!player)
|
||||
return; // Impossible!
|
||||
|
||||
if (!player->mo)
|
||||
return; // Also impossible!
|
||||
|
||||
if (player->spectator)
|
||||
return; // No messages for dying (crushed) spectators.
|
||||
|
||||
if (!netgame)
|
||||
return; // Presumably it's obvious what's happening in splitscreen.
|
||||
|
||||
if (LUAh_HurtMsg(player, inflictor, source, damagetype))
|
||||
return;
|
||||
|
||||
deadtarget = (player->mo->health <= 0);
|
||||
|
||||
// Don't log every hazard hit if they don't want us to.
|
||||
if (!deadtarget && !cv_hazardlog.value)
|
||||
return;
|
||||
|
||||
// Target's name
|
||||
snprintf(targetname, sizeof(targetname), "%s%s%s",
|
||||
CTFTEAMCODE(player),
|
||||
player_names[player - players],
|
||||
CTFTEAMENDCODE(player));
|
||||
|
||||
if (source)
|
||||
{
|
||||
// inflictor shouldn't be NULL if source isn't
|
||||
I_Assert(inflictor != NULL);
|
||||
|
||||
if (source->player)
|
||||
{
|
||||
// Source's name (now that we know there is one)
|
||||
snprintf(sourcename, sizeof(sourcename), "%s%s%s",
|
||||
CTFTEAMCODE(source->player),
|
||||
player_names[source->player - players],
|
||||
CTFTEAMENDCODE(source->player));
|
||||
|
||||
// We don't care if it's us.
|
||||
// "Player 1's [redacted] killed Player 1."
|
||||
if (source->player->playerstate == PST_DEAD && source->player != player &&
|
||||
(inflictor->flags2 & MF2_BEYONDTHEGRAVE))
|
||||
deadsource = true;
|
||||
|
||||
if (inflictor->flags & MF_PUSHABLE)
|
||||
{
|
||||
str = M_GetText("%s%s's playtime with heavy objects %s %s.\n");
|
||||
}
|
||||
else switch (inflictor->type)
|
||||
{
|
||||
case MT_PLAYER:
|
||||
if (damagetype == DMG_NUKE) // SH_ARMAGEDDON, armageddon shield
|
||||
str = M_GetText("%s%s's armageddon blast %s %s.\n");
|
||||
else if ((inflictor->player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL && (inflictor->player->pflags & PF_SHIELDABILITY))
|
||||
str = M_GetText("%s%s's elemental stomp %s %s.\n");
|
||||
else if (inflictor->player->powers[pw_invulnerability])
|
||||
str = M_GetText("%s%s's invincibility aura %s %s.\n");
|
||||
else if (inflictor->player->powers[pw_super])
|
||||
str = M_GetText("%s%s's super aura %s %s.\n");
|
||||
else
|
||||
str = M_GetText("%s%s's tagging hand %s %s.\n");
|
||||
break;
|
||||
case MT_SPINFIRE:
|
||||
str = M_GetText("%s%s's elemental fire trail %s %s.\n");
|
||||
break;
|
||||
case MT_THROWNBOUNCE:
|
||||
str = M_GetText("%s%s's bounce ring %s %s.\n");
|
||||
break;
|
||||
case MT_THROWNINFINITY:
|
||||
str = M_GetText("%s%s's infinity ring %s %s.\n");
|
||||
break;
|
||||
case MT_THROWNAUTOMATIC:
|
||||
str = M_GetText("%s%s's automatic ring %s %s.\n");
|
||||
break;
|
||||
case MT_THROWNSCATTER:
|
||||
str = M_GetText("%s%s's scatter ring %s %s.\n");
|
||||
break;
|
||||
// TODO: For next two, figure out how to determine if it was a direct hit or splash damage. -SH
|
||||
case MT_THROWNEXPLOSION:
|
||||
str = M_GetText("%s%s's explosion ring %s %s.\n");
|
||||
break;
|
||||
case MT_THROWNGRENADE:
|
||||
str = M_GetText("%s%s's grenade ring %s %s.\n");
|
||||
break;
|
||||
case MT_REDRING:
|
||||
if (inflictor->flags2 & MF2_RAILRING)
|
||||
str = M_GetText("%s%s's rail ring %s %s.\n");
|
||||
else
|
||||
str = M_GetText("%s%s's thrown ring %s %s.\n");
|
||||
break;
|
||||
default:
|
||||
str = M_GetText("%s%s %s %s.\n");
|
||||
break;
|
||||
}
|
||||
|
||||
CONS_Printf(str,
|
||||
deadsource ? M_GetText("The late ") : "",
|
||||
sourcename,
|
||||
deadtarget ? M_GetText("killed") : M_GetText("hit"),
|
||||
targetname);
|
||||
return;
|
||||
}
|
||||
else switch (source->type)
|
||||
{
|
||||
case MT_EGGMAN_ICON:
|
||||
str = M_GetText("%s was %s by Eggman's nefarious TV magic.\n");
|
||||
break;
|
||||
case MT_SPIKE:
|
||||
case MT_WALLSPIKE:
|
||||
str = M_GetText("%s was %s by spikes.\n");
|
||||
break;
|
||||
default:
|
||||
str = M_GetText("%s was %s by an environmental hazard.\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// null source, environment kills
|
||||
switch (damagetype)
|
||||
{
|
||||
case DMG_WATER:
|
||||
str = M_GetText("%s was %s by dangerous water.\n");
|
||||
break;
|
||||
case DMG_FIRE:
|
||||
str = M_GetText("%s was %s by molten lava.\n");
|
||||
break;
|
||||
case DMG_ELECTRIC:
|
||||
str = M_GetText("%s was %s by electricity.\n");
|
||||
break;
|
||||
case DMG_SPIKE:
|
||||
str = M_GetText("%s was %s by spikes.\n");
|
||||
break;
|
||||
case DMG_DROWNED:
|
||||
deathonly = true;
|
||||
str = M_GetText("%s drowned.\n");
|
||||
break;
|
||||
case DMG_CRUSHED:
|
||||
deathonly = true;
|
||||
str = M_GetText("%s was crushed.\n");
|
||||
break;
|
||||
case DMG_DEATHPIT:
|
||||
if (deadtarget)
|
||||
{
|
||||
deathonly = true;
|
||||
str = M_GetText("%s fell into a bottomless pit.\n");
|
||||
}
|
||||
break;
|
||||
case DMG_SPACEDROWN:
|
||||
if (deadtarget)
|
||||
{
|
||||
deathonly = true;
|
||||
str = M_GetText("%s asphyxiated in space.\n");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (deadtarget)
|
||||
{
|
||||
deathonly = true;
|
||||
str = M_GetText("%s died.\n");
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (!str)
|
||||
str = M_GetText("%s was %s by an environmental hazard.\n");
|
||||
}
|
||||
|
||||
if (!str) // Should not happen! Unless we missed catching something above.
|
||||
return;
|
||||
|
||||
if (deathonly)
|
||||
{
|
||||
if (!deadtarget)
|
||||
return;
|
||||
CONS_Printf(str, targetname);
|
||||
}
|
||||
else
|
||||
CONS_Printf(str, targetname, deadtarget ? M_GetText("killed") : M_GetText("hit"));
|
||||
}
|
||||
|
||||
// Easily make it so that overtime works offline
|
||||
//#define TESTOVERTIMEINFREEPLAY
|
||||
|
||||
|
|
@ -1353,7 +1151,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
if (target->player == &players[displayplayers[2]]) localaiming[2] = 0;
|
||||
if (target->player == &players[displayplayers[3]]) localaiming[3] = 0;
|
||||
|
||||
if (G_BattleGametype())
|
||||
if ((gametyperules & GTR_BUMPERS))
|
||||
K_CheckBumpers();
|
||||
|
||||
target->player->kartstuff[k_pogospring] = 0;
|
||||
|
|
@ -1828,7 +1626,7 @@ static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage)
|
|||
P_SetTarget(&boom->target, player->mo);
|
||||
}
|
||||
|
||||
if (G_BattleGametype())
|
||||
if ((gametyperules & GTR_BUMPERS))
|
||||
{
|
||||
if (player->kartstuff[k_bumper] > 0)
|
||||
{
|
||||
|
|
@ -2047,7 +1845,7 @@ void P_PlayerRingBurst(player_t *player, INT32 num_rings)
|
|||
fixed_t momxy = 5<<FRACBITS, momz = 12<<FRACBITS; // base horizonal/vertical thrusts
|
||||
|
||||
// Rings shouldn't be in Battle!
|
||||
if (G_BattleGametype())
|
||||
if ((gametyperules & GTR_BUMPERS))
|
||||
return;
|
||||
|
||||
// Better safe than sorry.
|
||||
|
|
|
|||
|
|
@ -1373,7 +1373,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
return true;
|
||||
}
|
||||
|
||||
if (G_BattleGametype()
|
||||
if ((gametyperules & GTR_BUMPERS)
|
||||
&& ((thing->player->kartstuff[k_bumper] && !tmthing->player->kartstuff[k_bumper])
|
||||
|| (tmthing->player->kartstuff[k_bumper] && !thing->player->kartstuff[k_bumper])))
|
||||
{
|
||||
|
|
@ -1392,7 +1392,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
mo1 = thing;
|
||||
mo2 = tmthing;
|
||||
|
||||
if (G_BattleGametype() && tmthing->player->kartstuff[k_pogospring])
|
||||
if ((gametyperules & GTR_BUMPERS) && tmthing->player->kartstuff[k_pogospring])
|
||||
{
|
||||
K_StealBumper(tmthing->player, thing->player, false);
|
||||
K_SpinPlayer(thing->player, tmthing, 0, tmthing, false);
|
||||
|
|
@ -1402,14 +1402,14 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
{
|
||||
zbounce = true;
|
||||
|
||||
if (G_BattleGametype() && thing->player->kartstuff[k_pogospring])
|
||||
if ((gametyperules & GTR_BUMPERS) && thing->player->kartstuff[k_pogospring])
|
||||
{
|
||||
K_StealBumper(thing->player, tmthing->player, false);
|
||||
K_SpinPlayer(tmthing->player, thing, 0, thing, false);
|
||||
}
|
||||
}
|
||||
|
||||
if (G_BattleGametype())
|
||||
if ((gametyperules & GTR_BUMPERS))
|
||||
{
|
||||
if (thing->player->kartstuff[k_sneakertimer] && !(tmthing->player->kartstuff[k_sneakertimer]) && !(thing->player->powers[pw_flashing])) // Don't steal bumpers while intangible
|
||||
{
|
||||
|
|
|
|||
621
src/p_mobj.c
621
src/p_mobj.c
|
|
@ -3337,7 +3337,7 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled
|
|||
dummy.z = thiscam->z;
|
||||
dummy.height = thiscam->height;
|
||||
|
||||
if ((player->pflags & PF_TIMEOVER) && G_RaceGametype())
|
||||
if ((player->pflags & PF_TIMEOVER) && (gametyperules & GTR_CIRCUIT))
|
||||
{
|
||||
player->karthud[khud_timeovercam] = (2*TICRATE)+1;
|
||||
}
|
||||
|
|
@ -3614,17 +3614,6 @@ void P_RecalcPrecipInSector(sector_t *sector)
|
|||
CalculatePrecipFloor(psecnode->m_thing);
|
||||
}
|
||||
|
||||
//
|
||||
// P_NullPrecipThinker
|
||||
//
|
||||
// For "Blank" precipitation
|
||||
//
|
||||
void P_NullPrecipThinker(precipmobj_t *mobj)
|
||||
{
|
||||
//(void)mobj;
|
||||
mobj->precipflags &= ~PCF_THUNK;
|
||||
}
|
||||
|
||||
void P_PrecipThinker(precipmobj_t *mobj)
|
||||
{
|
||||
P_CycleStateAnimation((mobj_t *)mobj);
|
||||
|
|
@ -3683,49 +3672,8 @@ void P_PrecipThinker(precipmobj_t *mobj)
|
|||
mobj->precipflags |= PCF_SPLASH;
|
||||
}
|
||||
|
||||
static void P_KillRingsInLava(mobj_t *mo)
|
||||
{
|
||||
msecnode_t *node;
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
// go through all sectors being touched by the ring
|
||||
for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||
{
|
||||
if (!node->m_sector)
|
||||
break;
|
||||
|
||||
if (node->m_sector->ffloors)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
fixed_t topheight, bottomheight;
|
||||
|
||||
for (rover = node->m_sector->ffloors; rover; rover = rover->next) // go through all fofs in the sector
|
||||
{
|
||||
if (!(rover->flags & FF_EXISTS)) continue; // fof must be real
|
||||
|
||||
if (!(rover->flags & FF_SWIMMABLE // fof must be water
|
||||
&& GETSECSPECIAL(rover->master->frontsector->special, 1) == 3)) // fof must be lava water
|
||||
continue;
|
||||
|
||||
// find heights of FOF
|
||||
topheight = P_GetFOFTopZ(mo, node->m_sector, rover, mo->x, mo->y, NULL);
|
||||
bottomheight = P_GetFOFBottomZ(mo, node->m_sector, rover, mo->x, mo->y, NULL);
|
||||
|
||||
if (mo->z <= topheight && mo->z + mo->height >= bottomheight) // if ring touches it, KILL IT
|
||||
{
|
||||
P_KillMobj(mo, NULL, NULL, DMG_FIRE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
>>>>>>> srb2/next
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void P_RingThinker(mobj_t *mobj)
|
||||
{
|
||||
|
||||
mobj_t *spark; // Ring Fuse
|
||||
|
||||
if (mobj->momx || mobj->momy)
|
||||
|
|
@ -3762,9 +3710,7 @@ static void P_RingThinker(mobj_t *mobj)
|
|||
|
||||
if (!mobj->fuse)
|
||||
{
|
||||
#ifdef HAVE_BLUA
|
||||
if (!LUAh_MobjFuse(mobj))
|
||||
#endif
|
||||
{
|
||||
mobj->flags2 &= ~MF2_DONTDRAW;
|
||||
spark = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_SIGNSPARKLE); // Spawn a fancy sparkle
|
||||
|
|
@ -7610,63 +7556,6 @@ static void P_MobjSceneryThink(mobj_t *mobj)
|
|||
if (mobj->movedir)
|
||||
mobj->angle += mobj->movedir;
|
||||
break;
|
||||
case MT_ROSY:
|
||||
P_RosySceneryThink(mobj);
|
||||
break;
|
||||
case MT_CDLHRT:
|
||||
{
|
||||
if (mobj->cvmem < 24)
|
||||
mobj->cvmem++;
|
||||
mobj->movedir += ANG10;
|
||||
P_UnsetThingPosition(mobj);
|
||||
mobj->x = mobj->extravalue1 + P_ReturnThrustX(mobj, mobj->movedir, mobj->cvmem*mobj->scale);
|
||||
mobj->y = mobj->extravalue2 + P_ReturnThrustY(mobj, mobj->movedir, mobj->cvmem*mobj->scale);
|
||||
P_SetThingPosition(mobj);
|
||||
|
||||
if (!mobj->fuse)
|
||||
{
|
||||
if (!LUAh_MobjFuse(mobj))
|
||||
P_RemoveMobj(mobj);
|
||||
return;
|
||||
}
|
||||
if (mobj->fuse < 0)
|
||||
return;
|
||||
if (mobj->fuse < 6)
|
||||
mobj->frame = (mobj->frame & ~FF_TRANSMASK) | ((10 - (mobj->fuse*2)) << (FF_TRANSSHIFT));
|
||||
mobj->fuse--;
|
||||
}
|
||||
break;
|
||||
case MT_FINISHFLAG:
|
||||
{
|
||||
if (!mobj->target || mobj->target->player->playerstate == PST_DEAD || !cv_exitmove.value)
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!camera.chase)
|
||||
mobj->flags2 |= MF2_DONTDRAW;
|
||||
else
|
||||
mobj->flags2 &= ~MF2_DONTDRAW;
|
||||
|
||||
P_UnsetThingPosition(mobj);
|
||||
{
|
||||
fixed_t radius = FixedMul(10*mobj->info->speed, mobj->target->scale);
|
||||
angle_t fa;
|
||||
|
||||
mobj->angle += FixedAngle(mobj->info->speed);
|
||||
|
||||
fa = mobj->angle >> ANGLETOFINESHIFT;
|
||||
|
||||
mobj->x = mobj->target->x + FixedMul(FINECOSINE(fa),radius);
|
||||
mobj->y = mobj->target->y + FixedMul(FINESINE(fa),radius);
|
||||
mobj->z = mobj->target->z + mobj->target->height/2;
|
||||
}
|
||||
P_SetThingPosition(mobj);
|
||||
|
||||
P_SetScale(mobj, mobj->target->scale);
|
||||
}
|
||||
break;
|
||||
case MT_ORBINAUT_SHIELD: // Kart orbit/trail items
|
||||
case MT_JAWZ_SHIELD:
|
||||
case MT_BANANA_SHIELD:
|
||||
|
|
@ -7837,7 +7726,7 @@ static void P_MobjSceneryThink(mobj_t *mobj)
|
|||
mobj->color = mobj->target->color;
|
||||
K_MatchGenericExtraFlags(mobj, mobj->target);
|
||||
|
||||
if ((G_RaceGametype() || mobj->target->player->kartstuff[k_bumper] <= 0)
|
||||
if (((gametyperules & GTR_CIRCUIT) || mobj->target->player->kartstuff[k_bumper] <= 0)
|
||||
#if 1 // Set to 0 to test without needing to host
|
||||
|| (P_IsDisplayPlayer(mobj->target->player))
|
||||
#endif
|
||||
|
|
@ -8474,7 +8363,7 @@ static boolean P_MobjDeadThink(mobj_t *mobj)
|
|||
if (mobj->flags2 & MF2_AMBUSH)
|
||||
{
|
||||
mobj->colorized = true;
|
||||
mobj->color = (1 + (leveltime % (MAXSKINCOLORS-1)));
|
||||
mobj->color = K_RainbowColor(leveltime);
|
||||
mobj->frame |= FF_FULLBRIGHT;
|
||||
}
|
||||
else
|
||||
|
|
@ -9652,7 +9541,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
statenum_t state = (mobj->state-states);
|
||||
|
||||
if (!mobj->target || !mobj->target->health || !mobj->target->player || mobj->target->player->spectator
|
||||
|| (G_RaceGametype() || mobj->target->player->kartstuff[k_bumper]))
|
||||
|| ((gametyperules & GTR_CIRCUIT) || mobj->target->player->kartstuff[k_bumper]))
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return;
|
||||
|
|
@ -9837,8 +9726,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
{
|
||||
if (newcolor != SKINCOLOR_NONE)
|
||||
{
|
||||
cur->color = KartColor_Opposite[newcolor*2];
|
||||
cur->frame = states[S_SIGN_FACE].frame + KartColor_Opposite[newcolor*2+1];
|
||||
cur->color = skincolors[newcolor].invcolor;
|
||||
cur->frame = states[S_SIGN_FACE].frame + skincolors[newcolor].invshade;
|
||||
}
|
||||
}
|
||||
else if (cur->state == &states[S_PLAY_SIGN])
|
||||
|
|
@ -10322,7 +10211,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
if (mobj->flags2 & MF2_AMBUSH)
|
||||
{
|
||||
mobj->colorized = true;
|
||||
mobj->color = (1 + (leveltime % (MAXSKINCOLORS-1)));
|
||||
mobj->color = K_RainbowColor(leveltime);
|
||||
mobj->frame |= FF_FULLBRIGHT;
|
||||
}
|
||||
else
|
||||
|
|
@ -10769,9 +10658,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
}
|
||||
}
|
||||
case MT_RANDOMITEM:
|
||||
if (G_BattleGametype() && mobj->threshold == 70)
|
||||
if ((gametyperules & GTR_BUMPERS) && mobj->threshold == 70)
|
||||
{
|
||||
mobj->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1)));
|
||||
mobj->color = K_RainbowColor(leveltime);
|
||||
mobj->colorized = true;
|
||||
|
||||
if (battleovertime.enabled)
|
||||
|
|
@ -10980,7 +10869,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
mobj->color = mobj->target->color;
|
||||
K_MatchGenericExtraFlags(mobj, mobj->target);
|
||||
|
||||
if ((G_RaceGametype() || mobj->target->player->kartstuff[k_bumper] <= 0)
|
||||
if (((gametyperules & GTR_CIRCUIT) || mobj->target->player->kartstuff[k_bumper] <= 0)
|
||||
#if 1 // Set to 0 to test without needing to host
|
||||
|| (P_IsDisplayPlayer(mobj->target->player))
|
||||
#endif
|
||||
|
|
@ -11518,7 +11407,7 @@ static boolean P_FuseThink(mobj_t *mobj)
|
|||
}
|
||||
return false;
|
||||
case MT_RANDOMITEM:
|
||||
if (G_BattleGametype() && (mobj->threshold != 70))
|
||||
if ((gametyperules & GTR_BUMPERS) && (mobj->threshold != 70))
|
||||
{
|
||||
if (mobj->threshold != 69)
|
||||
break;
|
||||
|
|
@ -12501,7 +12390,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
|||
|
||||
if (randu > (FRACUNIT/2))
|
||||
{
|
||||
mobj->color = P_RandomKey(MAXSKINCOLORS-1)+1;
|
||||
mobj->color = P_RandomKey(numskincolors-1)+1;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -12903,8 +12792,6 @@ void P_RemoveSavegameMobj(mobj_t *mobj)
|
|||
static CV_PossibleValue_t respawnitemtime_cons_t[] = {{1, "MIN"}, {300, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_itemrespawntime = {"respawnitemtime", "2", CV_NETVAR|CV_CHEAT, respawnitemtime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_itemrespawn = {"respawnitem", "On", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
static CV_PossibleValue_t flagtime_cons_t[] = {{0, "MIN"}, {300, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_flagtime = {"flagtime", "30", CV_NETVAR|CV_CHEAT, flagtime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
void P_SpawnPrecipitation(void)
|
||||
{
|
||||
|
|
@ -13097,7 +12984,7 @@ void P_RespawnBattleBoxes(void)
|
|||
{
|
||||
thinker_t *th;
|
||||
|
||||
if (!G_BattleGametype())
|
||||
if (!(gametyperules & GTR_BUMPERS))
|
||||
return;
|
||||
|
||||
for (th = thinkercap.next; th != &thinkercap; th = th->next)
|
||||
|
|
@ -13163,7 +13050,7 @@ void P_RespawnSpecials(void)
|
|||
mobj_t *mo = NULL;
|
||||
mapthing_t *mthing = NULL;
|
||||
|
||||
if (G_BattleGametype() && numgotboxes >= (4*nummapboxes/5)) // Battle Mode respawns all boxes in a different way
|
||||
if ((gametyperules & GTR_BUMPERS) && numgotboxes >= (4*nummapboxes/5)) // Battle Mode respawns all boxes in a different way
|
||||
P_RespawnBattleBoxes();
|
||||
|
||||
// wait time depends on player count
|
||||
|
|
@ -13371,7 +13258,7 @@ void P_SpawnPlayer(INT32 playernum)
|
|||
if (p->kartstuff[k_respawn] != 0)
|
||||
p->mo->flags |= MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_NOGRAVITY;
|
||||
|
||||
if (G_BattleGametype()) // SRB2kart
|
||||
if ((gametyperules & GTR_BUMPERS)) // SRB2kart
|
||||
{
|
||||
mobj_t *overheadarrow = P_SpawnMobj(mobj->x, mobj->y, mobj->z + mobj->height + 16*FRACUNIT, MT_PLAYERARROW);
|
||||
P_SetTarget(&overheadarrow->target, mobj);
|
||||
|
|
@ -13593,10 +13480,6 @@ void P_MovePlayerToStarpost(INT32 playernum)
|
|||
leveltime = p->starposttime;
|
||||
}
|
||||
|
||||
#define MAXHUNTEMERALDS 64
|
||||
mapthing_t *huntemeralds[MAXHUNTEMERALDS];
|
||||
INT32 numhuntemeralds;
|
||||
|
||||
fixed_t P_GetMobjSpawnHeight(const mobjtype_t mobjtype, const fixed_t x, const fixed_t y, const fixed_t dz, const fixed_t offset, const boolean flip, const fixed_t scale)
|
||||
{
|
||||
const subsector_t *ss = R_PointInSubsector(x, y);
|
||||
|
|
@ -13620,58 +13503,22 @@ fixed_t P_GetMapThingSpawnHeight(const mobjtype_t mobjtype, const mapthing_t* mt
|
|||
|
||||
switch (mobjtype)
|
||||
{
|
||||
// Bumpers never spawn flipped.
|
||||
case MT_NIGHTSBUMPER:
|
||||
flip = false;
|
||||
break;
|
||||
|
||||
// Objects with a non-zero default height.
|
||||
case MT_CRAWLACOMMANDER:
|
||||
case MT_DETON:
|
||||
case MT_JETTBOMBER:
|
||||
case MT_JETTGUNNER:
|
||||
case MT_EGGMOBILE2:
|
||||
if (!dz)
|
||||
dz = 33*FRACUNIT;
|
||||
break;
|
||||
case MT_EGGMOBILE:
|
||||
if (!dz)
|
||||
dz = 128*FRACUNIT;
|
||||
break;
|
||||
case MT_GOLDBUZZ:
|
||||
case MT_REDBUZZ:
|
||||
if (!dz)
|
||||
dz = 288*FRACUNIT;
|
||||
break;
|
||||
// (None yet)
|
||||
|
||||
// Horizontal springs, may float additional units with MTF_AMBUSH.
|
||||
case MT_YELLOWHORIZ:
|
||||
case MT_REDHORIZ:
|
||||
case MT_BLUEHORIZ:
|
||||
offset += mthing->options & MTF_AMBUSH ? 16*FRACUNIT : 0;
|
||||
offset += mthing->options & MTF_AMBUSH ? 16*mapobjectscale : 0;
|
||||
break;
|
||||
|
||||
// Ring-like items, may float additional units with MTF_AMBUSH.
|
||||
case MT_SPIKEBALL:
|
||||
case MT_EMERHUNT:
|
||||
case MT_EMERALDSPAWN:
|
||||
case MT_TOKEN:
|
||||
case MT_EMBLEM:
|
||||
case MT_RING:
|
||||
case MT_REDTEAMRING:
|
||||
case MT_BLUETEAMRING:
|
||||
case MT_COIN:
|
||||
case MT_BLUESPHERE:
|
||||
case MT_BOMBSPHERE:
|
||||
case MT_NIGHTSCHIP:
|
||||
case MT_NIGHTSSTAR:
|
||||
offset += mthing->options & MTF_AMBUSH ? 24*FRACUNIT : 0;
|
||||
offset += mthing->options & MTF_AMBUSH ? 24*mapobjectscale : 0;
|
||||
break;
|
||||
|
||||
// Remaining objects.
|
||||
default:
|
||||
if (P_WeaponOrPanel(mobjtype))
|
||||
offset += mthing->options & MTF_AMBUSH ? 24*FRACUNIT : 0;
|
||||
}
|
||||
|
||||
if (!(dz + offset)) // Snap to the surfaces when there's no offset set.
|
||||
|
|
@ -13735,13 +13582,8 @@ static boolean P_SpawnNonMobjMapThing(mapthing_t *mthing)
|
|||
else if (mthing->type == 750 // Slope vertex point (formerly chaos spawn)
|
||||
|| (mthing->type >= 600 && mthing->type <= 609) // Special placement patterns
|
||||
|| mthing->type == 1705 || mthing->type == 1713) // Hoops
|
||||
return true; // These are handled elsewhere.
|
||||
else if (mthing->type == mobjinfo[MT_EMERHUNT].doomednum)
|
||||
{
|
||||
// Emerald Hunt is Coop only. Don't spawn the emerald yet, but save the spawnpoint for later.
|
||||
if ((gametyperules & GTR_EMERALDHUNT) && numhuntemeralds < MAXHUNTEMERALDS)
|
||||
huntemeralds[numhuntemeralds++] = mthing;
|
||||
return true;
|
||||
return true; // These are handled elsewhere.
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
@ -13751,54 +13593,9 @@ static boolean P_AllowMobjSpawn(mapthing_t* mthing, mobjtype_t i)
|
|||
{
|
||||
switch (i)
|
||||
{
|
||||
case MT_EMERALD1:
|
||||
case MT_EMERALD2:
|
||||
case MT_EMERALD3:
|
||||
case MT_EMERALD4:
|
||||
case MT_EMERALD5:
|
||||
case MT_EMERALD6:
|
||||
case MT_EMERALD7:
|
||||
if (!G_CoopGametype()) // Don't place emeralds in non-coop modes
|
||||
return false;
|
||||
|
||||
if (metalrecording)
|
||||
return false; // Metal Sonic isn't for collecting emeralds.
|
||||
|
||||
if (emeralds & mobjinfo[i].speed) // You already have this emerald!
|
||||
return false;
|
||||
|
||||
break;
|
||||
case MT_EMERALDSPAWN:
|
||||
if (!cv_powerstones.value)
|
||||
return false;
|
||||
|
||||
if (!(gametyperules & GTR_POWERSTONES))
|
||||
return false;
|
||||
|
||||
runemeraldmanager = true;
|
||||
break;
|
||||
case MT_ROSY:
|
||||
if (!(G_CoopGametype() || (mthing->options & MTF_EXTRA)))
|
||||
return false; // she doesn't hang out here
|
||||
|
||||
if (!mariomode && !(netgame || multiplayer) && players[consoleplayer].skin == 3)
|
||||
return false; // no doubles
|
||||
|
||||
break;
|
||||
case MT_TOKEN:
|
||||
if (!(gametyperules & GTR_EMERALDTOKENS))
|
||||
return false; // Gametype's not right
|
||||
|
||||
if (tokenbits == 30)
|
||||
return false; // Too many tokens
|
||||
|
||||
if (tokenlist & (1 << tokenbits++))
|
||||
return false; // You already got this token
|
||||
|
||||
break;
|
||||
case MT_EMBLEM:
|
||||
if (netgame || multiplayer)
|
||||
return false; // Single player
|
||||
return false; // Single player only
|
||||
|
||||
if (modifiedgame && !savemoddata)
|
||||
return false; // No cheating!!
|
||||
|
|
@ -13810,138 +13607,19 @@ static boolean P_AllowMobjSpawn(mapthing_t* mthing, mobjtype_t i)
|
|||
|
||||
if (metalrecording) // Metal Sonic can't use these things.
|
||||
{
|
||||
if ((mobjinfo[i].flags & (MF_ENEMY|MF_BOSS)) || i == MT_TOKEN || i == MT_STARPOST
|
||||
|| i == MT_RING || i == MT_BLUETEAMRING || i == MT_REDTEAMRING || i == MT_COIN
|
||||
|| i == MT_BLUESPHERE || i == MT_BOMBSPHERE || i == MT_NIGHTSCHIP || i == MT_NIGHTSSTAR)
|
||||
if ((mobjinfo[i].flags & (MF_ENEMY|MF_BOSS)) || i == MT_STARPOST || i == MT_RING)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (((mobjinfo[i].flags & MF_ENEMY) || (mobjinfo[i].flags & MF_BOSS)) && !(gametyperules & GTR_SPAWNENEMIES))
|
||||
return false; // No enemies in ringslinger modes
|
||||
|
||||
if (!(gametyperules & GTR_ALLOWEXIT) && (i == MT_SIGN))
|
||||
return false; // Don't spawn exit signs in wrong game modes
|
||||
|
||||
if (!G_PlatformGametype() && (i == MT_STARPOST))
|
||||
return false; // Don't spawn starposts in wrong game modes
|
||||
|
||||
if (!G_RingSlingerGametype() || !cv_specialrings.value)
|
||||
if (P_WeaponOrPanel(i))
|
||||
return false; // Don't place weapons/panels in non-ringslinger modes
|
||||
|
||||
if (!(gametyperules & GTR_TEAMFLAGS)) // CTF specific things
|
||||
{
|
||||
if (i == MT_BLUEFLAG || i == MT_REDFLAG)
|
||||
return false; // No flags in non-CTF modes!
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((i == MT_BLUEFLAG && blueflag) || (i == MT_REDFLAG && redflag))
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("Only one flag per team allowed in CTF!\n"));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (modeattacking) // Record Attack special stuff
|
||||
{
|
||||
// Don't spawn starposts that wouldn't be usable
|
||||
if (i == MT_STARPOST)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ultimatemode)
|
||||
{
|
||||
if (i == MT_RING || i == MT_REDTEAMRING || i == MT_BLUETEAMRING
|
||||
|| i == MT_COIN || i == MT_NIGHTSSTAR || i == MT_NIGHTSCHIP
|
||||
|| i == MT_PITY_BOX || i == MT_ELEMENTAL_BOX || i == MT_ATTRACT_BOX
|
||||
|| i == MT_FORCE_BOX || i == MT_ARMAGEDDON_BOX || i == MT_WHIRLWIND_BOX
|
||||
|| i == MT_FLAMEAURA_BOX || i == MT_BUBBLEWRAP_BOX || i == MT_THUNDERCOIN_BOX
|
||||
|| i == MT_RING_BOX || i == MT_STARPOST)
|
||||
return false; // No rings or shields in Ultimate mode
|
||||
|
||||
// Don't include the gold repeating boxes here please.
|
||||
// They're likely facets of the level's design and therefore required to progress.
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#define nightsreplace ((maptol & TOL_NIGHTS) && !G_IsSpecialStage(gamemap))
|
||||
|
||||
static mobjtype_t P_GetMobjtypeSubstitute(mapthing_t *mthing, mobjtype_t i)
|
||||
{
|
||||
// Altering monitor spawns via cvars
|
||||
// If MF_GRENADEBOUNCE is set in the monitor's info,
|
||||
// skip this step. (Used for gold monitors)
|
||||
// Yeah, this is a dirty hack.
|
||||
if ((mobjinfo[i].flags & (MF_MONITOR|MF_GRENADEBOUNCE)) == MF_MONITOR)
|
||||
{
|
||||
if (gametyperules & GTR_RACE)
|
||||
{
|
||||
// Set powerup boxes to user settings for competition.
|
||||
switch (cv_competitionboxes.value)
|
||||
{
|
||||
case 1: // Mystery
|
||||
return MT_MYSTERY_BOX;
|
||||
case 2: // Teleport
|
||||
return MT_MIXUP_BOX;
|
||||
case 3: // None
|
||||
return MT_NULL; // Don't spawn!
|
||||
default:
|
||||
return i;
|
||||
}
|
||||
}
|
||||
// Set powerup boxes to user settings for other netplay modes
|
||||
else if (!G_CoopGametype())
|
||||
{
|
||||
switch (cv_matchboxes.value)
|
||||
{
|
||||
case 1: // Mystery
|
||||
return MT_MYSTERY_BOX;
|
||||
case 2: // Unchanging
|
||||
if (i == MT_MYSTERY_BOX)
|
||||
return MT_NULL; // don't spawn
|
||||
mthing->options &= ~(MTF_AMBUSH|MTF_OBJECTSPECIAL); // no random respawning!
|
||||
return i;
|
||||
case 3: // Don't spawn
|
||||
return MT_NULL;
|
||||
default:
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (nightsreplace)
|
||||
{
|
||||
if (i == MT_RING || i == MT_REDTEAMRING || i == MT_BLUETEAMRING || i == MT_COIN)
|
||||
return MT_NIGHTSSTAR;
|
||||
|
||||
if (i == MT_BLUESPHERE)
|
||||
return MT_NIGHTSCHIP;
|
||||
}
|
||||
|
||||
if (!(gametyperules & GTR_TEAMS))
|
||||
{
|
||||
if (i == MT_BLUETEAMRING || i == MT_REDTEAMRING)
|
||||
return MT_RING;
|
||||
|
||||
if (i == MT_RING_BLUEBOX || i == MT_RING_REDBOX)
|
||||
return MT_RING_BOX;
|
||||
}
|
||||
|
||||
if (modeattacking && i == MT_1UP_BOX) // 1UPs -->> Score TVs
|
||||
{
|
||||
// Either or, doesn't matter which.
|
||||
if (mthing->options & (MTF_AMBUSH | MTF_OBJECTSPECIAL))
|
||||
return MT_SCORE10K_BOX; // 10,000
|
||||
else
|
||||
return MT_SCORE1K_BOX; // 1,000
|
||||
}
|
||||
|
||||
if (mariomode && i == MT_ROSY)
|
||||
return MT_TOAD; // don't remove on penalty of death
|
||||
|
||||
// Don't need this for Kart YET!
|
||||
return i;
|
||||
}
|
||||
|
||||
|
|
@ -14380,145 +14058,6 @@ static boolean P_SetupParticleGen(mapthing_t *mthing, mobj_t *mobj)
|
|||
return true;
|
||||
}
|
||||
|
||||
static boolean P_SetupNiGHTSDrone(mapthing_t* mthing, mobj_t* mobj)
|
||||
{
|
||||
boolean flip = mthing->options & MTF_OBJECTFLIP;
|
||||
boolean topaligned = (mthing->options & MTF_OBJECTSPECIAL) && !(mthing->options & MTF_EXTRA);
|
||||
boolean middlealigned = (mthing->options & MTF_EXTRA) && !(mthing->options & MTF_OBJECTSPECIAL);
|
||||
boolean bottomoffsetted = !(mthing->options & MTF_OBJECTSPECIAL) && !(mthing->options & MTF_EXTRA);
|
||||
|
||||
INT16 timelimit = mthing->angle & 0xFFF;
|
||||
fixed_t hitboxradius = ((mthing->angle & 0xF000) >> 12)*32*FRACUNIT;
|
||||
fixed_t hitboxheight = mthing->extrainfo*32*FRACUNIT;
|
||||
fixed_t oldheight = mobj->height;
|
||||
fixed_t dronemanoffset, goaloffset, sparkleoffset, droneboxmandiff, dronemangoaldiff;
|
||||
|
||||
if (timelimit > 0)
|
||||
mobj->health = timelimit;
|
||||
|
||||
if (hitboxradius > 0)
|
||||
mobj->radius = hitboxradius;
|
||||
|
||||
if (hitboxheight > 0)
|
||||
mobj->height = hitboxheight;
|
||||
else
|
||||
mobj->height = mobjinfo[MT_NIGHTSDRONE].height;
|
||||
|
||||
droneboxmandiff = max(mobj->height - mobjinfo[MT_NIGHTSDRONE_MAN].height, 0);
|
||||
dronemangoaldiff = max(mobjinfo[MT_NIGHTSDRONE_MAN].height - mobjinfo[MT_NIGHTSDRONE_GOAL].height, 0);
|
||||
|
||||
if (flip && mobj->height != oldheight)
|
||||
P_TeleportMove(mobj, mobj->x, mobj->y, mobj->z - (mobj->height - oldheight));
|
||||
|
||||
if (!flip)
|
||||
{
|
||||
if (topaligned) // Align droneman to top of hitbox
|
||||
{
|
||||
dronemanoffset = droneboxmandiff;
|
||||
goaloffset = dronemangoaldiff/2 + dronemanoffset;
|
||||
}
|
||||
else if (middlealigned) // Align droneman to center of hitbox
|
||||
{
|
||||
dronemanoffset = droneboxmandiff/2;
|
||||
goaloffset = dronemangoaldiff/2 + dronemanoffset;
|
||||
}
|
||||
else if (bottomoffsetted)
|
||||
{
|
||||
dronemanoffset = 24*FRACUNIT;
|
||||
goaloffset = dronemangoaldiff + dronemanoffset;
|
||||
}
|
||||
else
|
||||
{
|
||||
dronemanoffset = 0;
|
||||
goaloffset = dronemangoaldiff/2 + dronemanoffset;
|
||||
}
|
||||
|
||||
sparkleoffset = goaloffset - FixedMul(15*FRACUNIT, mobj->scale);
|
||||
}
|
||||
else if (i == MT_WAYPOINT)
|
||||
{
|
||||
// just gets set on either the floor or ceiling
|
||||
boolean flip = (!!(mobjinfo[i].flags & MF_SPAWNCEILING) ^ !!(mthing->options & MTF_OBJECTFLIP));
|
||||
|
||||
// applying offsets! (if any)
|
||||
if (flip)
|
||||
{
|
||||
z = ONCEILINGZ;
|
||||
}
|
||||
else
|
||||
{
|
||||
z = ONFLOORZ;
|
||||
}
|
||||
|
||||
if (z == ONFLOORZ)
|
||||
mthing->z = 0;
|
||||
else
|
||||
mthing->z = (INT16)(z>>FRACBITS);
|
||||
}
|
||||
else
|
||||
{
|
||||
mobj->eflags |= MFE_VERTICALFLIP;
|
||||
mobj->flags2 |= MF2_OBJECTFLIP;
|
||||
|
||||
if (topaligned) // Align droneman to top of hitbox
|
||||
{
|
||||
dronemanoffset = 0;
|
||||
goaloffset = dronemangoaldiff/2 + dronemanoffset;
|
||||
}
|
||||
else if (middlealigned) // Align droneman to center of hitbox
|
||||
{
|
||||
dronemanoffset = droneboxmandiff/2;
|
||||
goaloffset = dronemangoaldiff/2 + dronemanoffset;
|
||||
}
|
||||
else if (bottomoffsetted)
|
||||
{
|
||||
dronemanoffset = droneboxmandiff - FixedMul(24*FRACUNIT, mobj->scale);
|
||||
goaloffset = dronemangoaldiff + dronemanoffset;
|
||||
}
|
||||
else
|
||||
{
|
||||
dronemanoffset = droneboxmandiff;
|
||||
goaloffset = dronemangoaldiff/2 + dronemanoffset;
|
||||
}
|
||||
|
||||
sparkleoffset = goaloffset + FixedMul(15*FRACUNIT, mobj->scale);
|
||||
}
|
||||
|
||||
// spawn visual elements
|
||||
{
|
||||
mobj_t* goalpost = P_SpawnMobjFromMobj(mobj, 0, 0, goaloffset, MT_NIGHTSDRONE_GOAL);
|
||||
mobj_t* sparkle = P_SpawnMobjFromMobj(mobj, 0, 0, sparkleoffset, MT_NIGHTSDRONE_SPARKLING);
|
||||
mobj_t* droneman = P_SpawnMobjFromMobj(mobj, 0, 0, dronemanoffset, MT_NIGHTSDRONE_MAN);
|
||||
|
||||
P_SetTarget(&mobj->target, goalpost);
|
||||
P_SetTarget(&goalpost->target, sparkle);
|
||||
P_SetTarget(&goalpost->tracer, droneman);
|
||||
|
||||
// correct Z position
|
||||
if (flip)
|
||||
{
|
||||
P_TeleportMove(goalpost, goalpost->x, goalpost->y, mobj->z + goaloffset);
|
||||
P_TeleportMove(sparkle, sparkle->x, sparkle->y, mobj->z + sparkleoffset);
|
||||
P_TeleportMove(droneman, droneman->x, droneman->y, mobj->z + dronemanoffset);
|
||||
}
|
||||
|
||||
// Remember position preference for later
|
||||
mobj->flags &= ~(MF_SLIDEME|MF_GRENADEBOUNCE);
|
||||
if (topaligned)
|
||||
mobj->flags |= MF_SLIDEME;
|
||||
else if (middlealigned)
|
||||
mobj->flags |= MF_GRENADEBOUNCE;
|
||||
else if (!bottomoffsetted)
|
||||
mobj->flags |= MF_SLIDEME|MF_GRENADEBOUNCE;
|
||||
|
||||
// Remember old Z position and flags for correction detection
|
||||
goalpost->movefactor = mobj->z;
|
||||
goalpost->friction = mobj->height;
|
||||
goalpost->threshold = mobj->flags & (MF_SLIDEME|MF_GRENADEBOUNCE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static boolean P_SetupBooster(mapthing_t* mthing, mobj_t* mobj, boolean strong)
|
||||
{
|
||||
angle_t angle = FixedAngle(mthing->angle << FRACBITS);
|
||||
|
|
@ -14597,9 +14136,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
|
|||
mobj->colorized = true;
|
||||
}
|
||||
break;
|
||||
case MT_EGGMOBILE3:
|
||||
mobj->cusval = mthing->extrainfo;
|
||||
break;
|
||||
case MT_FAN:
|
||||
if (mthing->options & MTF_OBJECTSPECIAL)
|
||||
{
|
||||
|
|
@ -14617,17 +14153,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
|
|||
else
|
||||
mobj->health = FixedMul(mobj->subsector->sector->ceilingheight - mobj->subsector->sector->floorheight, 3*(FRACUNIT/4)) >> FRACBITS;
|
||||
break;
|
||||
case MT_METALSONIC_RACE:
|
||||
case MT_METALSONIC_BATTLE:
|
||||
case MT_FANG:
|
||||
case MT_ROSY:
|
||||
if (mthing->options & MTF_EXTRA)
|
||||
{
|
||||
mobj->color = SKINCOLOR_SILVER;
|
||||
mobj->colorized = true;
|
||||
mobj->flags2 |= MF2_SLIDEPUSH;
|
||||
}
|
||||
break;
|
||||
case MT_BALLOON:
|
||||
if (mthing->angle > 0)
|
||||
mobj->color = ((mthing->angle - 1) % (numskincolors - 1)) + 1;
|
||||
|
|
@ -14710,25 +14235,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
|
|||
mobj->threshold = mthing->angle;
|
||||
mobj->movecount = mthing->extrainfo;
|
||||
break;
|
||||
case MT_POPUPTURRET:
|
||||
if (mthing->angle)
|
||||
mobj->threshold = mthing->angle;
|
||||
else
|
||||
mobj->threshold = (TICRATE*2)-1;
|
||||
break;
|
||||
case MT_NIGHTSBUMPER:
|
||||
// Lower 4 bits specify the angle of
|
||||
// the bumper in 30 degree increments.
|
||||
mobj->threshold = (mthing->options & 15) % 12; // It loops over, etc
|
||||
P_SetMobjState(mobj, mobj->info->spawnstate + mobj->threshold);
|
||||
break;
|
||||
case MT_EGGCAPSULE:
|
||||
if (mthing->angle <= 0)
|
||||
mthing->angle = 20; // prevent 0 health
|
||||
|
||||
mobj->health = mthing->angle;
|
||||
mobj->threshold = min(mthing->extrainfo, 7);
|
||||
break;
|
||||
case MT_TUBEWAYPOINT:
|
||||
{
|
||||
UINT8 sequence = mthing->angle >> 8;
|
||||
|
|
@ -14738,24 +14244,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
|
|||
P_AddWaypoint(sequence, id, mobj);
|
||||
break;
|
||||
}
|
||||
case MT_IDEYAANCHOR:
|
||||
mobj->health = mthing->extrainfo;
|
||||
break;
|
||||
case MT_NIGHTSDRONE:
|
||||
if (!P_SetupNiGHTSDrone(mthing, mobj))
|
||||
return false;
|
||||
break;
|
||||
case MT_HIVEELEMENTAL:
|
||||
if (mthing->extrainfo)
|
||||
mobj->extravalue1 = mthing->extrainfo;
|
||||
break;
|
||||
case MT_GLAREGOYLE:
|
||||
case MT_GLAREGOYLEUP:
|
||||
case MT_GLAREGOYLEDOWN:
|
||||
case MT_GLAREGOYLELONG:
|
||||
if (mthing->angle >= 360)
|
||||
mobj->tics += 7*(mthing->angle/360) + 1; // starting delay
|
||||
break;
|
||||
case MT_DSZSTALAGMITE:
|
||||
case MT_DSZ2STALAGMITE:
|
||||
case MT_KELP:
|
||||
|
|
@ -14802,23 +14290,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
|
|||
if (mthing->angle > 0)
|
||||
mobj->tics += mthing->angle;
|
||||
break;
|
||||
case MT_LAVAFALL:
|
||||
mobj->fuse = 30 + mthing->angle;
|
||||
if (mthing->options & MTF_AMBUSH)
|
||||
{
|
||||
P_SetScale(mobj, 2*mobj->scale);
|
||||
mobj->destscale = mobj->scale;
|
||||
}
|
||||
break;
|
||||
case MT_PYREFLY:
|
||||
//start on fire if Ambush flag is set, otherwise behave normally
|
||||
if (mthing->options & MTF_AMBUSH)
|
||||
{
|
||||
P_SetMobjState(mobj, mobj->info->meleestate);
|
||||
mobj->extravalue2 = 2;
|
||||
S_StartSound(mobj, sfx_s3kc2l);
|
||||
}
|
||||
break;
|
||||
case MT_BIGFERN:
|
||||
{
|
||||
angle_t angle = FixedAngle(mthing->angle << FRACBITS);
|
||||
|
|
@ -14857,22 +14328,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
|
|||
|
||||
mobj->flags2 |= MF2_AXIS;
|
||||
break;
|
||||
case MT_TOKEN:
|
||||
// We advanced tokenbits earlier due to the return check.
|
||||
// Subtract 1 here for the correct value.
|
||||
mobj->health = 1 << (tokenbits - 1);
|
||||
break;
|
||||
case MT_CYBRAKDEMON:
|
||||
if (mthing->options & MTF_AMBUSH)
|
||||
{
|
||||
mobj_t* elecmobj;
|
||||
elecmobj = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_CYBRAKDEMON_ELECTRIC_BARRIER);
|
||||
P_SetTarget(&elecmobj->target, mobj);
|
||||
elecmobj->angle = FixedAngle(mthing->angle << FRACBITS);
|
||||
elecmobj->destscale = mobj->scale*2;
|
||||
P_SetScale(elecmobj, elecmobj->destscale);
|
||||
}
|
||||
break;
|
||||
case MT_STARPOST:
|
||||
{
|
||||
thinker_t* th;
|
||||
|
|
@ -14962,11 +14417,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
|
|||
P_SetTarget(&mobj->tracer, base);
|
||||
}
|
||||
break;
|
||||
case MT_RING_BOX:
|
||||
//count 10 ring boxes into the number of rings equation too.
|
||||
if (nummaprings >= 0)
|
||||
nummaprings += 10;
|
||||
break;
|
||||
case MT_BIGTUMBLEWEED:
|
||||
case MT_LITTLETUMBLEWEED:
|
||||
if (mthing->options & MTF_AMBUSH)
|
||||
|
|
@ -14985,22 +14435,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
|
|||
blueflag = mobj;
|
||||
bflagpoint = mobj->spawnpoint;
|
||||
break;
|
||||
case MT_PUSH:
|
||||
case MT_PULL:
|
||||
mobj->health = 0; // Default behaviour: pushing uses XY, fading uses XYZ
|
||||
|
||||
if (mthing->options & MTF_AMBUSH)
|
||||
mobj->health |= 1; // If ambush is set, push using XYZ
|
||||
if (mthing->options & MTF_OBJECTSPECIAL)
|
||||
mobj->health |= 2; // If object special is set, fade using XY
|
||||
|
||||
if (G_IsSpecialStage(gamemap))
|
||||
P_SetMobjState(mobj, (mobj->type == MT_PUSH) ? S_GRAVWELLGREEN : S_GRAVWELLRED);
|
||||
break;
|
||||
case MT_NIGHTSSTAR:
|
||||
if (maptol & TOL_XMAS)
|
||||
P_SetMobjState(mobj, mobj->info->seestate);
|
||||
break;
|
||||
// SRB2Kart
|
||||
case MT_WAYPOINT:
|
||||
{
|
||||
|
|
@ -15442,17 +14876,6 @@ void P_SpawnHoop(mapthing_t *mthing)
|
|||
P_SpawnHoopInternal(mthing, 8 + (4*(mthing->options & 0xF)), 4*FRACUNIT);
|
||||
}
|
||||
|
||||
void P_SetBonusTime(mobj_t *mobj)
|
||||
{
|
||||
if (!mobj)
|
||||
return;
|
||||
|
||||
if (mobj->type != MT_BLUESPHERE && mobj->type != MT_NIGHTSCHIP)
|
||||
return;
|
||||
|
||||
P_SetMobjState(mobj, mobj->info->raisestate);
|
||||
}
|
||||
|
||||
static void P_SpawnItemRow(mapthing_t *mthing, mobjtype_t* itemtypes, UINT8 numitemtypes, INT32 numitems, fixed_t horizontalspacing, fixed_t verticalspacing, INT16 fixedangle, boolean bonustime)
|
||||
{
|
||||
mapthing_t dummything;
|
||||
|
|
|
|||
|
|
@ -712,7 +712,6 @@ static void P_NetUnArchiveColormaps(void)
|
|||
exc->colormap = existing_exc->colormap; // all our dummies are default values
|
||||
R_AddColormapToList(exc);
|
||||
}
|
||||
>>>>>>> srb2/next
|
||||
}
|
||||
|
||||
// Don't need these anymore
|
||||
|
|
@ -4112,8 +4111,6 @@ static void P_NetArchiveMisc(void)
|
|||
WRITEUINT32(save_p, countdowntimer);
|
||||
WRITEUINT8(save_p, countdowntimeup);
|
||||
|
||||
WRITEUINT32(save_p, hidetime);
|
||||
|
||||
// SRB2kart
|
||||
WRITEINT32(save_p, numgotboxes);
|
||||
WRITEUINT8(save_p, numtargets);
|
||||
|
|
@ -4244,8 +4241,6 @@ static inline boolean P_NetUnArchiveMisc(void)
|
|||
countdowntimer = (tic_t)READUINT32(save_p);
|
||||
countdowntimeup = (boolean)READUINT8(save_p);
|
||||
|
||||
hidetime = READUINT32(save_p);
|
||||
|
||||
// SRB2kart
|
||||
numgotboxes = READINT32(save_p);
|
||||
numtargets = READUINT8(save_p);
|
||||
|
|
|
|||
196
src/p_setup.c
196
src/p_setup.c
|
|
@ -715,9 +715,7 @@ void P_ReloadRings(void)
|
|||
}
|
||||
continue;
|
||||
}
|
||||
if (!(mo->type == MT_RING || mo->type == MT_COIN
|
||||
|| mo->type == MT_BLUESPHERE || mo->type == MT_BOMBSPHERE
|
||||
|| mo->type == MT_NIGHTSCHIP || mo->type == MT_NIGHTSSTAR))
|
||||
if (mo->type != MT_RING)
|
||||
continue;
|
||||
|
||||
// Don't auto-disintegrate things being pulled to us
|
||||
|
|
@ -731,12 +729,10 @@ void P_ReloadRings(void)
|
|||
for (i = 0; i < nummapthings; i++, mt++)
|
||||
{
|
||||
// Notice an omission? We handle hoops differently.
|
||||
if (mt->type == mobjinfo[MT_RING].doomednum || mt->type == mobjinfo[MT_COIN].doomednum
|
||||
|| mt->type == mobjinfo[MT_REDTEAMRING].doomednum || mt->type == mobjinfo[MT_BLUETEAMRING].doomednum
|
||||
|| mt->type == mobjinfo[MT_BLUESPHERE].doomednum || mt->type == mobjinfo[MT_BOMBSPHERE].doomednum)
|
||||
if (mt->type == mobjinfo[MT_RING].doomednum)
|
||||
{
|
||||
mt->mobj = NULL;
|
||||
P_SetBonusTime(P_SpawnMapThing(mt));
|
||||
P_SpawnMapThing(mt);
|
||||
}
|
||||
else if (mt->type >= 600 && mt->type <= 609) // Item patterns
|
||||
{
|
||||
|
|
@ -750,30 +746,6 @@ void P_ReloadRings(void)
|
|||
}
|
||||
}
|
||||
|
||||
void P_SwitchSpheresBonusMode(boolean bonustime)
|
||||
{
|
||||
mobj_t *mo;
|
||||
thinker_t *th;
|
||||
|
||||
// scan the thinkers to find spheres to switch
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)th;
|
||||
|
||||
if (mo->type != MT_BLUESPHERE && mo->type != MT_NIGHTSCHIP
|
||||
&& mo->type != MT_FLINGBLUESPHERE && mo->type != MT_FLINGNIGHTSCHIP)
|
||||
continue;
|
||||
|
||||
if (!mo->health)
|
||||
continue;
|
||||
|
||||
P_SetMobjState(mo, ((bonustime) ? mo->info->raisestate : mo->info->spawnstate));
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef SCANTHINGS
|
||||
void P_ScanThings(INT16 mapnum, INT16 wadnum, INT16 lumpnum)
|
||||
{
|
||||
|
|
@ -799,35 +771,37 @@ void P_ScanThings(INT16 mapnum, INT16 wadnum, INT16 lumpnum)
|
|||
type = READUINT16(data) & 4095;
|
||||
data += sizeof (INT16); // skip options
|
||||
|
||||
switch (type)
|
||||
if (mt->type == mobjinfo[MT_RANDOMITEM].doomednum)
|
||||
{
|
||||
nummapboxes++;
|
||||
}
|
||||
else if (mt->type == mobjinfo[MT_BATTLECAPSULE].doomednum)
|
||||
{
|
||||
maptargets++;
|
||||
}
|
||||
else if (mt->type == mobjinfo[MT_RING].doomednum)
|
||||
{
|
||||
case 300: // MT_RING
|
||||
case 1800: // MT_COIN
|
||||
case 308: // red team ring
|
||||
case 309: // blue team ring
|
||||
maprings++;
|
||||
break;
|
||||
case 400: // MT_SUPERRINGBOX
|
||||
case 414: // red ring box
|
||||
case 415: // blue ring box
|
||||
case 603: // 10 diagonal rings
|
||||
maprings += 10;
|
||||
break;
|
||||
case 600: // 5 vertical rings
|
||||
case 601: // 5 vertical rings
|
||||
case 602: // 5 diagonal rings
|
||||
maprings += 5;
|
||||
break;
|
||||
case 604: // 8 circle rings
|
||||
case 609: // 16 circle rings & wings
|
||||
maprings += 8;
|
||||
break;
|
||||
case 605: // 16 circle rings
|
||||
maprings += 16;
|
||||
break;
|
||||
case 608: // 8 circle rings & wings
|
||||
maprings += 4;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case 603: // 10 diagonal rings
|
||||
maprings += 10;
|
||||
break;
|
||||
case 600: // 5 vertical rings
|
||||
case 601: // 5 vertical rings
|
||||
case 602: // 5 diagonal rings
|
||||
maprings += 5;
|
||||
break;
|
||||
case 604: // 8 circle rings
|
||||
maprings += 8;
|
||||
break;
|
||||
case 605: // 16 circle rings
|
||||
maprings += 16;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Z_Free(datastart);
|
||||
|
|
@ -837,37 +811,12 @@ void P_ScanThings(INT16 mapnum, INT16 wadnum, INT16 lumpnum)
|
|||
}
|
||||
#endif
|
||||
|
||||
static void P_SpawnEmeraldHunt(void)
|
||||
{
|
||||
INT32 emer[3], num[MAXHUNTEMERALDS], i, randomkey;
|
||||
fixed_t x, y, z;
|
||||
|
||||
for (i = 0; i < numhuntemeralds; i++)
|
||||
num[i] = i;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
// generate random index, shuffle afterwards
|
||||
randomkey = P_RandomKey(numhuntemeralds--);
|
||||
emer[i] = num[randomkey];
|
||||
num[randomkey] = num[numhuntemeralds];
|
||||
num[numhuntemeralds] = emer[i];
|
||||
|
||||
// spawn emerald
|
||||
x = huntemeralds[emer[i]]->x<<FRACBITS;
|
||||
y = huntemeralds[emer[i]]->y<<FRACBITS;
|
||||
z = P_GetMapThingSpawnHeight(MT_EMERHUNT, huntemeralds[emer[i]], x, y);
|
||||
P_SetMobjStateNF(P_SpawnMobj(x, y, z, MT_EMERHUNT),
|
||||
mobjinfo[MT_EMERHUNT].spawnstate+i);
|
||||
}
|
||||
}
|
||||
|
||||
static void P_SpawnMapThings(boolean spawnemblems)
|
||||
{
|
||||
size_t i;
|
||||
mapthing_t *mt;
|
||||
|
||||
// Spawn axis points first so they are at the front of the list for fast searching.
|
||||
// Spawn axis points first so they are at the front of the list for fast searching.
|
||||
for (i = 0, mt = mapthings; i < nummapthings; i++, mt++)
|
||||
{
|
||||
switch (mt->type)
|
||||
|
|
@ -883,8 +832,6 @@ static void P_SpawnMapThings(boolean spawnemblems)
|
|||
}
|
||||
}
|
||||
|
||||
numhuntemeralds = 0;
|
||||
|
||||
for (i = 0, mt = mapthings; i < nummapthings; i++, mt++)
|
||||
{
|
||||
if (mt->type == 1700 // MT_AXIS
|
||||
|
|
@ -892,18 +839,8 @@ static void P_SpawnMapThings(boolean spawnemblems)
|
|||
|| mt->type == 1702) // MT_AXISTRANSFERLINE
|
||||
continue; // These were already spawned
|
||||
|
||||
/* MOVE TO P_SPAWNMAPTHING
|
||||
|
||||
if (mt->type == mobjinfo[MT_RANDOMITEM].doomednum)
|
||||
nummapboxes++;
|
||||
|
||||
if (mt->type == mobjinfo[MT_BATTLECAPSULE].doomednum)
|
||||
{
|
||||
maptargets++;
|
||||
continue; // These should not be spawned *yet*
|
||||
}
|
||||
|
||||
*/
|
||||
continue; // This will spawn later
|
||||
|
||||
if (!spawnemblems && mt->type == mobjinfo[MT_EMBLEM].doomednum)
|
||||
continue;
|
||||
|
|
@ -917,10 +854,6 @@ static void P_SpawnMapThings(boolean spawnemblems)
|
|||
else // Everything else
|
||||
P_SpawnMapThing(mt);
|
||||
}
|
||||
|
||||
// random emeralds for hunt
|
||||
if (numhuntemeralds)
|
||||
P_SpawnEmeraldHunt();
|
||||
}
|
||||
|
||||
// Experimental groovy write function!
|
||||
|
|
@ -3425,7 +3358,6 @@ static void P_InitLevelSettings(void)
|
|||
players[i].gotcontinue = false;
|
||||
|
||||
players[i].xtralife = players[i].deadtimer = players[i].numboxes = players[i].totalring = players[i].laps = 0;
|
||||
players[i].health = 1;
|
||||
players[i].aiming = 0;
|
||||
players[i].pflags &= ~PF_TIMEOVER;
|
||||
}
|
||||
|
|
@ -3462,7 +3394,7 @@ static void P_InitLevelSettings(void)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (G_BattleGametype())
|
||||
if ((gametyperules & GTR_BUMPERS))
|
||||
gamespeed = KARTSPEED_EASY;
|
||||
else
|
||||
{
|
||||
|
|
@ -3556,15 +3488,15 @@ static void P_ForceCharacter(const char *forcecharskin)
|
|||
if (splitscreen)
|
||||
{
|
||||
sprintf(skincmd, "skin2 %s\n", forcecharskin);
|
||||
CV_Set(&cv_skin2, forcecharskin);
|
||||
CV_Set(&cv_skin[1], forcecharskin);
|
||||
if (splitscreen > 1)
|
||||
{
|
||||
sprintf(skincmd, "skin3 %s\n", forcecharskin);
|
||||
CV_Set(&cv_skin3, forcecharskin);
|
||||
CV_Set(&cv_skin[2], forcecharskin);
|
||||
if (splitscreen > 2)
|
||||
{
|
||||
sprintf(skincmd, "skin4 %s\n", forcecharskin);
|
||||
CV_Set(&cv_skin4, forcecharskin);
|
||||
CV_Set(&cv_skin[3], forcecharskin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3574,42 +3506,18 @@ static void P_ForceCharacter(const char *forcecharskin)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (splitscreen)
|
||||
UINT8 i;
|
||||
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
SetPlayerSkin(g_localplayers[1], forcecharskin);
|
||||
if ((unsigned)cv_playercolor2.value != skins[players[g_localplayers[1]].skin].prefcolor && !modeattacking)
|
||||
SetPlayerSkin(g_localplayers[i], forcecharskin);
|
||||
|
||||
// normal player colors in single player
|
||||
if ((unsigned)cv_playercolor[i].value != skins[players[g_localplayers[i]].skin].prefcolor && !modeattacking)
|
||||
{
|
||||
CV_StealthSetValue(&cv_playercolor2, skins[players[g_localplayers[1]].skin].prefcolor);
|
||||
players[g_localplayers[1]].skincolor = skins[players[g_localplayers[1]].skin].prefcolor;
|
||||
CV_StealthSetValue(&cv_playercolor[i], skins[players[g_localplayers[i]].skin].prefcolor);
|
||||
players[g_localplayers[i]].skincolor = skins[players[g_localplayers[i]].skin].prefcolor;
|
||||
}
|
||||
|
||||
if (splitscreen > 1)
|
||||
{
|
||||
SetPlayerSkin(g_localplayers[2], forcecharskin);
|
||||
if ((unsigned)cv_playercolor3.value != skins[players[g_localplayers[2]].skin].prefcolor && !modeattacking)
|
||||
{
|
||||
CV_StealthSetValue(&cv_playercolor3, skins[players[g_localplayers[2]].skin].prefcolor);
|
||||
players[g_localplayers[2]].skincolor = skins[players[g_localplayers[2]].skin].prefcolor;
|
||||
}
|
||||
|
||||
if (splitscreen > 2)
|
||||
{
|
||||
SetPlayerSkin(g_localplayers[3], forcecharskin);
|
||||
if ((unsigned)cv_playercolor4.value != skins[players[g_localplayers[3]].skin].prefcolor && !modeattacking)
|
||||
{
|
||||
CV_StealthSetValue(&cv_playercolor4, skins[players[g_localplayers[3]].skin].prefcolor);
|
||||
players[g_localplayers[3]].skincolor = skins[players[g_localplayers[3]].skin].prefcolor;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SetPlayerSkin(consoleplayer, forcecharskin);
|
||||
// normal player colors in single player
|
||||
if ((unsigned)cv_playercolor.value != skins[players[consoleplayer].skin].prefcolor && !modeattacking)
|
||||
{
|
||||
CV_StealthSetValue(&cv_playercolor, skins[players[consoleplayer].skin].prefcolor);
|
||||
players[consoleplayer].skincolor = skins[players[consoleplayer].skin].prefcolor;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3935,11 +3843,11 @@ static void P_InitPlayers(void)
|
|||
|
||||
players[i].mo = NULL;
|
||||
|
||||
if (!G_RaceGametype())
|
||||
if (!(gametyperules & GTR_CIRCUIT))
|
||||
{
|
||||
G_DoReborn(i);
|
||||
}
|
||||
else // gametype is GT_COOP or GT_RACE
|
||||
else // gametype is race
|
||||
{
|
||||
G_SpawnPlayer(i);
|
||||
if (players[i].starposttime)
|
||||
|
|
@ -3957,9 +3865,7 @@ static void P_InitGametype(void)
|
|||
if (modeattacking && !demo.playback)
|
||||
P_LoadRecordGhosts();
|
||||
|
||||
if (G_TagGametype())
|
||||
P_InitTagGametype();
|
||||
else if ((gametyperules & GTR_RACE) && server)
|
||||
if ((gametyperules & GTR_CIRCUIT) && server)
|
||||
{
|
||||
if ((netgame || multiplayer) && cv_basenumlaps.value
|
||||
&& (!(mapheaderinfo[gamemap - 1]->levelflags & LF_SECTIONRACE)
|
||||
|
|
@ -4241,7 +4147,7 @@ boolean P_LoadLevel(boolean fromnetsave)
|
|||
// The waypoint data that's in PU_LEVEL needs to be reset back to 0/NULL now since PU_LEVEL was cleared
|
||||
K_ClearWaypoints();
|
||||
// Load the waypoints please!
|
||||
if (G_RaceGametype())
|
||||
if ((gametyperules & GTR_CIRCUIT))
|
||||
{
|
||||
if (K_SetupWaypointList() == false)
|
||||
{
|
||||
|
|
|
|||
84
src/p_spec.c
84
src/p_spec.c
|
|
@ -2223,7 +2223,7 @@ void P_CrossSpecialLine(line_t *line, INT32 side, mobj_t *thing)
|
|||
{
|
||||
case 2001: // Finish Line
|
||||
{
|
||||
if (G_RaceGametype() && !(player->exiting) && !(player->pflags & PF_HITFINISHLINE))
|
||||
if ((gametyperules & GTR_CIRCUIT) && !(player->exiting) && !(player->pflags & PF_HITFINISHLINE))
|
||||
{
|
||||
if (((line->flags & (ML_NOCLIMB)) && (side == 0))
|
||||
|| (!(line->flags & (ML_NOCLIMB)) && (side == 1))) // crossed from behind to infront
|
||||
|
|
@ -4059,11 +4059,6 @@ void P_SetupSignExit(player_t *player)
|
|||
if (thing->type != MT_SIGN)
|
||||
continue;
|
||||
|
||||
if (!numfound
|
||||
&& !(player->mo->target && player->mo->target->type == MT_SIGN)
|
||||
&& !((gametyperules & GTR_FRIENDLY) && (netgame || multiplayer) && cv_exitmove.value))
|
||||
P_SetTarget(&player->mo->target, thing);
|
||||
|
||||
if (thing->state != &states[thing->info->spawnstate])
|
||||
continue;
|
||||
|
||||
|
|
@ -4085,11 +4080,6 @@ void P_SetupSignExit(player_t *player)
|
|||
if (thing->type != MT_SIGN)
|
||||
continue;
|
||||
|
||||
if (!numfound
|
||||
&& !(player->mo->target && player->mo->target->type == MT_SIGN)
|
||||
&& !((gametyperules & GTR_FRIENDLY) && (netgame || multiplayer) && cv_exitmove.value))
|
||||
P_SetTarget(&player->mo->target, thing);
|
||||
|
||||
if (thing->state != &states[thing->info->spawnstate])
|
||||
continue;
|
||||
|
||||
|
|
@ -4838,70 +4828,8 @@ DoneSection2:
|
|||
}
|
||||
break;
|
||||
|
||||
case 3: // Red Team's Base
|
||||
if ((gametyperules & GTR_TEAMFLAGS) && P_IsObjectOnGround(player->mo))
|
||||
{
|
||||
if (player->ctfteam == 1 && (player->gotflag & GF_BLUEFLAG))
|
||||
{
|
||||
mobj_t *mo;
|
||||
|
||||
// Make sure the red team still has their own
|
||||
// flag at their base so they can score.
|
||||
if (!P_IsFlagAtBase(MT_REDFLAG))
|
||||
break;
|
||||
|
||||
HU_SetCEchoFlags(V_AUTOFADEOUT|V_ALLOWLOWERCASE);
|
||||
HU_SetCEchoDuration(5);
|
||||
HU_DoCEcho(va(M_GetText("%s%s%s\\CAPTURED THE %sBLUE FLAG%s.\\\\\\\\"), "\x85", player_names[player-players], "\x80", "\x84", "\x80"));
|
||||
|
||||
if (splitscreen || players[consoleplayer].ctfteam == 1)
|
||||
S_StartSound(NULL, sfx_flgcap);
|
||||
else if (players[consoleplayer].ctfteam == 2)
|
||||
S_StartSound(NULL, sfx_lose);
|
||||
|
||||
mo = P_SpawnMobj(player->mo->x,player->mo->y,player->mo->z,MT_BLUEFLAG);
|
||||
player->gotflag &= ~GF_BLUEFLAG;
|
||||
mo->flags &= ~MF_SPECIAL;
|
||||
mo->fuse = TICRATE;
|
||||
mo->spawnpoint = bflagpoint;
|
||||
mo->flags2 |= MF2_JUSTATTACKED;
|
||||
redscore += 1;
|
||||
P_AddPlayerScore(player, 5);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 4: // Blue Team's Base
|
||||
if ((gametyperules & GTR_TEAMFLAGS) && P_IsObjectOnGround(player->mo))
|
||||
{
|
||||
if (player->ctfteam == 2 && (player->gotflag & GF_REDFLAG))
|
||||
{
|
||||
mobj_t *mo;
|
||||
|
||||
// Make sure the blue team still has their own
|
||||
// flag at their base so they can score.
|
||||
if (!P_IsFlagAtBase(MT_BLUEFLAG))
|
||||
break;
|
||||
|
||||
HU_SetCEchoFlags(V_AUTOFADEOUT|V_ALLOWLOWERCASE);
|
||||
HU_SetCEchoDuration(5);
|
||||
HU_DoCEcho(va(M_GetText("%s%s%s\\CAPTURED THE %sRED FLAG%s.\\\\\\\\"), "\x84", player_names[player-players], "\x80", "\x85", "\x80"));
|
||||
|
||||
if (splitscreen || players[consoleplayer].ctfteam == 2)
|
||||
S_StartSound(NULL, sfx_flgcap);
|
||||
else if (players[consoleplayer].ctfteam == 1)
|
||||
S_StartSound(NULL, sfx_lose);
|
||||
|
||||
mo = P_SpawnMobj(player->mo->x,player->mo->y,player->mo->z,MT_REDFLAG);
|
||||
player->gotflag &= ~GF_REDFLAG;
|
||||
mo->flags &= ~MF_SPECIAL;
|
||||
mo->fuse = TICRATE;
|
||||
mo->spawnpoint = rflagpoint;
|
||||
mo->flags2 |= MF2_JUSTATTACKED;
|
||||
bluescore += 1;
|
||||
P_AddPlayerScore(player, 5);
|
||||
}
|
||||
}
|
||||
case 3: // Red Team's goal
|
||||
case 4: // Blue Team's goal
|
||||
break;
|
||||
|
||||
case 5: // Fan sector
|
||||
|
|
@ -6890,14 +6818,14 @@ void P_SpawnSpecials(boolean fromnetsave)
|
|||
break;
|
||||
|
||||
case 308: // Race-only linedef executor. Triggers once.
|
||||
if (!(gametyperules & GTR_RACE))
|
||||
if (!(gametyperules & GTR_CIRCUIT))
|
||||
lines[i].special = 0;
|
||||
break;
|
||||
|
||||
// Linedef executor triggers for CTF teams.
|
||||
case 309:
|
||||
case 311:
|
||||
if (!(gametyperules & GTR_TEAMFLAGS))
|
||||
if (!(gametyperules & GTR_TEAMS))
|
||||
lines[i].special = 0;
|
||||
break;
|
||||
|
||||
|
|
@ -7137,7 +7065,7 @@ void P_SpawnSpecials(boolean fromnetsave)
|
|||
case 2000: // Waypoint Parameters
|
||||
break;
|
||||
case 2001: // Finish Line
|
||||
if (G_RaceGametype())
|
||||
if ((gametyperules & GTR_CIRCUIT))
|
||||
circuitmap = true;
|
||||
break;
|
||||
case 2002: // Linedef Trigger: Race Lap
|
||||
|
|
|
|||
16
src/p_tick.c
16
src/p_tick.c
|
|
@ -489,9 +489,6 @@ void P_Ticker(boolean run)
|
|||
{
|
||||
players[i].quittime++;
|
||||
|
||||
if (players[i].quittime == 30 * TICRATE && G_TagGametype())
|
||||
P_CheckSurvivors();
|
||||
|
||||
if (server && players[i].quittime >= (tic_t)FixedMul(cv_rejointimeout.value, 60 * TICRATE)
|
||||
&& !(players[i].quittime % TICRATE))
|
||||
SendKick(i, KICK_MSG_PLAYER_QUIT);
|
||||
|
|
@ -590,7 +587,7 @@ void P_Ticker(boolean run)
|
|||
if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo))
|
||||
P_PlayerAfterThink(&players[i]);
|
||||
|
||||
if (G_BattleGametype() && battleovertime.enabled)
|
||||
if ((gametyperules & GTR_BUMPERS) && battleovertime.enabled)
|
||||
K_RunBattleOvertime();
|
||||
|
||||
LUAh_ThinkFrame();
|
||||
|
|
@ -613,11 +610,10 @@ void P_Ticker(boolean run)
|
|||
if (!(modeattacking && !demo.playback) || leveltime >= starttime - TICRATE*4)
|
||||
timeinmap++;
|
||||
|
||||
/*if (G_TagGametype())
|
||||
P_DoTagStuff();
|
||||
|
||||
/*
|
||||
if (G_GametypeHasTeams())
|
||||
P_DoCTFStuff();*/
|
||||
P_DoCTFStuff();
|
||||
*/
|
||||
|
||||
if (run)
|
||||
{
|
||||
|
|
@ -650,7 +646,7 @@ void P_Ticker(boolean run)
|
|||
if (hyubgone > 1)
|
||||
hyubgone--;
|
||||
|
||||
if (G_BattleGametype())
|
||||
if ((gametyperules & GTR_BUMPERS))
|
||||
{
|
||||
if (wantedcalcdelay && --wantedcalcdelay <= 0)
|
||||
K_CalculateBattleWanted();
|
||||
|
|
@ -773,7 +769,7 @@ void P_PreTicker(INT32 frames)
|
|||
if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo))
|
||||
P_PlayerAfterThink(&players[i]);
|
||||
|
||||
if (G_BattleGametype() && battleovertime.enabled)
|
||||
if ((gametyperules & GTR_BUMPERS) && battleovertime.enabled)
|
||||
K_RunBattleOvertime();
|
||||
|
||||
LUAh_ThinkFrame();
|
||||
|
|
|
|||
129
src/p_user.c
129
src/p_user.c
|
|
@ -404,7 +404,7 @@ UINT8 P_FindLowestLap(void)
|
|||
INT32 i;
|
||||
UINT8 lowest = UINT8_MAX;
|
||||
|
||||
if (gametyperules & GTR_RACE)
|
||||
if (gametyperules & GTR_CIRCUIT)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
|
|
@ -431,7 +431,7 @@ UINT8 P_FindHighestLap(void)
|
|||
INT32 i;
|
||||
UINT8 highest = 0;
|
||||
|
||||
if (!G_RaceGametype())
|
||||
if (!(gametyperules & GTR_CIRCUIT))
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
|
|
@ -489,7 +489,7 @@ void P_GivePlayerRings(player_t *player, INT32 num_rings)
|
|||
if (!player->mo)
|
||||
return;
|
||||
|
||||
if (G_BattleGametype()) // No rings in Battle Mode
|
||||
if ((gametyperules & GTR_BUMPERS)) // No rings in Battle Mode
|
||||
return;
|
||||
|
||||
player->kartstuff[k_rings] += num_rings;
|
||||
|
|
@ -501,64 +501,12 @@ void P_GivePlayerRings(player_t *player, INT32 num_rings)
|
|||
player->rings = -20; // Chaotix ring debt!
|
||||
}
|
||||
|
||||
//
|
||||
// P_GivePlayerLives
|
||||
//
|
||||
// Gives the player an extra life.
|
||||
// Call this function when you want to add lives to the player.
|
||||
//
|
||||
void P_GivePlayerLives(player_t *player, INT32 numlives)
|
||||
{
|
||||
UINT8 prevlives = player->lives;
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
if (player->bot)
|
||||
player = &players[consoleplayer];
|
||||
|
||||
if (gamestate == GS_LEVEL)
|
||||
{
|
||||
if (player->lives == INFLIVES || !(gametyperules & GTR_LIVES))
|
||||
{
|
||||
P_GivePlayerRings(player, 100*numlives);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((netgame || multiplayer) && G_GametypeUsesCoopLives() && cv_cooplives.value == 0)
|
||||
{
|
||||
P_GivePlayerRings(player, 100*numlives);
|
||||
if (player->lives - prevlives >= numlives)
|
||||
goto docooprespawn;
|
||||
|
||||
numlives = (numlives + prevlives - player->lives);
|
||||
}
|
||||
}
|
||||
else if (player->lives == INFLIVES)
|
||||
return;
|
||||
|
||||
player->lives += numlives;
|
||||
|
||||
if (player->lives > 99)
|
||||
player->lives = 99;
|
||||
else if (player->lives < 1)
|
||||
player->lives = 1;
|
||||
|
||||
docooprespawn:
|
||||
if (cv_coopstarposts.value)
|
||||
return;
|
||||
if (prevlives > 0)
|
||||
return;
|
||||
if (!player->spectator)
|
||||
return;
|
||||
P_SpectatorJoinGame(player);
|
||||
}
|
||||
|
||||
// Adds to the player's score
|
||||
void P_AddPlayerScore(player_t *player, UINT32 amount)
|
||||
{
|
||||
//UINT32 oldscore;
|
||||
|
||||
if (!(G_BattleGametype()))
|
||||
if (!((gametyperules & GTR_BUMPERS)))
|
||||
return;
|
||||
|
||||
if (player->exiting) // srb2kart
|
||||
|
|
@ -782,7 +730,7 @@ boolean P_EndingMusic(player_t *player)
|
|||
bestlocalpos = ((player->pflags & PF_TIMEOVER) ? MAXPLAYERS+1 : player->kartstuff[k_position]);
|
||||
}
|
||||
|
||||
if (G_RaceGametype() && bestlocalpos == MAXPLAYERS+1)
|
||||
if ((gametyperules & GTR_CIRCUIT) && bestlocalpos == MAXPLAYERS+1)
|
||||
sprintf(buffer, "k*fail"); // F-Zero death results theme
|
||||
else
|
||||
{
|
||||
|
|
@ -796,9 +744,9 @@ boolean P_EndingMusic(player_t *player)
|
|||
|
||||
S_SpeedMusic(1.0f);
|
||||
|
||||
if (G_RaceGametype())
|
||||
if ((gametyperules & GTR_CIRCUIT))
|
||||
buffer[1] = 'r';
|
||||
else if (G_BattleGametype())
|
||||
else if ((gametyperules & GTR_BUMPERS))
|
||||
{
|
||||
buffer[1] = 'b';
|
||||
looping = false;
|
||||
|
|
@ -891,7 +839,7 @@ void P_RestoreMusic(player_t *player)
|
|||
#if 0
|
||||
// Event - Final Lap
|
||||
// Still works for GME, but disabled for consistency
|
||||
if (G_RaceGametype() && player->laps >= (UINT8)(cv_numlaps.value))
|
||||
if ((gametyperules & GTR_CIRCUIT) && player->laps >= (UINT8)(cv_numlaps.value))
|
||||
S_SpeedMusic(1.2f);
|
||||
#endif
|
||||
if (mapmusresume && cv_resume.value)
|
||||
|
|
@ -1376,7 +1324,7 @@ void P_DoPlayerExit(player_t *player)
|
|||
if (P_IsLocalPlayer(player) && (!player->spectator && !demo.playback))
|
||||
legitimateexit = true;
|
||||
|
||||
if (G_RaceGametype()) // If in Race Mode, allow
|
||||
if ((gametyperules & GTR_CIRCUIT)) // If in Race Mode, allow
|
||||
{
|
||||
player->exiting = raceexittime+2;
|
||||
K_KartUpdatePosition(player);
|
||||
|
|
@ -1411,7 +1359,7 @@ void P_DoPlayerExit(player_t *player)
|
|||
if (P_CheckRacers())
|
||||
player->exiting = raceexittime+1;
|
||||
}
|
||||
else if (G_BattleGametype()) // Battle Mode exiting
|
||||
else if ((gametyperules & GTR_BUMPERS)) // Battle Mode exiting
|
||||
{
|
||||
player->exiting = battleexittime+1;
|
||||
P_EndingMusic(player);
|
||||
|
|
@ -2792,7 +2740,7 @@ static void P_DeathThink(player_t *player)
|
|||
if (player->bot) // don't allow bots to do any of the below, B_CheckRespawn does all they need for respawning already
|
||||
goto notrealplayer;
|
||||
|
||||
if ((player->pflags & PF_TIMEOVER) && G_RaceGametype())
|
||||
if ((player->pflags & PF_TIMEOVER) && (gametyperules & GTR_CIRCUIT))
|
||||
{
|
||||
player->karthud[khud_timeovercam]++;
|
||||
|
||||
|
|
@ -3264,7 +3212,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
|
|||
|| (leveltime < introtime)); // Kart intro cam
|
||||
#endif
|
||||
|
||||
if ((player->pflags & PF_TIMEOVER) && G_RaceGametype()) // 1 for momentum keep, 2 for turnaround
|
||||
if ((player->pflags & PF_TIMEOVER) && (gametyperules & GTR_CIRCUIT)) // 1 for momentum keep, 2 for turnaround
|
||||
timeover = (player->karthud[khud_timeovercam] > 2*TICRATE ? 2 : 1);
|
||||
else
|
||||
timeover = 0;
|
||||
|
|
@ -4194,8 +4142,7 @@ void P_PlayerThink(player_t *player)
|
|||
{
|
||||
seenplayer = NULL;
|
||||
|
||||
if (cv_seenames.value && cv_allowseenames.value &&
|
||||
!(G_TagGametype() && (player->pflags & PF_TAGIT)))
|
||||
if (cv_seenames.value && cv_allowseenames.value)
|
||||
{
|
||||
mobj_t *mo = P_SpawnNameFinder(player->mo, MT_NAMECHECK);
|
||||
|
||||
|
|
@ -4251,7 +4198,7 @@ void P_PlayerThink(player_t *player)
|
|||
|
||||
if (!mapreset)
|
||||
{
|
||||
if (gametyperules & GTR_RACE)
|
||||
if (gametyperules & GTR_CIRCUIT)
|
||||
{
|
||||
INT32 i;
|
||||
|
||||
|
|
@ -4293,7 +4240,7 @@ void P_PlayerThink(player_t *player)
|
|||
|
||||
// If it is set, start subtracting
|
||||
// Don't allow it to go back to 0
|
||||
if (player->exiting > 1 && (player->exiting < raceexittime+2 || !G_RaceGametype())) // SRB2kart - "&& player->exiting > 1"
|
||||
if (player->exiting > 1 && (player->exiting < raceexittime+2 || !(gametyperules & GTR_CIRCUIT))) // SRB2kart - "&& player->exiting > 1"
|
||||
player->exiting--;
|
||||
|
||||
if (player->exiting && exitcountdown)
|
||||
|
|
@ -4302,39 +4249,8 @@ void P_PlayerThink(player_t *player)
|
|||
|
||||
if (player->exiting == 2 || countdown2 == 2)
|
||||
{
|
||||
UINT8 numneeded = (G_IsSpecialStage(gamemap) ? 4 : cv_playersforexit.value);
|
||||
if (numneeded) // Count to be sure everyone's exited
|
||||
{
|
||||
INT32 i, total = 0, exiting = 0;
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (!playeringame[i] || players[i].spectator || players[i].bot)
|
||||
continue;
|
||||
if (players[i].quittime > 30 * TICRATE)
|
||||
continue;
|
||||
if (players[i].lives <= 0)
|
||||
continue;
|
||||
|
||||
total++;
|
||||
if (players[i].exiting && players[i].exiting < 4)
|
||||
exiting++;
|
||||
}
|
||||
|
||||
if (!total || ((4*exiting)/total) >= numneeded)
|
||||
{
|
||||
if (server)
|
||||
SendNetXCmd(XD_EXITLEVEL, NULL, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (player->pflags & PF_FINISHED)
|
||||
{
|
||||
if (((gametyperules & GTR_FRIENDLY) && cv_exitmove.value) && !G_EnoughPlayersFinished())
|
||||
player->exiting = 0;
|
||||
else
|
||||
P_DoPlayerExit(player);
|
||||
if (server)
|
||||
SendNetXCmd(XD_EXITLEVEL, NULL, 0);
|
||||
}
|
||||
|
||||
// check water content, set stuff in mobj
|
||||
|
|
@ -4351,8 +4267,8 @@ void P_PlayerThink(player_t *player)
|
|||
#else
|
||||
if (player->spectator &&
|
||||
#endif
|
||||
G_GametypeUsesCoopStarposts() && (netgame || multiplayer) && cv_coopstarposts.value == 2)
|
||||
P_ConsiderAllGone();
|
||||
(gametyperules & GTR_LIVES))
|
||||
/*P_ConsiderAllGone()*/;
|
||||
|
||||
if (player->playerstate == PST_DEAD)
|
||||
{
|
||||
|
|
@ -4391,7 +4307,7 @@ void P_PlayerThink(player_t *player)
|
|||
// Synchronizes the "real" amount of time spent in the level.
|
||||
if (!player->exiting && !stoppedclock)
|
||||
{
|
||||
if (gametyperules & GTR_RACE)
|
||||
if (gametyperules & GTR_CIRCUIT)
|
||||
{
|
||||
player->realtime = leveltime - starttime;
|
||||
if (player == &players[consoleplayer])
|
||||
|
|
@ -4535,8 +4451,7 @@ void P_PlayerThink(player_t *player)
|
|||
player->pflags &= ~PF_USEDOWN;
|
||||
|
||||
// IF PLAYER NOT HERE THEN FLASH END IF
|
||||
if (player->quittime && player->powers[pw_flashing] < flashingtics - 1
|
||||
&& !(G_TagGametype() && !(player->pflags & PF_TAGIT)) && !player->gotflag)
|
||||
if (player->quittime && player->powers[pw_flashing] < flashingtics - 1 && !player->gotflag)
|
||||
player->powers[pw_flashing] = flashingtics - 1;
|
||||
|
||||
// Counters, time dependent power ups.
|
||||
|
|
@ -4572,7 +4487,7 @@ void P_PlayerThink(player_t *player)
|
|||
|| player->kartstuff[k_growshrinktimer] > 0 // Grow doesn't flash either.
|
||||
|| player->kartstuff[k_respawn] // Respawn timer (for drop dash effect)
|
||||
|| (player->pflags & PF_TIMEOVER) // NO CONTEST explosion
|
||||
|| (G_BattleGametype() && player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer])
|
||||
|| ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer])
|
||||
|| leveltime < starttime)) // Level intro
|
||||
{
|
||||
if (player->powers[pw_flashing] > 0 && player->powers[pw_flashing] < K_GetKartFlashing(player)
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@ typedef struct
|
|||
skinflags_t flags;
|
||||
|
||||
char realname[SKINNAMESIZE+1]; // Display name for level completion.
|
||||
char hudname[SKINNAMESIZE+1]; // HUD name to display (officially exactly 5 characters long)
|
||||
char facerank[9], facewant[9], facemmap[9]; // Arbitrarily named patch lumps
|
||||
|
||||
// SRB2kart
|
||||
|
|
@ -50,18 +49,19 @@ typedef struct
|
|||
// Definable color translation table
|
||||
UINT8 starttranscolor;
|
||||
UINT16 prefcolor;
|
||||
UINT16 supercolor;
|
||||
UINT16 prefoppositecolor; // if 0 use tables instead
|
||||
|
||||
fixed_t highresscale; // scale of highres, default is 0.5
|
||||
|
||||
char rivals[SKINRIVALS][SKINNAMESIZE+1]; // Your top 3 rivals for GP mode. Uses names so that you can reference skins that aren't added
|
||||
|
||||
// specific sounds per skin
|
||||
sfxenum_t soundsid[NUMSKINSOUNDS]; // sound # in S_sfx table
|
||||
|
||||
// contains super versions too
|
||||
spritedef_t sprites[NUMPLAYERSPRITES*2];
|
||||
spriteinfo_t sprinfo[NUMPLAYERSPRITES*2];
|
||||
|
||||
char rivals[SKINRIVALS][SKINNAMESIZE+1]; // Your top 3 rivals for GP mode. Uses names so that you can reference skins that aren't added
|
||||
|
||||
UINT8 availability; // lock?
|
||||
} skin_t;
|
||||
|
||||
/// Externs
|
||||
|
|
@ -124,7 +124,7 @@ typedef struct follower_s
|
|||
} follower_t;
|
||||
|
||||
extern INT32 numfollowers;
|
||||
extern follower_t followers[MAXSKINS]; // again, use the same rules as skins, no reason not to.
|
||||
extern follower_t followers[MAXSKINS]; // again, use the same rules as skins, no reason not to.
|
||||
|
||||
INT32 R_FollowerAvailable(const char *name);
|
||||
boolean SetPlayerFollower(INT32 playernum,const char *skinname);
|
||||
|
|
|
|||
|
|
@ -2617,7 +2617,6 @@ boolean S_RecallMusic(UINT16 status, boolean fromfirst)
|
|||
else if (!entry->status)
|
||||
{
|
||||
Z_Free(entry);
|
||||
>>>>>>> srb2/next
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -3308,8 +3307,8 @@ static void PlaySoundIfUnfocused_OnChange(void)
|
|||
S_EnableSound();
|
||||
}
|
||||
}
|
||||
=======
|
||||
|
||||
#ifndef NO_MIDI
|
||||
void MusicPref_OnChange(void)
|
||||
{
|
||||
if (M_CheckParm("-nomusic") || M_CheckParm("-noaudio") ||
|
||||
|
|
@ -3321,6 +3320,7 @@ void MusicPref_OnChange(void)
|
|||
else if (S_PrefAvailable(cv_musicpref.value, "_clear"))
|
||||
S_ChangeMusicInternal("_clear", false);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_OPENMPT
|
||||
void ModFilter_OnChange(void)
|
||||
|
|
@ -3329,4 +3329,3 @@ void ModFilter_OnChange(void)
|
|||
openmpt_module_set_render_param(openmpt_mhandle, OPENMPT_MODULE_RENDER_INTERPOLATIONFILTER_LENGTH, cv_modfilter.value);
|
||||
}
|
||||
#endif
|
||||
>>>>>>> srb2/next
|
||||
|
|
|
|||
|
|
@ -593,11 +593,6 @@ void SCR_ClosedCaptions(void)
|
|||
basey -= 42;
|
||||
else if (splitscreen)
|
||||
basey -= 8;
|
||||
else if ((modeattacking == ATTACKING_NIGHTS)
|
||||
|| (!(maptol & TOL_NIGHTS)
|
||||
&& ((cv_powerupdisplay.value == 2) // "Always"
|
||||
|| (cv_powerupdisplay.value == 1 && !camera.chase)))) // "First-person only"
|
||||
basey -= 16;
|
||||
}
|
||||
|
||||
for (i = 0; i < NUMCAPTIONS; i++)
|
||||
|
|
@ -632,7 +627,6 @@ void SCR_ClosedCaptions(void)
|
|||
|
||||
V_DrawRightAlignedString(BASEVIDWIDTH - 20, y, flags,
|
||||
va("%c [%s]", dot, (closedcaptions[i].s->caption[0] ? closedcaptions[i].s->caption : closedcaptions[i].s->name)));
|
||||
>>>>>>> srb2/next
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -173,22 +173,23 @@ hudinfo_t hudinfo[NUMHUDITEMS] =
|
|||
|
||||
boolean ST_SameTeam(player_t *a, player_t *b)
|
||||
{
|
||||
// Just pipe team messages to everyone in co-op or race.
|
||||
if (!G_BattleGametype())
|
||||
return true;
|
||||
|
||||
// Spectator chat.
|
||||
if (a->spectator && b->spectator)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Team chat.
|
||||
if (G_GametypeHasTeams())
|
||||
return a->ctfteam == b->ctfteam;
|
||||
|
||||
if (G_TagGametype())
|
||||
return ((a->pflags & PF_TAGIT) == (b->pflags & PF_TAGIT));
|
||||
|
||||
return false;
|
||||
if (G_GametypeHasTeams() == true)
|
||||
{
|
||||
// You get team messages if you're on the same team.
|
||||
return (a->ctfteam == b->ctfteam);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not that everyone's not on the same team, but team messages go to normal chat if everyone's not in the same team.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
static boolean st_stopped = true;
|
||||
|
|
@ -736,10 +737,10 @@ void ST_drawTitleCard(void)
|
|||
UINT8 colornum;
|
||||
const UINT8 *colormap;
|
||||
|
||||
if (players[consoleplayer].skincolor)
|
||||
colornum = players[consoleplayer].skincolor;
|
||||
if (players[g_localplayers[0]].skincolor)
|
||||
colornum = players[g_localplayers[0]].skincolor;
|
||||
else
|
||||
colornum = cv_playercolor.value;
|
||||
colornum = cv_playercolor[0].value;
|
||||
|
||||
colormap = R_GetTranslationColormap(TC_DEFAULT, colornum, GTC_CACHE);
|
||||
|
||||
|
|
@ -901,9 +902,7 @@ static void ST_overlayDrawer(void)
|
|||
|
||||
// draw level title Tails
|
||||
if (*mapheaderinfo[gamemap-1]->lvlttl != '\0' && !(hu_showscores && (netgame || multiplayer) && !mapreset)
|
||||
#ifdef HAVE_BLUA
|
||||
&& LUA_HudEnabled(hud_stagetitle)
|
||||
#endif
|
||||
&& LUA_HudEnabled(hud_stagetitle)
|
||||
)
|
||||
ST_drawLevelTitle();
|
||||
|
||||
|
|
@ -955,15 +954,15 @@ static void ST_overlayDrawer(void)
|
|||
switch (demo.savemode)
|
||||
{
|
||||
case DSM_NOTSAVING:
|
||||
V_DrawRightAlignedThinString(BASEVIDWIDTH - 2, 2, V_HUDTRANS|V_SNAPTOTOP|V_SNAPTORIGHT|V_ALLOWLOWERCASE|(G_BattleGametype() ? V_REDMAP : V_SKYMAP), "Look Backward: Save replay");
|
||||
V_DrawRightAlignedThinString(BASEVIDWIDTH - 2, 2, V_HUDTRANS|V_SNAPTOTOP|V_SNAPTORIGHT|V_ALLOWLOWERCASE|((gametyperules & GTR_BUMPERS) ? V_REDMAP : V_SKYMAP), "Look Backward: Save replay");
|
||||
break;
|
||||
|
||||
case DSM_WILLAUTOSAVE:
|
||||
V_DrawRightAlignedThinString(BASEVIDWIDTH - 2, 2, V_HUDTRANS|V_SNAPTOTOP|V_SNAPTORIGHT|V_ALLOWLOWERCASE|(G_BattleGametype() ? V_REDMAP : V_SKYMAP), "Replay will be saved. (Look Backward: Change title)");
|
||||
V_DrawRightAlignedThinString(BASEVIDWIDTH - 2, 2, V_HUDTRANS|V_SNAPTOTOP|V_SNAPTORIGHT|V_ALLOWLOWERCASE|((gametyperules & GTR_BUMPERS) ? V_REDMAP : V_SKYMAP), "Replay will be saved. (Look Backward: Change title)");
|
||||
break;
|
||||
|
||||
case DSM_WILLSAVE:
|
||||
V_DrawRightAlignedThinString(BASEVIDWIDTH - 2, 2, V_HUDTRANS|V_SNAPTOTOP|V_SNAPTORIGHT|V_ALLOWLOWERCASE|(G_BattleGametype() ? V_REDMAP : V_SKYMAP), "Replay will be saved.");
|
||||
V_DrawRightAlignedThinString(BASEVIDWIDTH - 2, 2, V_HUDTRANS|V_SNAPTOTOP|V_SNAPTORIGHT|V_ALLOWLOWERCASE|((gametyperules & GTR_BUMPERS) ? V_REDMAP : V_SKYMAP), "Replay will be saved.");
|
||||
break;
|
||||
|
||||
case DSM_TITLEENTRY:
|
||||
|
|
@ -1023,7 +1022,7 @@ void ST_Drawer(void)
|
|||
R_ReloadHUDGraphics();
|
||||
|
||||
#ifdef SEENAMES
|
||||
if (cv_seenames.value && cv_allowseenames.value && displayplayer == consoleplayer && seenplayer && seenplayer->mo)
|
||||
if (cv_seenames.value && cv_allowseenames.value && displayplayers[0] == consoleplayer && seenplayer && seenplayer->mo)
|
||||
{
|
||||
INT32 c = 0;
|
||||
switch (cv_seenames.value)
|
||||
|
|
@ -1065,22 +1064,6 @@ void ST_Drawer(void)
|
|||
#endif
|
||||
if (rendermode != render_none) ST_doPaletteStuff();
|
||||
|
||||
// Blindfold!
|
||||
if ((gametyperules & GTR_BLINDFOLDED)
|
||||
&& (leveltime < hidetime * TICRATE))
|
||||
{
|
||||
if (players[displayplayer].pflags & PF_TAGIT)
|
||||
{
|
||||
stplyr = &players[displayplayer];
|
||||
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31|V_PERPLAYER);
|
||||
}
|
||||
else if (splitscreen && players[secondarydisplayplayer].pflags & PF_TAGIT)
|
||||
{
|
||||
stplyr = &players[secondarydisplayplayer];
|
||||
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31|V_PERPLAYER);
|
||||
}
|
||||
}
|
||||
|
||||
st_translucency = cv_translucenthud.value;
|
||||
|
||||
if (st_overlay)
|
||||
|
|
|
|||
|
|
@ -424,7 +424,6 @@ void V_CubeApply(UINT8 *red, UINT8 *green, UINT8 *blue)
|
|||
{
|
||||
working[0][q] = dolerp(working[0][q], working[1][q]);
|
||||
working[1][q] = dolerp(working[2][q], working[3][q]);
|
||||
>>>>>>> srb2/next
|
||||
}
|
||||
linear = (*blue/255.0);
|
||||
for (q = 0; q < 3; q++)
|
||||
|
|
|
|||
|
|
@ -41,7 +41,6 @@
|
|||
|
||||
#include "m_random.h" // M_RandomKey
|
||||
#include "g_input.h" // PLAYER1INPUTDOWN
|
||||
#include "k_color.h" // colortranslations
|
||||
#include "k_battle.h"
|
||||
#include "k_pwrlv.h"
|
||||
#include "console.h" // cons_menuhighlight
|
||||
|
|
@ -1039,7 +1038,7 @@ static void K_UpdatePowerLevels(void)
|
|||
|
||||
CONS_Debug(DBG_GAMELOGIC, "Player %d's PWR.LV: %d\n", jpnum, theirpower);
|
||||
|
||||
if (G_RaceGametype())
|
||||
if ((gametyperules & GTR_CIRCUIT))
|
||||
{
|
||||
if (data.match.val[i] < data.match.val[j])
|
||||
won = true;
|
||||
|
|
@ -1164,9 +1163,9 @@ void Y_StartIntermission(void)
|
|||
|
||||
if (netgame && cv_kartusepwrlv.value)
|
||||
{
|
||||
if (G_RaceGametype())
|
||||
if ((gametyperules & GTR_CIRCUIT))
|
||||
powertype = PWRLV_RACE;
|
||||
else if (G_BattleGametype())
|
||||
else if ((gametyperules & GTR_BUMPERS))
|
||||
powertype = PWRLV_BATTLE;
|
||||
}
|
||||
|
||||
|
|
@ -1453,7 +1452,7 @@ void Y_VoteDrawer(void)
|
|||
break;
|
||||
}
|
||||
|
||||
color = colortranslations[players[p].skincolor][7];
|
||||
color = skincolors[players[p].skincolor].ramp[7];
|
||||
colormap = R_GetTranslationColormap(TC_DEFAULT, players[p].skincolor, GTC_CACHE);
|
||||
}
|
||||
|
||||
|
|
@ -1633,9 +1632,7 @@ void Y_VoteTicker(void)
|
|||
if (paused || P_AutoPause() || !voteclient.loaded)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
LUAh_VoteThinker();
|
||||
#endif
|
||||
|
||||
votetic++;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue