K_GetScreenCords function to get screen coordinates from mobjs + Driftgauge and Nametags #114

Merged
alufolie91 merged 77 commits from driftgauge into Saturn-Next 2024-03-17 12:23:03 +01:00
12 changed files with 959 additions and 48 deletions

No files matched your search

+12 -2
View File
@@ -1070,6 +1070,7 @@ static boolean AddIWAD(void)
}
}
// extra graphic patches for saturn specific thingies
boolean found_extra_kart;
boolean found_extra2_kart;
@@ -1077,8 +1078,10 @@ boolean snw_speedo; // snowy speedometer check
boolean clr_hud; // colour hud check
boolean big_lap; // bigger lap counter
boolean big_lap_color; // bigger lap counter but colour
boolean kartzspeedo; // kartZ speedometer
boolean statdp; // New stat
boolean kartzspeedo; // kartZ speedo
boolean statdp; // stat display for extended player setup
boolean nametaggfx; // Nametag stuffs
boolean driftgaugegfx;
static void IdentifyVersion(void)
{
@@ -1468,6 +1471,13 @@ void D_SRB2Main(void)
if (W_CheckMultipleLumps("K_STATNB", "K_STATN1", "K_STATN2", "K_STATN3", "K_STATN4", \
"K_STATN5", "K_STATN6", NULL))
statdp = true;
// Nametag stuffs
if (W_CheckMultipleLumps("NTLINE", "NTLINEV", "NTSP", "NTWH", NULL))
nametaggfx = true;
if (W_CheckMultipleLumps("K_DGAU","K_DCAU","K_DGSU","K_DCSU", NULL))
driftgaugegfx = true;
}
//
+6 -3
View File
@@ -31,9 +31,12 @@ extern boolean found_extra2_kart; // for use in k_kart.c
extern boolean snw_speedo; // snowy speedometer check
extern boolean clr_hud; // colour hud check
extern boolean big_lap; // bigger lap counter
extern boolean big_lap_color; //bigger lap counter but colour
extern boolean kartzspeedo; //kartZ speedo
extern boolean statdp; //stat display for extended player setup
extern boolean big_lap_color; // bigger lap counter but colour
extern boolean kartzspeedo; // kartZ speedo
extern boolean statdp; // stat display for extended player setup
extern boolean nametaggfx; // Nametag stuffs
extern boolean driftgaugegfx;
extern boolean autoloading;
extern boolean autoloaded;
+61 -2
View File
@@ -505,6 +505,45 @@ consvar_t cv_mute = {"mute", "Off", CV_NETVAR|CV_CALL, CV_OnOff, Mute_OnChange,
consvar_t cv_sleep = {"cpusleep", "1", CV_SAVE, sleeping_cons_t, NULL, -1, NULL, NULL, 0, 0, NULL};
static CV_PossibleValue_t nametagtrans_cons_t[] = {
{0, "Never"}, {1, "Far only"}, {2, "Dynamic"}, {3, "Always"}, {4, "HUD Trans."}, {0, NULL}};
/*static CV_PossibleValue_t nametagscaling_cons_t[] = {
{0, "MIN"}, {320, "MAX"}, {0, NULL}};*/
static CV_PossibleValue_t nametagdistance_cons_t[] = {
{0, "MIN"}, {640, "MAX"}, {0, NULL}};
static CV_PossibleValue_t nametagmaxplayer_cons_t[] = {
{1, "MIN"}, {MAXPLAYERS, "MAX"}, {0, NULL}};
static CV_PossibleValue_t nametagsize_cons_t[] = {
{0, "Off"}, {1, "Small"}, {2, "Minimal"}, {0, NULL}};
static CV_PossibleValue_t nametagrestat_cons_t[] = {
{0, "Off"}, {1, "Restat"}, {2, "Always"}, {0, NULL}};
consvar_t cv_nametag = {"kartnametag", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_nametagtrans = {"kartnametagtransparency", "Dynamic", CV_SAVE, nametagtrans_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_nametagfacerank = {"kartnametagfacerank", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_nametagrestat = {"kartnametagrestat", "Restat", CV_SAVE, nametagrestat_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_nametagdist = {"kartnametagdist", "320", CV_SAVE, nametagdistance_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_nametagmaxplayers = {"kartnametagmaxplayers", "3", CV_SAVE, nametagmaxplayer_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_nametagmaxlenght = {"kartnametagmaxlenght", "12", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
//consvar_t cv_nametagscaling = {"nametagscaling", "160", CV_SAVE, nametagscaling_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_showownnametag = {"kartnametagshowown", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_smallnametags = {"kartnametagsmall", "Off", CV_SAVE, nametagsize_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_nametaghop = {"kartnametaghop", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_nametagscore = {"kartnametagscore", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_shownametagfinish = {"kartshownametagfinished", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_shownametagspectator = {"kartshownametagspectator", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
static CV_PossibleValue_t driftgaugeoffset_cons_t[] = {
{-FRACUNIT*128, "MIN"}, {FRACUNIT*128, "MAX"}, {0, NULL}};
static CV_PossibleValue_t driftgaugestyle_cons_t[] = {
{1, "Default"}, {2, "Small"}, {3, "Big Numbers"}, {4, "Numbers Only"}, {0, NULL}};
consvar_t cv_driftgauge = {"kartdriftgauge", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_driftgaugeofs = {"kartdriftgaugeoffset", "-20", CV_FLOAT|CV_SAVE, driftgaugeoffset_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_driftgaugetrans = {"kartdriftgaugetransparency", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_driftgaugestyle = {"kartdriftgaugestyle", "1", CV_SAVE, driftgaugestyle_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
static CV_PossibleValue_t skinselectspin_cons_t[] = {
{0, "Off"}, {1, "Slow"}, {2, "2"}, {3, "3"}, {4, "4"}, {5, "5"}, {6, "6"}, {7, "7"}, {8, "8"}, {9, "9"}, {10, "Fast"}, {SKINSELECTSPIN_PAIN, "Pain"}, {0, NULL}};
consvar_t cv_skinselectspin = {"skinselectspin", "5", CV_SAVE, skinselectspin_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
@@ -1070,6 +1109,26 @@ void D_RegisterClientCommands(void)
CV_RegisterVar(&cv_scr_height);
CV_RegisterVar(&cv_soundtest);
CV_RegisterVar(&cv_nametag);
CV_RegisterVar(&cv_nametagtrans);
CV_RegisterVar(&cv_nametagfacerank);
CV_RegisterVar(&cv_nametagmaxplayers);
CV_RegisterVar(&cv_nametagmaxlenght);
//CV_RegisterVar(&cv_nametagscaling);
CV_RegisterVar(&cv_nametagdist);
CV_RegisterVar(&cv_showownnametag);
CV_RegisterVar(&cv_smallnametags);
CV_RegisterVar(&cv_nametagrestat);
CV_RegisterVar(&cv_nametaghop);
CV_RegisterVar(&cv_nametagscore);
CV_RegisterVar(&cv_shownametagfinish);
CV_RegisterVar(&cv_shownametagspectator);
CV_RegisterVar(&cv_driftgauge);
CV_RegisterVar(&cv_driftgaugeofs);
CV_RegisterVar(&cv_driftgaugetrans);
CV_RegisterVar(&cv_driftgaugestyle);
CV_RegisterVar(&cv_perfstats);
CV_RegisterVar(&cv_ps_thinkframe_page);
@@ -1087,8 +1146,8 @@ void D_RegisterClientCommands(void)
CV_RegisterVar(&cv_speed);
CV_RegisterVar(&cv_opflags);
CV_RegisterVar(&cv_mapthingnum);
// CV_RegisterVar(&cv_grid);
// CV_RegisterVar(&cv_snapto);
//CV_RegisterVar(&cv_grid);
//CV_RegisterVar(&cv_snapto);
// add cheat commands
COM_AddCommand("noclip", Command_CheatNoClip_f);
+20
View File
@@ -173,9 +173,29 @@ extern consvar_t cv_skipmapcheck;
extern consvar_t cv_sleep;
extern consvar_t cv_nametag;
extern consvar_t cv_nametagtrans;
extern consvar_t cv_nametagfacerank;
extern consvar_t cv_nametagmaxplayers;
extern consvar_t cv_nametagmaxlenght;
//extern consvar_t cv_nametagscaling;
extern consvar_t cv_nametagdist;
extern consvar_t cv_showownnametag;
extern consvar_t cv_smallnametags;
extern consvar_t cv_nametagrestat;
extern consvar_t cv_nametaghop;
extern consvar_t cv_nametagscore;
extern consvar_t cv_shownametagfinish;
extern consvar_t cv_shownametagspectator;
#define SKINSELECTSPIN_PAIN 25
extern consvar_t cv_skinselectspin;
extern consvar_t cv_driftgauge;
extern consvar_t cv_driftgaugeofs;
extern consvar_t cv_driftgaugetrans;
extern consvar_t cv_driftgaugestyle;
extern consvar_t cv_perfstats;
extern consvar_t cv_ps_thinkframe_page;
extern consvar_t cv_ps_samplesize;
+580 -2
View File
@@ -5,16 +5,27 @@
/// All of the SRB2kart-unique stuff.
#include "doomdef.h"
#include "doomstat.h"
#include "doomtype.h"
#include "command.h"
#include "d_netcmd.h"
#include "d_player.h"
#include "hu_stuff.h"
#include "g_game.h"
#include "m_fixed.h"
#include "m_random.h"
#include "m_menu.h" // ffdhidshfuisduifigergho9igj89dgodhfih AAAAAAAAAA
#include "p_local.h"
#include "p_slopes.h"
#include "r_defs.h"
#include "r_draw.h"
#include "r_local.h"
#include "r_state.h"
#include "r_things.h"
#include "s_sound.h"
#include "screen.h"
#include "st_stuff.h"
#include "tables.h"
#include "v_video.h"
#include "z_zone.h"
#include "m_misc.h"
@@ -25,6 +36,12 @@
#include "lua_hook.h" // For MobjDamage and ShouldDamage
#include "d_main.h" // found_extra_kart
#include "i_video.h"
#ifdef HWRENDER
#include "hardware/hw_main.h"
#endif
// Hud offset cvars
#define IMPL_HUD_OFFSET_X(name)\
consvar_t cv_##name##_xoffset = {"hud_" #name "_xoffset", "0", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
@@ -6989,6 +7006,16 @@ static patch_t *kp_lapanim_number[10][3];
static patch_t *kp_lapanim_emblem[2];
static patch_t *kp_lapanim_hand[3];
static patch_t *nametagpic;
static patch_t *nametagline;
static patch_t *nametagspeed;
static patch_t *nametagweight;
static patch_t *driftgauge;
static patch_t *driftgaugecolor;
static patch_t *driftgaugesmall;
static patch_t *driftgaugesmallcolor;
static patch_t *kp_yougotem;
static patch_t *skp_smallsticker;
@@ -7020,7 +7047,7 @@ void K_LoadKartHUDGraphics(void)
kp_lapstickerbig2 = W_CachePatchName("K_STLA2B", PU_HUDGFX);
}
//Colourized hud
// Colourized hud
if (clr_hud)
{
kp_timestickerclr = W_CachePatchName("K_SCTIME", PU_HUDGFX);
@@ -7046,7 +7073,7 @@ void K_LoadKartHUDGraphics(void)
skp_smallstickerclr = W_CachePatchName("SC_SMSTC", PU_HUDGFX);
}
//KartZ speedo
// KartZ speedo
if (kartzspeedo)
{
kp_kartzspeedo[0] = W_CachePatchName("K_KZSP1", PU_HUDGFX);
@@ -7075,7 +7102,24 @@ void K_LoadKartHUDGraphics(void)
kp_kartzspeedo[23] = W_CachePatchName("K_KZSP24", PU_HUDGFX);
kp_kartzspeedo[24] = W_CachePatchName("K_KZSP25", PU_HUDGFX);
}
// Nametags
if (nametaggfx)
{
nametagpic = W_CachePatchName("NTLINE", PU_HUDGFX);
nametagline = W_CachePatchName("NTLINEV", PU_HUDGFX);
nametagspeed = W_CachePatchName("NTSP", PU_HUDGFX);
nametagweight = W_CachePatchName("NTWH", PU_HUDGFX);
}
if (driftgaugegfx){
driftgauge = W_CachePatchName("K_DGAU", PU_HUDGFX);
driftgaugecolor = W_CachePatchName("K_DCAU", PU_HUDGFX);
driftgaugesmall = W_CachePatchName("K_DGSU", PU_HUDGFX);
driftgaugesmallcolor = W_CachePatchName("K_DCSU", PU_HUDGFX);
}
// Starting countdown
kp_startcountdown[0] = W_CachePatchName("K_CNT3A", PU_HUDGFX);
kp_startcountdown[1] = W_CachePatchName("K_CNT2A", PU_HUDGFX);
@@ -8828,6 +8872,528 @@ static void K_drawKartBumpersOrKarma(void)
}
}
// converts mobj coordinates into screen coordinates
// NOTE: use with V_NOSCALESTART!
// Code updated in Lua by GenericHeroGuy for libSG
// Badly ported to C by NepDisk and acutally made to work and fixed by Indev!(Thanks so much!)
// original code by Lat'
static void K_GetScreenCoords(vector2_t *vec, player_t *player, camera_t *came, mobj_t *target, fixed_t hofs, boolean dontclip)
{
fixed_t camx, camy, camz;
angle_t camangle, camaiming;
fixed_t distfact;
fixed_t dist;
fixed_t xres;
fixed_t yres;
fixed_t fov;
fixed_t fovratio;
fixed_t offset;
boolean srcflip;
boolean targflip;
fixed_t y;
fixed_t x;
// In case of early return we can check if those are negative
vec->x = -1;
vec->y = -1;
// this should never happen but its also kart so ¯\_(ツ)_/¯
if (!player || !target || !came)
return;
if (player->awayviewtics) {
camx = player->awayviewmobj->x;
camy = player->awayviewmobj->y;
camz = player->awayviewmobj->z;
camangle = player->awayviewmobj->angle;
camaiming = player->awayviewaiming;
}
else if (came->chase) {
camx = came->x;
camy = came->y;
camz = came->z + (player->mo->eflags & MFE_VERTICALFLIP && came->height);
camangle = came->angle;
camaiming = came->aiming;
}
else {
camx = player->mo->x;
camy = player->mo->y;
camz = player->viewz;
camangle = player->mo->angle;
camaiming = player->aiming;
}
xres = vid.width<<(FRACBITS-1);
yres = vid.height<<(FRACBITS-1);
fov = FixedDiv(xres, FINETANGENT(((FixedAngle(cv_fov.value/2)+ANGLE_90)>>ANGLETOFINESHIFT) & 4095));
// X coordinate
// get difference between camangle and angle towards target
x = (INT32)camangle - (INT32)R_PointToAngle2(camx, camy, target->x, target->y);
distfact = FINECOSINE((x>>ANGLETOFINESHIFT) & FINEMASK);
if (!distfact) distfact = 1;
if (encoremode)
x = -x;
if (x < (fixed_t)ANGLE_270 || x > (fixed_t)ANGLE_90)
return;
// flipping
targflip = target->eflags & MFE_VERTICALFLIP;
srcflip = player->pflags & PF_FLIPCAM && player->mo->eflags & MFE_VERTICALFLIP;
// Y coordinate
// getting the angle difference here is a bit more involved...
// start by getting the height difference between the camera and target
y = camz - target->z - (targflip ? target->height/1.5 : 0); // for some reason needs to be divided by 1.5 idk
if (hofs)
y = y - (targflip ? -hofs : hofs);
// then get the distance between camera and target
dist = R_PointToDist2(camx, camy, target->x, target->y);
#ifdef HWRENDER
// NOW we can get the angle differnce
if (rendermode == render_opengl && cv_grshearing.value == 0)
{
angle_t yang = R_PointToAngle2(0, 0, dist, y); // not perspective
x = FixedMul(x, FINECOSINE((yang>>ANGLETOFINESHIFT) & FINEMASK)); // perspective
y = -camaiming - FixedDiv(yang, distfact);
if (y < (fixed_t)ANGLE_270 || y > (fixed_t)ANGLE_90) // clip points behind the camera
return;
if (splitscreen == 1) // multiply by 1.25 for 2P splitscreen
y = y + (y/4) ;
if (srcflip) // flipcam
y = -y;
y = FixedMul(FINETANGENT((((angle_t)(-y)+ANGLE_90)>>ANGLETOFINESHIFT) & 4095), fov) + yres; // project the angle to get our final Y coordinate
}
else
#endif
{
fovratio = FixedDiv(90*FRACUNIT, 180*FRACUNIT - FixedMul(cv_fov.value, 4*FRACUNIT/3)-FRACUNIT*-30);
y = FixedDiv(y, FixedMul(dist, distfact));
if (srcflip)
y = -y; // flipcam
if (y != INT32_MIN) // I_Error(): FixedDiv: divide by zero
y = FixedMul(FixedDiv(y, fovratio), xres) + yres;
//else print("NOPE!")
offset = FixedMul(FINETANGENT(((camaiming+ANGLE_90)>>ANGLETOFINESHIFT) & 4095), xres);
// this isn't fovtan... what am i even doing anymore
if (splitscreen == 1)
offset = 17*offset/10;
// OpenGL with software perspective is miscentered on non-16:10 resolutions
#ifdef HWRENDER
if (rendermode == render_opengl)
offset = FixedMul(offset, FixedDiv(104857, FixedDiv(xres, yres)));
#endif
// thanks fickle
offset = FixedDiv(offset, fovratio);
if (srcflip)
offset = -offset; // flipcam
y = y + offset;
}
// project the angle to get our final X coordinate
x = FixedMul(FINETANGENT(((x+ANGLE_90)>>ANGLETOFINESHIFT) & 4095), fov);
if (splitscreen == 1) // divide by 320/200 (1.6) on 2P splitscreen
x = (x/2) + (x/8);
x = x + xres;
// now clip in screen-space
if (!dontclip && (x < 0 || x > xres*2 || y < 0 || y > yres*2))
return;
// get splitscreen index
int splitindex = stplyrnum;
// adjust coords for splitscreen
if (splitscreen == 1){ // 2P
y = y>>1;
if (splitindex)
y = y + yres;
}
if (splitscreen >= 2) { // 3P or 4P
x = x>>1;
y = y>>1;
if (splitindex & 1)
x = x + xres;
if (splitindex >= 2)
y = y + yres;
}
vec->y = y;
vec->x = x;
}
//Slighty fixed by Alug and further rewritten by NepDisk
//Decided to port and highly modify sunflower version for the main nametag drawing with additions by NepDisk. My previous one was broken anyway due to the changed screencoords and noscalestart
static void K_drawNameTags(void)
{
UINT8 i,j;
INT32 trans = 0;
vector2_t pos = {0};
fixed_t tagwidth;
fixed_t tagwidthsmall;
fixed_t namex,namey;
int dup = 0;
int tagcolor = 0;
int vflags = 0;
int flipped = 0;
int tagsdisplayed = 0;
char *tag;
patch_t *icon;
INT32 hudtransflag = V_LocalTransFlag();
boolean flipcam;
if (!stplyr->mo || (stplyr->spectator && !cv_shownametagspectator.value) || splitscreen || (stplyr->exiting && !cv_shownametagfinish.value))
return;
// True if currently viewed player is flipped and has flipcam on
flipcam = (stplyr->pflags & PF_FLIPCAM) && (stplyr->mo->eflags & MFE_VERTICALFLIP);
for (i = 0; i < MAXPLAYERS; i++)
{
UINT8 *cm;
fixed_t distance = 0;
fixed_t maxdistance = (10*cv_nametagdist.value)* mapobjectscale;
flipped = 0;
fixed_t z;
if (i > PLAYERSMASK)
continue;
if (!players[i].mo || P_MobjWasRemoved(players[i].mo) || players[i].spectator || !playeringame[i])
continue;
if (i == displayplayers[0] && !cv_showownnametag.value && !(leveltime < 130))
continue;
if (!(i == displayplayers[0]) && leveltime < starttime)
continue;
if (players[i].kartstuff[k_hyudorotimer]) // player is invisible
continue;
distance = R_PointToDist(players[i].mo->x, players[i].mo->y);
if (distance > maxdistance)
continue;
if (!P_CheckSight(stplyr->mo, players[i].mo))
continue;
switch (cv_nametagtrans.value)
{
case 0:
trans = 0;
break;
case 1:
if (distance > (maxdistance*3/4))
trans = V_60TRANS;
else
trans = 0;
break;
case 2:
if (distance > (maxdistance*3/1))
trans = V_90TRANS;
else if (distance > (maxdistance*3/2))
trans = V_80TRANS;
else if (distance > (maxdistance*3/3))
trans = V_60TRANS;
else if (distance > (maxdistance*3/4))
trans = V_40TRANS;
else if (distance > (maxdistance*3/5))
trans = V_20TRANS;
else
trans = 0;
break;
case 3:
trans = V_40TRANS;
break;
case 4:
trans = hudtransflag;
break;
default:
break;
}
dup = vid.dupx;
// If flipcam is on, other player is flipped relative to us when we have different
// verticalflip flag value. Otherwise, they are simply flipped when verticalflip flag says
// so
if (flipcam)
flipped = (players[i].mo->eflags & MFE_VERTICALFLIP) != (stplyr->mo->eflags & MFE_VERTICALFLIP);
else
flipped = players[i].mo->eflags & MFE_VERTICALFLIP;
z = players[i].mo->height;
//Saltyhop hehe
if (cv_saltyhop.value && cv_nametaghop.value)
z += players[i].mo->spriteyoffset;
K_GetScreenCoords(&pos, stplyr, camera, players[i].mo, z, false);
//Check for negative screencoords
if (pos.x == -1 || pos.y == -1)
continue;
tagsdisplayed += 1;
if (tagsdisplayed > cv_nametagmaxplayers.value)
break;
namex = pos.x>>FRACBITS;
namey = pos.y>>FRACBITS;
tag = va("%s%s ", HU_SkinColorToConsoleColor(players[i].mo->color),player_names[i]);
icon = R_GetSkinFaceMini(players[i].mo->player);
cm = R_GetTranslationColormap(players[i].skin, players[i].mo->color, GTC_CACHE);
tagcolor = colortranslations[players[i].mo->color][7];
vflags = trans | V_NOSCALESTART;
tagwidth = cv_smallnametags.value ? dup*V_SmallStringWidth(player_names[i], V_ALLOWLOWERCASE) : dup*V_ThinStringWidth(player_names[i], V_ALLOWLOWERCASE);
tagwidthsmall = cv_smallnametags.value ? V_SmallStringWidth(player_names[i], V_ALLOWLOWERCASE) : V_ThinStringWidth(player_names[i], V_ALLOWLOWERCASE);
if (cv_smallnametags.value == 2 || cv_smallnametags.value == 1 || !nametaggfx)
{
if (flipped)
namey += dup*5;
else // small offset
namey -= dup*3;
if (nametaggfx && cv_smallnametags.value == 1)
{
if (cv_nametagfacerank.value)
tagwidthsmall += icon->width - dup;
// Have to draw the nametag using patches here since drawfill can't draw at this scale...
if (!flipped)
V_DrawFixedPatch(namex<<FRACBITS, namey<<FRACBITS, FRACUNIT/2, vflags, nametagline, cm);
V_DrawStretchyFixedPatch(((namex+dup*3)<<FRACBITS), namey<<FRACBITS,
tagwidthsmall<<FRACBITS, FRACUNIT/2, vflags, nametagpic, cm);
namex += dup*2;
namey -= dup*4;
}
if (cv_nametagfacerank.value)
{
V_DrawFixedPatch(namex<<FRACBITS, (namey - icon->height/2)<<FRACBITS, FRACUNIT/2, vflags, icon, cm);
namex += dup*(1+icon->width/2); // add offset to other stuff
}
//Name
V_DrawSmallString(namex, namey, V_ALLOWLOWERCASE | vflags, tag);
if ((cv_nametagrestat.value == 1 && (players[i].kartspeed != skins[players[i].skin].kartspeed || players[i].kartweight != skins[players[i].skin].kartweight)) || cv_nametagrestat.value == 2)
{
V_DrawSmallString(namex, namey - dup*5, vflags, va("\x84S%d ", players[i].kartspeed));
V_DrawSmallString(namex + dup*10, namey - dup*5, vflags, va("\x87W%d ", players[i].kartweight));
}
if (cv_nametagscore.value)
{
if ((cv_nametagrestat.value == 1 && (players[i].kartspeed != skins[players[i].skin].kartspeed || players[i].kartweight != skins[players[i].skin].kartweight)) || cv_nametagrestat.value == 2)
V_DrawSmallString(namex, namey - dup*10, V_ALLOWLOWERCASE | vflags, va("\x8A%d ", players[i].score));
else
V_DrawSmallString(namex, namey - dup*5, V_ALLOWLOWERCASE | vflags, va("\x8A%d ", players[i].score));
}
}
else
{
if (cv_nametagfacerank.value)
tagwidth += dup*(icon->width+1);
if (flipped)
{
for (j = 0; j < 4; j++)
{
V_DrawFill(namex, namey, dup*3, dup*4, 31 | vflags);
V_DrawFill(namex+dup, namey, dup, dup*4, tagcolor | vflags);
namey += dup*4;
namex += dup;
}
namey -= dup*3;
V_DrawFill(namex, namey+dup*2, dup, dup, 31 | vflags); // a single black pixel
V_DrawFill(namex+dup, namey, tagwidth, dup*3, 31 | vflags);
V_DrawFill(namex+dup, namey+dup, tagwidth - dup, dup, tagcolor | vflags);
namex += dup*2;
}
else
{
for (j = 0; j < 4; j++)
{
namey -= dup*4;
V_DrawFill(namex, namey, dup*3, dup*4, 31 | vflags);
V_DrawFill(namex+dup, namey, dup, dup*4, tagcolor | vflags);
namex += dup;
}
V_DrawFill(namex, namey, dup, dup, 31 | vflags);
V_DrawFill(namex+dup, namey, tagwidth - dup*2, dup*3, 31 | vflags);
V_DrawFill(namex+dup, namey+dup, tagwidth - dup*3, dup, tagcolor | vflags);
}
if (cv_nametagfacerank.value)
{
V_DrawMappedPatch(namex, namey - dup*(icon->height+1), vflags, icon, cm);
namex += dup*(icon->height+1); // add offset to other stuff
}
V_DrawThinString(namex, namey - dup*10, V_ALLOWLOWERCASE | vflags, tag);
if ((cv_nametagrestat.value == 1 && (players[i].kartspeed != skins[players[i].skin].kartspeed || players[i].kartweight != skins[players[i].skin].kartweight)) || cv_nametagrestat.value == 2)
{
V_DrawScaledPatch(namex, namey - dup*20, vflags, nametagspeed);
V_DrawScaledPatch(namex + dup*18, namey - dup*20, vflags, nametagweight);
V_DrawString(namex + dup*9, namey - dup*19, V_ALLOWLOWERCASE | vflags, va("\x84%d ", players[i].kartspeed));
V_DrawString(namex + dup*27, namey - dup*19, V_ALLOWLOWERCASE | vflags, va("\x87%d ", players[i].kartweight));
}
if (cv_nametagscore.value)
{
if ((cv_nametagrestat.value == 1 && (players[i].kartspeed != skins[players[i].skin].kartspeed || players[i].kartweight != skins[players[i].skin].kartweight)) || cv_nametagrestat.value == 2)
V_DrawSmallString(namex, namey - dup*25, V_ALLOWLOWERCASE | vflags, va("\x8A%d ", players[i].score));
else
V_DrawSmallString(namex, namey - dup*15, V_ALLOWLOWERCASE | vflags, va("\x8A%d ", players[i].score));
}
}
}
}
// Based on Driftgauge refactor by GenericHeroGuy ported from lua and expanded by NepDisk
static void K_drawDriftGauge(void)
{
INT32 driftval = K_GetKartDriftSparkValue(stplyr);
INT32 driftcharge = min(driftval*4, stplyr->kartstuff[k_driftcharge]);
vector2_t pos = {0};
fixed_t basex,basey;
INT32 drifttrans = 0;
INT32 hudtransflag = V_LocalTransFlag();
int dup = vid.dupx;
int i,j;
UINT8 driftcolors[3][4] = {
{0, 0, 10, 16}, // no drift
{215, 215, 204, 253}, // blue
{125, 125, 151, 159} // red
};
UINT8 driftskins[3] = {
SKINCOLOR_NONE,
SKINCOLOR_TEAL,
SKINCOLOR_SALMON,
};
UINT8 driftrainbow[18] = {
0, 31, 47, 63, 79, 95, 111, 119, 127, 143, 159, 175, 183, 191, 199, 207, 223, 247
};
if (!stplyr->mo || !stplyr->kartstuff[k_drift] || (!splitscreen && !camera->chase))
return;
if (!splitscreen)
K_GetScreenCoords(&pos, stplyr, camera, stplyr->mo, FixedMul(cv_driftgaugeofs.value, cv_driftgaugeofs.value > 0 ? stplyr->mo->scale : mapobjectscale), false);
else
{
//Loop through each player camera for splitscreen.
for (j = 0; j <= stplyrnum; j++)
K_GetScreenCoords(&pos, stplyr, &camera[j], stplyr->mo, FixedMul(cv_driftgaugeofs.value, cv_driftgaugeofs.value > 0 ? stplyr->mo->scale : mapobjectscale), false);
}
//Check for negative screencoords
if (pos.x == -1 || pos.y == -1)
return;
basex = pos.x>>FRACBITS;
basey = pos.y>>FRACBITS;
fixed_t barx;
fixed_t bary;
INT32 BAR_WIDTH;
if (cv_driftgaugetrans.value)
drifttrans = hudtransflag;
else
drifttrans = 0;
switch (cv_driftgaugestyle.value)
{
case 1:
case 2:
case 3:
if (driftgaugegfx)
{
if (cv_driftgaugestyle.value == 1 || cv_driftgaugestyle.value == 3)
{
barx = basex - dup*23;
BAR_WIDTH = dup*47;
}
else
{
barx = basex - dup*12;
BAR_WIDTH = dup*23;
}
bary = basey - dup*2;
INT32 limit = driftval * (driftcharge >= driftval*2 ? 2 : 1);
INT32 width = ((driftcharge - (driftcharge >= driftval ? limit : 0)) * BAR_WIDTH) / limit;
INT32 level = min(driftcharge / driftval, 2);
UINT8 *cmap;
if (!K_UseColorHud())
V_DrawMappedPatch(cv_driftgaugestyle.value == 2 ? basex + dup*11 : basex, basey, V_NOSCALESTART|V_OFFSET|drifttrans, cv_driftgaugestyle.value == 2 ? driftgaugesmall : driftgauge, NULL);
else //Colourized hud
{
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
V_DrawMappedPatch(cv_driftgaugestyle.value == 2 ? basex + dup*11 : basex, basey, V_NOSCALESTART|V_OFFSET|drifttrans, cv_driftgaugestyle.value == 2 ? driftgaugesmallcolor : driftgaugecolor, colormap);
}
if (driftcharge >= driftval*4) // rainbow sparks
{
cmap = R_GetTranslationColormap(TC_RAINBOW, 1 + leveltime % (MAXSKINCOLORS-1),GTC_CACHE);
for (i = 0; i < 4; i++)
{
V_DrawFill(barx, bary+dup*1+dup*i, BAR_WIDTH, dup, (driftrainbow[(leveltime % 18) + 1] + i*2) | V_NOSCALESTART|drifttrans);
}
}
else // none/blue/red
{
cmap = R_GetTranslationColormap(TC_RAINBOW, driftskins[level],GTC_CACHE);
for (i = 0; i < 4; i++)
{
if (driftcharge >= driftval)
V_DrawFill(barx, bary+dup*1+dup*i, BAR_WIDTH, dup, driftcolors[level-1][i] | V_NOSCALESTART|drifttrans);
V_DrawFill(barx, bary+dup*1+dup*i, width, dup, driftcolors[level][i] | V_NOSCALESTART|drifttrans);
}
}
// right, also draw a cool number
//SG_DrawPaddedNum(v, basex + (dup*32), basey, driftcharge*100 / driftval, 3, "PINGN", V_NOSCALESTART|V_OFFSET|drifttrans, cmap)
if (cv_driftgaugestyle.value == 3)
V_DrawPaddedTallColorNum(basex + (dup*32), basey, V_NOSCALESTART|V_OFFSET|drifttrans, driftcharge*100 / driftval, 3, cmap);
else
V_DrawPingNum(cv_driftgaugestyle.value == 2 ? basex + (dup*22) : basex + (dup*32), basey, V_NOSCALESTART|V_OFFSET|drifttrans, driftcharge*100 / driftval, cmap);
}
break;
case 4:
{
UINT8 *cmap;
INT32 level = min(driftcharge / driftval, 2);
if (driftcharge >= driftval*4)
cmap = R_GetTranslationColormap(TC_RAINBOW, 1 + leveltime % (MAXSKINCOLORS-1),GTC_CACHE);
else
cmap = R_GetTranslationColormap(TC_RAINBOW, driftskins[level],GTC_CACHE);
V_DrawPaddedTallColorNum(basex + (dup*16), basey, V_NOSCALESTART|V_OFFSET|drifttrans, driftcharge*100 / driftval, 3, cmap);
}
break;
default:
break;
}
}
static fixed_t K_FindCheckX(fixed_t px, fixed_t py, angle_t ang, fixed_t mx, fixed_t my)
{
fixed_t dist, x;
@@ -9903,6 +10469,18 @@ void K_drawKartHUD(void)
if (LUA_HudEnabled(hud_item) && !freecam)
K_drawKartItem();
if (cv_driftgauge.value && !modeattacking)
{
if (LUA_HudEnabled(hud_driftgauge))
K_drawDriftGauge();
}
if (cv_nametag.value)
{
if (LUA_HudEnabled(hud_nametags))
K_drawNameTags();
}
// If not splitscreen, draw...
if (!splitscreen && !demo.title)
{
+1
View File
@@ -81,6 +81,7 @@ void K_CalculateBattleWanted(void);
void K_CheckBumpers(void);
void K_CheckSpectateStatus(void);
void K_UpdateSpectateGrief(void);
void K_AutoAdjustNameTagPos(void);
// sound stuff for lua
void K_PlayAttackTaunt(mobj_t *source);
+2
View File
@@ -32,6 +32,8 @@ enum hud {
hud_wanted,
hud_speedometer,
hud_statdisplay,
hud_nametags,
hud_driftgauge,
hud_freeplay,
hud_rankings, // Tab rankings
+2
View File
@@ -55,6 +55,8 @@ static const char *const hud_disable_options[] = {
"wanted",
"speedometer",
"statdisplay",
"nametags",
"driftgauge",
"freeplay",
"rankings",
NULL};
+146 -38
View File
@@ -358,12 +358,19 @@ menu_t OP_SaturnCreditsDef;
// Bird
menu_t OP_BirdDef;
// Stuff, yknow.
menu_t OP_ForkedBirdDef;
menu_t OP_LocalSkinDef;
menu_t OP_TiltDef;
menu_t OP_AdvancedBirdDef;
// Chaotic
menu_t OP_NametagDef;
//Driftgauge
menu_t OP_DriftGaugeDef;
#define numaddonsshown 4
// Replay hut
@@ -457,6 +464,7 @@ static CV_PossibleValue_t map_cons_t[] = {
{0, NULL}
};
consvar_t cv_nextmap = {"nextmap", "1", CV_HIDEN|CV_CALL, map_cons_t, Nextmap_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_nextmapaddon = {"nextmapaddon", "1", CV_HIDEN|CV_CALL, NULL, Nextmap_OnChange, 0, NULL, NULL, 0, 0, NULL};
static CV_PossibleValue_t skins_cons_t[MAXSKINS+1] = {{1, DEFAULTSKIN}};
consvar_t cv_chooseskin = {"chooseskin", DEFAULTSKIN, CV_HIDEN|CV_CALL, skins_cons_t, Nextmap_OnChange, 0, NULL, NULL, 0, 0, NULL};
@@ -1077,7 +1085,7 @@ enum
// Prefix: OP_
static menuitem_t OP_MainMenu[] =
{
{IT_SUBMENU|IT_STRING, NULL, "Control Setup...", &OP_ControlsDef, 0},
{IT_SUBMENU|IT_STRING, NULL, "Control Setup...", &OP_ControlsDef, 0},
{IT_SUBMENU|IT_STRING, NULL, "Video Options...", &OP_VideoOptionsDef, 20},
{IT_SUBMENU|IT_STRING, NULL, "Sound Options...", &OP_SoundOptionsDef, 30},
@@ -1086,15 +1094,15 @@ static menuitem_t OP_MainMenu[] =
{IT_SUBMENU|IT_STRING, NULL, "Gameplay Options...", &OP_GameOptionsDef, 60},
{IT_SUBMENU|IT_STRING, NULL, "Server Options...", &OP_ServerOptionsDef, 70},
{IT_SUBMENU|IT_STRING, NULL, "Data Options...", &OP_DataOptionsDef, 90},
{IT_SUBMENU|IT_STRING, NULL, "Data Options...", &OP_DataOptionsDef, 90},
{IT_CALL|IT_STRING, NULL, "Tricks & Secrets (F1)", M_Manual, 110},
{IT_CALL|IT_STRING, NULL, "Play Credits", M_Credits, 120},
{IT_SUBMENU|IT_STRING, NULL, "Saturn Options...", &OP_SaturnDef, 140},
{IT_SUBMENU|IT_STRING, NULL, "Bird", &OP_BirdDef, 150},
{IT_CALL|IT_STRING, NULL, "Local Skin Options...", M_LocalSkinMenu, 160},
{IT_SUBMENU|IT_STRING, NULL, "Bird", &OP_BirdDef, 150},
{IT_CALL|IT_STRING, NULL, "Local Skin Options...", M_LocalSkinMenu, 160},
};
static menuitem_t OP_ControlsMenu[] =
@@ -1969,15 +1977,18 @@ static menuitem_t OP_SaturnMenu[] =
{IT_STRING | IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 60},
{IT_STRING | IT_CVAR, NULL, "Show Minimap Names", &cv_showminimapnames, 65},
{IT_STRING | IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 70},
{IT_STRING | IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 80},
{IT_STRING | IT_CVAR, NULL, "Show Localskin Menus", &cv_showlocalskinmenus, 85},
{IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 95},
{IT_STRING | IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 90},
{IT_STRING | IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 95},
{IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 105},
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 110},
{IT_STRING | IT_CVAR, NULL, "Less Midnight Channel Flicker", &cv_lessflicker, 115},
{IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 120}, // uwu
{IT_SUBMENU|IT_STRING, NULL, "Sprite Distortion...", &OP_PlayerDistortDef, 125},
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 130},
{IT_SUBMENU|IT_STRING, NULL, "Saturn Credits", &OP_SaturnCreditsDef, 140}, // uwu
};
static const char* OP_SaturnTooltips[] =
@@ -1997,6 +2008,8 @@ static const char* OP_SaturnTooltips[] =
"Minimize the player icons on the minimap.",
"Show the big Cecho Messages.",
"Show Localskin Menus.",
"Nametag Options.",
"Driftgauge Options.",
"Disables the flicker effect on Midnight Channel.",
"Options for sprite distortion effects.",
"Move position of HUD elements.",
@@ -2018,6 +2031,10 @@ enum
sm_lapemblem,
sm_mapnames,
sm_smallmap,
sm_cechotogle,
sm_showlocalskin,
sm_nametagmen,
sm_driftgaugemen,
sm_pisschannel,
sm_distortionmenu,
sm_hudoffsets,
@@ -2214,6 +2231,88 @@ static menuitem_t OP_ForkedBirdMenu[] =
{IT_STRING | IT_CVAR, NULL, "Lua Immersion", &cv_luaimmersion, 170},
};
static menuitem_t OP_NametagMenu[] =
{
{IT_HEADER, NULL, "Nametag", NULL, 0},
{IT_STRING | IT_CVAR, NULL, "Nametag", &cv_nametag, 20},
{IT_STRING | IT_CVAR, NULL, "Show Char image in Nametag", &cv_nametagfacerank, 30},
{IT_STRING | IT_CVAR, NULL, "Show Own Nametag", &cv_showownnametag, 40},
{IT_STRING | IT_CVAR, NULL, "Nametag Max distance", &cv_nametagdist, 50},
{IT_STRING | IT_CVAR, NULL, "Nametag Max Display Players", &cv_nametagmaxplayers, 60},
{IT_STRING | IT_CVAR, NULL, "Nametag Transparency", &cv_nametagtrans, 70},
{IT_STRING | IT_CVAR, NULL, "Nametag Score", &cv_nametagscore, 80},
{IT_STRING | IT_CVAR, NULL, "Nametag Restat", &cv_nametagrestat, 90},
{IT_STRING | IT_CVAR, NULL, "Nametag Hop", &cv_nametaghop, 100},
{IT_STRING | IT_CVAR, NULL, "Small Nametags", &cv_smallnametags, 110},
{IT_STRING | IT_CVAR, NULL, "Show Nametags after Race finish", &cv_shownametagfinish, 120},
{IT_STRING | IT_CVAR, NULL, "Show Nametags in Spectator Mode", &cv_shownametagspectator, 130},
//{IT_STRING | IT_CVAR, NULL, "Nametag Scaling", &cv_nametagscaling, 70}
};
static const char* OP_NametagTooltips[] =
{
NULL,
"Enable nametags in game.",
"Show character icon in nametag.",
"Show your own nametag in game.",
"Distance nametags are visible.",
"Maximum amount of nametags on screen.",
"Transparency of nametags.",
"Show player score in nametag.",
"Show stats in nametags.",
"Enable Saltyhop support for nametags.",
"Alternative smaller nametags.",
"Show Nametags after Race finish.",
"Show Nametags when you are spectating.",
};
enum
{
nt_header,
nt_nametag,
nt_ntchar,
nt_owntag,
nt_maxdist,
nt_maxplayer,
nt_nttrans,
nt_ntpscore,
nt_ntrestat,
nt_nthop,
nt_smol,
nt_finish,
nt_spec,
};
static menuitem_t OP_DriftGaugeMenu[] =
{
{IT_HEADER, NULL, "Driftgauge", NULL, 0},
{IT_STRING | IT_CVAR, NULL, "Driftgauge", &cv_driftgauge, 20},
{IT_STRING | IT_CVAR, NULL, "Driftgauge Transparency", &cv_driftgaugetrans, 30},
{IT_STRING | IT_CVAR, NULL, "Driftgauge Offset", &cv_driftgaugeofs, 40},
{IT_STRING | IT_CVAR, NULL, "Driftgauge Style", &cv_driftgaugestyle, 50},
};
static const char* OP_DriftGaugeTooltips[] =
{
NULL,
"Enable driftgauge in game.",
"Have driftgauge use hud transparency.",
"Vertical driftgauge offset.",
"Driftgauge style.",
};
enum
{
dg_header,
dg_dg,
dg_dgtrans,
dg_dgoffset,
dg_dgstyle,
};
static menuitem_t OP_TiltMenu[] =
{
{IT_STRING | IT_CVAR, NULL, "Camera Tilting", &cv_tilting, 0},
@@ -2766,6 +2865,10 @@ menu_t OP_HudOffsetDef = DEFAULTSCROLLSTYLE(NULL, OP_HudOffsetMenu, &OP_SaturnDe
menu_t OP_SaturnCreditsDef = DEFAULTMENUSTYLE(NULL, OP_SaturnCreditsMenu, &OP_SaturnDef, 30, 10);
menu_t OP_BirdDef = DEFAULTMENUSTYLE(NULL, OP_BirdMenu, &OP_MainDef, 30, 30);
menu_t OP_NametagDef = DEFAULTMENUSTYLE(NULL, OP_NametagMenu, &OP_SaturnDef, 30, 40);
menu_t OP_DriftGaugeDef = DEFAULTMENUSTYLE(NULL, OP_DriftGaugeMenu, &OP_SaturnDef, 30, 60);
menu_t OP_TiltDef = DEFAULTMENUSTYLE(NULL, OP_TiltMenu, &OP_BirdDef, 30, 60);
menu_t OP_AdvancedBirdDef = DEFAULTMENUSTYLE(NULL, OP_AdvancedBirdMenu, &OP_BirdDef, 30, 60);
@@ -4359,6 +4462,9 @@ void M_Init(void)
OP_SaturnMenu[sm_coloritem].status = IT_GRAYEDOUT;
OP_SaturnMenu[sm_colorhud_customcolor].status = IT_GRAYEDOUT;
}
if (!nametaggfx)
OP_NametagMenu[nt_ntchar].status = IT_GRAYEDOUT;
#ifndef NONET
CV_RegisterVar(&cv_serversort);
@@ -4812,11 +4918,9 @@ static void M_DrawGenericMenu(void)
W_CachePatchName("M_CURSOR", PU_CACHE));
V_DrawString(currentMenu->x, cursory, lowercase|highlightflags, currentMenu->menuitems[itemOn].text);
}
// dumb hack
// tooltips
if (currentMenu == &OP_ControlsDef)
{
if (!(OP_ControlsTooltips[itemOn] == NULL))
@@ -4826,7 +4930,7 @@ static void M_DrawGenericMenu(void)
coolalphatimer--;
}
}
if (currentMenu == &OP_MouseOptionsDef)
{
if (!(OP_MouseTooltips[itemOn] == NULL))
@@ -4836,7 +4940,7 @@ static void M_DrawGenericMenu(void)
coolalphatimer--;
}
}
if (currentMenu == &OP_VideoOptionsDef)
{
if (!(OP_VideoTooltips[itemOn] == NULL))
@@ -4846,7 +4950,7 @@ static void M_DrawGenericMenu(void)
coolalphatimer--;
}
}
if (currentMenu == &OP_SoundOptionsDef)
{
if (!(OP_SoundTooltips[itemOn] == NULL))
@@ -4856,7 +4960,7 @@ static void M_DrawGenericMenu(void)
coolalphatimer--;
}
}
if (currentMenu == &OP_SoundAdvancedDef)
{
if (!(OP_SoundAdvancedTooltips[itemOn] == NULL))
@@ -4866,7 +4970,7 @@ static void M_DrawGenericMenu(void)
coolalphatimer--;
}
}
if (currentMenu == &OP_ExpOptionsDef)
{
if (!(OP_ExpTooltips[itemOn] == NULL))
@@ -4876,7 +4980,7 @@ static void M_DrawGenericMenu(void)
coolalphatimer--;
}
}
if (currentMenu == &OP_ChatOptionsDef)
{
if (!(OP_ChatOptionsTooltips[itemOn] == NULL))
@@ -4887,8 +4991,6 @@ static void M_DrawGenericMenu(void)
}
}
if (currentMenu == &OP_GameOptionsDef)
{
if (!(OP_GameTooltips[itemOn] == NULL))
@@ -4898,8 +5000,7 @@ static void M_DrawGenericMenu(void)
coolalphatimer--;
}
}
if (currentMenu == &OP_ServerOptionsDef)
{
if (!(OP_ServerOptionsTooltips[itemOn] == NULL))
@@ -4909,8 +5010,7 @@ static void M_DrawGenericMenu(void)
coolalphatimer--;
}
}
if (currentMenu == &OP_AdvServerOptionsDef)
{
if (!(OP_AdvServerOptionsTooltips[itemOn] == NULL))
@@ -4921,9 +5021,6 @@ static void M_DrawGenericMenu(void)
}
}
if (currentMenu == &OP_PlayerDistortDef)
{
if (!(OP_PlayerDistortTooltips[itemOn] == NULL))
@@ -4933,10 +5030,7 @@ static void M_DrawGenericMenu(void)
coolalphatimer--;
}
}
if (currentMenu == &OP_SaturnCreditsDef) // C:
{
if (!(OP_CreditTooltips[itemOn] == NULL))
@@ -4946,7 +5040,7 @@ static void M_DrawGenericMenu(void)
coolalphatimer--;
}
}
if (currentMenu == &OP_BirdDef)
{
if (!(OP_BirdTooltips[itemOn] == NULL))
@@ -4956,7 +5050,7 @@ static void M_DrawGenericMenu(void)
coolalphatimer--;
}
}
if (currentMenu == &OP_TiltDef)
{
if (!(OP_TiltTooltips[itemOn] == NULL))
@@ -4966,7 +5060,7 @@ static void M_DrawGenericMenu(void)
coolalphatimer--;
}
}
if (currentMenu == &OP_AdvancedBirdDef)
{
if (!(OP_AdvancedBirdTooltips[itemOn] == NULL))
@@ -4977,7 +5071,25 @@ static void M_DrawGenericMenu(void)
}
}
if (currentMenu == &OP_NametagDef)
{
if (!(OP_NametagTooltips[itemOn] == NULL))
{
M_DrawSplitText(BASEVIDWIDTH / 2, BASEVIDHEIGHT-50, V_ALLOWLOWERCASE|V_SNAPTOBOTTOM, OP_NametagTooltips[itemOn], 30, coolalphatimer);
if (coolalphatimer > 0 && interpTimerHackAllow)
coolalphatimer--;
}
}
if (currentMenu == &OP_DriftGaugeDef)
{
if (!(OP_DriftGaugeTooltips[itemOn] == NULL))
{
M_DrawSplitText(BASEVIDWIDTH / 2, BASEVIDHEIGHT-50, V_ALLOWLOWERCASE|V_SNAPTOBOTTOM, OP_DriftGaugeTooltips[itemOn], 30, coolalphatimer);
if (coolalphatimer > 0 && interpTimerHackAllow)
coolalphatimer--;
}
}
}
static void M_DrawGenericBackgroundMenu(void)
@@ -4988,8 +5100,6 @@ static void M_DrawGenericBackgroundMenu(void)
#define scrollareaheight 72
// note that alphakey is multiplied by 2 for scrolling menus to allow greater usage in UINT8 range.
static void M_DrawGenericScrollMenu(void)
{
@@ -5135,8 +5245,6 @@ static void M_DrawGenericScrollMenu(void)
}
#endif
if (currentMenu == &OP_SaturnDef)
{
if (!(OP_SaturnTooltips[itemOn] == NULL))
+2 -1
View File
@@ -169,6 +169,7 @@ static boolean P_CrossSubsecPolyObj(polyobj_t *po, register los_t *los)
return true;
}
//
// P_CrossSubsector
//
@@ -492,4 +493,4 @@ boolean P_CheckSight(mobj_t *t1, mobj_t *t2)
// the head node is the last node output
return P_CrossBSPNode((INT32)numnodes - 1, &los);
}
}
+124
View File
@@ -2328,6 +2328,109 @@ void V_DrawCenteredSmallStringAtFixed(fixed_t x, fixed_t y, INT32 option, const
V_DrawSmallStringAtFixed(x, y, option, string);
}
void V_DrawThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
{
fixed_t cx = x, cy = y;
INT32 w, c, dupx, dupy, scrwidth, center = 0, left = 0;
const char *ch = string;
INT32 spacewidth = 4, charwidth = 0;
INT32 charflags = 0;
const UINT8 *colormap = NULL;
INT32 lowercase = (option & V_ALLOWLOWERCASE);
option &= ~V_FLIP; // which is also shared with V_ALLOWLOWERCASE...
if (option & V_NOSCALESTART)
{
dupx = vid.dupx;
dupy = vid.dupy;
scrwidth = vid.width;
}
else
{
dupx = dupy = 1;
scrwidth = vid.width/vid.dupx;
left = (scrwidth - BASEVIDWIDTH)/2;
scrwidth -= left;
}
switch (option & V_SPACINGMASK)
{
case V_MONOSPACE:
spacewidth = 8;
/* FALLTHRU */
case V_OLDSPACING:
charwidth = 8;
break;
case V_6WIDTHSPACE:
spacewidth = 6;
default:
break;
}
charflags = (option & V_CHARCOLORMASK);
colormap = V_GetStringColormap(charflags);
for (;;ch++)
{
if (!*ch)
break;
if (*ch & 0x80) //color parsing -x 2.16.09
{
// manually set flags override color codes
if (!(option & V_CHARCOLORMASK))
{
charflags = ((*ch & 0x7f) << V_CHARCOLORSHIFT) & V_CHARCOLORMASK;
colormap = V_GetStringColormap(charflags);
}
continue;
}
if (*ch == '\n')
{
cx = x;
if (option & V_RETURN8)
cy += (8*dupy)<<FRACBITS;
else
cy += (12*dupy)<<FRACBITS;
continue;
}
c = *ch;
if (!lowercase)
c = toupper(c);
c -= HU_FONTSTART;
// character does not exist or is a space
if (c < 0 || c >= HU_FONTSIZE || !tny_font[c])
{
cx += (spacewidth * dupx)<<FRACBITS;
continue;
}
if (charwidth)
{
w = charwidth * dupx;
center = w/2 - SHORT(tny_font[c]->width)*(dupx/2);
}
else
w = SHORT(tny_font[c]->width) * dupx;
if ((cx>>FRACBITS) > scrwidth)
break;
if ((cx>>FRACBITS)+left + w < 0) //left boundary check
{
cx += w<<FRACBITS;
continue;
}
//V_DrawSciencePatch(cx + (center<<FRACBITS), cy, option, tny_font[c], FRACUNIT);
V_DrawFixedPatch(cx + (center<<FRACBITS), cy, FRACUNIT, option, tny_font[c], colormap);
cx += w<<FRACBITS;
}
}
// Draws a tallnum. Replaces two functions in y_inter and st_stuff
void V_DrawTallNum(INT32 x, INT32 y, INT32 flags, INT32 num)
{
@@ -2374,6 +2477,27 @@ void V_DrawPaddedTallNum(INT32 x, INT32 y, INT32 flags, INT32 num, INT32 digits)
} while (--digits);
}
// Draws a number with a set number of digits.
// Does not handle negative numbers in a special way, don't try to feed it any.
void V_DrawPaddedTallColorNum(INT32 x, INT32 y, INT32 flags, INT32 num, INT32 digits, const UINT8 *colormap)
{
INT32 w = SHORT(tallnum[0]->width);
if (flags & V_NOSCALESTART)
w *= vid.dupx;
if (num < 0)
num = -num;
// draw the number
do
{
x -= w;
V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, FRACUNIT, flags, tallnum[num % 10], colormap);
num /= 10;
} while (--digits);
}
// Draws a number using the PING font thingy.
// TODO: Merge number drawing functions into one with "font name" selection.
+3
View File
@@ -212,9 +212,12 @@ void V_DrawStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string)
void V_DrawSmallStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
void V_DrawCenteredSmallStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
void V_DrawThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string);
// Draw tall nums, used for menu, HUD, intermission
void V_DrawTallNum(INT32 x, INT32 y, INT32 flags, INT32 num);
void V_DrawPaddedTallNum(INT32 x, INT32 y, INT32 flags, INT32 num, INT32 digits);
void V_DrawPaddedTallColorNum(INT32 x, INT32 y, INT32 flags, INT32 num, INT32 digits, const UINT8 *colormap);
// Draw ping numbers. Used by the scoreboard and that one ping option. :P
// This is a separate function because IMO lua should have access to it as well.