Merge branch 'blankart-dev' into newinput

This commit is contained in:
NepDisk 2025-03-13 01:50:07 -04:00
commit 89c5ece49b
26 changed files with 615 additions and 106 deletions

View file

@ -173,7 +173,7 @@ BlanKart's namespace implements the following additional fields:
gravity = <float>; // Sector's gravity multiplier. Default = 1.0.
offroad = <float>; // Sector's offroad multiplier. Default = 0.0.
damagetype = <string>; // Damage inflicted by the sector.
// Can be "None", "Generic", "Lava", "DeathPit", "Instakill", or "Stumble".
// Can be "None", "Generic", "Lava", "DeathPit", "Instakill".
// Default = "None".
action = <integer>; // Sector action, same as line special. Default = 0.
@ -217,7 +217,8 @@ BlanKart's namespace implements the following additional fields:
nostepup = <bool>; // true = objects can't step up.
doublestepup = <bool>; // true = objects have increased step up.
nostepdown = <bool>; // true = objects can't step down.
cheatcheckactivator = <bool>; // true = players activate cheat checks when in this sector.
starpostactivator = <bool>; // true = players activate starposts when in this sector.
cheatcheckactivator = <bool>; // true = players activate starposts when in this sector.
exit = <bool>; // true = players finish match when entering sector.
deleteitems = <bool>; // true = items instantly explode when entering sector.
fan = <bool>; // true = players are propelled upwards in this sector.
@ -225,7 +226,7 @@ BlanKart's namespace implements the following additional fields:
zoomtubeend = <bool>; // true = sector is end of a zoom tube.
speedpad = <bool>; // true = players are launched forward by this sector.
finishline = <bool>l // true = players gain a lap or finish the race in this sector. Used for legacy support.
finishline = <bool>; // true = players gain a lap or finish the race in this sector. Used for legacy support.
sneakerpanel = <bool>; // true = players are speed boosted forward by this sector.
waterpanel = <bool>; // true = players are speed boosted forward by this sector and are able to drive on water.
redpogospring = <bool>; // true = players are bounced into the air by this sector.
@ -303,8 +304,12 @@ RR 1.0: 20.09.2024
BK 1.0: 08.02.2025
- Document spec updated to account for BlanKart differnces.
BK 1.0: 10.02.25
BK 1.0: 10.02.2025
- Added offset*_* flags.
- Added flags for nophysics_floor and nophysics_ceiling.
- Readded effect6 for compat reasons.
- Readded gravityoverride.
BK 1.0: 11.03.2025
- Fixed up some typos.
- Added more effects.

View file

@ -4913,8 +4913,8 @@ static void HandlePacketFromPlayer(SINT8 node)
txtpak = (UINT8 *)&netbuffer->u.serverpak.cmds[netbuffer->u.serverpak.numslots
* netbuffer->u.serverpak.numtics];
if (realend > gametic + CLIENTBACKUPTICS)
realend = gametic + CLIENTBACKUPTICS;
if (realend > gametic + BACKUPTICS)
realend = gametic + BACKUPTICS;
cl_packetmissed = realstart > neededtic;
if (realstart <= neededtic && realend > neededtic)
@ -5360,11 +5360,11 @@ static void SV_SendTics(void)
{
// assert supposedtics[n]>=nettics[n]
realfirsttic = supposedtics[n];
lasttictosend = nettics[n] + CLIENTBACKUPTICS;
if (lasttictosend > maketic)
lasttictosend = maketic;
if (lasttictosend - nettics[n] >= BACKUPTICS)
lasttictosend = nettics[n] + BACKUPTICS-1;
if (realfirsttic >= lasttictosend)
{
// well we have sent all tics we will so use extrabandwidth

View file

@ -43,7 +43,6 @@ applications may follow different packet versions.
// Networking and tick handling related.
#define BACKUPTICS 512 // more than enough for most timeouts....
#define CLIENTBACKUPTICS 32
#define MAXTEXTCMD 512
// No. of tics your controls can be delayed by.

View file

@ -571,8 +571,6 @@ struct player_t
INT32 aizdrifttilt;
INT32 aizdriftturn;
INT32 underwatertilt;
fixed_t offroad; // In Super Mario Kart, going offroad has lee-way of about 1 second before you start losing speed
UINT8 pogospring; // Pogo spring bounce effect
UINT8 brakestop; // Wait until you've made a complete stop for a few tics before letting brake go in reverse.

View file

@ -956,7 +956,7 @@ void F_BlanStartCredits(void)
S_StopMusic();
S_StopSounds();
S_ChangeMusicInternal("KMAP04", true);
S_ChangeMusicInternal("BLANCD", true);
S_ShowMusicCredit();
finalecount = 0;

View file

@ -32,7 +32,7 @@ consvar_t cv_mousesens2 = CVAR_INIT ("mousesens2", "20", CV_SAVE, mousesens_cons
consvar_t cv_mouseysens = CVAR_INIT ("mouseysens", "20", CV_SAVE, mousesens_cons_t, NULL);
consvar_t cv_mouseysens2 = CVAR_INIT ("mouseysens2", "20", CV_SAVE, mousesens_cons_t, NULL);
consvar_t cv_controlperkey = CVAR_INIT ("controlperkey", "One", CV_SAVE, onecontrolperkey_cons_t, NULL);
consvar_t cv_turnsmooth = CVAR_INIT ("turnsmoothing", "Slow", CV_SAVE, turnsmooth_cons_t, NULL);
consvar_t cv_turnsmooth = CVAR_INIT ("turnsmoothing", "Off", CV_SAVE, turnsmooth_cons_t, NULL);
// current state of the keys
// JOYAXISRANGE for fully pressed, 0 for not pressed

View file

@ -50,6 +50,8 @@ static CV_PossibleValue_t speedo_cons_t[]= {
{0, NULL}};
consvar_t cv_newspeedometer = CVAR_INIT ("newspeedometer", "Default", CV_SAVE, speedo_cons_t, NULL);
consvar_t cv_showinput = CVAR_INIT ("showinput", "Off", CV_SAVE, CV_OnOff, NULL);
//{ Patch Definitions
static patch_t *kp_nodraw;
@ -1357,6 +1359,7 @@ static void K_DrawKartPositionNum(INT32 num)
fixed_t scale = FRACUNIT;
patch_t *localpatch = kp_positionnum[0][0];
INT32 fx = 0, fy = 0, fflags = 0;
INT32 xoffs = (cv_showinput.value) ? -48 : 0;
INT32 addOrSub = V_ADD;
boolean flipdraw = false; // flip the order we draw it in for MORE splitscreen bs. fun.
boolean flipvdraw = false; // used only for 2p splitscreen so overtaking doesn't make 1P's position fly off the screen.
@ -1373,17 +1376,15 @@ static void K_DrawKartPositionNum(INT32 num)
overtake = true; // this is used for splitscreen stuff in conjunction with flipdraw.
}
if (r_splitscreen)
{
if (r_splitscreen || (cv_showinput.value && !r_splitscreen))
scale /= 2;
}
W = FixedMul(W<<FRACBITS, scale)>>FRACBITS;
// pain and suffering defined below
if (!r_splitscreen)
{
fx = POSI_X;
fx = POSI_X + xoffs;
fy = BASEVIDHEIGHT - 8;
fflags = V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SPLITSCREEN;
}
@ -3830,7 +3831,7 @@ static void K_drawKartFirstPerson(void)
static void K_drawInput(void)
{
static INT32 pn = 0;
INT32 target = 0, splitflags = (V_SNAPTOBOTTOM|V_SNAPTORIGHT);
INT32 target = 0, splitflags = (V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SLIDEIN);
INT32 x = (BASEVIDWIDTH - 32)*FRACUNIT, y = (BASEVIDHEIGHT - 24)*FRACUNIT;
INT32 offs, col;
const INT32 accent1 = splitflags | skincolors[stplyr->skincolor].ramp[5];
@ -4143,7 +4144,7 @@ static void K_drawDistributionDebugger(void)
bestbumper = players[i].bumper;
}
if (!(numbosswaypoints > 0))
if (!(K_UsingLegacyCheckpoints()))
{
// lovely double loop......
for (i = 0; i < MAXPLAYERS; i++)
@ -4161,13 +4162,13 @@ static void K_drawDistributionDebugger(void)
if (spbplace != -1 && stplyr->position == spbplace+1)
{
// SPB Rush Mode: It's 2nd place's job to catch-up items and make 1st place's job hell
if (!(numbosswaypoints > 0))
if (!(K_UsingLegacyCheckpoints()))
pdis = (3 * pdis) / 2;
spbrush = true;
}
if (!(numbosswaypoints > 0))
if (!(K_UsingLegacyCheckpoints()))
{
pdis = K_ScaleItemDistance(pdis, pingame, spbrush);
@ -4179,7 +4180,7 @@ static void K_drawDistributionDebugger(void)
}
}
if (numbosswaypoints > 0)
if (K_UsingLegacyCheckpoints())
useodds = K_FindLegacyUseodds(stplyr, 0, pingame, bestbumper, spbrush, dontforcespb);
else
useodds = K_FindUseodds(stplyr, 0, pdis, bestbumper, spbrush);
@ -4207,7 +4208,7 @@ static void K_drawDistributionDebugger(void)
if (numbosswaypoints > 0)
if (K_UsingLegacyCheckpoints())
itemodds = K_KartGetLegacyItemOdds(useodds, i, 0, spbrush);
else
itemodds = K_KartGetItemOdds(
@ -4264,7 +4265,7 @@ static void K_drawDistributionDebugger(void)
else
V_DrawString(0, 0, V_SPLITSCREEN|V_HUDTRANS|V_SNAPTOTOP, va("USEODDS %d", useodds));
if (numbosswaypoints > 0)
if (K_UsingLegacyCheckpoints())
V_DrawSmallString(70, 0, V_SPLITSCREEN|V_HUDTRANS|V_SNAPTOTOP, "Legacy Distance Mode");
}
@ -4274,7 +4275,7 @@ static void K_drawCheckpointDebugger(void)
if (stplyr != &players[displayplayers[0]]) // only for p1
return;
if (numbosswaypoints > 0)
if (K_UsingLegacyCheckpoints())
{
if (stplyr->starpostnum >= (numstarposts - (numstarposts/2)))
V_DrawString(8, 184, 0, va("Checkpoint: %d / %d (Can finish)", stplyr->starpostnum, numstarposts));
@ -4449,7 +4450,7 @@ void K_drawKartHUD(void)
K_drawRingMeter();
}
if (modeattacking && !bossinfo.boss)
if (cv_showinput.value || (modeattacking && !bossinfo.boss))
{
// Draw the input UI
if (LUA_HudEnabled(hud_position))

View file

@ -25,6 +25,8 @@ extern "C" {
extern consvar_t cv_newspeedometer;
extern consvar_t cv_showinput;
struct trackingResult_t
{
fixed_t x, y;

View file

@ -253,6 +253,7 @@ void K_RegisterKartStuff(void)
CV_RegisterVar(&cv_kartrings);
CV_RegisterVar(&cv_newspeedometer);
CV_RegisterVar(&cv_showinput);
CV_RegisterVar(&cv_kartwalltransfer);
@ -362,11 +363,11 @@ static UINT8 K_KartItemOddsRace[NUMKARTRESULTS-1][8] =
/*Hyudoro*/ { 0, 0, 0, 1, 2, 1, 0, 0 }, // Hyudoro
/*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring
/*Kitchen Sink*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Kitchen Sink
/*Super Ring*/ { 2, 1, 1, 0, 0, 0, 0, 0 }, // Super Ring
/*Super Ring*/ { 1, 2, 2, 0, 0, 0, 0, 0 }, // Super Ring
/*Land Mine*/ { 3, 0, 0, 0, 0, 0, 0, 0 }, // Land Mine
/*Bubble Shield*/ { 0, 1, 2, 1, 0, 0, 0, 0 }, // Bubble Shield
/*Flame Shield*/ { 0, 0, 0, 0, 0, 1, 3, 5 }, // Flame Shield
/*Drop Target*/ { 2, 0, 0, 0, 0, 0, 0, 0 }, // Drop Target
/*Flame Shield*/ { 0, 0, 0, 0, 0, 2, 4, 5 }, // Flame Shield
/*Drop Target*/ { 1, 0, 0, 0, 0, 0, 0, 0 }, // Drop Target
/*Sneaker x2*/ { 0, 0, 2, 2, 2, 0, 0, 0 }, // Sneaker x2
/*Sneaker x3*/ { 0, 0, 0, 1, 6,10, 5, 0 }, // Sneaker x3
/*Banana x3*/ { 0, 1, 1, 0, 0, 0, 0, 0 }, // Banana x3
@ -1428,7 +1429,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
else if (!(player->itemroulette >= (TICRATE*3)))
return;
if (!(numbosswaypoints > 0))
if (!(K_UsingLegacyCheckpoints()))
{
for (i = 0; i < MAXPLAYERS; i++)
{
@ -1455,12 +1456,12 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
if (spbplace != -1 && player->position == spbplace+1)
{
// SPB Rush Mode: It's 2nd place's job to catch-up items and make 1st place's job hell
if (!(numbosswaypoints > 0))
if (!(K_UsingLegacyCheckpoints()))
pdis = (3 * pdis) / 2;
spbrush = true;
}
if (!(numbosswaypoints > 0))
if (!(K_UsingLegacyCheckpoints()))
{
pdis = K_ScaleItemDistance(pdis, pingame, spbrush);
@ -1583,7 +1584,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
}
}
if (!(numbosswaypoints > 0))
if (!(K_UsingLegacyCheckpoints()))
{
// SPECIAL CASE No. 6:
// Force SPB onto 2nd if they get too far behind
@ -1609,7 +1610,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
// Split into another function for a debug function below
// Use a legacy version for maps not using waypoints.
if (numbosswaypoints > 0)
if (K_UsingLegacyCheckpoints())
useodds = K_FindLegacyUseodds(player, mashed, pingame, bestbumper, spbrush, dontforcespb);
else
useodds = K_FindUseodds(player, mashed, pdis, bestbumper, spbrush);
@ -1628,7 +1629,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
for (i = 1; i < NUMKARTRESULTS; i++)
{
if (numbosswaypoints > 0)
if (K_UsingLegacyCheckpoints())
{
spawnchance[i] = (totalspawnchance += K_KartGetLegacyItemOdds(useodds, i, mashed, spbrush));
@ -7073,7 +7074,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
}
// Start at lap 1 when using old checkpoint system just to be safe.
if ((numbosswaypoints > 0) && (player->laps == 0) && (numlaps > 0))
if ((K_UsingLegacyCheckpoints()) && (player->laps == 0) && (numlaps > 0))
player->laps = 1;
if (player->stealingtimer == 0 && player->stolentimer == 0
@ -8238,9 +8239,9 @@ static void K_UpdatePlayerWaypoints(player_t *const player)
// While the player was in the "bigwaypointgap" state, laps did not change from crossing finish lines.
// So reset the lap back to normal, in case they were able to get behind the line.
player->laps = player->lastsafelap;
if (numbosswaypoints == 0)
if (!K_UsingLegacyCheckpoints())
{
player->laps = player->lastsafelap;
player->starpostnum = player->lastsafestarpost;
}
}
@ -8874,10 +8875,9 @@ void K_UpdateAllPlayerPositions(void)
if (player->respawn > 0 && player->lastsafelap != player->laps)
{
player->laps = player->lastsafelap;
if (numbosswaypoints == 0)
if (!K_UsingLegacyCheckpoints())
{
player->laps = player->lastsafelap;
player->starpostnum = player->lastsafestarpost;
}
}
@ -8890,7 +8890,7 @@ void K_UpdateAllPlayerPositions(void)
{
if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo))
{
if (numbosswaypoints > 0)
if (K_UsingLegacyCheckpoints())
K_KartLegacyUpdatePosition(&players[i]);
else
K_KartUpdatePosition(&players[i]);
@ -10170,6 +10170,17 @@ boolean K_RingsActive(void)
return true;
}
boolean K_UsingLegacyCheckpoints(void)
{
if (numbosswaypoints > 0)
{
// We are using Kart V1 waypoints!
return true;
}
return false;
}
void K_UpdateMobjItemOverlay(mobj_t *part, SINT8 itemType, UINT8 itemCount)
{
switch (itemType)

View file

@ -187,6 +187,7 @@ void K_UnsetItemOut(player_t *player);
boolean K_SafeRespawnPosition(mobj_t * mo);
boolean K_RingsActive(void);
boolean K_UsingLegacyCheckpoints(void);
void K_UpdateMobjItemOverlay(mobj_t *part, SINT8 itemType, UINT8 itemCount);

View file

@ -20,6 +20,7 @@
#include "z_zone.h"
#include "g_game.h"
#include "p_slopes.h"
#include "k_kart.h"
#include "cxxutil.hpp"
@ -2779,7 +2780,7 @@ boolean K_SetupWaypointList(void)
if (!waypointcap)
{
if (numbosswaypoints == 0)
if (!K_UsingLegacyCheckpoints())
{
CONS_Alert(CONS_ERROR, "No waypoints or legacy checkpoints in map.\n");
}
@ -2799,7 +2800,7 @@ boolean K_SetupWaypointList(void)
if (firstwaypoint == NULL)
{
if (numbosswaypoints == 0)
if (!K_UsingLegacyCheckpoints())
{
CONS_Alert(CONS_ERROR, "No waypoints or legacy checkpoints in map.\n");
}

View file

@ -3974,7 +3974,21 @@ static int lib_kSafeRespawnPosition(lua_State *L)
//HUDSAFE
if (!mobj)
return LUA_ErrInvalid(L, "mobj_t");
lua_pushfixed(L, K_SafeRespawnPosition(mobj));
lua_pushboolean(L, K_SafeRespawnPosition(mobj));
return 1;
}
// Checks if Rings are applicable.
static int lib_kRingsActive(lua_State *L)
{
lua_pushboolean(L, K_RingsActive());
return 1;
}
// Checks if current map is using legacy boss3 bassed checkpoints. Useful for map compat.
static int lib_kUsingLegacyCheckpoints(lua_State *L)
{
lua_pushboolean(L, K_UsingLegacyCheckpoints());
return 1;
}
@ -4276,6 +4290,9 @@ static luaL_Reg lib[] = {
{"K_GetCollideAngle",lib_kGetCollideAngle},
{"K_RingsActive",lib_kRingsActive},
{"K_UsingLegacyCheckpoints",lib_kUsingLegacyCheckpoints},
// k_boss
{"K_InitBossHealthBar", lib_kInitBossHealthBar},
{"K_UpdateBossHealthBar", lib_kUpdateBossHealthBar},

View file

@ -32,6 +32,8 @@ enum mobj_e {
mobj_angle,
mobj_pitch,
mobj_roll,
mobj_slopepitch,
mobj_sloperoll,
mobj_rollangle,
mobj_sprite,
mobj_frame,
@ -117,6 +119,8 @@ static const char *const mobj_opt[] = {
"angle",
"pitch",
"roll",
"slopepitch",
"sloperoll",
"rollangle",
"sprite",
"frame",

View file

@ -226,6 +226,7 @@ static void M_DestroyRobots(INT32 choice);
//static void M_LevelSelectWarp(INT32 choice);
static void M_Credits(INT32 choice);
static void M_BlanCredits(INT32 choice);
static void M_MusicTest(INT32 choice);
static void M_PandorasBox(INT32 choice);
static void M_EmblemHints(INT32 choice);
static char *M_GetConditionString(condition_t cond);
@ -323,7 +324,7 @@ menu_t OP_DataOptionsDef, OP_ScreenshotOptionsDef, OP_EraseDataDef;
menu_t OP_DiscordOptionsDef;
#endif
menu_t OP_HUDOptionsDef, OP_ChatOptionsDef;
menu_t OP_GameOptionsDef, OP_ServerOptionsDef;
menu_t OP_GameOptionsDef, OP_BlanKartGameOptionsDef, OP_ServerOptionsDef;
menu_t OP_AdvServerOptionsDef;
//menu_t OP_NetgameOptionsDef, OP_GametypeOptionsDef;
menu_t OP_MonitorToggleDef;
@ -364,6 +365,7 @@ static void M_DrawCenteredMenu(void);
static void M_DrawAddons(void);
static void M_DrawSkyRoom(void);
static void M_DrawChecklist(void);
static void M_DrawMusicTest(void);
static void M_DrawEmblemHints(void);
static void M_DrawPauseMenu(void);
static void M_DrawLevelSelectOnly(boolean leftfade, boolean rightfade);
@ -390,6 +392,7 @@ static boolean M_ExitPandorasBox(void);
static boolean M_QuitMultiPlayerMenu(void);
static void M_HandleAddons(INT32 choice);
static void M_HandleSoundTest(INT32 choice);
static void M_HandleMusicTest(INT32 choice);
static void M_HandleImageDef(INT32 choice);
//static void M_HandleLoadSave(INT32 choice);
static void M_HandleLevelStats(INT32 choice);
@ -821,6 +824,10 @@ static menuitem_t SR_UnlockChecklistMenu[] =
{IT_SUBMENU | IT_STRING, NULL, "NEXT", {.submenu = &MainDef}, 192},
};
static menuitem_t SR_MusicTestMenu[] =
{
{IT_KEYHANDLER | IT_STRING, NULL, "", {.routine = M_HandleMusicTest}, 0},
};
static menuitem_t SR_EmblemHintMenu[] =
{
{IT_STRING|IT_CVAR, NULL, "Medal Radar", {.cvar = &cv_itemfinder}, 10},
@ -1097,12 +1104,13 @@ static menuitem_t OP_CamOptionsMenu[] =
{
{IT_HEADER, NULL, "Camera Options", {NULL}, 0},
{IT_STRING | IT_CVAR, NULL, "Lagless Camera", {.cvar = &cv_laglesscam}, 20},
{IT_STRING | IT_CVAR, NULL, "Camera Tiling", {.cvar = &cv_tilting}, 20},
{IT_STRING | IT_CVAR, NULL, "Lagless Camera", {.cvar = &cv_laglesscam}, 30},
{IT_STRING | IT_SUBMENU, NULL, "Player 1 Camera options...", {.submenu = &OP_Player1CamOptionsDef}, 40},
{IT_STRING | IT_SUBMENU, NULL, "Player 2 Camera options...", {.submenu = &OP_Player2CamOptionsDef}, 50},
{IT_STRING | IT_SUBMENU, NULL, "Player 3 Camera options...", {.submenu = &OP_Player3CamOptionsDef}, 60},
{IT_STRING | IT_SUBMENU, NULL, "Player 4 Camera options...", {.submenu = &OP_Player4CamOptionsDef}, 70},
{IT_STRING | IT_SUBMENU, NULL, "Player 1 Camera options...", {.submenu = &OP_Player1CamOptionsDef}, 50},
{IT_STRING | IT_SUBMENU, NULL, "Player 2 Camera options...", {.submenu = &OP_Player2CamOptionsDef}, 60},
{IT_STRING | IT_SUBMENU, NULL, "Player 3 Camera options...", {.submenu = &OP_Player3CamOptionsDef}, 70},
{IT_STRING | IT_SUBMENU, NULL, "Player 4 Camera options...", {.submenu = &OP_Player4CamOptionsDef}, 80},
};
static menuitem_t OP_Player1CamOptionsMenu[] =
@ -1336,9 +1344,10 @@ static menuitem_t OP_SoundOptionsMenu[] =
{IT_STRING|IT_CVAR, NULL, "Powerup Warning", {.cvar = &cv_kartinvinsfx}, 95},
{IT_KEYHANDLER|IT_STRING, NULL, "Sound Test", {.routine = M_HandleSoundTest}, 110},
{IT_STRING|IT_CALL, NULL, "Music Test", {.routine = M_MusicTest}, 120},
{IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", {.cvar = &cv_playmusicifunfocused}, 125},
{IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", {.cvar = &cv_playsoundifunfocused}, 135},
{IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", {.cvar = &cv_playmusicifunfocused}, 135},
{IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", {.cvar = &cv_playsoundifunfocused}, 145},
};
static menuitem_t OP_DataOptionsMenu[] =
@ -1472,19 +1481,28 @@ static menuitem_t OP_GameOptionsMenu[] =
{
{IT_STRING | IT_SUBMENU, NULL, "Random Item Toggles...", {.submenu = &OP_MonitorToggleDef}, 10},
{IT_STRING | IT_CVAR, NULL, "Race Game Speed", {.cvar = &cv_kartspeed}, 30},
{IT_STRING | IT_CVAR, NULL, "Battle Game Speed", {.cvar = &cv_kartbattlespeed}, 40},
{IT_STRING | IT_CVAR, NULL, "Frantic Items", {.cvar = &cv_kartfrantic}, 50},
{IT_SECRET, NULL, "Encore Mode", {.cvar = &cv_kartencore}, 60},
{IT_STRING | IT_SUBMENU, NULL, "BlanKart Gameplay...", {.submenu = &OP_BlanKartGameOptionsDef}, 30},
{IT_STRING | IT_CVAR, NULL, "Number of Laps", {.cvar = &cv_numlaps}, 80},
{IT_STRING | IT_CVAR, NULL, "Exit Countdown Timer", {.cvar = &cv_countdowntime}, 90},
{IT_STRING | IT_CVAR, NULL, "Race Game Speed", {.cvar = &cv_kartspeed}, 40},
{IT_STRING | IT_CVAR, NULL, "Battle Game Speed", {.cvar = &cv_kartbattlespeed}, 50},
{IT_STRING | IT_CVAR, NULL, "Frantic Items", {.cvar = &cv_kartfrantic}, 60},
{IT_SECRET, NULL, "Encore Mode", {.cvar = &cv_kartencore}, 70},
{IT_STRING | IT_CVAR, NULL, "Time Limit", {.cvar = &cv_timelimit}, 110},
{IT_STRING | IT_CVAR, NULL, "Starting Bumpers", {.cvar = &cv_kartbumpers}, 120},
{IT_STRING | IT_CVAR, NULL, "Karma Comeback", {.cvar = &cv_kartcomeback}, 130},
{IT_STRING | IT_CVAR, NULL, "Number of Laps", {.cvar = &cv_numlaps}, 90},
{IT_STRING | IT_CVAR, NULL, "Exit Countdown Timer", {.cvar = &cv_countdowntime}, 100},
{IT_STRING | IT_CVAR, NULL, "Time Limit", {.cvar = &cv_timelimit}, 120},
{IT_STRING | IT_CVAR, NULL, "Starting Bumpers", {.cvar = &cv_kartbumpers}, 130},
{IT_STRING | IT_CVAR, NULL, "Karma Comeback", {.cvar = &cv_kartcomeback}, 140},
{IT_STRING | IT_CVAR, NULL, "Track Power Levels", {.cvar = &cv_kartusepwrlv}, 160},
};
static menuitem_t OP_BlanKartGameOptionsMenu[] =
{
{IT_STRING | IT_CVAR, NULL, "Rings", {.cvar = &cv_kartrings}, 10},
{IT_STRING | IT_CVAR, NULL, "Purple Drift", {.cvar = &cv_kartpurpledrift}, 20},
{IT_STRING | IT_CVAR, NULL, "Track Power Levels", {.cvar = &cv_kartusepwrlv}, 150},
};
static menuitem_t OP_ServerOptionsMenu[] =
@ -1819,6 +1837,20 @@ menu_t SR_UnlockChecklistDef =
0,
NULL
};
menu_t SR_MusicTestDef =
{
MN_NONE,
NULL,
sizeof (SR_MusicTestMenu)/sizeof (menuitem_t),
&OP_SoundOptionsDef,
SR_MusicTestMenu,
M_DrawMusicTest,
60, 150,
0,
NULL
};
menu_t SR_EmblemHintDef =
{
MN_NONE,
@ -2070,6 +2102,7 @@ menu_t OP_Player4CamOptionsDef = DEFAULTMENUSTYLE(MN_NONE, NULL, OP_Player4CamOp
menu_t OP_ChatOptionsDef = DEFAULTMENUSTYLE(MN_NONE, "M_HUD", OP_ChatOptionsMenu, &OP_HUDOptionsDef, 30, 30);
menu_t OP_GameOptionsDef = DEFAULTMENUSTYLE(MN_NONE, "M_GAME", OP_GameOptionsMenu, &OP_MainDef, 30, 30);
menu_t OP_BlanKartGameOptionsDef = DEFAULTMENUSTYLE(MN_NONE, "M_GAME", OP_BlanKartGameOptionsMenu, &OP_GameOptionsDef, 30, 30);
menu_t OP_ServerOptionsDef = DEFAULTMENUSTYLE(MN_NONE, "M_SERVER", OP_ServerOptionsMenu, &OP_MainDef, 24, 30);
menu_t OP_AdvServerOptionsDef = DEFAULTMENUSTYLE(MN_NONE, "M_SERVER", OP_AdvServerOptionsMenu, &OP_ServerOptionsDef, 24, 30);
@ -2441,12 +2474,15 @@ static void M_ChangeCvar(INT32 choice)
choice = (choice<<1) - 1;
if (cv->flags & CV_FLOAT)
{
if (((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_SLIDER)
||((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_INVISSLIDER)
||((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_NOMOD)
|| !(currentMenu->menuitems[itemOn].status & IT_CV_INTEGERSTEP))
||((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_NOMOD))
{
CV_SetValue(cv,cv->value+choice);
}
else if (cv->flags & CV_FLOAT)
{
if (!(currentMenu->menuitems[itemOn].status & IT_CV_INTEGERSTEP))
{
char s[20];
float n = FIXED_TO_FLOAT(cv->value)+(choice)*(1.0f/16.0f);
@ -6351,7 +6387,7 @@ static void M_Options(INT32 choice)
OP_DataOptionsMenu[3].status = (Playing()) ? (IT_GRAYEDOUT) : (IT_STRING|IT_SUBMENU); // Erase data
#endif
OP_GameOptionsMenu[4].status =
OP_GameOptionsMenu[5].status =
(M_SecretUnlocked(SECRET_ENCORE)) ? (IT_CVAR|IT_STRING) : IT_SECRET; // cv_kartencore
OP_MainDef.prevMenu = currentMenu;
@ -6733,6 +6769,338 @@ static void M_HandleSoundTest(INT32 choice)
}
}
static musicdef_t *curplaying = NULL;
static INT32 st_sel = 0;
static tic_t st_time = 0;
static size_t st_namescroll = 0;
static size_t st_namescrollstate = 0;
//static patch_t* st_radio[9];
//static patch_t* st_launchpad[4];
static void M_MusicTest(INT32 choice)
{
//INT32 ul = skyRoomMenuTranslations[choice-1];
//UINT8 i;
//char buf[8];
(void)choice;
if (!S_PrepareSoundTest())
{
M_StartMessage(M_GetText("No selectable tracks found.\n"),NULL,MM_NOTHING);
return;
}
curplaying = NULL;
st_time = 0;
st_sel = 0;
M_SetupNextMenu(&SR_MusicTestDef);
}
static void M_DrawMusicTest(void)
{
INT32 x, y, i;
// let's handle the ticker first. ideally we'd tick this somewhere else, BUT...
if (curplaying)
{
{
fixed_t work;
work = st_time;
if (st_time >= (FRACUNIT << (FRACBITS - 2))) // prevent overflow jump - takes about 15 minutes of loop on the same song to reach
st_time = work;
st_time += renderdeltatics;
}
}
x = 90<<FRACBITS;
y = (BASEVIDHEIGHT-32)<<FRACBITS;
y = (BASEVIDWIDTH-(vid.width/vid.dupx))/2;
V_DrawFill(y-1, 20, vid.width/vid.dupx+1, 24, 159);
{
static fixed_t st_scroll = -FRACUNIT;
const char* titl;
x = 16;
V_DrawString(x, 10, 0, "NOW PLAYING:");
if (curplaying)
{
if (curplaying->title && curplaying->title[0])
titl = va("%s - ", curplaying->title);
else if (curplaying->title && curplaying->source[0])
titl = va("%s - ", curplaying->source);
else
titl = va("%s - ", "What did you do.......");
}
else
titl = "NONE - ";
i = V_LevelNameWidth(titl);
st_scroll += renderdeltatics;
while (st_scroll >= (i << FRACBITS))
st_scroll -= i << FRACBITS;
x -= st_scroll >> FRACBITS;
while (x < BASEVIDWIDTH-y)
x += i;
while (x > y)
{
x -= i;
V_DrawLevelTitle(x, 24, 0, titl);
}
if (curplaying && curplaying->author && curplaying->composers && curplaying->composers[0] && curplaying->author[0])
V_DrawRightAlignedThinString(BASEVIDWIDTH-16, 46, V_ALLOWLOWERCASE, va ("%s, %s",curplaying->author, curplaying->composers));
else if (curplaying && curplaying->author && curplaying->author[0])
V_DrawRightAlignedThinString(BASEVIDWIDTH-16, 46, V_ALLOWLOWERCASE, curplaying->author);
if (curplaying)
{
if (!curplaying->usage && !curplaying->usage[0])
V_DrawString(vid.dupx, vid.height - 10*vid.dupy, V_NOSCALESTART|V_ALLOWLOWERCASE, va("%.6s", &curplaying->name[0][0]));
else {
V_DrawSmallString(vid.dupx, vid.height - 5*vid.dupy, V_NOSCALESTART|V_ALLOWLOWERCASE, va("%.6s - %.255s\n", &curplaying->name[0][0], curplaying->usage));
}
}
}
V_DrawFill(20, 60, 280, 128, 159);
{
INT32 t, b, q, m = 128;
if (numsoundtestdefs <= 8)
{
t = 0;
b = numsoundtestdefs - 1;
i = 0;
}
else
{
q = m;
m = (5*m)/numsoundtestdefs;
if (st_sel < 3)
{
t = 0;
b = 7;
i = 0;
}
else if (st_sel >= numsoundtestdefs-4)
{
t = numsoundtestdefs - 8;
b = numsoundtestdefs - 1;
i = q-m;
}
else
{
t = st_sel - 3;
b = st_sel + 4;
i = (t * (q-m))/(numsoundtestdefs - 8);
}
}
V_DrawFill(20+280-1, 60 + i, 1, m, 0);
if (t != 0)
V_DrawString(20+280+4, 60+4 - (skullAnimCounter/5), V_YELLOWMAP, "\x1A");
if (b != numsoundtestdefs - 1)
V_DrawString(20+280+4, 60+128-12 + (skullAnimCounter/5), V_YELLOWMAP, "\x1B");
x = 24;
y = 64;
if (renderisnewtic) ++st_namescroll;
while (t <= b)
{
if (t == st_sel)
V_DrawFill(20, y-4, 280-1, 16, 157);
{
const size_t MAXLENGTH = 34;
const tic_t SCROLLSPEED = TICRATE/5; // Number of tics for name being scrolled by 1 letter
size_t nameoffset = 0;
size_t namelength = soundtestdefs[t]->source ? strlen(soundtestdefs[t]->source) : 0;
if (soundtestdefs[t]->title && (soundtestdefs[t]->title[0]))
namelength = strlen(soundtestdefs[t]->title);
char buf[MAXLENGTH+1];
if (t == st_sel && namelength > MAXLENGTH)
{
switch (st_namescrollstate)
{
case 0:
{
// Scroll forward
nameoffset = (st_namescroll/SCROLLSPEED) % (namelength - MAXLENGTH + 1);
if (nameoffset == namelength - MAXLENGTH)
{
st_namescroll = 0;
st_namescrollstate++;
}
}
break;
case 1:
{
nameoffset = namelength - MAXLENGTH;
// Show name end for 1 second, then start scrolling back
if (st_namescroll == TICRATE)
{
st_namescroll = 0;
st_namescrollstate++;
}
}
break;
case 2:
{
// Scroll back
nameoffset = (namelength - MAXLENGTH - 1) - (st_namescroll/SCROLLSPEED) % (namelength - MAXLENGTH);
if (nameoffset == 0)
{
st_namescroll = 0;
st_namescrollstate++;
}
}
break;
case 3:
{
nameoffset = 0;
// Show name beginning for 1 second, then start scrolling forward again
if (st_namescroll == TICRATE)
{
st_namescroll = 0;
st_namescrollstate = 0;
}
}
break;
}
}
if (soundtestdefs[t]->title && soundtestdefs[t]->title[0])
strncpy(buf, soundtestdefs[t]->title + nameoffset, MAXLENGTH);
else if (soundtestdefs[t]->source && soundtestdefs[t]->source[0])
strncpy(buf, soundtestdefs[t]->source + nameoffset, MAXLENGTH);
else
strncpy(buf, "How tf did you get here?", MAXLENGTH);
buf[MAXLENGTH] = 0;
V_DrawString(x, y, (t == st_sel ? V_YELLOWMAP : 0)|V_ALLOWLOWERCASE|V_MONOSPACE, buf);
if (curplaying == soundtestdefs[t])
{
V_DrawFill(20+280-9, y-4, 8, 16, 150);
}
}
t++;
y += 16;
}
}
}
static void M_HandleMusicTest(INT32 choice)
{
boolean exitmenu = false; // exit to previous menu
switch (choice)
{
case KEY_DOWNARROW:
if (st_sel++ >= numsoundtestdefs-1)
st_sel = 0;
{
S_StartSound(NULL, sfx_menu1);
}
st_namescroll = 0;
st_namescrollstate = 0;
break;
case KEY_UPARROW:
if (!st_sel--)
st_sel = numsoundtestdefs-1;
{
S_StartSound(NULL, sfx_menu1);
}
st_namescroll = 0;
st_namescrollstate = 0;
break;
case KEY_PGDN:
if (st_sel < numsoundtestdefs-1)
{
st_sel += 3;
if (st_sel >= numsoundtestdefs-1)
st_sel = numsoundtestdefs-1;
S_StartSound(NULL, sfx_menu1);
}
st_namescroll = 0;
st_namescrollstate = 0;
break;
case KEY_PGUP:
if (st_sel)
{
st_sel -= 3;
if (st_sel < 0)
st_sel = 0;
S_StartSound(NULL, sfx_menu1);
}
st_namescroll = 0;
st_namescrollstate = 0;
break;
case KEY_BACKSPACE:
if (curplaying)
{
S_StopSounds();
S_StopMusic();
curplaying = NULL;
st_time = 0;
S_StartSound(NULL, sfx_skid);
}
break;
case KEY_ESCAPE:
exitmenu = true;
st_namescroll = 0;
st_namescrollstate = 0;
break;
case KEY_RIGHTARROW:
case KEY_LEFTARROW:
case KEY_ENTER:
S_StopSounds();
S_StopMusic();
st_time = 0;
curplaying = soundtestdefs[st_sel];
S_ChangeMusicInternal(&curplaying->name[0][0], true);
break;
default:
break;
}
if (exitmenu)
{
Z_Free(soundtestdefs);
soundtestdefs = NULL;
if (currentMenu->prevMenu)
M_SetupNextMenu(currentMenu->prevMenu);
else
M_ClearMenus(true);
}
}
// Entering secrets menu
/*static void M_SecretsMenu(INT32 choice)
{

View file

@ -533,6 +533,13 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
return;
}
if (player->invincibilitytimer > 0 || player->growshrinktimer > 0 || player->hyudorotimer > 0)
{
//player->flashing = 0;
K_DropHnextList(player, false);
K_StripItems(player);
}
S_StopSound(special); // Don't continue playing the gurgle or the siren
spbexplode = P_SpawnMobj(toucher->x, toucher->y, toucher->z, MT_SPBEXPLOSION);
@ -849,7 +856,7 @@ void P_TouchStarPost(mobj_t *post, player_t *player, boolean snaptopost)
(void)snaptopost;
// Player must have touched all previous starposts
if ((post->health - player->starpostnum > 1) && (numbosswaypoints == 0))
if ((post->health - player->starpostnum > 1) && (!K_UsingLegacyCheckpoints()))
{
if (!player->checkskip)
{
@ -866,7 +873,7 @@ void P_TouchStarPost(mobj_t *post, player_t *player, boolean snaptopost)
}
// Going backwards triggers sound
if ((post->health >= ((numstarposts/2) + player->starpostnum)) && (numbosswaypoints > 0))
if ((post->health >= ((numstarposts/2) + player->starpostnum)) && (K_UsingLegacyCheckpoints()))
{
if (!player->checkskip)
S_StartSound(toucher, sfx_s26d);
@ -2153,12 +2160,12 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
else
{
const UINT8 type = (damagetype & DMG_TYPEMASK);
const boolean hardhit = (type == DMG_EXPLODE || type == DMG_KARMA); // This damage type can do evil stuff like ALWAYS combo
const boolean explosioncombo = (type == DMG_EXPLODE); // This damage type can do evil stuff like ALWAYS combo
INT16 ringburst = 5;
// Check if the player is allowed to be damaged!
// If not, then spawn the instashield effect instead.
if (!force && !(inflictor && inflictor->type == MT_SPBEXPLOSION && inflictor->extravalue1 == 1))
if (!force)
{
if (gametyperules & GTR_BUMPERS)
{
@ -2188,10 +2195,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
{
// Check if we should allow wombo combos (hard hits by default, inverted by the presence of DMG_WOMBO).
boolean allowcombo = hardhit;
if ((allowcombo == false) && (player->flashing > 0 || player->squishedtimer > 0))
// Check if we should allow explosion combos.
if ((explosioncombo == false) && (player->flashing > 0 || player->squishedtimer > 0))
{
// Post-hit invincibility
K_DoInstashield(player);
@ -2277,7 +2282,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
K_PlayPainSound(target, source);
if ((hardhit == true) || (cv_kartdebughuddrop.value && !modeattacking))
if ((explosioncombo == true) || (cv_kartdebughuddrop.value && !modeattacking))
{
K_DropItems(player);
}

View file

@ -1290,12 +1290,12 @@ void P_SetPitchRollFromSlope(mobj_t *mo, pslope_t *slope)
fixed_t tempy = slope->normal.y;
fixed_t tempx = slope->normal.x;
mo->pitch = R_PointToAngle2(0, 0, FixedSqrt(FixedMul(tempy, tempy) + FixedMul(tempz, tempz)), tempx);
mo->roll = R_PointToAngle2(0, 0, tempz, tempy);
mo->slopepitch = R_PointToAngle2(0, 0, FixedSqrt(FixedMul(tempy, tempy) + FixedMul(tempz, tempz)), tempx);
mo->sloperoll = R_PointToAngle2(0, 0, tempz, tempy);
}
else
{
mo->pitch = mo->roll = 0;
mo->slopepitch = mo->sloperoll = 0;
}
}

View file

@ -294,6 +294,7 @@ struct mobj_t
// More drawing info: to determine current sprite.
angle_t angle, pitch, roll; // orientation
angle_t slopepitch, sloperoll;
angle_t old_angle, old_pitch, old_roll; // orientation interpolation
angle_t old_angle2, old_pitch2, old_roll2;
angle_t rollangle;
@ -461,6 +462,7 @@ struct precipmobj_t
// More drawing info: to determine current sprite.
angle_t angle, pitch, roll; // orientation
angle_t slopepitch, sloperoll;
angle_t old_angle, old_pitch, old_roll; // orientation interpolation
angle_t old_angle2, old_pitch2, old_roll2;
angle_t rollangle;

View file

@ -266,8 +266,6 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEINT32(save->p, players[i].aizdrifttilt);
WRITEINT32(save->p, players[i].aizdriftturn);
WRITEINT32(save->p, players[i].underwatertilt);
WRITEFIXED(save->p, players[i].offroad);
WRITEFIXED(save->p, players[i].tiregrease);
WRITEUINT8(save->p, players[i].pogospring);
@ -578,8 +576,6 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].aizdrifttilt = READINT32(save->p);
players[i].aizdriftturn = READINT32(save->p);
players[i].underwatertilt = READINT32(save->p);
players[i].offroad = READFIXED(save->p);
players[i].tiregrease = READFIXED(save->p);
players[i].pogospring = READUINT8(save->p);
@ -3735,6 +3731,10 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
mobj->terrain = NULL;
}
// Reset some non-synch values
mobj->sloperoll = 0;
mobj->slopepitch = 0;
// set sprev, snext, bprev, bnext, subsector
P_SetThingPosition(mobj);

View file

@ -8689,7 +8689,7 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate)
if ((K_SetupWaypointList() == false))
{
if (numbosswaypoints == 0)
if (!K_UsingLegacyCheckpoints())
{
CONS_Alert(CONS_ERROR, "Waypoints were not able to be setup and legacy checkpoints do not exist! Player positions will not work correctly.\n");
}

View file

@ -1987,7 +1987,7 @@ static void K_HandleLapIncrement(player_t *player)
{
if (K_IgnoreFinishLine(player))
return;
if (((numbosswaypoints > 0) ? (player->starpostnum >= (numstarposts - (numstarposts/2))) : (player->starpostnum == numstarposts)) || (player->laps == 0))
if (((K_UsingLegacyCheckpoints()) ? (player->starpostnum >= (numstarposts - (numstarposts/2))) : (player->starpostnum == numstarposts)) || (player->laps == 0))
{
size_t i = 0;
UINT8 nump = 0;
@ -3374,7 +3374,7 @@ boolean P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, cha
INT32 trigid = args[0];
if (trigid < 0 || trigid > 31) // limited by 32 bit variable
CONS_Debug(DBG_GAMELOGIC, "Unlockable trigger (sidedef %hu): bad trigger ID %d\n", line->sidenum[0], trigid);
CONS_Debug(DBG_GAMELOGIC, "Unlockable trigger: bad trigger ID %d\n", trigid);
else
{
unlocktriggers |= 1 << trigid;
@ -3389,7 +3389,7 @@ boolean P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, cha
}
// Execute one time only
line->special = 0;
activator = NULL;
break;
case 442: // Calls P_SetMobjState on mobjs of a given type in the tagged sectors
@ -4119,10 +4119,10 @@ boolean P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, cha
if (mobj)
{
mobj->angle = FixedAngle(args[3] << FRACBITS);
CONS_Debug(DBG_GAMELOGIC, "Linedef Type %d - Spawn Object: %d spawned at (%d, %d, %d)\n", line->special, mobj->type, mobj->x>>FRACBITS, mobj->y>>FRACBITS, mobj->z>>FRACBITS); //TODO: Convert mobj->type to a string somehow.
CONS_Debug(DBG_GAMELOGIC, "Linedef Type %d - Spawn Object: %d spawned at (%d, %d, %d)\n", special, mobj->type, mobj->x>>FRACBITS, mobj->y>>FRACBITS, mobj->z>>FRACBITS); //TODO: Convert mobj->type to a string somehow.
}
else
CONS_Alert(CONS_ERROR,"Linedef Type %d - Spawn Object: Object did not spawn!\n", line->special);
CONS_Alert(CONS_ERROR,"Linedef Type %d - Spawn Object: Object did not spawn!\n", special);
}
break;

View file

@ -3969,6 +3969,21 @@ Quaketilt (player_t *player)
return moma;
}
static angle_t P_GetCameraPitchRollAngle(mobj_t *mobj, player_t *viewPlayer)
{
angle_t viewingAngle = R_PointToAnglePlayer(viewPlayer, mobj->x, mobj->y);
fixed_t pitchMul = -FINESINE(viewingAngle >> ANGLETOFINESHIFT);
fixed_t rollMul = FINECOSINE(viewingAngle >> ANGLETOFINESHIFT);
angle_t sloperolll = mobj->slopepitch;
angle_t slopepitch = mobj->sloperoll;
angle_t rollOrPitch = FixedMul(mobj->pitch + sloperolll, pitchMul) + FixedMul(mobj->roll + slopepitch, rollMul);
return rollOrPitch;
}
static void
DoABarrelRoll (player_t *player)
{
@ -3993,7 +4008,7 @@ DoABarrelRoll (player_t *player)
return;
}
slope = InvAngle(R_GetPitchRollAngle(player->mo, player));
slope = InvAngle(P_GetCameraPitchRollAngle(player->mo, player));
if (AbsAngle(slope) < ANGLE_11hh)
{

View file

@ -193,6 +193,8 @@ consvar_t cv_maxportals = CVAR_INIT ("maxportals", "2", CV_SAVE, maxportals_cons
consvar_t cv_renderstats = CVAR_INIT ("renderstats", "Off", 0, CV_OnOff, NULL);
consvar_t cv_sloperoll = CVAR_INIT ("spritesloperoll", "On", CV_SAVE, CV_OnOff, NULL);
void SplitScreen_OnChange(void)
{
UINT8 i;
@ -1826,6 +1828,7 @@ void R_RegisterEngineStuff(void)
CV_RegisterVar(&cv_tilting);
CV_RegisterVar(&cv_actionmovie);
CV_RegisterVar(&cv_windowquake);
CV_RegisterVar(&cv_sloperoll);
CV_RegisterVar(&cv_showhud);
CV_RegisterVar(&cv_translucenthud);

View file

@ -156,6 +156,8 @@ extern consvar_t cv_skybox;
extern consvar_t cv_tailspickup;
extern consvar_t cv_debugfinishline;
extern consvar_t cv_sloperoll;
// debugging
typedef enum {

View file

@ -28,7 +28,16 @@ angle_t R_GetPitchRollAngle(mobj_t *mobj, player_t *viewPlayer)
fixed_t pitchMul = -FINESINE(viewingAngle >> ANGLETOFINESHIFT);
fixed_t rollMul = FINECOSINE(viewingAngle >> ANGLETOFINESHIFT);
angle_t rollOrPitch = FixedMul(mobj->pitch, pitchMul) + FixedMul(mobj->roll, rollMul);
angle_t sloperolll = mobj->slopepitch;
angle_t slopepitch = mobj->sloperoll;
if (!cv_sloperoll.value || (mobj->player && (mobj->player->pogospring > 0)))
{
sloperolll = 0;
slopepitch = 0;
}
angle_t rollOrPitch = FixedMul(mobj->pitch + sloperolll, pitchMul) + FixedMul(mobj->roll + slopepitch, rollMul);
return rollOrPitch;
}
@ -42,11 +51,7 @@ static angle_t R_PlayerSpriteRotation(player_t *player, player_t *viewPlayer)
angle_t rollAngle = 0;
if (player->mo->eflags & MFE_UNDERWATER)
{
rollAngle -= player->underwatertilt;
}
else if (sliptideLift)
if (sliptideLift)
{
/* (from side) tilt downward if turning
toward camera, upward if away. */
@ -55,6 +60,12 @@ static angle_t R_PlayerSpriteRotation(player_t *player, player_t *viewPlayer)
FixedMul(sliptideLift, FINECOSINE(angleDelta >> ANGLETOFINESHIFT));
}
if (player->pogospring)
{
rollAngle = 0;
}
return rollAngle;
}

View file

@ -25,6 +25,7 @@
#include "w_wad.h"
#include "z_zone.h"
#include "d_main.h"
#include "d_netfil.h"
#include "r_sky.h" // skyflatnum
#include "p_local.h" // camera info
#include "fastcmp.h"
@ -33,6 +34,7 @@
#include "lua_hook.h" // MusicChange hook
#include "k_boss.h" // bossinfo
#include "byteptr.h"
#include "v_video.h"
#ifdef HW3SOUND
// 3D Sound Interface
@ -1535,7 +1537,8 @@ ReadMusicDefFields
}
else if (!stricmp(stoken, "usage"))
{
// This does absolutely nothing, just a way to ignore this
Z_Free(def->usage);
def->usage = Z_StrDup(textline);
}
else
{
@ -1630,6 +1633,7 @@ static void S_LoadMusicDefLump(lumpnum_t lumpnum)
if (df->legacy && df->source)
{
df->source = replacechar(df->source, '_', ' ');
df->usage = replacechar(df->usage, '_', ' ');
df->title = Z_StrDup(df->source);
memset(df->source, 0, strlen(df->source));
df->source = NULL;
@ -1661,9 +1665,20 @@ void S_LoadMusicDefs(UINT16 wad)
void S_InitMusicDefs(void)
{
UINT16 i;
char *tempname;
for (i = 0; i < numwadfiles; i++)
{
nameonly(tempname = va("%s", wadfiles[i]->filename));
if (wadfiles[i]->filename && !stricmp(tempname, "music.kart"))
{
// Awful hack but what can you do?
continue;
}
S_LoadMusicDefs(i);
}
}
//
// S_ShowMusicCredit
@ -1678,6 +1693,7 @@ void S_ShowMusicCredit(void)
char credittext[128] = "";
char *work = NULL;
size_t len = 128, worklen;
INT32 widthused = (3*BASEVIDWIDTH/4) - 7, workwidth;
if (!cv_songcredits.value || demo.rewinding)
return;
@ -1713,22 +1729,29 @@ void S_ShowMusicCredit(void)
}
}
#define MUSICCREDITAPPEND(field)\
widthused -= V_ThinStringWidth(credittext, 0);
#define MUSICCREDITAPPEND(field, force)\
if (field)\
{\
work = va(" - %s", field);\
worklen = strlen(work);\
if (worklen <= len)\
{\
workwidth = V_ThinStringWidth(work, 0);\
if (force || widthused >= workwidth)\
{\
strncat(credittext, work, len);\
len -= worklen;\
widthused -= workwidth;\
}\
}\
}
MUSICCREDITAPPEND(def->author);
MUSICCREDITAPPEND(def->source);
MUSICCREDITAPPEND(def->author, false);
MUSICCREDITAPPEND(def->source, true);
#undef MUSICCREDITAPPEND
//#undef MUSICCREDITAPPEND
}
if (credittext[0] == '\0')
@ -1742,6 +1765,41 @@ void S_ShowMusicCredit(void)
cursongcredit.trans = NUMTRANSMAPS;
}
musicdef_t **soundtestdefs = NULL;
INT32 numsoundtestdefs = 0;
//
// S_PrepareSoundTest
//
// Prepare sound test. What am I, your butler?
//
boolean S_PrepareSoundTest(void)
{
musicdef_t *def;
INT32 pos = numsoundtestdefs = 0;
for (def = musicdefstart; def; def = def->next)
{
numsoundtestdefs++;
}
if (!numsoundtestdefs)
return false;
if (soundtestdefs)
Z_Free(soundtestdefs);
if (!(soundtestdefs = Z_Malloc(numsoundtestdefs*sizeof(musicdef_t *), PU_STATIC, NULL)))
I_Error("S_PrepareSoundTest(): could not allocate soundtestdefs.");
for (def = musicdefstart; def; def = def->next)
{
soundtestdefs[pos++] = def;
}
return true;
}
/// ------------------------
/// Music Status
/// ------------------------

View file

@ -184,6 +184,7 @@ struct musicdef_t
char *author;
char *source;
char *composers;
char *usage;
int volume;
boolean contentidunsafe;
boolean legacy;
@ -200,13 +201,18 @@ extern struct cursongcredit
fixed_t old_x;
} cursongcredit;
extern musicdef_t soundtestsfx;
extern musicdef_t *musicdefstart;
extern musicdef_t **soundtestdefs;
extern INT32 numsoundtestdefs;
extern UINT8 soundtestpage;
extern int musicdef_volume;
void S_LoadMusicDefs(UINT16 wadnum);
void S_InitMusicDefs(void);
musicdef_t *S_FindMusicDef(const char *name, UINT8 *i);
void S_ShowMusicCredit(void);
boolean S_PrepareSoundTest(void);
//
// Music Seeking