Merge branch 'blankart-dev' into newinput
This commit is contained in:
commit
89c5ece49b
26 changed files with 615 additions and 106 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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,10 +5360,10 @@ static void SV_SendTics(void)
|
|||
{
|
||||
// assert supposedtics[n]>=nettics[n]
|
||||
realfirsttic = supposedtics[n];
|
||||
lasttictosend = maketic;
|
||||
|
||||
lasttictosend = nettics[n] + CLIENTBACKUPTICS;
|
||||
if (lasttictosend > maketic)
|
||||
lasttictosend = maketic;
|
||||
if (lasttictosend - nettics[n] >= BACKUPTICS)
|
||||
lasttictosend = nettics[n] + BACKUPTICS-1;
|
||||
|
||||
if (realfirsttic >= lasttictosend)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -956,7 +956,7 @@ void F_BlanStartCredits(void)
|
|||
S_StopMusic();
|
||||
S_StopSounds();
|
||||
|
||||
S_ChangeMusicInternal("KMAP04", true);
|
||||
S_ChangeMusicInternal("BLANCD", true);
|
||||
S_ShowMusicCredit();
|
||||
|
||||
finalecount = 0;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
27
src/k_hud.c
27
src/k_hud.c
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -25,6 +25,8 @@ extern "C" {
|
|||
|
||||
extern consvar_t cv_newspeedometer;
|
||||
|
||||
extern consvar_t cv_showinput;
|
||||
|
||||
struct trackingResult_t
|
||||
{
|
||||
fixed_t x, y;
|
||||
|
|
|
|||
43
src/k_kart.c
43
src/k_kart.c
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
416
src/m_menu.c
416
src/m_menu.c
|
|
@ -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))
|
||||
{
|
||||
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))
|
||||
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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
10
src/p_spec.c
10
src/p_spec.c
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
17
src/p_user.c
17
src/p_user.c
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,8 +1665,19 @@ 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);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
|
@ -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)\
|
||||
{\
|
||||
strncat(credittext, work, len);\
|
||||
len -= worklen;\
|
||||
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
|
||||
/// ------------------------
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue