From 97f0ea1b0fa57f23189740523ee1f52640bea381 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 16:59:23 +0200 Subject: [PATCH 01/26] initial support https://git.do.srb2.org/haya_/Kart-Public/-/commit/a464df2165d62528af46d7ef0a6cbdbf29c3d07c --- src/d_netcmd.c | 64 ++++++++++++++++++- src/d_netcmd.h | 4 ++ src/d_player.h | 2 + src/g_game.c | 6 ++ src/hardware/hw_main.c | 32 ++++++---- src/hardware/hw_md2.c | 60 +++++++++++++----- src/hardware/hw_md2.h | 3 +- src/p_enemy.c | 1 + src/p_mobj.c | 10 +++ src/p_mobj.h | 2 + src/p_setup.c | 8 +-- src/p_setup.h | 2 +- src/r_draw.c | 55 ++++++++++++---- src/r_draw.h | 2 + src/r_things.c | 140 ++++++++++++++++++++++++++++++++--------- src/r_things.h | 6 +- src/st_stuff.c | 19 ++++++ src/st_stuff.h | 1 + 18 files changed, 338 insertions(+), 79 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index cb2123e45..007d62949 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -110,6 +110,10 @@ static void Skin_OnChange(void); static void Skin2_OnChange(void); static void Skin3_OnChange(void); static void Skin4_OnChange(void); +static void Localskin_OnChange(void); +static void Localskin2_OnChange(void); +static void Localskin3_OnChange(void); +static void Localskin4_OnChange(void); static void Color_OnChange(void); static void Color2_OnChange(void); static void Color3_OnChange(void); @@ -141,6 +145,7 @@ static void Command_SetViews_f(void); static void Command_Addfilelocal(void); static void Command_Addfile(void); +static void Command_Addskins(void); static void Command_ListWADS_f(void); #ifdef DELFILE static void Command_Delfile(void); @@ -289,6 +294,11 @@ consvar_t cv_skin = {"skin", DEFAULTSKIN, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin_ consvar_t cv_skin2 = {"skin2", DEFAULTSKIN2, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin2_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_skin3 = {"skin3", DEFAULTSKIN3, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin3_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_skin4 = {"skin4", DEFAULTSKIN4, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin4_OnChange, 0, NULL, NULL, 0, 0, NULL}; +// haha I've beaten you now, ONLINE +consvar_t cv_localskin = {"localskin", "none", CV_CALL|CV_NOINIT, NULL, Localskin_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_localskin2 = {"localskin2", "none", CV_CALL|CV_NOINIT, NULL, Localskin2_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_localskin3 = {"localskin3", "none", CV_CALL|CV_NOINIT, NULL, Localskin3_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_localskin4 = {"localskin4", "none", CV_CALL|CV_NOINIT, NULL, Localskin4_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_skipmapcheck = {"skipmapcheck", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -643,6 +653,7 @@ void D_RegisterServerCommands(void) COM_AddCommand("addfilelocal", Command_Addfilelocal); COM_AddCommand("addfile", Command_Addfile); + COM_AddCommand("addskins", Command_Addskins); COM_AddCommand("listwad", Command_ListWADS_f); #ifdef DELFILE @@ -885,18 +896,22 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_playername); CV_RegisterVar(&cv_playercolor); CV_RegisterVar(&cv_skin); // r_things.c (skin NAME) + CV_RegisterVar(&cv_localskin); // secondary player (splitscreen) CV_RegisterVar(&cv_playername2); CV_RegisterVar(&cv_playercolor2); CV_RegisterVar(&cv_skin2); + CV_RegisterVar(&cv_localskin2); // third player CV_RegisterVar(&cv_playername3); CV_RegisterVar(&cv_playercolor3); CV_RegisterVar(&cv_skin3); + CV_RegisterVar(&cv_localskin3); // fourth player CV_RegisterVar(&cv_playername4); CV_RegisterVar(&cv_playercolor4); CV_RegisterVar(&cv_skin4); + CV_RegisterVar(&cv_localskin4); // preferred number of players CV_RegisterVar(&cv_splitplayers); @@ -4564,7 +4579,7 @@ static void Command_Addfile(void) // Add file on your client directly if it is trivial, or you aren't in a netgame. if (!(netgame || multiplayer) || musiconly) { - P_AddWadFile(fn); + P_AddWadFile(fn, false); return; } @@ -4613,6 +4628,20 @@ static void Command_Addfile(void) SendNetXCmd(XD_ADDFILE, buf, buf_p - buf); } +/** Adds something at runtime. + */ +static void +Command_Addskins (void) +{ + if (COM_Argc() != 2) + { + CONS_Printf( + "addskins : load skins bro\n"); + return; + } + P_AddWadFile(COM_Argv(1), true); +} + #ifdef DELFILE /** removes the last added pwad at runtime. * Searches for sounds, maps, music and images to remove @@ -4769,7 +4798,7 @@ static void Got_Addfilecmd(UINT8 **cp, INT32 playernum) ncs = findfile(filename,md5sum,true); - if (ncs != FS_FOUND || !P_AddWadFile(filename)) + if (ncs != FS_FOUND || !P_AddWadFile(filename, false)) { Command_ExitGame_f(); if (ncs == FS_FOUND) @@ -5925,6 +5954,37 @@ static void Command_ListSkins(void) } } +/** bruh + */ +static void Localskin_OnChange(void) +{ + if (!Playing()) + return; // do whatever you want + SetLocalPlayerSkin(consoleplayer, cv_localskin.string, &cv_localskin); +} + +/** two bruh machine gun + */ +static void Localskin2_OnChange(void) +{ + if (!Playing()) + return; // do whatever you want + SetLocalPlayerSkin(displayplayers[1], cv_localskin2.string, &cv_localskin2); +} + +static void Localskin3_OnChange(void) +{ + if (!Playing()) + return; // do whatever you want + SetLocalPlayerSkin(displayplayers[2], cv_localskin3.string, &cv_localskin3); +} + +static void Localskin4_OnChange(void) +{ + if (!Playing()) + return; // do whatever you want + SetLocalPlayerSkin(displayplayers[3], cv_localskin4.string, &cv_localskin4); +} /** Sends a color change for the console player, unless that player is moving. * \sa cv_playercolor, Color2_OnChange, Skin_OnChange diff --git a/src/d_netcmd.h b/src/d_netcmd.h index e999a202e..9cf7c2e5d 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -21,18 +21,22 @@ extern consvar_t cv_playername; extern consvar_t cv_playercolor; extern consvar_t cv_skin; +extern consvar_t cv_localskin; // secondary splitscreen player extern consvar_t cv_playername2; extern consvar_t cv_playercolor2; extern consvar_t cv_skin2; +extern consvar_t cv_localskin2; // third splitscreen player extern consvar_t cv_playername3; extern consvar_t cv_playercolor3; extern consvar_t cv_skin3; +extern consvar_t cv_localskin3; // fourth splitscreen player extern consvar_t cv_playername4; extern consvar_t cv_playercolor4; extern consvar_t cv_skin4; +extern consvar_t cv_localskin4; // preferred number of players extern consvar_t cv_splitplayers; diff --git a/src/d_player.h b/src/d_player.h index d7bfb80eb..1479b3a9f 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -415,6 +415,8 @@ typedef struct player_s UINT8 skincolor; INT32 skin; + INT32 localskin; + boolean skinlocal; UINT32 score; // player score fixed_t dashspeed; // dashing speed diff --git a/src/g_game.c b/src/g_game.c index 0cb897b52..d17434f4e 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2702,6 +2702,8 @@ void G_PlayerReborn(INT32 player) UINT8 mare; UINT8 skincolor; INT32 skin; + int localskin; + boolean skinlocal; tic_t jointime; UINT8 splitscreenindex; boolean spectator; @@ -2748,6 +2750,8 @@ void G_PlayerReborn(INT32 player) skincolor = players[player].skincolor; skin = players[player].skin; + localskin = players[player].localskin; + skinlocal = players[player].skinlocal; // SRB2kart kartspeed = players[player].kartspeed; kartweight = players[player].kartweight; @@ -2837,6 +2841,8 @@ void G_PlayerReborn(INT32 player) // save player config truth reborn p->skincolor = skincolor; p->skin = skin; + p->localskin = localskin; + p->skinlocal = skinlocal; // SRB2kart p->kartspeed = kartspeed; p->kartweight = kartweight; diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 834f617bf..adfd08cff 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3825,7 +3825,7 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) FOutVector baseWallVerts[4]; // This is what the verts should end up as GLPatch_t *gpatch; FSurfaceInfo Surf; - const boolean hires = (spr->mobj && spr->mobj->skin && ((skin_t *)spr->mobj->skin)->flags & SF_HIRES); + const boolean hires = (spr->mobj && spr->mobj->skin && ((skin_t *)( (spr->mobj->localskin) ? spr->mobj->localskin : spr->mobj->skin ))->flags & SF_HIRES); extracolormap_t *colormap; FUINT lightlevel; FBITFIELD blend = 0; @@ -3849,7 +3849,7 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) this_scale = FIXED_TO_FLOAT(spr->mobj->scale); if (hires) - this_scale = this_scale * FIXED_TO_FLOAT(((skin_t *)spr->mobj->skin)->highresscale); + this_scale = this_scale * FIXED_TO_FLOAT(((skin_t *)( (spr->mobj->localskin) ? spr->mobj->localskin : spr->mobj->skin ))->highresscale); gpatch = spr->gpatch; //W_CachePatchNum(spr->patchlumpnum, PU_CACHE); @@ -4171,11 +4171,11 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) FOutVector wallVerts[4]; GLPatch_t *gpatch; // sprite patch converted to hardware FSurfaceInfo Surf; - const boolean hires = (spr->mobj && spr->mobj->skin && ((skin_t *)spr->mobj->skin)->flags & SF_HIRES); + const boolean hires = (spr->mobj && spr->mobj->skin && ((skin_t *)( (spr->mobj->localskin) ? spr->mobj->localskin : spr->mobj->skin ))->flags & SF_HIRES); if (spr->mobj) this_scale = FIXED_TO_FLOAT(spr->mobj->scale); if (hires) - this_scale = this_scale * FIXED_TO_FLOAT(((skin_t *)spr->mobj->skin)->highresscale); + this_scale = this_scale * FIXED_TO_FLOAT(((skin_t *)( (spr->mobj->localskin) ? spr->mobj->localskin : spr->mobj->skin ))->highresscale); if (!spr->mobj) return; @@ -4722,8 +4722,19 @@ void HWR_DrawSprites(void) else if (spr->mobj && spr->mobj->skin && spr->mobj->sprite == SPR_PLAY) { + md2_t *md2; + if (spr->mobj->localskin) + { + if (spr->mobj->skinlocal) + md2 = &md2_localplayermodels[(skin_t *)spr->mobj->localskin - localskins]; + else + md2 = &md2_playermodels [(skin_t *)spr->mobj->localskin - skins]; + } + else + md2 = &md2_playermodels[(skin_t *)spr->mobj->skin - skins]; + // 8/1/19: Only don't display player models if no default SPR_PLAY is found. - if (!cv_grmdls.value || ((md2_playermodels[(skin_t*)spr->mobj->skin-skins].notfound || md2_playermodels[(skin_t*)spr->mobj->skin-skins].scale < 0.0f) && ((!cv_grfallbackplayermodel.value) || md2_models[SPR_PLAY].notfound || md2_models[SPR_PLAY].scale < 0.0f)) || spr->mobj->state == &states[S_PLAY_SIGN]) + if (!cv_grmdls.value || ((md2->notfound || md2->scale < 0.0f) && ((!cv_grfallbackplayermodel.value) || md2_models[SPR_PLAY].notfound || md2_models[SPR_PLAY].scale < 0.0f)) || spr->mobj->state == &states[S_PLAY_SIGN]) HWR_DrawSprite(spr); else HWR_DrawMD2(spr); @@ -4970,7 +4981,7 @@ void HWR_ProjectSprite(mobj_t *thing) //Fab : 02-08-98: 'skin' override spritedef currently used for skin if (thing->skin && thing->sprite == SPR_PLAY) { - sprdef = &((skin_t *)thing->skin)->spritedef; + sprdef = &((skin_t *)( (thing->localskin) ? thing->localskin : thing->skin ))->spritedef; #ifdef ROTSPRITE sprinfo = &spriteinfo[thing->sprite]; #endif @@ -5045,8 +5056,8 @@ void HWR_ProjectSprite(mobj_t *thing) } } - if (thing->skin && ((skin_t *)thing->skin)->flags & SF_HIRES) - this_scale = this_scale * FIXED_TO_FLOAT(((skin_t *)thing->skin)->highresscale); + if (thing->skin && ((skin_t *)( (thing->localskin) ? thing->localskin : thing->skin ))->flags & SF_HIRES) + this_scale = this_scale * FIXED_TO_FLOAT(((skin_t *)( (thing->localskin) ? thing->localskin : thing->skin ))->highresscale); spr_width = spritecachedinfo[lumpoff].width; spr_height = spritecachedinfo[lumpoff].height; @@ -5205,10 +5216,7 @@ void HWR_ProjectSprite(mobj_t *thing) if (thing->colorized) vis->colormap = R_GetTranslationColormap(TC_RAINBOW, thing->color, GTC_CACHE); else if (thing->skin && thing->sprite == SPR_PLAY) // This thing is a player! - { - size_t skinnum = (skin_t*)thing->skin-skins; - vis->colormap = R_GetTranslationColormap((INT32)skinnum, thing->color, GTC_CACHE); - } + vis->colormap = R_GetLocalTranslationColormap(thing->skin, thing->localskin, thing->color, GTC_CACHE, thing->skinlocal); else vis->colormap = R_GetTranslationColormap(TC_DEFAULT, thing->color, GTC_CACHE); } diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index ce7ee8d9f..140c42c1f 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -75,6 +75,7 @@ md2_t md2_models[NUMSPRITES]; md2_t md2_playermodels[MAXSKINS]; +md2_t md2_localplayermodels[MAXSKINS]; /* @@ -487,6 +488,13 @@ void HWR_InitMD2(void) md2_playermodels[s].skin = -1; md2_playermodels[s].notfound = true; md2_playermodels[s].error = false; + + md2_localplayermodels[s].scale = -1.0f; + md2_localplayermodels[s].model = NULL; + md2_localplayermodels[s].grpatch = NULL; + md2_localplayermodels[s].skin = -1; + md2_localplayermodels[s].notfound = true; + md2_localplayermodels[s].error = false; } for (i = 0; i < NUMSPRITES; i++) { @@ -559,11 +567,12 @@ md2found: fclose(f); } -void HWR_AddPlayerMD2(int skin) // For MD2's that were added after startup +void HWR_AddPlayerMD2(int skin, boolean local) // For MD2's that were added after startup { FILE *f; char name[20], filename[32]; float scale, offset; + md2_t *md2s; if (nomd2s) return; @@ -585,22 +594,23 @@ void HWR_AddPlayerMD2(int skin) // For MD2's that were added after startup } } - // Check for any MD2s that match the names of sprite names! + md2s = ( (local) ? md2_localplayermodels : md2_playermodels ); + // Check for any MD2s that match the names of player skins! while (fscanf(f, "%19s %31s %f %f", name, filename, &scale, &offset) == 4) { - if (stricmp(name, skins[skin].name) == 0) + if (stricmp(name, ( (local) ? localskins : skins )[skin].name) == 0) { - md2_playermodels[skin].skin = skin; - md2_playermodels[skin].scale = scale; - md2_playermodels[skin].offset = offset; - md2_playermodels[skin].notfound = false; - strcpy(md2_playermodels[skin].filename, filename); + md2s[skin].skin = skin; + md2s[skin].scale = scale; + md2s[skin].offset = offset; + md2s[skin].notfound = false; + strcpy(md2s[skin].filename, filename); goto playermd2found; } } //CONS_Printf("MD2 for player skin %s not found\n", skins[skin].name); - md2_playermodels[skin].notfound = true; + md2s[skin].notfound = true; playermd2found: fclose(f); } @@ -1154,6 +1164,8 @@ void HWR_DrawMD2(gr_vissprite_t *spr) { R_InterpolateMobjState(spr->mobj, FRACUNIT, &interp); } + md2_t *md2s; + int skinnum; // Apparently people don't like jump frames like that, so back it goes //if (tics > durs) @@ -1168,13 +1180,33 @@ void HWR_DrawMD2(gr_vissprite_t *spr) // dont forget to enabled the depth test because we can't do this like // before: polygons models are not sorted + + /* fuck you */ + if (spr->mobj->localskin) + { + if (spr->mobj->skinlocal) + { + md2s = md2_localplayermodels; + skinnum = (skin_t *)spr->mobj->localskin - localskins; + } + else + { + md2s = md2_playermodels; + skinnum = (skin_t *)spr->mobj->localskin - skins; + } + } + else + { + md2s = md2_playermodels; + skinnum = (skin_t *)spr->mobj->skin - skins; + } // 1. load model+texture if not already loaded // 2. draw model with correct position, rotation,... - if (spr->mobj->skin && spr->mobj->sprite == SPR_PLAY && !md2_playermodels[(skin_t*)spr->mobj->skin-skins].notfound) // Use the player MD2 list if the mobj has a skin and is using the player sprites + if (spr->mobj->skin && spr->mobj->sprite == SPR_PLAY && !md2s[skinnum].notfound) // Use the player MD2 list if the mobj has a skin and is using the player sprites { - md2 = &md2_playermodels[(skin_t*)spr->mobj->skin-skins]; - md2->skin = (skin_t*)spr->mobj->skin-skins; + md2 = &md2s[skinnum]; + md2->skin = skinnum; sprinfo = &spriteinfo[spr->mobj->sprite]; } else @@ -1239,7 +1271,7 @@ void HWR_DrawMD2(gr_vissprite_t *spr) skinnum = TC_RAINBOW; else { - skinnum = (INT32)((skin_t*)spr->mobj->skin-skins); + skinnum = (INT32)((skin_t*)( (spr->mobj->localskin) ? spr->mobj->localskin : spr->mobj->skin ) - ( (spr->mobj->skinlocal) ? localskins : skins )); } } else skinnum = TC_DEFAULT; @@ -1306,7 +1338,7 @@ void HWR_DrawMD2(gr_vissprite_t *spr) p.z = FIXED_TO_FLOAT(interp.z); if (spr->mobj->skin && spr->mobj->sprite == SPR_PLAY) - sprdef = &((skin_t *)spr->mobj->skin)->spritedef; + sprdef = &((skin_t *)( (spr->mobj->localskin) ? spr->mobj->localskin : spr->mobj->skin ))->spritedef; else sprdef = &sprites[spr->mobj->sprite]; diff --git a/src/hardware/hw_md2.h b/src/hardware/hw_md2.h index fab8e6ad9..a6f06428e 100644 --- a/src/hardware/hw_md2.h +++ b/src/hardware/hw_md2.h @@ -37,10 +37,11 @@ typedef struct extern md2_t md2_models[NUMSPRITES]; extern md2_t md2_playermodels[MAXSKINS]; +extern md2_t md2_localplayermodels[MAXSKINS]; void HWR_InitMD2(void); void HWR_DrawMD2(gr_vissprite_t *spr); -void HWR_AddPlayerMD2(INT32 skin); +void HWR_AddPlayerMD2(INT32 skin, boolean local); void HWR_AddSpriteMD2(size_t spritenum); #endif // _HW_MD2_H_ diff --git a/src/p_enemy.c b/src/p_enemy.c index 01b1e8f56..a25999f1f 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -2608,6 +2608,7 @@ void A_MonitorPop(mobj_t *actor) remains->fuse = actor->fuse; // Transfer respawn timer remains->threshold = 68; remains->skin = NULL; + remains->localskin = NULL; P_SetTarget(&tmthing, remains); diff --git a/src/p_mobj.c b/src/p_mobj.c index 8aa726870..204532ea2 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10772,6 +10772,16 @@ void P_SpawnPlayer(INT32 playernum) // (usefulness: when body mobj is detached from player (who respawns), // the dead body mobj retains the skin through the 'spritedef' override). mobj->skin = &skins[p->skin]; + if (p->localskin > 0) + { + if (p->skinlocal) + mobj->localskin = &localskins[p->localskin - 1]; + else + mobj->localskin = & skins[p->localskin - 1]; + } + else + mobj->localskin = 0; + mobj->skinlocal = p->skinlocal; mobj->health = p->health; p->playerstate = PST_LIVE; diff --git a/src/p_mobj.h b/src/p_mobj.h index 004a437c4..67a579c11 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -327,6 +327,8 @@ typedef struct mobj_s UINT16 eflags; // extra flags void *skin; // overrides 'sprite' when non-NULL (for player bodies to 'remember' the skin) + void *localskin; + boolean skinlocal; // Player and mobj sprites in multiplayer modes are modified // using an internal color lookup table for re-indexing. UINT8 color; // This replaces MF_TRANSLATION. Use 0 for default (no translation). diff --git a/src/p_setup.c b/src/p_setup.c index f0bf34c9f..978df4066 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3433,7 +3433,7 @@ boolean P_RunSOC(const char *socfilename) lumpnum_t lump; if (strstr(socfilename, ".soc") != NULL) - return P_AddWadFile(socfilename); + return P_AddWadFile(socfilename, false); lump = W_CheckNumForName(socfilename); if (lump == LUMPERROR) @@ -3449,11 +3449,11 @@ boolean P_RunSOC(const char *socfilename) // Add a wadfile to the active wad files, // replace sounds, musics, patches, textures, sprites and maps // -boolean P_AddWadFile(const char *wadfilename) +boolean P_AddWadFile(const char *wadfilename, boolean local) { UINT16 wadnum; - if ((wadnum = P_PartialAddWadFile(wadfilename, false)) == UINT16_MAX) + if ((wadnum = P_PartialAddWadFile(wadfilename, local)) == UINT16_MAX) return false; P_MultiSetupWadFiles(true); @@ -3545,7 +3545,7 @@ UINT16 P_PartialAddWadFile(const char *wadfilename, boolean local) // // look for skins // - R_AddSkins(wadnum); // faB: wadfile index in wadfiles[] + R_AddSkins(wadnum, local); // faB: wadfile index in wadfiles[] // // edit music defs diff --git a/src/p_setup.h b/src/p_setup.h index 99269da00..728549943 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -60,7 +60,7 @@ void P_ScanThings(INT16 mapnum, INT16 wadnum, INT16 lumpnum); #endif void P_LoadThingsOnly(void); boolean P_SetupLevel(boolean skipprecip); -boolean P_AddWadFile(const char *wadfilename); +boolean P_AddWadFile(const char *wadfilename, boolean local); boolean P_AddWadFileLocal(const char *wadfilename); #ifdef DELFILE boolean P_DelWadFile(void); diff --git a/src/r_draw.c b/src/r_draw.c index a29c26a3c..88fa75e7f 100644 --- a/src/r_draw.c +++ b/src/r_draw.c @@ -18,6 +18,7 @@ #include "doomdef.h" #include "doomstat.h" #include "r_local.h" +#include "r_things.h" #include "st_stuff.h" // need ST_HEIGHT #include "i_video.h" #include "v_video.h" @@ -141,6 +142,7 @@ UINT32 nflatxshift, nflatyshift, nflatshiftup, nflatmask; #define NUM_PALETTE_ENTRIES 256 static UINT8** translationtablecache[TT_CACHE_SIZE] = {NULL}; +static UINT8** localtranslationtablecache[MAXSKINS] = {NULL}; // See also the enum skincolors_t @@ -519,29 +521,39 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U \return Colormap. If not cached, caller should Z_Free. */ -UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags) +static UINT8* RGetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags, boolean local) { + UINT8 ***tt; UINT8* ret; INT32 skintableindex; - // Adjust if we want the default colormap - if (skinnum == TC_DEFAULT) skintableindex = DEFAULT_TT_CACHE_INDEX; - else if (skinnum == TC_BOSS) skintableindex = BOSS_TT_CACHE_INDEX; - else if (skinnum == TC_METALSONIC) skintableindex = METALSONIC_TT_CACHE_INDEX; - else if (skinnum == TC_ALLWHITE) skintableindex = ALLWHITE_TT_CACHE_INDEX; - else if (skinnum == TC_RAINBOW) skintableindex = RAINBOW_TT_CACHE_INDEX; - else if (skinnum == TC_BLINK) skintableindex = BLINK_TT_CACHE_INDEX; - else skintableindex = skinnum; + if (local) + { + tt = localtranslationtablecache; + skintableindex = skinnum; + } + else + { + tt = translationtablecache; + // Adjust if we want the default colormap + if (skinnum == TC_DEFAULT) skintableindex = DEFAULT_TT_CACHE_INDEX; + else if (skinnum == TC_BOSS) skintableindex = BOSS_TT_CACHE_INDEX; + else if (skinnum == TC_METALSONIC) skintableindex = METALSONIC_TT_CACHE_INDEX; + else if (skinnum == TC_ALLWHITE) skintableindex = ALLWHITE_TT_CACHE_INDEX; + else if (skinnum == TC_RAINBOW) skintableindex = RAINBOW_TT_CACHE_INDEX; + else if (skinnum == TC_BLINK) skintableindex = BLINK_TT_CACHE_INDEX; + else skintableindex = skinnum; + } if (flags & GTC_CACHE) { // Allocate table for skin if necessary - if (!translationtablecache[skintableindex]) - translationtablecache[skintableindex] = Z_Calloc(MAXTRANSLATIONS * sizeof(UINT8**), PU_STATIC, NULL); + if (!tt[skintableindex]) + tt[skintableindex] = Z_Calloc(MAXTRANSLATIONS * sizeof(UINT8**), PU_STATIC, NULL); // Get colormap - ret = translationtablecache[skintableindex][color]; + ret = tt[skintableindex][color]; } else ret = NULL; @@ -553,12 +565,25 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags) // Cache the colormap if desired if (flags & GTC_CACHE) - translationtablecache[skintableindex][color] = ret; + tt[skintableindex][color] = ret; } return ret; } +UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags) +{ + return RGetTranslationColormap(skinnum, color, flags, false); +} + +UINT8* R_GetLocalTranslationColormap(skin_t *skin, skin_t *localskin, skincolors_t color, UINT8 flags, boolean local) +{ + if (localskin) + return RGetTranslationColormap(( localskin - ( (local) ? localskins : skins ) ), color, flags, local); + else + return RGetTranslationColormap(( skin - skins ), color, flags, false); +} + /** \brief Flushes cache of translation colormaps. Flushes cache of translation colormaps, but doesn't actually free the @@ -574,6 +599,10 @@ void R_FlushTranslationColormapCache(void) for (i = 0; i < (INT32)(sizeof(translationtablecache) / sizeof(translationtablecache[0])); i++) if (translationtablecache[i]) memset(translationtablecache[i], 0, MAXTRANSLATIONS * sizeof(UINT8**)); + + for (i = 0; i < (INT32)(sizeof(localtranslationtablecache) / sizeof(localtranslationtablecache[0])); i++) + if (localtranslationtablecache[i]) + memset(localtranslationtablecache[i], 0, MAXTRANSLATIONS * sizeof(UINT8**)); } /* diff --git a/src/r_draw.h b/src/r_draw.h index b6d72fe71..c35c95ea4 100644 --- a/src/r_draw.h +++ b/src/r_draw.h @@ -15,6 +15,7 @@ #define __R_DRAW__ #include "r_defs.h" +#include "r_things.h" // ------------------------------- // COMMON STUFF FOR 8bpp AND 16bpp @@ -115,6 +116,7 @@ extern lumpnum_t viewborderlump[8]; // Initialize color translation tables, for player rendering etc. void R_InitTranslationTables(void); UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags); +UINT8* R_GetLocalTranslationColormap(skin_t *skin, skin_t *localskin, skincolors_t color, UINT8 flags, boolean local); void R_FlushTranslationColormapCache(void); UINT8 R_GetColorByName(const char *name); diff --git a/src/r_things.c b/src/r_things.c index 26dad2f0b..0a2644c06 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -643,7 +643,7 @@ void R_InitSprites(void) // it can be is do before loading config for skin cvar possible value R_InitSkins(); for (i = 0; i < numwadfiles; i++) - R_AddSkins((UINT16)i); + R_AddSkins((UINT16)i, false); // // check if all sprites have frames @@ -872,10 +872,7 @@ static void R_DrawVisSprite(vissprite_t *vis) if (vis->mobj->colorized) dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE); else if (vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // MT_GHOST LOOKS LIKE A PLAYER SO USE THE PLAYER TRANSLATION TABLES. >_> - { - size_t skinnum = (skin_t*)vis->mobj->skin-skins; - dc_translation = R_GetTranslationColormap((INT32)skinnum, vis->mobj->color, GTC_CACHE); - } + dc_translation = R_GetLocalTranslationColormap(vis->mobj->skin, vis->mobj->localskin, vis->mobj->color, GTC_CACHE, vis->mobj->skinlocal); else // Use the defaults dc_translation = R_GetTranslationColormap(TC_DEFAULT, vis->mobj->color, GTC_CACHE); } @@ -893,10 +890,7 @@ static void R_DrawVisSprite(vissprite_t *vis) if (vis->mobj->colorized) dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE); else if (vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // This thing is a player! - { - size_t skinnum = (skin_t*)vis->mobj->skin-skins; - dc_translation = R_GetTranslationColormap((INT32)skinnum, vis->mobj->color, GTC_CACHE); - } + dc_translation = R_GetLocalTranslationColormap(vis->mobj->skin, vis->mobj->localskin, vis->mobj->color, GTC_CACHE, vis->mobj->skinlocal); else // Use the defaults dc_translation = R_GetTranslationColormap(TC_DEFAULT, vis->mobj->color, GTC_CACHE); } @@ -925,7 +919,9 @@ static void R_DrawVisSprite(vissprite_t *vis) frac = vis->startfrac; windowtop = windowbottom = sprbotscreen = INT32_MAX; - if (vis->mobj->skin && ((skin_t *)vis->mobj->skin)->flags & SF_HIRES) + if (vis->mobj->localskin && ((skin_t *)vis->mobj->localskin)->flags & SF_HIRES) + this_scale = FixedMul(this_scale, ((skin_t *)vis->mobj->localskin)->highresscale); + else if (vis->mobj->skin && ((skin_t *)vis->mobj->skin)->flags & SF_HIRES) this_scale = FixedMul(this_scale, ((skin_t *)vis->mobj->skin)->highresscale); if (this_scale <= 0) this_scale = 1; @@ -1274,7 +1270,7 @@ static void R_ProjectSprite(mobj_t *thing) //Fab : 02-08-98: 'skin' override spritedef currently used for skin if (thing->skin && thing->sprite == SPR_PLAY) { - sprdef = &((skin_t *)thing->skin)->spritedef; + sprdef = &((skin_t *)( (thing->localskin) ? thing->localskin : thing->skin ))->spritedef; #ifdef ROTSPRITE sprinfo = &spriteinfo[thing->sprite]; #endif @@ -1348,7 +1344,9 @@ static void R_ProjectSprite(mobj_t *thing) I_Assert(lump < max_spritelumps); - if (thing->skin && ((skin_t *)thing->skin)->flags & SF_HIRES) + if (thing->localskin && ((skin_t *)thing->localskin)->flags & SF_HIRES) + this_scale = FixedMul(this_scale, ((skin_t *)thing->localskin)->highresscale); + else if (thing->skin && ((skin_t *)thing->skin)->flags & SF_HIRES) this_scale = FixedMul(this_scale, ((skin_t *)thing->skin)->highresscale); spr_width = spritecachedinfo[lump].width; @@ -2784,6 +2782,7 @@ void R_DrawMasked(void) // ========================================================================== INT32 numskins = 0; +INT32 numlocalskins = 0; skin_t skins[MAXSKINS]; UINT8 skinstats[9][9][MAXSKINS]; UINT8 skinstatscount[9][9] = { @@ -2798,13 +2797,15 @@ UINT8 skinstatscount[9][9] = { {0, 0, 0, 0, 0, 0, 0, 0, 0} }; UINT8 skinsorted[MAXSKINS]; +skin_t localskins[MAXSKINS]; // FIXTHIS: don't work because it must be inistilised before the config load //#define SKINVALUES #ifdef SKINVALUES CV_PossibleValue_t skin_cons_t[MAXSKINS+1]; +CV_PossibleValue_t localskin_cons_t[MAXSKINS+1]; #endif -static void Sk_SetDefaultValue(skin_t *skin) +static void Sk_SetDefaultValue(skin_t *skin, boolean local) { INT32 i; // @@ -2812,7 +2813,7 @@ static void Sk_SetDefaultValue(skin_t *skin) // memset(skin, 0, sizeof (skin_t)); snprintf(skin->name, - sizeof skin->name, "skin %u", (UINT32)(skin-skins)); + sizeof skin->name, "skin %u", (UINT32)(skin-( (local) ? localskins : skins ))); skin->name[sizeof skin->name - 1] = '\0'; skin->wadnum = INT16_MAX; strcpy(skin->sprite, ""); @@ -2853,13 +2854,15 @@ void R_InitSkins(void) { skin_cons_t[i].value = 0; skin_cons_t[i].strvalue = NULL; + localskin_cons_t[i].value = 0; + localskin_cons_t[i].strvalue = NULL; } #endif // skin[0] = Sonic skin skin = &skins[0]; numskins = 1; - Sk_SetDefaultValue(skin); + Sk_SetDefaultValue(skin, false); memset(skinstats, 0, sizeof(skinstats)); memset(skinsorted, 0, sizeof(skinsorted)); @@ -2893,7 +2896,7 @@ void R_InitSkins(void) //MD2 for sonic doesn't want to load in Linux. #ifdef HWRENDER if (rendermode == render_opengl) - HWR_AddPlayerMD2(0); + HWR_AddPlayerMD2(0, false); #endif } @@ -2911,6 +2914,23 @@ INT32 R_SkinAvailable(const char *name) return -1; } +INT32 R_LocalSkinAvailable(const char *name, boolean local) +{ + INT32 i; + + if (local) + { + for (i = 0; i < numlocalskins; i++) + { + if (stricmp(localskins[i].name,name)==0) + return i; + } + return -1; + } + else + return R_SkinAvailable(name); +} + // network code calls this when a 'skin change' is received boolean SetPlayerSkin(INT32 playernum, const char *skinname) { @@ -2936,6 +2956,61 @@ boolean SetPlayerSkin(INT32 playernum, const char *skinname) return false; } +void SetLocalPlayerSkin(INT32 playernum, const char *skinname, consvar_t *cvar) +{ + player_t *player = &players[playernum]; + INT32 i; + + if (strcasecmp(skinname, "none")) + { + for (i = 0; i < numlocalskins; i++) + { + // search in the skin list + if (stricmp(localskins[i].name, skinname) == 0) + { + player->localskin = 1 + i; + player->skinlocal = true; + if (player->mo) + { + player->mo->localskin = &localskins[i]; + player->mo->skinlocal = true; + } + break; + } + } + for (i = 0; i < numskins; i++) + { + // search in the skin list + if (stricmp(skins[i].name, skinname) == 0) + { + player->localskin = 1 + i; + player->skinlocal = false; + if (player->mo) + { + player->mo->localskin = &skins[i]; + player->mo->skinlocal = false; + } + break; + } + } + } + else + { + player->localskin = 0; + player->skinlocal = false; + if (player->mo) + { + player->mo->localskin = 0; + player->mo->skinlocal = false; + } + } + + if (player->localskin > 0) + CV_StealthSet(cvar, ( (player->skinlocal) ? localskins : skins )[player->localskin - 1].name); + else + CV_StealthSet(cvar, "none"); +} + // Same as SetPlayerSkin, but uses the skin #. // network code calls this when a 'skin change' is received void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum) @@ -3120,7 +3195,7 @@ void sortSkinGrid(void) // // Find skin sprites, sounds & optional status bar face, & add them // -void R_AddSkins(UINT16 wadnum) +void R_AddSkins(UINT16 wadnum, boolean local) { UINT16 lump, lastlump = 0; char *buf; @@ -3140,7 +3215,7 @@ void R_AddSkins(UINT16 wadnum) // advance by default lastlump = lump + 1; - if (numskins >= MAXSKINS) + if (( (local) ? numlocalskins : numskins ) >= MAXSKINS) { CONS_Alert(CONS_WARNING, M_GetText("Unable to add skin, too many characters are loaded (%d maximum)\n"), MAXSKINS); continue; // so we know how many skins couldn't be added @@ -3156,8 +3231,8 @@ void R_AddSkins(UINT16 wadnum) buf2[size] = '\0'; // set defaults - skin = &skins[numskins]; - Sk_SetDefaultValue(skin); + skin = &( (local) ? localskins : skins )[( (local) ? numlocalskins : numskins )]; + Sk_SetDefaultValue(skin, local); skin->wadnum = wadnum; hudname = realname = false; // parse @@ -3181,7 +3256,7 @@ void R_AddSkins(UINT16 wadnum) // the skin name must uniquely identify a single skin // I'm lazy so if name is already used I leave the 'skin x' // default skin name set in Sk_SetDefaultValue - if (R_SkinAvailable(value) == -1) + if (R_LocalSkinAvailable(value, local) == -1) { STRBUFCPY(skin->name, value); strlwr(skin->name); @@ -3191,12 +3266,12 @@ void R_AddSkins(UINT16 wadnum) else { const size_t stringspace = - strlen(value) + sizeof (numskins) + 1; + strlen(value) + sizeof (( (local) ? numlocalskins : numskins )) + 1; char *value2 = Z_Malloc(stringspace, PU_STATIC, NULL); snprintf(value2, stringspace, - "%s%d", value, numskins); + "%s%d", value, ( (local) ? numlocalskins : numskins )); value2[stringspace - 1] = '\0'; - if (R_SkinAvailable(value2) == -1) + if (R_LocalSkinAvailable(value2, local) == -1) { STRBUFCPY(skin->name, value2); @@ -3379,20 +3454,23 @@ next_token: CONS_Printf(M_GetText("Added skin '%s'\n"), skin->name); #ifdef SKINVALUES - skin_cons_t[numskins].value = numskins; - skin_cons_t[numskins].strvalue = skin->name; + ( (local) ? localskin_cons_t : skin_cons_t )[( (local) ? numlocalskins : numskins )].value = ( (local) ? numlocalskins : numskins ); + ( (local) ? localskin_cons_t : skin_cons_t )[( (local) ? numlocalskins : numskins )].strvalue = skin->name; #endif // Update the forceskin possiblevalues - Forceskin_cons_t[numskins+1].value = numskins; - Forceskin_cons_t[numskins+1].strvalue = skins[numskins].name; + if (! local) + { + Forceskin_cons_t[numskins+1].value = numskins; + Forceskin_cons_t[numskins+1].strvalue = skins[numskins].name; + } // add face graphics - ST_LoadFaceGraphics(skin->facerank, skin->facewant, skin->facemmap, numskins); + ST_LoadLocalFaceGraphics(skin->facerank, skin->facewant, skin->facemmap, numskins, local); #ifdef HWRENDER if (rendermode == render_opengl) - HWR_AddPlayerMD2(numskins); + HWR_AddPlayerMD2(( (local) ? numlocalskins : numskins ), local); #endif skinstats[skin->kartspeed-1][skin->kartweight-1][skinstatscount[skin->kartspeed-1][skin->kartweight-1]] = numskins; CONS_Debug(DBG_SETUP, M_GetText("Added %d to %d, %d\n"), numskins, skin->kartweight, skin->kartweight); @@ -3401,7 +3479,7 @@ next_token: skinsorted[numskins] = numskins; - numskins++; + ( (local) ? numlocalskins++ : numskins++ ); } sortSkinGrid(); diff --git a/src/r_things.h b/src/r_things.h index ab4688f91..5d7076f10 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -201,17 +201,21 @@ typedef struct drawnode_s } drawnode_t; extern INT32 numskins; +extern INT32 numlocalskins; extern skin_t skins[MAXSKINS]; extern UINT8 skinstats[9][9][MAXSKINS]; extern UINT8 skinstatscount[9][9]; extern UINT8 skinsorted[MAXSKINS]; void sortSkinGrid(void); +extern skin_t localskins[MAXSKINS]; boolean SetPlayerSkin(INT32 playernum,const char *skinname); void SetPlayerSkinByNum(INT32 playernum,INT32 skinnum); // Tails 03-16-2002 +void SetLocalPlayerSkin(INT32 playernum,const char *skinname, consvar_t *cvar); INT32 R_SkinAvailable(const char *name); -void R_AddSkins(UINT16 wadnum); +INT32 R_LocalSkinAvailable(const char *name, boolean local); +void R_AddSkins(UINT16 wadnum, boolean local); #ifdef DELFILE void R_DelSkins(UINT16 wadnum); diff --git a/src/st_stuff.c b/src/st_stuff.c index 966a0c9c6..949ff4bac 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -58,6 +58,10 @@ patch_t *facerankprefix[MAXSKINS]; // ranking patch_t *facewantprefix[MAXSKINS]; // wanted patch_t *facemmapprefix[MAXSKINS]; // minimap +patch_t *localfacerankprefix[MAXSKINS]; // ranking +patch_t *localfacewantprefix[MAXSKINS]; // wanted +patch_t *localfacemmapprefix[MAXSKINS]; // minimap + // ------------------------------------------ // status bar overlay // ------------------------------------------ @@ -380,12 +384,27 @@ void ST_LoadFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 skin facemmapprefix[skinnum] = W_CachePatchName(mmapstr, PU_HUDGFX); } +void ST_LoadLocalFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 skinnum, boolean local) +{ + if (local) + { + localfacerankprefix[skinnum] = W_CachePatchName(rankstr, PU_HUDGFX); + localfacewantprefix[skinnum] = W_CachePatchName(wantstr, PU_HUDGFX); + localfacemmapprefix[skinnum] = W_CachePatchName(mmapstr, PU_HUDGFX); + } + else + ST_LoadFaceGraphics(rankstr, wantstr, mmapstr, skinnum); +} + void ST_ReloadSkinFaceGraphics(void) { INT32 i; for (i = 0; i < numskins; i++) ST_LoadFaceGraphics(skins[i].facerank, skins[i].facewant, skins[i].facemmap, i); + + for (i = 0; i < numlocalskins; i++) + ST_LoadLocalFaceGraphics(skins[i].facerank, skins[i].facewant, skins[i].facemmap, i, true); } static inline void ST_InitData(void) diff --git a/src/st_stuff.h b/src/st_stuff.h index 0f8722720..1478655ca 100644 --- a/src/st_stuff.h +++ b/src/st_stuff.h @@ -51,6 +51,7 @@ void ST_LoadGraphics(void); // face load graphics, called when skin changes void ST_LoadFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 playernum); +void ST_LoadLocalFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 playernum, boolean local); void ST_ReloadSkinFaceGraphics(void); #ifdef DELFILE void ST_UnLoadFaceGraphics(INT32 skinnum); -- 2.54.0 From 6e55d8881614638877d5ed89b488876bcf8292c9 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 17:02:05 +0200 Subject: [PATCH 02/26] more shit https://git.do.srb2.org/haya_/Kart-Public/-/commit/28fa3039c147d7b479b8d4ddfca50918c620aa2f --- src/k_kart.c | 4 ++-- src/k_kart.h | 2 +- src/r_draw.c | 2 +- src/r_things.c | 2 +- src/st_stuff.h | 3 +++ 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 36bb9a57a..9eb3defe5 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -504,7 +504,7 @@ void K_RainbowColormap(UINT8 *dest_colormap, UINT8 skincolor) \return void */ -void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color) +void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color, boolean local) { INT32 i; INT32 starttranscolor; @@ -540,7 +540,7 @@ void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color) return; } - starttranscolor = (skinnum != TC_DEFAULT) ? skins[skinnum].starttranscolor : DEFAULT_STARTTRANSCOLOR; + starttranscolor = (skinnum != TC_DEFAULT) ? ( (local) ? localskins : skins )[skinnum].starttranscolor : DEFAULT_STARTTRANSCOLOR; // Fill in the entries of the palette that are fixed for (i = 0; i < starttranscolor; i++) diff --git a/src/k_kart.h b/src/k_kart.h index b664f9c33..a7dc591f8 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -15,7 +15,7 @@ extern UINT8 colortranslations[MAXTRANSLATIONS][16]; extern const char *KartColor_Names[MAXSKINCOLORS]; extern const UINT8 KartColor_Opposite[MAXSKINCOLORS*2]; void K_RainbowColormap(UINT8 *dest_colormap, UINT8 skincolor); -void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color); +void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color, boolean local); UINT8 K_GetKartColorByName(const char *name); void K_RegisterKartStuff(void); diff --git a/src/r_draw.c b/src/r_draw.c index 88fa75e7f..536b478b9 100644 --- a/src/r_draw.c +++ b/src/r_draw.c @@ -561,7 +561,7 @@ static UINT8* RGetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 f if (!ret) { ret = Z_MallocAlign(NUM_PALETTE_ENTRIES, (flags & GTC_CACHE) ? PU_LEVEL : PU_STATIC, NULL, 8); - K_GenerateKartColormap(ret, skinnum, color); //R_GenerateTranslationColormap(ret, skinnum, color); // SRB2kart + K_GenerateKartColormap(ret, skinnum, color, local); //R_GenerateTranslationColormap(ret, skinnum, color); // SRB2kart // Cache the colormap if desired if (flags & GTC_CACHE) diff --git a/src/r_things.c b/src/r_things.c index 0a2644c06..1eca172a7 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -3466,7 +3466,7 @@ next_token: } // add face graphics - ST_LoadLocalFaceGraphics(skin->facerank, skin->facewant, skin->facemmap, numskins, local); + ST_LoadLocalFaceGraphics(skin->facerank, skin->facewant, skin->facemmap, ( (local) ? numlocalskins : numskins ), local); #ifdef HWRENDER if (rendermode == render_opengl) diff --git a/src/st_stuff.h b/src/st_stuff.h index 1478655ca..5b3f611d9 100644 --- a/src/st_stuff.h +++ b/src/st_stuff.h @@ -79,6 +79,9 @@ extern patch_t *sboperiod; extern patch_t *facerankprefix[MAXSKINS]; // ranking extern patch_t *facewantprefix[MAXSKINS]; // wanted extern patch_t *facemmapprefix[MAXSKINS]; // minimap +extern patch_t *localfacerankprefix[MAXSKINS]; // ranking +extern patch_t *localfacewantprefix[MAXSKINS]; // wanted +extern patch_t *localfacemmapprefix[MAXSKINS]; // minimap extern patch_t *livesback; extern patch_t *ngradeletters[7]; -- 2.54.0 From bc7ce5c983efe34d610e4628f25df8c201e8cbaf Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 17:04:40 +0200 Subject: [PATCH 03/26] "immersion" https://git.do.srb2.org/haya_/Kart-Public/-/commit/4547347e219158c1d11a6f373c9c94a7bd2ee789 --- src/k_kart.c | 26 ++++++++++++++++++-------- src/s_sound.c | 2 +- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9eb3defe5..5fc7a1bd0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8090,7 +8090,11 @@ static boolean K_drawKartPositionFaces(void) else colormap = R_GetTranslationColormap(players[rankplayer[i]].skin, players[rankplayer[i]].mo->color, GTC_CACHE); - V_DrawMappedPatch(FACE_X, Y, V_HUDTRANS|V_SNAPTOLEFT, facerankprefix[players[rankplayer[i]].skin], colormap); + { + player_t *p; + p = &players[rankplayer[i]]; + V_DrawMappedPatch(FACE_X, Y, V_HUDTRANS|V_SNAPTOLEFT, ( (p->skinlocal) ? localfacerankprefix : facerankprefix )[( (p->localskin) ? p->localskin-1 : p->skin )], colormap); + } #ifdef HAVE_BLUA if (LUA_HudEnabled(hud_battlebumpers)) @@ -8176,7 +8180,11 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I else colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo->color, GTC_CACHE); - V_DrawMappedPatch(x, y-4, 0, facerankprefix[players[tab[i].num].skin], colormap); + { + player_t *p; + p = &players[tab[i].num]; + V_DrawMappedPatch(x, y-4, 0, ( (p->skinlocal) ? localfacerankprefix : facerankprefix )[( (p->localskin) ? p->localskin-1 : p->skin )], colormap); + } /*if (G_BattleGametype() && players[tab[i].num].kartstuff[k_bumper] > 0) -- not enough space for this { INT32 bumperx = x+19; @@ -8523,7 +8531,7 @@ static void K_drawKartWanted(void) if (players[battlewanted[i]].skincolor) { colormap = R_GetTranslationColormap(TC_RAINBOW, p->skincolor, GTC_CACHE); - V_DrawFixedPatch(x<skin] : facerankprefix[p->skin]), colormap); + V_DrawFixedPatch(x<skinlocal) ? localfacewantprefix : facewantprefix )[( (p->localskin) ? p->localskin-1 : p->skin )] : ( (p->skinlocal) ? localfacerankprefix : facerankprefix )[( (p->localskin) ? p->localskin-1 : p->skin )]), colormap); /*if (basey2) // again with 4p stuff V_DrawFixedPatch(x<skin] : facerankprefix[p->skin]), colormap);*/ } @@ -8590,6 +8598,7 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, pat // it, they wouldn't 'spawn' on the top-right side of the HUD. UINT8 skin = 0; + boolean skinlocal = mo->skinlocal; fixed_t amnumxpos, amnumypos; INT32 amxpos, amypos; @@ -8602,7 +8611,7 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, pat fixed_t xscale, yscale, zoom; if (mo->skin) - skin = ((skin_t*)mo->skin)-skins; + skin = ((skin_t*)( (mo->localskin) ? mo->localskin : mo->skin ))-( (skinlocal) ? localskins : skins ); maxx = maxy = INT32_MAX; minx = miny = INT32_MIN; @@ -8646,11 +8655,11 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, pat if (encoremode) amnumxpos = -amnumxpos; - amxpos = amnumxpos + ((x + AutomapPic->width/2 - (facemmapprefix[skin]->width/2))<height/2 - (facemmapprefix[skin]->height/2))<width/2 - (( (skinlocal) ? localfacemmapprefix : facemmapprefix )[skin]->width/2))<height/2 - (( (skinlocal) ? localfacemmapprefix : facemmapprefix )[skin]->height/2))<color) // 'default' color - V_DrawSciencePatch(amxpos, amypos, flags, facemmapprefix[skin], FRACUNIT); + V_DrawSciencePatch(amxpos, amypos, flags, ( (skinlocal) ? localfacemmapprefix : facemmapprefix )[skin], FRACUNIT); else { UINT8 *colormap = R_GetTranslationColormap((mo->colorized) ? TC_RAINBOW : skin, mo->color, GTC_CACHE); @@ -8658,7 +8667,8 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, pat if (cv_minihead.value == 1) V_DrawFixedPatch(amxpos + (2 * FRACUNIT), amypos + (2 * FRACUNIT), FRACUNIT/2, flags, facemmapprefix[skin], colormap); else if (cv_minihead.value == 0) - V_DrawFixedPatch(amxpos, amypos, FRACUNIT, flags, facemmapprefix[skin], colormap); + colormap = R_GetLocalTranslationColormap(mo->skin, mo->localskin, mo->color, GTC_CACHE, skinlocal); + V_DrawFixedPatch(amxpos, amypos, FRACUNIT, flags, ( (skinlocal) ? localfacemmapprefix : facemmapprefix )[skin], colormap); if (cv_showminimapnames.value && !(modeattacking || gamestate == GS_TIMEATTACK)) { diff --git a/src/s_sound.c b/src/s_sound.c index 977d3be55..9afea7bf5 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -578,7 +578,7 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) if (sfx->skinsound != -1 && origin && origin->skin) { // redirect player sound to the sound in the skin table - sfx_id = ((skin_t *)origin->skin)->soundsid[sfx->skinsound]; + sfx_id = ((skin_t *)( (origin->localskin) ? origin->localskin : origin->skin ))->soundsid[sfx->skinsound]; sfx = &S_sfx[sfx_id]; } -- 2.54.0 From 7ab0a808a9db885f9dad11a589f82c27447be1b0 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 17:05:21 +0200 Subject: [PATCH 04/26] Show which skin is the real one --- src/m_menu.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/m_menu.c b/src/m_menu.c index 3c67d86ce..7bcde32f5 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -10452,6 +10452,13 @@ static void M_DrawSetupMultiPlayerMenu(void) // draw box around guy V_DrawFill(mx + 43 - (charw/2), my+65, charw, 84, 239); + + if (setupm_skinlocal) + { + UINT8 *colmap; + colmap = R_GetTranslationColormap(setupm_fakeskin, setupm_fakecolor, GTC_MENUCACHE); + V_DrawFixedPatch(( mx + 43 - (charw/2) + 1 )< Date: Wed, 30 Aug 2023 17:08:50 +0200 Subject: [PATCH 05/26] Ghost and signpost support https://git.do.srb2.org/haya_/Kart-Public/-/commit/f07179589414b15605da14901f742342ab53de66 --- src/p_user.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 700671ef6..5130c8f55 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1696,6 +1696,8 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) ghost->fuse = ghost->info->damage; ghost->skin = mobj->skin; + ghost->localskin = mobj->localskin; + ghost->skinlocal = mobj->skinlocal; if (mobj->flags2 & MF2_OBJECTFLIP) ghost->flags |= MF2_OBJECTFLIP; @@ -1737,10 +1739,19 @@ void P_DoPlayerExit(player_t *player) if (P_IsLocalPlayer(player)) { sfxenum_t sfx_id; - if (K_IsPlayerLosing(player)) - sfx_id = ((skin_t *)player->mo->skin)->soundsid[S_sfx[sfx_klose].skinsound]; - else - sfx_id = ((skin_t *)player->mo->skin)->soundsid[S_sfx[sfx_kwin].skinsound]; + // fix godjjsa win sounds + if (K_IsPlayerLosing(player)) { + if (player->mo->skinlocal) + sfx_id = ((skin_t *)player->mo->localskin)->soundsid[S_sfx[sfx_klose].skinsound]; + else + sfx_id = ((skin_t *)player->mo->skin)->soundsid[S_sfx[sfx_klose].skinsound]; + } + else { + if (player->mo->skinlocal) + sfx_id = ((skin_t *)player->mo->localskin)->soundsid[S_sfx[sfx_kwin].skinsound]; + else + sfx_id = ((skin_t *)player->mo->skin)->soundsid[S_sfx[sfx_kwin].skinsound]; + } S_StartSound(NULL, sfx_id); } else -- 2.54.0 From 65fadcf7094c44f34ce3a9243da428169aa5eb80 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 17:09:40 +0200 Subject: [PATCH 06/26] fix https://git.do.srb2.org/haya_/Kart-Public/-/commit/b6b3dcb3f08b470d6075c2949b2dee364afb5c99 --- src/p_enemy.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/p_enemy.c b/src/p_enemy.c index a25999f1f..1812ede5d 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -4168,6 +4168,12 @@ void A_SignPlayer(mobj_t *actor) P_SetTarget(&ov->target, actor); ov->color = actor->target->player->skincolor; ov->skin = &skins[actor->target->player->skin]; + if (actor->target->skinlocal) { + // needs - 1 or else it pukes an error out + // same thing happens on p_mobj.c + ov->localskin = &localskins[actor->target->player->localskin - 1]; + ov->skinlocal = actor->target->skinlocal; + } P_SetMobjState(ov, actor->info->seestate); // S_PLAY_SIGN } -- 2.54.0 From c011d09e33ce76854e69c2122eadc9695ecf4610 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 17:11:38 +0200 Subject: [PATCH 07/26] fix for localskins not properly saving when returning back into the titlescreen https://git.do.srb2.org/haya_/Kart-Public/-/commit/e679dfe0aa059cca68bc67da5a45c12c26dfd9ac --- src/p_setup.c | 2 +- src/w_wad.c | 15 +++++++++------ src/w_wad.h | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 978df4066..f47417b04 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3483,7 +3483,7 @@ UINT16 P_PartialAddWadFile(const char *wadfilename, boolean local) boolean mapsadded = false; lumpinfo_t *lumpinfo; - if ((numlumps = W_InitFile(wadfilename, local)) == INT16_MAX) + if ((numlumps = W_InitFile(wadfilename, 0, &wadnum, local)) == INT16_MAX) { refreshdirmenu |= REFRESHDIR_NOTLOADED; CONS_Printf(M_GetText("Errors occurred while loading %s; not added.\n"), wadfilename); diff --git a/src/w_wad.c b/src/w_wad.c index 31977bea8..630947fad 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -690,7 +690,7 @@ static void W_ReadFileShaders(wadfile_t *wadfile) // // Can now load dehacked files (.soc) // -UINT16 W_InitFile(const char *filename, boolean local) +UINT16 W_InitFile(const char *filename, const char *lumpname, UINT16 *wadnump, boolean local) { FILE *handle; lumpinfo_t *lumpinfo = NULL; @@ -743,10 +743,13 @@ UINT16 W_InitFile(const char *filename, boolean local) { if (!memcmp(wadfiles[i]->md5sum, md5sum, 16)) { - CONS_Alert(CONS_ERROR, M_GetText("%s is already loaded\n"), filename); - if (handle) - fclose(handle); - return INT16_MAX; + if (!local) { + CONS_Alert(CONS_ERROR, M_GetText("%s is already loaded\n"), filename); + if (handle) + fclose(handle); + return INT16_MAX; + } + CONS_Alert(CONS_WARNING, M_GetText("%s is a local skin that is already loaded\n"), filename); } } #endif @@ -898,7 +901,7 @@ INT32 W_InitMultipleFiles(char **filenames, boolean addons) G_SetGameModified(true, false); //CONS_Debug(DBG_SETUP, "Loading %s\n", *filenames); - rc = W_InitFile(*filenames, false); + rc = W_InitFile(*filenames, 0, 0, false); if (rc == INT16_MAX) CONS_Printf(M_GetText("Errors occurred while loading %s; not added.\n"), *filenames); overallrc &= (rc != INT16_MAX) ? 1 : 0; diff --git a/src/w_wad.h b/src/w_wad.h index 1c6e86c49..32c843580 100644 --- a/src/w_wad.h +++ b/src/w_wad.h @@ -132,7 +132,7 @@ FILE *W_OpenWadFile(const char **filename, boolean useerrors); // // if local is true, it wouldn't check if file adds complex things, therefore // allowing to still join server without the "you have wrong addons loaded" error -UINT16 W_InitFile(const char *filename, boolean local); +UINT16 W_InitFile(const char *filename, const char *lumpname, UINT16 *wadnump, boolean local); #ifdef DELFILE void W_UnloadWadFile(UINT16 num); #endif -- 2.54.0 From 46c7bf8b031a0498affdcc5a5115b0aa6ee15720 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 17:24:50 +0200 Subject: [PATCH 08/26] fix shit https://git.do.srb2.org/haya_/Kart-Public/-/commit/e4ba8b9a753fe741f1e5a65490ae0d2d645baa97 --- src/d_netcmd.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++--- src/k_kart.c | 2 +- src/m_menu.c | 22 +++++++++++++-- src/r_things.c | 8 ++++-- src/st_stuff.c | 19 +++++++------ src/st_stuff.h | 2 +- 6 files changed, 105 insertions(+), 20 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 007d62949..41287dcbb 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -146,6 +146,10 @@ static void Command_SetViews_f(void); static void Command_Addfilelocal(void); static void Command_Addfile(void); static void Command_Addskins(void); +static void Command_Localskin1(void); +static void Command_Localskin2(void); +static void Command_Localskin3(void); +static void Command_Localskin4(void); static void Command_ListWADS_f(void); #ifdef DELFILE static void Command_Delfile(void); @@ -295,10 +299,10 @@ consvar_t cv_skin2 = {"skin2", DEFAULTSKIN2, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Sk consvar_t cv_skin3 = {"skin3", DEFAULTSKIN3, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin3_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_skin4 = {"skin4", DEFAULTSKIN4, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin4_OnChange, 0, NULL, NULL, 0, 0, NULL}; // haha I've beaten you now, ONLINE -consvar_t cv_localskin = {"localskin", "none", CV_CALL|CV_NOINIT, NULL, Localskin_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_localskin2 = {"localskin2", "none", CV_CALL|CV_NOINIT, NULL, Localskin2_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_localskin3 = {"localskin3", "none", CV_CALL|CV_NOINIT, NULL, Localskin3_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_localskin4 = {"localskin4", "none", CV_CALL|CV_NOINIT, NULL, Localskin4_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_localskin = {"internal___localskin", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_localskin2 = {"internal___localskin2", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_localskin3 = {"internal___localskin3", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_localskin4 = {"internal___localskin4", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_skipmapcheck = {"skipmapcheck", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -654,6 +658,10 @@ void D_RegisterServerCommands(void) COM_AddCommand("addfilelocal", Command_Addfilelocal); COM_AddCommand("addfile", Command_Addfile); COM_AddCommand("addskins", Command_Addskins); + COM_AddCommand("localskin", Command_Localskin1); + COM_AddCommand("localskin2", Command_Localskin2); + COM_AddCommand("localskin3", Command_Localskin3); + COM_AddCommand("localskin4", Command_Localskin4); COM_AddCommand("listwad", Command_ListWADS_f); #ifdef DELFILE @@ -4642,6 +4650,62 @@ Command_Addskins (void) P_AddWadFile(COM_Argv(1), true); } +static void Command_Localskin1 (void) { + if (!Playing() && !demo.playback) + { + CONS_Printf("You can only use this command in gameplay.\n"); + return; + } + if (COM_Argc() != 2) + { + CONS_Printf("localskin : Set a localskin.\n"); + return; + } + SetLocalPlayerSkin(consoleplayer, COM_Argv(1), &cv_localskin); +} + +static void Command_Localskin2 (void) { + if (!Playing() && !demo.playback) + { + CONS_Printf("You can only use this command in gameplay.\n"); + return; + } + if (COM_Argc() != 2) + { + CONS_Printf("localskin2 : Set a localskin.\n"); + return; + } + SetLocalPlayerSkin(displayplayers[1], COM_Argv(1), &cv_localskin2); +} + +static void Command_Localskin3 (void) { + if (!Playing() && !demo.playback) + { + CONS_Printf("You can only use this command in gameplay.\n"); + return; + } + if (COM_Argc() != 2) + { + CONS_Printf("localskin3 : Set a localskin.\n"); + return; + } + SetLocalPlayerSkin(displayplayers[2], COM_Argv(1), &cv_localskin3); +} + +static void Command_Localskin4 (void) { + if (!Playing() && !demo.playback) + { + CONS_Printf("You can only use this command in gameplay.\n"); + return; + } + if (COM_Argc() != 2) + { + CONS_Printf("localskin4 : Set a localskin.\n"); + return; + } + SetLocalPlayerSkin(displayplayers[3], COM_Argv(1), &cv_localskin4); +} + #ifdef DELFILE /** removes the last added pwad at runtime. * Searches for sounds, maps, music and images to remove diff --git a/src/k_kart.c b/src/k_kart.c index 5fc7a1bd0..a2c2699d6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8598,7 +8598,7 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, pat // it, they wouldn't 'spawn' on the top-right side of the HUD. UINT8 skin = 0; - boolean skinlocal = mo->skinlocal; + boolean skinlocal = mo->player->localskin > 0; fixed_t amnumxpos, amnumypos; INT32 amxpos, amypos; diff --git a/src/m_menu.c b/src/m_menu.c index 7bcde32f5..a4941bdb2 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3571,7 +3571,7 @@ void M_StartControlPanel(void) else // multiplayer { MPauseMenu[mpause_switchmap].status = IT_DISABLED; - MPauseMenu[mpause_addons].status = IT_DISABLED; + //MPauseMenu[mpause_addons].status = IT_DISABLED; MPauseMenu[mpause_scramble].status = IT_DISABLED; MPauseMenu[mpause_psetupsplit].status = IT_DISABLED; MPauseMenu[mpause_psetupsplit2].status = IT_DISABLED; @@ -5499,6 +5499,14 @@ static boolean M_ChangeStringAddons(INT32 choice) } #undef len +// i hate myself +static boolean DumbStartsWith(const char *pre, const char *str) +{ + size_t lenpre = strlen(pre), + lenstr = strlen(str); + return lenstr < lenpre ? false : memcmp(pre, str, lenpre) == 0; +} + static void M_HandleAddons(INT32 choice) { boolean exitmenu = false; // exit to previous menu @@ -5617,7 +5625,17 @@ static void M_HandleAddons(INT32 choice) case EXT_KART: #endif case EXT_PK3: - COM_BufAddText(va("addfile \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); + if (netgame || multiplayer) { + // no characters? + if (DumbStartsWith("KC_", dirmenu[dir_on[menudepthleft]]+DIR_STRING)) { + M_StartMessage(va("%c%s\x80\nYou are loading a local skin.\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),NULL,MM_NOTHING); + COM_BufAddText(va("addskins \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); + } + else + S_StartSound(NULL, sfx_s26d); + } + else + COM_BufAddText(va("addfile \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); break; default: S_StartSound(NULL, sfx_s26d); diff --git a/src/r_things.c b/src/r_things.c index 1eca172a7..adf602251 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -3459,14 +3459,18 @@ next_token: #endif // Update the forceskin possiblevalues - if (! local) + if (!local) { Forceskin_cons_t[numskins+1].value = numskins; Forceskin_cons_t[numskins+1].strvalue = skins[numskins].name; } // add face graphics - ST_LoadLocalFaceGraphics(skin->facerank, skin->facewant, skin->facemmap, ( (local) ? numlocalskins : numskins ), local); + if (local) { + ST_LoadLocalFaceGraphics(skin->facerank, skin->facewant, skin->facemmap, numlocalskins); + } else { + ST_LoadFaceGraphics(skin->facerank, skin->facewant, skin->facemmap, numskins); + } #ifdef HWRENDER if (rendermode == render_opengl) diff --git a/src/st_stuff.c b/src/st_stuff.c index 949ff4bac..1c469507c 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -384,16 +384,15 @@ void ST_LoadFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 skin facemmapprefix[skinnum] = W_CachePatchName(mmapstr, PU_HUDGFX); } -void ST_LoadLocalFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 skinnum, boolean local) +void ST_LoadLocalFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 skinnum) { - if (local) - { - localfacerankprefix[skinnum] = W_CachePatchName(rankstr, PU_HUDGFX); - localfacewantprefix[skinnum] = W_CachePatchName(wantstr, PU_HUDGFX); - localfacemmapprefix[skinnum] = W_CachePatchName(mmapstr, PU_HUDGFX); - } - else - ST_LoadFaceGraphics(rankstr, wantstr, mmapstr, skinnum); + localfacerankprefix[skinnum] = W_CachePatchName(rankstr, PU_HUDGFX); + localfacewantprefix[skinnum] = W_CachePatchName(wantstr, PU_HUDGFX); + localfacemmapprefix[skinnum] = W_CachePatchName(mmapstr, PU_HUDGFX); + + //CONS_Printf("Added rank prefix %s\n", rankstr); + //CONS_Printf("Added want prefix %s\n", wantstr); + //CONS_Printf("Added mmap prefix %s\n", mmapstr); } void ST_ReloadSkinFaceGraphics(void) @@ -404,7 +403,7 @@ void ST_ReloadSkinFaceGraphics(void) ST_LoadFaceGraphics(skins[i].facerank, skins[i].facewant, skins[i].facemmap, i); for (i = 0; i < numlocalskins; i++) - ST_LoadLocalFaceGraphics(skins[i].facerank, skins[i].facewant, skins[i].facemmap, i, true); + ST_LoadLocalFaceGraphics(localskins[i].facerank, localskins[i].facewant, localskins[i].facemmap, i); } static inline void ST_InitData(void) diff --git a/src/st_stuff.h b/src/st_stuff.h index 5b3f611d9..0a047d8ce 100644 --- a/src/st_stuff.h +++ b/src/st_stuff.h @@ -51,7 +51,7 @@ void ST_LoadGraphics(void); // face load graphics, called when skin changes void ST_LoadFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 playernum); -void ST_LoadLocalFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 playernum, boolean local); +void ST_LoadLocalFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 playernum); void ST_ReloadSkinFaceGraphics(void); #ifdef DELFILE void ST_UnLoadFaceGraphics(INT32 skinnum); -- 2.54.0 From 58c58e9542f9dd4997feb02220ea19b21dab873f Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 17:31:57 +0200 Subject: [PATCH 09/26] fix shit even more https://git.do.srb2.org/haya_/Kart-Public/-/commit/37d72b4680bbb1ecb68aaa817f2afc8b34deab96 --- src/k_kart.c | 2 +- src/lua_mobjlib.c | 5 ++++- src/lua_skinlib.c | 18 +++++++++--------- src/r_things.c | 9 +++++++++ src/r_things.h | 2 ++ src/st_stuff.c | 26 ++++++++++++++++++++++++-- src/st_stuff.h | 6 ++++++ src/w_wad.c | 14 +++++++++++++- src/y_inter.c | 11 +++++++++-- 9 files changed, 77 insertions(+), 16 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index a2c2699d6..5fc7a1bd0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8598,7 +8598,7 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, pat // it, they wouldn't 'spawn' on the top-right side of the HUD. UINT8 skin = 0; - boolean skinlocal = mo->player->localskin > 0; + boolean skinlocal = mo->skinlocal; fixed_t amnumxpos, amnumypos; INT32 amxpos, amypos; diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 91c2158e8..ca7825601 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -350,7 +350,10 @@ int mobj_skin_getter(lua_State *L) if (!mo->skin) return 0; - lua_pushstring(L, ((skin_t *)mo->skin)->name); + if (mo->localskin) // only do this for demos + lua_pushstring(L, ((skin_t *)mo->localskin)->name); + else + lua_pushstring(L, ((skin_t *)mo->skin)->name); return 1; } diff --git a/src/lua_skinlib.c b/src/lua_skinlib.c index f44e97afe..e86cd55af 100644 --- a/src/lua_skinlib.c +++ b/src/lua_skinlib.c @@ -166,14 +166,14 @@ static int lib_iterateSkins(lua_State *L) lua_remove(L, 1); // state is unused. if (!lua_isnil(L, 1)) - i = (INT32)(*((skin_t **)luaL_checkudata(L, 1, META_SKIN)) - skins) + 1; + i = (INT32)(*((skin_t **)luaL_checkudata(L, 1, META_SKIN)) - allskins) + 1; else i = 0; // skins are always valid, only added, never removed - if (i < numskins) + if (i < numallskins) { - LUA_PushUserdata(L, &skins[i], META_SKIN); + LUA_PushUserdata(L, &allskins[i], META_SKIN); return 1; } @@ -191,9 +191,9 @@ static int lib_getSkin(lua_State *L) i = luaL_checkinteger(L, 2); if (i < 0 || i >= MAXSKINS) return luaL_error(L, "skins[] index %d out of range (0 - %d)", i, MAXSKINS-1); - if (i >= numskins) + if (i >= numallskins) return 0; - LUA_PushUserdata(L, &skins[i], META_SKIN); + LUA_PushUserdata(L, &allskins[i], META_SKIN); return 1; } @@ -207,10 +207,10 @@ static int lib_getSkin(lua_State *L) } // find skin by name - for (i = 0; i < numskins; i++) - if (fastcmp(skins[i].name, field)) + for (i = 0; i < numallskins; i++) + if (fastcmp(allskins[i].name, field)) { - LUA_PushUserdata(L, &skins[i], META_SKIN); + LUA_PushUserdata(L, &allskins[i], META_SKIN); return 1; } @@ -219,7 +219,7 @@ static int lib_getSkin(lua_State *L) static int lib_numSkins(lua_State *L) { - lua_pushinteger(L, numskins); + lua_pushinteger(L, numallskins); return 1; } diff --git a/src/r_things.c b/src/r_things.c index adf602251..653aa3930 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2782,6 +2782,7 @@ void R_DrawMasked(void) // ========================================================================== INT32 numskins = 0; +INT32 numallskins = 0; INT32 numlocalskins = 0; skin_t skins[MAXSKINS]; UINT8 skinstats[9][9][MAXSKINS]; @@ -2798,6 +2799,7 @@ UINT8 skinstatscount[9][9] = { }; UINT8 skinsorted[MAXSKINS]; skin_t localskins[MAXSKINS]; +skin_t allskins[MAXSKINS*2]; // FIXTHIS: don't work because it must be inistilised before the config load //#define SKINVALUES #ifdef SKINVALUES @@ -2898,6 +2900,10 @@ void R_InitSkins(void) if (rendermode == render_opengl) HWR_AddPlayerMD2(0, false); #endif + + // lets set it + allskins[0] = skins[0]; + numallskins = 1; } // returns true if the skin name is found (loaded from pwad) @@ -3482,8 +3488,11 @@ next_token: CONS_Debug(DBG_SETUP, M_GetText("Incremented %d, %d to %d\n"), skin->kartspeed, skin->kartweight, skinstatscount[skin->kartspeed - 1][skin->kartweight - 1]); skinsorted[numskins] = numskins; + + allskins[numallskins] = ( (local) ? localskins : skins )[( (local) ? numlocalskins : numskins )]; ( (local) ? numlocalskins++ : numskins++ ); + numallskins++; } sortSkinGrid(); diff --git a/src/r_things.h b/src/r_things.h index 5d7076f10..2d9e7a47f 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -202,6 +202,7 @@ typedef struct drawnode_s extern INT32 numskins; extern INT32 numlocalskins; +extern INT32 numallskins; extern skin_t skins[MAXSKINS]; extern UINT8 skinstats[9][9][MAXSKINS]; extern UINT8 skinstatscount[9][9]; @@ -209,6 +210,7 @@ extern UINT8 skinsorted[MAXSKINS]; void sortSkinGrid(void); extern skin_t localskins[MAXSKINS]; +extern skin_t allskins[MAXSKINS*2]; boolean SetPlayerSkin(INT32 playernum,const char *skinname); void SetPlayerSkinByNum(INT32 playernum,INT32 skinnum); // Tails 03-16-2002 diff --git a/src/st_stuff.c b/src/st_stuff.c index 1c469507c..2b5355abc 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -62,6 +62,14 @@ patch_t *localfacerankprefix[MAXSKINS]; // ranking patch_t *localfacewantprefix[MAXSKINS]; // wanted patch_t *localfacemmapprefix[MAXSKINS]; // minimap +char *facerankprefix_name[MAXSKINS]; // ranking +char *facewantprefix_name[MAXSKINS]; // wanted +char *facemmapprefix_name[MAXSKINS]; // minimap + +char *localfacerankprefix_name[MAXSKINS]; // ranking +char *localfacewantprefix_name[MAXSKINS]; // wanted +char *localfacemmapprefix_name[MAXSKINS]; // minimap + // ------------------------------------------ // status bar overlay // ------------------------------------------ @@ -382,6 +390,10 @@ void ST_LoadFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 skin facerankprefix[skinnum] = W_CachePatchName(rankstr, PU_HUDGFX); facewantprefix[skinnum] = W_CachePatchName(wantstr, PU_HUDGFX); facemmapprefix[skinnum] = W_CachePatchName(mmapstr, PU_HUDGFX); + + facerankprefix_name[skinnum] = rankstr; + facewantprefix_name[skinnum] = wantstr; + facemmapprefix_name[skinnum] = mmapstr; } void ST_LoadLocalFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 skinnum) @@ -389,6 +401,10 @@ void ST_LoadLocalFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 localfacerankprefix[skinnum] = W_CachePatchName(rankstr, PU_HUDGFX); localfacewantprefix[skinnum] = W_CachePatchName(wantstr, PU_HUDGFX); localfacemmapprefix[skinnum] = W_CachePatchName(mmapstr, PU_HUDGFX); + + localfacerankprefix_name[skinnum] = rankstr; + localfacewantprefix_name[skinnum] = wantstr; + localfacemmapprefix_name[skinnum] = mmapstr; //CONS_Printf("Added rank prefix %s\n", rankstr); //CONS_Printf("Added want prefix %s\n", wantstr); @@ -402,8 +418,14 @@ void ST_ReloadSkinFaceGraphics(void) for (i = 0; i < numskins; i++) ST_LoadFaceGraphics(skins[i].facerank, skins[i].facewant, skins[i].facemmap, i); - for (i = 0; i < numlocalskins; i++) - ST_LoadLocalFaceGraphics(localskins[i].facerank, localskins[i].facewant, localskins[i].facemmap, i); + if (players[consoleplayer].skinlocal) { + for (i = 0; i < numlocalskins; i++) { + ST_LoadLocalFaceGraphics(localskins[i].facerank, localskins[i].facewant, localskins[i].facemmap, i); + } + } else { + for (i = 0; i < numskins; i++) + ST_LoadLocalFaceGraphics(skins[i].facerank, skins[i].facewant, skins[i].facemmap, i); + } } static inline void ST_InitData(void) diff --git a/src/st_stuff.h b/src/st_stuff.h index 0a047d8ce..281b87fb5 100644 --- a/src/st_stuff.h +++ b/src/st_stuff.h @@ -82,6 +82,12 @@ extern patch_t *facemmapprefix[MAXSKINS]; // minimap extern patch_t *localfacerankprefix[MAXSKINS]; // ranking extern patch_t *localfacewantprefix[MAXSKINS]; // wanted extern patch_t *localfacemmapprefix[MAXSKINS]; // minimap +extern char *facerankprefix_name[MAXSKINS]; // ranking +extern char *facewantprefix_name[MAXSKINS]; // wanted +extern char *facemmapprefix_name[MAXSKINS]; // minimap +extern char *localfacerankprefix_name[MAXSKINS]; // ranking +extern char *localfacewantprefix_name[MAXSKINS]; // wanted +extern char *localfacemmapprefix_name[MAXSKINS]; // minimap extern patch_t *livesback; extern patch_t *ngradeletters[7]; diff --git a/src/w_wad.c b/src/w_wad.c index 630947fad..d2bbf0bdc 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -65,6 +65,7 @@ #include "i_system.h" #include "md5.h" #include "lua_script.h" +#include "st_stuff.h" #ifdef SCANTHINGS #include "p_setup.h" // P_ScanThings #endif @@ -1730,7 +1731,18 @@ void *W_CachePatchName(const char *name, INT32 tag) { lumpnum_t num; - num = W_CheckNumForName(name); + const char *finalname = name; + + // bogus fix by haya + // i really dont want to bother rn + if (finalname == facerankprefix_name[players[consoleplayer].skin] && players[consoleplayer].skinlocal) + finalname = localfacerankprefix_name[players[consoleplayer].localskin - 1]; + else if (finalname == facemmapprefix_name[players[consoleplayer].skin] && players[consoleplayer].skinlocal) + finalname = localfacemmapprefix_name[players[consoleplayer].localskin - 1]; + else if (finalname == facewantprefix_name[players[consoleplayer].skin] && players[consoleplayer].skinlocal) + finalname = localfacewantprefix_name[players[consoleplayer].localskin - 1]; + + num = W_CheckNumForName(finalname); if (num == LUMPERROR) return W_CachePatchNum(W_GetNumForName("MISSING"), tag); diff --git a/src/y_inter.c b/src/y_inter.c index 3fb2d3aa3..71011ed60 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -482,7 +482,14 @@ void Y_IntermissionDrawer(void) if (data.match.color[i]) { UINT8 *colormap = R_GetTranslationColormap(*data.match.character[i], *data.match.color[i], GTC_CACHE); - V_DrawMappedPatch(x+16, y-4, 0, facerankprefix[*data.match.character[i]], colormap); + if (!players[i].skinlocal) { + if (!players[i].localskin) + V_DrawMappedPatch(x+16, y-4, 0, facerankprefix[*data.match.character[i]], colormap); + else + V_DrawMappedPatch(x+16, y-4, 0, facerankprefix[players[i].localskin - 1], colormap); + } else { + V_DrawMappedPatch(x+16, y-4, 0, localfacerankprefix[players[i].localskin - 1], colormap); + } } if (data.match.num[i] == whiteplayer) @@ -1200,7 +1207,7 @@ void Y_VoteDrawer(void) if (players[i].skincolor) { UINT8 *colormap = R_GetTranslationColormap(players[i].skin, players[i].skincolor, GTC_CACHE); - V_DrawMappedPatch(x+24, y+9, V_SNAPTOLEFT, facerankprefix[players[i].skin], colormap); + V_DrawMappedPatch(x+24, y+9, V_SNAPTOLEFT, (players[i].skinlocal ? localfacerankprefix : facerankprefix)[((players[i].localskin) ? players[i].localskin-1 : players[i].skin)], colormap); } if (!splitscreen && i == consoleplayer) -- 2.54.0 From ceae12baba2b70e1e909b10957021eea3fc442c8 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 17:34:28 +0200 Subject: [PATCH 10/26] fix an issue with desynchs https://git.do.srb2.org/haya_/Kart-Public/-/commit/a47d965b82e45bcf600217899a2cd6951024093b --- src/lua_mobjlib.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index ca7825601..ff4a024ac 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -19,6 +19,7 @@ #include "p_local.h" #include "g_game.h" #include "p_setup.h" +#include "doomdef.h" #include "lua_script.h" #include "lua_libs.h" @@ -350,7 +351,7 @@ int mobj_skin_getter(lua_State *L) if (!mo->skin) return 0; - if (mo->localskin) // only do this for demos + if (mo->localskin) // pretty cool, but also destructive lua_pushstring(L, ((skin_t *)mo->localskin)->name); else lua_pushstring(L, ((skin_t *)mo->skin)->name); @@ -366,7 +367,7 @@ int mobj_skin_setter(lua_State *L) char skin[SKINNAMESIZE+1]; // all skin names are limited to this length strlcpy(skin, luaL_checkstring(L, 2), sizeof skin); strlwr(skin); // all skin names are lowercase - for (i = 0; i < numskins; i++) + for (i = 0; i < numskins; i++) { { if (fastcmp(skins[i].name, skin)) { @@ -375,7 +376,10 @@ int mobj_skin_setter(lua_State *L) } } - return luaL_error(L, "mobj.skin '%s' not found!", skin); + } + + mo->skin = &skins[players[consoleplayer].skin]; // we dont want to use our local skin for this!!!!!!!!! + return 0; } int mobj_color_setter(lua_State *L) -- 2.54.0 From 9dc2ad4f32ff0a2cc7e1ed5acca8361f3f0fb3c1 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 17:39:41 +0200 Subject: [PATCH 11/26] add localskinall command https://git.do.srb2.org/haya_/Kart-Public/-/commit/958fe796eb070b6678cd45ea835a998d8dc6d2c9 --- src/d_netcmd.c | 75 ++++++++++++++++++++++++----------------------- src/d_netcmd.h | 1 + src/lua_mobjlib.c | 9 ++++-- 3 files changed, 46 insertions(+), 39 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 41287dcbb..7d88cb466 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -110,10 +110,6 @@ static void Skin_OnChange(void); static void Skin2_OnChange(void); static void Skin3_OnChange(void); static void Skin4_OnChange(void); -static void Localskin_OnChange(void); -static void Localskin2_OnChange(void); -static void Localskin3_OnChange(void); -static void Localskin4_OnChange(void); static void Color_OnChange(void); static void Color2_OnChange(void); static void Color3_OnChange(void); @@ -150,6 +146,7 @@ static void Command_Localskin1(void); static void Command_Localskin2(void); static void Command_Localskin3(void); static void Command_Localskin4(void); +static void Command_LocalskinAll(void); static void Command_ListWADS_f(void); #ifdef DELFILE static void Command_Delfile(void); @@ -303,6 +300,7 @@ consvar_t cv_localskin = {"internal___localskin", "none", CV_HIDEN, NULL, NULL, consvar_t cv_localskin2 = {"internal___localskin2", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_localskin3 = {"internal___localskin3", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_localskin4 = {"internal___localskin4", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_localskinall = {"internal___localskinall", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_skipmapcheck = {"skipmapcheck", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -662,6 +660,7 @@ void D_RegisterServerCommands(void) COM_AddCommand("localskin2", Command_Localskin2); COM_AddCommand("localskin3", Command_Localskin3); COM_AddCommand("localskin4", Command_Localskin4); + COM_AddCommand("localskinall", Command_LocalskinAll); COM_AddCommand("listwad", Command_ListWADS_f); #ifdef DELFILE @@ -920,6 +919,7 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_playercolor4); CV_RegisterVar(&cv_skin4); CV_RegisterVar(&cv_localskin4); + CV_RegisterVar(&cv_localskinall); // preferred number of players CV_RegisterVar(&cv_splitplayers); @@ -4636,6 +4636,14 @@ static void Command_Addfile(void) SendNetXCmd(XD_ADDFILE, buf, buf_p - buf); } +// i hate myself +static boolean DumbStartsWith(const char *pre, const char *str) +{ + size_t lenpre = strlen(pre), + lenstr = strlen(str); + return lenstr < lenpre ? false : memcmp(pre, str, lenpre) == 0; +} + /** Adds something at runtime. */ static void @@ -4647,7 +4655,15 @@ Command_Addskins (void) "addskins : load skins bro\n"); return; } - P_AddWadFile(COM_Argv(1), true); + // we dont want anything that aint a skin + if (DumbStartsWith("KC_", COM_Argv(1))) + P_AddWadFile(COM_Argv(1), true); + else if (DumbStartsWith("KCL_", COM_Argv(1)) && demo.playback) // KCL only for demos + P_AddWadFile(COM_Argv(1), true); + else if (DumbStartsWith("KCL_", COM_Argv(1)) && !demo.playback) + CONS_Alert(CONS_ERROR, M_GetText("Cannot add file %s as it is a skin with lua."), COM_Argv(1)); + else + CONS_Alert(CONS_ERROR, M_GetText("Cannot add file %s as it is not a skin."), COM_Argv(1)); } static void Command_Localskin1 (void) { @@ -4706,6 +4722,23 @@ static void Command_Localskin4 (void) { SetLocalPlayerSkin(displayplayers[3], COM_Argv(1), &cv_localskin4); } +static void Command_LocalskinAll (void) { + if (!Playing() && !demo.playback) + { + CONS_Printf("You can only use this command in gameplay.\n"); + return; + } + if (COM_Argc() != 2) + { + CONS_Printf("localskinall : Set a localskin to all players.\n"); + return; + } + INT32 i; + for (i; i < MAXPLAYERS; i++) { + SetLocalPlayerSkin(i, COM_Argv(1), &cv_localskinall); + } +} + #ifdef DELFILE /** removes the last added pwad at runtime. * Searches for sounds, maps, music and images to remove @@ -6018,38 +6051,6 @@ static void Command_ListSkins(void) } } -/** bruh - */ -static void Localskin_OnChange(void) -{ - if (!Playing()) - return; // do whatever you want - SetLocalPlayerSkin(consoleplayer, cv_localskin.string, &cv_localskin); -} - -/** two bruh machine gun - */ -static void Localskin2_OnChange(void) -{ - if (!Playing()) - return; // do whatever you want - SetLocalPlayerSkin(displayplayers[1], cv_localskin2.string, &cv_localskin2); -} - -static void Localskin3_OnChange(void) -{ - if (!Playing()) - return; // do whatever you want - SetLocalPlayerSkin(displayplayers[2], cv_localskin3.string, &cv_localskin3); -} - -static void Localskin4_OnChange(void) -{ - if (!Playing()) - return; // do whatever you want - SetLocalPlayerSkin(displayplayers[3], cv_localskin4.string, &cv_localskin4); -} - /** Sends a color change for the console player, unless that player is moving. * \sa cv_playercolor, Color2_OnChange, Skin_OnChange * \author Graue diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 9cf7c2e5d..80c7078a0 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -37,6 +37,7 @@ extern consvar_t cv_playername4; extern consvar_t cv_playercolor4; extern consvar_t cv_skin4; extern consvar_t cv_localskin4; +extern consvar_t cv_localskinall; // preferred number of players extern consvar_t cv_splitplayers; diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index ff4a024ac..a7f3d8580 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -367,6 +367,12 @@ int mobj_skin_setter(lua_State *L) char skin[SKINNAMESIZE+1]; // all skin names are limited to this length strlcpy(skin, luaL_checkstring(L, 2), sizeof skin); strlwr(skin); // all skin names are lowercase + // nope, not this time chief. + if (fastcmp(localskins[players[consoleplayer].localskin - 1].name, skin)) + { + mo->skin = &skins[players[consoleplayer].skin]; // we dont want to use our local skin for this!!!!!!!!! + return 0; + } for (i = 0; i < numskins; i++) { { if (fastcmp(skins[i].name, skin)) @@ -378,8 +384,7 @@ int mobj_skin_setter(lua_State *L) } - mo->skin = &skins[players[consoleplayer].skin]; // we dont want to use our local skin for this!!!!!!!!! - return 0; + return luaL_error(L, "mobj.skin '%s' not found!", skin); } int mobj_color_setter(lua_State *L) -- 2.54.0 From faeb4d22ed6153eea4fd965f2b32a11946263442 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 18:43:55 +0200 Subject: [PATCH 12/26] Add a -force parameter to addskins, fix localskin not playing the right sounds https://git.do.srb2.org/haya_/Kart-Public/-/commit/932e9b92c3551dc4910157ea8d3eea1145ccfc40 --- src/d_netcmd.c | 33 ++++++++++++++++++++++----------- src/m_menu.c | 2 +- src/p_user.c | 4 ++-- src/y_inter.c | 9 +++++---- 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 7d88cb466..235cde3a2 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -49,6 +49,7 @@ #include "m_anigif.h" #include "k_kart.h" // SRB2kart #include "y_inter.h" +#include "fastcmp.h" #include "m_perfstats.h" #ifdef NETGAME_DEVMODE @@ -4649,21 +4650,31 @@ static boolean DumbStartsWith(const char *pre, const char *str) static void Command_Addskins (void) { - if (COM_Argc() != 2) + if (COM_Argc() > 3) { CONS_Printf( - "addskins : load skins bro\n"); + "addskins : Load a skin file.\n"); return; } - // we dont want anything that aint a skin - if (DumbStartsWith("KC_", COM_Argv(1))) - P_AddWadFile(COM_Argv(1), true); - else if (DumbStartsWith("KCL_", COM_Argv(1)) && demo.playback) // KCL only for demos - P_AddWadFile(COM_Argv(1), true); - else if (DumbStartsWith("KCL_", COM_Argv(1)) && !demo.playback) - CONS_Alert(CONS_ERROR, M_GetText("Cannot add file %s as it is a skin with lua."), COM_Argv(1)); - else - CONS_Alert(CONS_ERROR, M_GetText("Cannot add file %s as it is not a skin."), COM_Argv(1)); + // no forcing? + if (fasticmp(COM_Argv(2), "-force") || fasticmp(COM_Argv(2), "-f")) { + CONS_Alert(CONS_NOTICE, M_GetText("Adding file %s. May or may not be a skin.\n"), COM_Argv(1)); + P_AddWadFile(COM_Argv(1), 0, true); + } else { + if (DumbStartsWith("KC_", COM_Argv(1))) { + P_AddWadFile(COM_Argv(1), 0, true); + } else if (DumbStartsWith("KCL_", COM_Argv(1))) { + if (!demo.playback) { + CONS_Alert(CONS_ERROR, M_GetText("Cannot add file %s as it is a skin with lua. Include -force or -f to force it to load.\n"), COM_Argv(1)); + return; + } else { + P_AddWadFile(COM_Argv(1), 0, true); + } + } else { + CONS_Alert(CONS_ERROR, M_GetText("Cannot add file %s as it is not a skin.\n"), COM_Argv(1)); + return; + } + } } static void Command_Localskin1 (void) { diff --git a/src/m_menu.c b/src/m_menu.c index a4941bdb2..872af2530 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -5629,7 +5629,7 @@ static void M_HandleAddons(INT32 choice) // no characters? if (DumbStartsWith("KC_", dirmenu[dir_on[menudepthleft]]+DIR_STRING)) { M_StartMessage(va("%c%s\x80\nYou are loading a local skin.\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),NULL,MM_NOTHING); - COM_BufAddText(va("addskins \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); + COM_BufAddText(va("addskins \"%s%s\" -force", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); } else S_StartSound(NULL, sfx_s26d); diff --git a/src/p_user.c b/src/p_user.c index 5130c8f55..c625e5fcc 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1741,13 +1741,13 @@ void P_DoPlayerExit(player_t *player) sfxenum_t sfx_id; // fix godjjsa win sounds if (K_IsPlayerLosing(player)) { - if (player->mo->skinlocal) + if (player->mo->localskin) sfx_id = ((skin_t *)player->mo->localskin)->soundsid[S_sfx[sfx_klose].skinsound]; else sfx_id = ((skin_t *)player->mo->skin)->soundsid[S_sfx[sfx_klose].skinsound]; } else { - if (player->mo->skinlocal) + if (player->mo->localskin) sfx_id = ((skin_t *)player->mo->localskin)->soundsid[S_sfx[sfx_kwin].skinsound]; else sfx_id = ((skin_t *)player->mo->skin)->soundsid[S_sfx[sfx_kwin].skinsound]; diff --git a/src/y_inter.c b/src/y_inter.c index 71011ed60..02b88f834 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -482,13 +482,14 @@ void Y_IntermissionDrawer(void) if (data.match.color[i]) { UINT8 *colormap = R_GetTranslationColormap(*data.match.character[i], *data.match.color[i], GTC_CACHE); - if (!players[i].skinlocal) { - if (!players[i].localskin) + // i fucking hate this i fucking hate this i hate this so much + if (!players[data.match.num[i]].skinlocal) { + if (!players[data.match.num[i]].localskin) V_DrawMappedPatch(x+16, y-4, 0, facerankprefix[*data.match.character[i]], colormap); else - V_DrawMappedPatch(x+16, y-4, 0, facerankprefix[players[i].localskin - 1], colormap); + V_DrawMappedPatch(x+16, y-4, 0, facerankprefix[players[data.match.num[i]].localskin - 1], colormap); } else { - V_DrawMappedPatch(x+16, y-4, 0, localfacerankprefix[players[i].localskin - 1], colormap); + V_DrawMappedPatch(x+16, y-4, 0, localfacerankprefix[players[data.match.num[i]].localskin - 1], colormap); } } -- 2.54.0 From 487cbc495a278ea23a638a8a3fc745018248dc4e Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 18:47:57 +0200 Subject: [PATCH 13/26] more changes https://git.do.srb2.org/haya_/Kart-Public/-/commit/9e3919195d143956e31bf092f6822cab61d1ee81 --- src/d_netcmd.c | 7 +++++-- src/g_game.c | 10 ++++++++++ src/g_game.h | 1 + src/lua_script.c | 2 +- src/r_things.c | 19 +++++++++++++++++++ src/st_stuff.c | 9 ++------- src/w_wad.c | 1 + src/w_wad.h | 1 + 8 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 235cde3a2..71dd814d9 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -4683,12 +4683,15 @@ static void Command_Localskin1 (void) { CONS_Printf("You can only use this command in gameplay.\n"); return; } - if (COM_Argc() != 2) + if (COM_Argc() > 3) { CONS_Printf("localskin : Set a localskin.\n"); return; } - SetLocalPlayerSkin(consoleplayer, COM_Argv(1), &cv_localskin); + if (fasticmp(COM_Argv(2), "-display") || fasticmp(COM_Argv(2), "-d")) + SetLocalPlayerSkin(displayplayers[0], COM_Argv(1), &cv_localskin); + else + SetLocalPlayerSkin(consoleplayer, COM_Argv(1), &cv_localskin); } static void Command_Localskin2 (void) { diff --git a/src/g_game.c b/src/g_game.c index d17434f4e..1a5e0c067 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -846,6 +846,16 @@ void G_SetGameModified(boolean silent, boolean major) M_EndModeAttackRun(); } +void G_SetWadModified(boolean silent, boolean major, UINT16 wadnum) +{ + // now that we have a wad that is actually well, a gameplay changing mod + // (for later) + wadfiles[wadnum]->majormod = true; + + // set our game to be marked as modified. + G_SetGameModified(silent, major); +} + /** Builds an original game map name from a map number. * The complexity is due to MAPA0-MAPZZ. * diff --git a/src/g_game.h b/src/g_game.h index 67618296f..d7163b4ed 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -402,6 +402,7 @@ boolean G_GetRetryFlag(void); void G_LoadGameData(void); void G_LoadGameSettings(void); +void G_SetWadModified(boolean silent, boolean major, UINT16 wadnum); void G_SetGameModified(boolean silent, boolean major); void G_SetGamestate(gamestate_t newstate); diff --git a/src/lua_script.c b/src/lua_script.c index 8f4438732..e0da24b40 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -280,7 +280,7 @@ void LUA_LoadLump(UINT16 wad, UINT16 lump) LUA_LoadFile(&f, name); // actually load file! // Okay, we've modified the game beyond the point of no return. - G_SetGameModified(multiplayer, true); + G_SetWadModified(multiplayer, true, wad); free(name); Z_Free(f.data); diff --git a/src/r_things.c b/src/r_things.c index 653aa3930..4d21ed574 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2966,6 +2966,13 @@ void SetLocalPlayerSkin(INT32 playernum, const char *skinname, consvar_t *cvar) { player_t *player = &players[playernum]; INT32 i; + + // this is where we're gonna use major mod for. + if (wadfiles[skins[player->skin].wadnum]->majormod && !demo.playback) + { + CONS_Alert(CONS_ERROR, M_GetText("Cannot set localskin to %s because the player's skin is modifying the game.\n"), skinname); + return; + } if (strcasecmp(skinname, "none")) { @@ -2975,6 +2982,12 @@ void SetLocalPlayerSkin(INT32 playernum, const char *skinname, consvar_t *cvar) if (stricmp(localskins[i].name, skinname) == 0) { player->localskin = 1 + i; + if (wadfiles[localskins[player->localskin - 1].wadnum]->majormod && !demo.playback) + { + CONS_Alert(CONS_ERROR, M_GetText("Cannot set localskin to %s because the localskin is a gameplay-modifying addon.\n"), skinname); + player->localskin = 0; + return; + } player->skinlocal = true; if (player->mo) { @@ -2990,6 +3003,12 @@ void SetLocalPlayerSkin(INT32 playernum, const char *skinname, consvar_t *cvar) if (stricmp(skins[i].name, skinname) == 0) { player->localskin = 1 + i; + if (wadfiles[skins[player->localskin - 1].wadnum]->majormod && !demo.playback) + { + CONS_Alert(CONS_ERROR, M_GetText("Cannot set localskin to %s because the skin is a gameplay-modifying addon.\n"), skinname); + player->localskin = 0; + return; + } player->skinlocal = false; if (player->mo) { diff --git a/src/st_stuff.c b/src/st_stuff.c index 2b5355abc..19567b42d 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -418,13 +418,8 @@ void ST_ReloadSkinFaceGraphics(void) for (i = 0; i < numskins; i++) ST_LoadFaceGraphics(skins[i].facerank, skins[i].facewant, skins[i].facemmap, i); - if (players[consoleplayer].skinlocal) { - for (i = 0; i < numlocalskins; i++) { - ST_LoadLocalFaceGraphics(localskins[i].facerank, localskins[i].facewant, localskins[i].facemmap, i); - } - } else { - for (i = 0; i < numskins; i++) - ST_LoadLocalFaceGraphics(skins[i].facerank, skins[i].facewant, skins[i].facemmap, i); + for (i = 0; i < numlocalskins; i++) { + ST_LoadLocalFaceGraphics(localskins[i].facerank, localskins[i].facewant, localskins[i].facemmap, i); } } diff --git a/src/w_wad.c b/src/w_wad.c index d2bbf0bdc..1e0cd96ae 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -793,6 +793,7 @@ UINT16 W_InitFile(const char *filename, const char *lumpname, UINT16 *wadnump, b fseek(handle, 0, SEEK_END); wadfile->filesize = (unsigned)ftell(handle); wadfile->type = type; + wadfile->majormod = false; // already generated, just copy it over M_Memcpy(&wadfile->md5sum, &md5sum, 16); diff --git a/src/w_wad.h b/src/w_wad.h index 32c843580..230d69a72 100644 --- a/src/w_wad.h +++ b/src/w_wad.h @@ -114,6 +114,7 @@ typedef struct wadfile_s UINT32 filesize; // for network UINT8 md5sum[16]; boolean important; + boolean majormod; } wadfile_t; #define WADFILENUM(lumpnum) (UINT16)((lumpnum)>>16) // wad flumpnum>>16) // wad file number in upper word -- 2.54.0 From 23ba3d493be814e3a4f82b01e4be6639820a54cc Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 18:50:00 +0200 Subject: [PATCH 14/26] issues fixing --- src/d_netcmd.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 71dd814d9..dfd5e5615 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -4657,6 +4657,7 @@ Command_Addskins (void) return; } // no forcing? + /* if (fasticmp(COM_Argv(2), "-force") || fasticmp(COM_Argv(2), "-f")) { CONS_Alert(CONS_NOTICE, M_GetText("Adding file %s. May or may not be a skin.\n"), COM_Argv(1)); P_AddWadFile(COM_Argv(1), 0, true); @@ -4668,13 +4669,16 @@ Command_Addskins (void) CONS_Alert(CONS_ERROR, M_GetText("Cannot add file %s as it is a skin with lua. Include -force or -f to force it to load.\n"), COM_Argv(1)); return; } else { + */ P_AddWadFile(COM_Argv(1), 0, true); + /* } } else { CONS_Alert(CONS_ERROR, M_GetText("Cannot add file %s as it is not a skin.\n"), COM_Argv(1)); return; } } + */ } static void Command_Localskin1 (void) { -- 2.54.0 From 43e133159496b7d3f20c03b0aca092e440e493ac Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 18:51:10 +0200 Subject: [PATCH 15/26] another localfile thingie https://git.do.srb2.org/haya_/Kart-Public/-/commit/4a60babf75ce6362d32a1633b12a718d65bcd18c --- src/d_netfil.c | 2 +- src/p_setup.c | 5 +++++ src/w_wad.h | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/d_netfil.c b/src/d_netfil.c index 0436f05d3..dbf4e6281 100644 --- a/src/d_netfil.c +++ b/src/d_netfil.c @@ -513,7 +513,7 @@ INT32 CL_CheckFiles(void) for (i = 0, j = mainwads+1; i < fileneedednum || j < numwadfiles;) { - if (j < numwadfiles && !wadfiles[j]->important) + if (j < numwadfiles && (!wadfiles[j]->important || wadfiles[j]->localfile)) { // Unimportant on our side. still don't care. ++j; diff --git a/src/p_setup.c b/src/p_setup.c index f47417b04..ca15e44ba 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3493,6 +3493,11 @@ UINT16 P_PartialAddWadFile(const char *wadfilename, boolean local) if (wadfiles[wadnum]->important) partadd_important = true; + + if (local) + wadfiles[wadnum]->localfile = true; + else + wadfiles[wadnum]->localfile = false; // // search for sound replacements diff --git a/src/w_wad.h b/src/w_wad.h index 230d69a72..b2b518793 100644 --- a/src/w_wad.h +++ b/src/w_wad.h @@ -115,6 +115,7 @@ typedef struct wadfile_s UINT8 md5sum[16]; boolean important; boolean majormod; + boolean localfile; // only for skins } wadfile_t; #define WADFILENUM(lumpnum) (UINT16)((lumpnum)>>16) // wad flumpnum>>16) // wad file number in upper word -- 2.54.0 From 76b66b41b63cfbfd1a073585373da476959b3b7c Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 18:58:26 +0200 Subject: [PATCH 16/26] Argh! https://git.do.srb2.org/haya_/Kart-Public/-/commit/217f15452c1fda9ea3c0d00650d470e13e14e0f5 --- src/CMakeLists.txt | 2 + src/args.c | 48 ++++++++--------- src/args.h | 20 +++---- src/command.c | 12 ++++- src/command.h | 4 ++ src/d_netcmd.c | 126 +++++++++++++++++---------------------------- src/p_enemy.c | 6 +++ src/r_things.c | 6 +++ src/r_things.h | 2 + 9 files changed, 112 insertions(+), 114 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 88231fc03..099e9f1ba 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,6 +3,7 @@ # Core sources set(SRB2_CORE_SOURCES am_map.c + args.c b_bot.c command.c comptime.c @@ -52,6 +53,7 @@ set(SRB2_CORE_SOURCES set(SRB2_CORE_HEADERS am_map.h + args.h b_bot.h byteptr.h command.h diff --git a/src/args.c b/src/args.c index 88eec9092..465208e47 100644 --- a/src/args.c +++ b/src/args.c @@ -1,4 +1,4 @@ -#include "doomtype.h" +#include #include #include #include @@ -106,7 +106,7 @@ static void vec_free(Vec* vec) { } -static boolean vec_add(Vec* vec, void* entry) { +static bool vec_add(Vec* vec, void* entry) { if (vec->count + 1 > vec->capacity) { int new_capacity = vec->capacity < 8 ? 8 : vec->capacity * 2; void** new_array = realloc(vec->entries, sizeof(void*) * new_capacity); @@ -191,7 +191,7 @@ static MapEntry* map_find(Map* map, const char* key, uint32_t key_hash) { } -static boolean map_grow(Map* map) { +static bool map_grow(Map* map) { MapEntry* old_entries = map->entries; int old_capacity = map->capacity; int new_capacity = old_capacity < 8 ? 8 : old_capacity * 2; @@ -227,7 +227,7 @@ static boolean map_grow(Map* map) { // Returns true if the key was found. -static boolean map_get(Map* map, const char* key, void** value) { +static bool map_get(Map* map, const char* key, void** value) { if (map->count == 0) return false; uint32_t key_hash = str_hash(key); @@ -241,7 +241,7 @@ static boolean map_get(Map* map, const char* key, void** value) { // Adds a new entry to the map or updates the value of an existing entry. // (Note that the map stores its own internal copy of the key string.) -static boolean map_set(Map* map, const char* key, void* value) { +static bool map_set(Map* map, const char* key, void* value) { if (map->count == map->max_load_threshold) { if (!map_grow(map)) { return false; @@ -269,7 +269,7 @@ static boolean map_set(Map* map, const char* key, void* value) { // Convenience wrapper for map_set(). This splits the key string into space- // separated words and adds a separate entry to the map for each word. -static boolean map_set_splitkey(Map* map, const char* key_string, void* value) { +static bool map_set_splitkey(Map* map, const char* key_string, void* value) { char *copy_of_key_string = str_dup(key_string); if (!copy_of_key_string) { return false; @@ -343,7 +343,7 @@ static void option_free(Option* opt) { } -static boolean option_append_value(Option* opt, OptionValue value) { +static bool option_append_value(Option* opt, OptionValue value) { if (opt->count + 1 > opt->capacity) { int new_capacity = opt->capacity < 4 ? 4 : opt->capacity * 2; OptionValue* new_array = realloc(opt->values, sizeof(OptionValue) * new_capacity); @@ -359,7 +359,7 @@ static boolean option_append_value(Option* opt, OptionValue value) { } -static boolean option_try_set(Option* opt, char* arg) { +static bool option_try_set(Option* opt, char* arg) { if (opt->type == OPT_STR) { return option_append_value(opt, (OptionValue){.str_val = arg}); } @@ -579,7 +579,7 @@ static char* argstream_next(ArgStream* stream) { } -static boolean argstream_has_next(ArgStream* stream) { +static bool argstream_has_next(ArgStream* stream) { return stream->index < stream->count; } @@ -600,10 +600,10 @@ struct ArgParser { ap_callback_t callback; char* cmd_name; struct ArgParser* cmd_parser; - boolean enable_help_command; - boolean had_memory_error; + bool enable_help_command; + bool had_memory_error; struct ArgParser* parent; - boolean first_positional_arg_ends_options; + bool first_positional_arg_ends_options; }; @@ -748,7 +748,7 @@ char* ap_get_version(ArgParser* parser) { } -void ap_first_pos_arg_ends_options(ArgParser* parser, boolean enable) { +void ap_first_pos_arg_ends_options(ArgParser* parser, bool enable) { parser->first_positional_arg_ends_options = enable; } @@ -832,7 +832,7 @@ int ap_count(ArgParser* parser, const char* name) { // Returns true if the specified flag or option was found. -boolean ap_found(ArgParser* parser, const char* name) { +bool ap_found(ArgParser* parser, const char* name) { Option* opt = ap_get_opt(parser, name); return opt->count > 0; } @@ -913,7 +913,7 @@ double* ap_dbl_values(ArgParser* parser, const char* name) { // Returns true if the parser has found one or more positional arguments. -boolean ap_has_args(ArgParser* parser) { +bool ap_has_args(ArgParser* parser) { return parser->positional_args->count > 0; } @@ -1016,7 +1016,7 @@ void ap_callback(ArgParser* parser, ap_callback_t function) { // Returns true if the parser has found a command. -boolean ap_has_cmd(ArgParser* parser) { +bool ap_has_cmd(ArgParser* parser) { return parser->cmd_name != NULL; } @@ -1034,7 +1034,7 @@ ArgParser* ap_cmd_parser(ArgParser* parser) { // Toggles support for the automatic 'help' command. -void ap_enable_help_command(ArgParser* parser, boolean enable) { +void ap_enable_help_command(ArgParser* parser, bool enable) { parser->enable_help_command = enable; } @@ -1056,7 +1056,7 @@ static void ap_handle_equals_opt(ArgParser* parser, const char* prefix, const ch char *value = strchr(arg, '=') + 1; Option* option; - boolean found = map_get(parser->option_map, name, (void**)&option); + bool found = map_get(parser->option_map, name, (void**)&option); if (!found || option->type == OPT_FLAG) { err(va("%s%s is not a recognised option name", prefix, name)); @@ -1101,7 +1101,7 @@ static void ap_handle_short_opt(ArgParser* parser, const char* arg, ArgStream* s for (size_t i = 0; i < strlen(arg); i++) { char keystr[] = {arg[i], 0}; Option* option; - boolean found = map_get(parser->option_map, keystr, (void**)&option); + bool found = map_get(parser->option_map, keystr, (void**)&option); if (!found) { if (arg[i] == 'h' && parser->helptext != NULL) { CONS_Printf("%s\n", parser->helptext); @@ -1134,7 +1134,7 @@ static void ap_parse_stream(ArgParser* parser, ArgStream* stream) { } ArgParser* cmd_parser; - boolean is_first_arg = true; + bool is_first_arg = true; while (argstream_has_next(stream)) { char* arg = argstream_next(stream); @@ -1216,7 +1216,7 @@ static void ap_parse_stream(ArgParser* parser, ArgStream* stream) { // Parse an array of string arguments. -static boolean ap_parse_array(ArgParser* parser, int count, char* args[]) { +static bool ap_parse_array(ArgParser* parser, int count, char* args[]) { if (parser->had_memory_error) { return false; } @@ -1237,7 +1237,7 @@ static boolean ap_parse_array(ArgParser* parser, int count, char* args[]) { // are the arguments passed to main(), i.e. that the first element in [argv] is the program's name // and should be ignored when parsing the actual *arguments*. In some situations [argv] can be // empty, i.e. [argc == 0], which can lead to security vulnerabilities if not explicitly handled. -boolean ap_parse(ArgParser* parser, int argc, char* argv[]) { +bool ap_parse(ArgParser* parser, int argc, char* argv[]) { if (argc > 1) { return ap_parse_array(parser, argc - 1, argv + 1); } @@ -1250,7 +1250,7 @@ boolean ap_parse(ArgParser* parser, int argc, char* argv[]) { /* --------------------- */ -boolean ap_had_memory_error(ArgParser* parser) { +bool ap_had_memory_error(ArgParser* parser) { return parser->had_memory_error; } @@ -1294,7 +1294,7 @@ void ap_print(ArgParser* parser) { /* --------------------- */ -void ap_cmd_help(ArgParser* parser, boolean enable) { +void ap_cmd_help(ArgParser* parser, bool enable) { ap_enable_help_command(parser, enable); } diff --git a/src/args.h b/src/args.h index e2db1e501..39cd57b5c 100644 --- a/src/args.h +++ b/src/args.h @@ -8,7 +8,7 @@ #ifndef args_h #define args_h -#include "doomtype.h" +#include // ----------------------------------------------------------------------------- // Types. @@ -51,7 +51,7 @@ char* ap_get_version(ArgParser* parser); // If toggled to true, the first positional argument ends option parsing; all // subsequent arguments will be treated as positionals. Defaults to false. -void ap_first_pos_arg_ends_options(ArgParser* parser, boolean enable); +void ap_first_pos_arg_ends_options(ArgParser* parser, bool enable); // Parses the application's command line arguments. The parameters are assumed // to be [argc] and [argv] as supplied to main(), i.e. the first element of the @@ -59,7 +59,7 @@ void ap_first_pos_arg_ends_options(ArgParser* parser, boolean enable); // if the arguments were successfully parsed. Returns false if parsing failed // due to a memory allocation error. (This memory allocation error may have // occured during set-up rather than during parsing.) -boolean ap_parse(ArgParser* parser, int argc, char** argv); +bool ap_parse(ArgParser* parser, int argc, char** argv); // Frees the memory associated with the parser and any subparsers. void ap_free(ArgParser* parser); @@ -88,7 +88,7 @@ void ap_dbl_opt(ArgParser* parser, const char* name, double fallback); int ap_count(ArgParser* parser, const char* name); // Returns true if the specified flag or option was found. -boolean ap_found(ArgParser* parser, const char* name); +bool ap_found(ArgParser* parser, const char* name); // Returns the value of a string option. char* ap_str_value(ArgParser* parser, const char* name); @@ -128,7 +128,7 @@ double* ap_dbl_values(ArgParser* parser, const char* name); // ----------------------------------------------------------------------------- // Returns true if the parser has found one or more positional arguments. -boolean ap_has_args(ArgParser* parser); +bool ap_has_args(ArgParser* parser); // Returns the number of positional arguments. int ap_count_args(ArgParser* parser); @@ -166,7 +166,7 @@ ArgParser* ap_cmd(ArgParser* parser, const char* name); void ap_callback(ArgParser* parser, ap_callback_t function); // Returns true if the parser has found a command. -boolean ap_has_cmd(ArgParser* parser); +bool ap_has_cmd(ArgParser* parser); // Returns the command name, if the parser has found a command. char* ap_cmd_name(ArgParser* parser); @@ -174,11 +174,11 @@ char* ap_cmd_name(ArgParser* parser); // Returns the command's parser instance, if the parser has found a command. ArgParser* ap_cmd_parser(ArgParser* parser); -// This booleanean switch toggles support for an automatic 'help' command that +// This boolean switch toggles support for an automatic 'help' command that // prints subcommand helptext. The value defaults to false but gets toggled // automatically to true whenever a command is registered. You can use this // function to disable the feature if required. -void ap_enable_help_command(ArgParser* parser, boolean enable); +void ap_enable_help_command(ArgParser* parser, bool enable); // ----------------------------------------------------------------------------- // Debugging utilities. @@ -188,14 +188,14 @@ void ap_enable_help_command(ArgParser* parser, boolean enable); void ap_print(ArgParser* parser); // True if an attempt to allocate memory failed. -boolean ap_had_memory_error(ArgParser* parser); +bool ap_had_memory_error(ArgParser* parser); // ----------------------------------------------------------------------------- // Deprecated. // ----------------------------------------------------------------------------- // Replaced by ap_enable_help_command(). -void ap_cmd_help(ArgParser* parser, boolean enable); +void ap_cmd_help(ArgParser* parser, bool enable); // Replaced by ap_set_helptext(). void ap_helptext(ArgParser* parser, const char* helptext); diff --git a/src/command.c b/src/command.c index 46709fc67..0af4b9fb2 100644 --- a/src/command.c +++ b/src/command.c @@ -277,7 +277,7 @@ static xcommand_t *com_commands = NULL; // current commands #define MAX_ARGS 80 static size_t com_argc; -static char *com_argv[MAX_ARGS]; +char *com_argv[MAX_ARGS]; static const char *com_null_string = ""; static char *com_args = NULL; // current command args or NULL @@ -327,6 +327,16 @@ const char *COM_Argv(size_t arg) return com_argv[arg]; } +/** Returns all of the console command arguments + * + * \return String pointer to the argv table. + * \sa COM_ArgvList + */ +char **COM_ArgvList(void) +{ + return com_argv; +} + /** Gets all console command arguments. * * \return String pointer to all arguments for the last command. diff --git a/src/command.h b/src/command.h index 3fc39c84a..2276a0ae2 100644 --- a/src/command.h +++ b/src/command.h @@ -33,8 +33,12 @@ typedef void (*com_func_t)(void); void COM_AddCommand(const char *name, com_func_t func); int COM_AddLuaCommand(const char *name); +#define MAX_ARGS 80 +extern char *com_argv[MAX_ARGS]; + size_t COM_Argc(void); const char *COM_Argv(size_t arg); // if argv > argc, returns empty string +char **COM_ArgvList(void); char *COM_Args(void); size_t COM_CheckParm(const char *check); // like M_CheckParm :) size_t COM_CheckPartialParm(const char *check); diff --git a/src/d_netcmd.c b/src/d_netcmd.c index dfd5e5615..f7e13dc92 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -143,11 +143,7 @@ static void Command_SetViews_f(void); static void Command_Addfilelocal(void); static void Command_Addfile(void); static void Command_Addskins(void); -static void Command_Localskin1(void); -static void Command_Localskin2(void); -static void Command_Localskin3(void); -static void Command_Localskin4(void); -static void Command_LocalskinAll(void); +static void Command_GLocalSkin(void); static void Command_ListWADS_f(void); #ifdef DELFILE static void Command_Delfile(void); @@ -657,11 +653,7 @@ void D_RegisterServerCommands(void) COM_AddCommand("addfilelocal", Command_Addfilelocal); COM_AddCommand("addfile", Command_Addfile); COM_AddCommand("addskins", Command_Addskins); - COM_AddCommand("localskin", Command_Localskin1); - COM_AddCommand("localskin2", Command_Localskin2); - COM_AddCommand("localskin3", Command_Localskin3); - COM_AddCommand("localskin4", Command_Localskin4); - COM_AddCommand("localskinall", Command_LocalskinAll); + COM_AddCommand("localskin", Command_GLocalSkin); COM_AddCommand("listwad", Command_ListWADS_f); #ifdef DELFILE @@ -4681,80 +4673,56 @@ Command_Addskins (void) */ } -static void Command_Localskin1 (void) { - if (!Playing() && !demo.playback) - { - CONS_Printf("You can only use this command in gameplay.\n"); - return; - } - if (COM_Argc() > 3) - { - CONS_Printf("localskin : Set a localskin.\n"); - return; - } - if (fasticmp(COM_Argv(2), "-display") || fasticmp(COM_Argv(2), "-d")) - SetLocalPlayerSkin(displayplayers[0], COM_Argv(1), &cv_localskin); - else - SetLocalPlayerSkin(consoleplayer, COM_Argv(1), &cv_localskin); -} +// args n stuff +#include "args.h" -static void Command_Localskin2 (void) { - if (!Playing() && !demo.playback) - { - CONS_Printf("You can only use this command in gameplay.\n"); - return; - } - if (COM_Argc() != 2) - { - CONS_Printf("localskin2 : Set a localskin.\n"); - return; - } - SetLocalPlayerSkin(displayplayers[1], COM_Argv(1), &cv_localskin2); -} +static void Command_GLocalSkin (void) { + ArgParser* parser = ap_new(); + ap_set_helptext(parser, "Usage: localskin [options] \n\nOptions: \n\ + -d, --display: Use the first displaying player instead of yourself.\n\ + Has no effect on replays. Omits any player related\n\ + options.\n\ + -a, --all: Set a localskin to all players. Omits any player related\n\ + options.\n\ + -p, --player: Set a localskin to a specific player name.\n\ + If omitted, defaults to the client player, unless -d \n\ + or --display is added."); + ap_set_version(parser, ""); + ap_str_opt(parser, "player p", player_names[consoleplayer]); + ap_flag(parser, "display d"); + ap_flag(parser, "all a"); -static void Command_Localskin3 (void) { - if (!Playing() && !demo.playback) - { - CONS_Printf("You can only use this command in gameplay.\n"); - return; - } - if (COM_Argc() != 2) - { - CONS_Printf("localskin3 : Set a localskin.\n"); - return; - } - SetLocalPlayerSkin(displayplayers[2], COM_Argv(1), &cv_localskin3); -} + ap_parse(parser, COM_Argc(), COM_ArgvList()); -static void Command_Localskin4 (void) { - if (!Playing() && !demo.playback) - { - CONS_Printf("You can only use this command in gameplay.\n"); - return; - } - if (COM_Argc() != 2) - { - CONS_Printf("localskin4 : Set a localskin.\n"); - return; - } - SetLocalPlayerSkin(displayplayers[3], COM_Argv(1), &cv_localskin4); -} + boolean disply; + boolean allp; -static void Command_LocalskinAll (void) { - if (!Playing() && !demo.playback) - { - CONS_Printf("You can only use this command in gameplay.\n"); - return; - } - if (COM_Argc() != 2) - { - CONS_Printf("localskinall : Set a localskin to all players.\n"); - return; - } - INT32 i; - for (i; i < MAXPLAYERS; i++) { - SetLocalPlayerSkin(i, COM_Argv(1), &cv_localskinall); + if (ap_found(parser, "display")) disply = true; else disply = false; + if (ap_found(parser, "all")) allp = true; else allp = false; + + INT32 i, idx; + i = 0; + idx = 0; + + for (idx = 0; idx < ap_count_args(parser); idx++) { + if (disply) { + SetLocalPlayerSkin(displayplayers[0], ap_arg(parser, idx), &cv_localskin); + return; + } else { + for (i = 0; i < MAXPLAYERS; i++) { + if (allp) { + SetLocalPlayerSkin(i, ap_arg(parser, idx), &cv_localskinall); + } else { + if (fasticmp(player_names[i], ap_str_value(parser, "player"))) { + SetLocalPlayerSkin(i, ap_arg(parser, idx), &cv_localskin); + break; + } + } + } + } } + + ap_free(parser); } #ifdef DELFILE diff --git a/src/p_enemy.c b/src/p_enemy.c index 1812ede5d..ecdb8c376 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -4173,6 +4173,12 @@ void A_SignPlayer(mobj_t *actor) // same thing happens on p_mobj.c ov->localskin = &localskins[actor->target->player->localskin - 1]; ov->skinlocal = actor->target->skinlocal; + } else { + // needs - 1 or else it pukes an error out + // same thing happens on p_mobj.c + if (actor->target->player->localskin) + ov->localskin = &skins[actor->target->player->localskin - 1]; + ov->skinlocal = actor->target->skinlocal; } P_SetMobjState(ov, actor->info->seestate); // S_PLAY_SIGN } diff --git a/src/r_things.c b/src/r_things.c index 4d21ed574..0f99661c6 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2880,7 +2880,9 @@ void R_InitSkins(void) strncpy(skin->facerank, "PLAYRANK", 9); strncpy(skin->facewant, "PLAYWANT", 9); strncpy(skin->facemmap, "PLAYMMAP", 9); + skin->wadnum = 0; // god what have you brought to this world skin->prefcolor = SKINCOLOR_BLUE; + skin->localskin = false; // SRB2kart skin->kartspeed = 8; @@ -3030,10 +3032,12 @@ void SetLocalPlayerSkin(INT32 playernum, const char *skinname, consvar_t *cvar) } } + /* if (player->localskin > 0) CV_StealthSet(cvar, ( (player->skinlocal) ? localskins : skins )[player->localskin - 1].name); else CV_StealthSet(cvar, "none"); + */ } // Same as SetPlayerSkin, but uses the skin #. @@ -3489,6 +3493,8 @@ next_token: Forceskin_cons_t[numskins+1].value = numskins; Forceskin_cons_t[numskins+1].strvalue = skins[numskins].name; } + + skin->localskin = local; // add face graphics if (local) { diff --git a/src/r_things.h b/src/r_things.h index 2d9e7a47f..af4b98e6b 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -97,6 +97,8 @@ typedef struct // specific sounds per skin sfxenum_t soundsid[NUMSKINSOUNDS]; // sound # in S_sfx table + + boolean localskin; } skin_t; extern CV_PossibleValue_t Forceskin_cons_t[]; -- 2.54.0 From 71e4005226874ca6dc333873284f07d5cd65c7e8 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 19:12:56 +0200 Subject: [PATCH 17/26] add menu n shit https://git.do.srb2.org/haya_/Kart-Public/-/commit/b85a55137cfef0a18b297c59e62018586323a2e9 --- src/d_netcmd.c | 22 ++++++------- src/d_netcmd.h | 6 ++-- src/lua_mobjlib.c | 18 +++++------ src/m_menu.c | 82 ++++++++++++++++++++++++++++++++++++++--------- src/r_things.c | 69 +++++++++++++++++++++------------------ src/r_things.h | 2 ++ 6 files changed, 128 insertions(+), 71 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index f7e13dc92..756d5607f 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -294,10 +294,6 @@ consvar_t cv_skin3 = {"skin3", DEFAULTSKIN3, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Sk consvar_t cv_skin4 = {"skin4", DEFAULTSKIN4, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin4_OnChange, 0, NULL, NULL, 0, 0, NULL}; // haha I've beaten you now, ONLINE consvar_t cv_localskin = {"internal___localskin", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_localskin2 = {"internal___localskin2", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_localskin3 = {"internal___localskin3", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_localskin4 = {"internal___localskin4", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_localskinall = {"internal___localskinall", "none", CV_HIDEN, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_skipmapcheck = {"skipmapcheck", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -456,6 +452,7 @@ static CV_PossibleValue_t basenumlaps_cons_t[] = {{1, "MIN"}, {50, "MAX"}, {0, " consvar_t cv_basenumlaps = {"basenumlaps", "Map default", CV_NETVAR|CV_CALL|CV_CHEAT, basenumlaps_cons_t, BaseNumLaps_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_forceskin = {"forceskin", "Off", CV_NETVAR|CV_CALL|CV_CHEAT, Forceskin_cons_t, ForceSkin_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_fakelocalskin = {"fakelocalskin", "None", CV_SAVE, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_downloading = {"downloading", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_allowexitlevel = {"allowexitlevel", "No", CV_NETVAR, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -477,6 +474,7 @@ consvar_t cv_showping = {"showping", "Always", CV_SAVE, showping_cons_t, NULL, 0 static CV_PossibleValue_t pingmeasurement_cons_t[] = {{0, "Frames"}, {1, "Milliseconds"}, {0, NULL}}; consvar_t cv_pingmeasurement = {"pingmeasurement", "Frames", CV_SAVE, pingmeasurement_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_luaimmersion = {"luaimmersion", "On", CV_SAVE, CV_OnOff, 0, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_minihead = {"smallminimapplayers", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -788,6 +786,9 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_showping); CV_RegisterVar(&cv_pingmeasurement); + CV_RegisterVar(&cv_luaimmersion); + CV_RegisterVar(&cv_fakelocalskin); + CV_RegisterVar(&cv_minihead); CV_RegisterVar(&cv_showminimapnames); @@ -901,18 +902,14 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_playername2); CV_RegisterVar(&cv_playercolor2); CV_RegisterVar(&cv_skin2); - CV_RegisterVar(&cv_localskin2); // third player CV_RegisterVar(&cv_playername3); CV_RegisterVar(&cv_playercolor3); CV_RegisterVar(&cv_skin3); - CV_RegisterVar(&cv_localskin3); // fourth player CV_RegisterVar(&cv_playername4); CV_RegisterVar(&cv_playercolor4); CV_RegisterVar(&cv_skin4); - CV_RegisterVar(&cv_localskin4); - CV_RegisterVar(&cv_localskinall); // preferred number of players CV_RegisterVar(&cv_splitplayers); @@ -4706,15 +4703,18 @@ static void Command_GLocalSkin (void) { for (idx = 0; idx < ap_count_args(parser); idx++) { if (disply) { - SetLocalPlayerSkin(displayplayers[0], ap_arg(parser, idx), &cv_localskin); + SetLocalPlayerSkin(displayplayers[0], ap_arg(parser, idx), NULL); return; } else { for (i = 0; i < MAXPLAYERS; i++) { if (allp) { - SetLocalPlayerSkin(i, ap_arg(parser, idx), &cv_localskinall); + SetLocalPlayerSkin(i, ap_arg(parser, idx), NULL); } else { if (fasticmp(player_names[i], ap_str_value(parser, "player"))) { - SetLocalPlayerSkin(i, ap_arg(parser, idx), &cv_localskin); + if (fasticmp(player_names[i], cv_playername.string)) + SetLocalPlayerSkin(i, ap_arg(parser, idx), &cv_localskin); + else + SetLocalPlayerSkin(i, ap_arg(parser, idx), NULL); break; } } diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 80c7078a0..e2c084e0d 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -26,18 +26,14 @@ extern consvar_t cv_localskin; extern consvar_t cv_playername2; extern consvar_t cv_playercolor2; extern consvar_t cv_skin2; -extern consvar_t cv_localskin2; // third splitscreen player extern consvar_t cv_playername3; extern consvar_t cv_playercolor3; extern consvar_t cv_skin3; -extern consvar_t cv_localskin3; // fourth splitscreen player extern consvar_t cv_playername4; extern consvar_t cv_playercolor4; extern consvar_t cv_skin4; -extern consvar_t cv_localskin4; -extern consvar_t cv_localskinall; // preferred number of players extern consvar_t cv_splitplayers; @@ -162,6 +158,8 @@ extern consvar_t cv_minihead; extern consvar_t cv_showlapemblem; extern consvar_t cv_showviewpointtext; +extern consvar_t cv_luaimmersion; +extern consvar_t cv_fakelocalskin; extern consvar_t cv_skipmapcheck; diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index a7f3d8580..39f9ab0bc 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -20,6 +20,7 @@ #include "g_game.h" #include "p_setup.h" #include "doomdef.h" +#include "d_netcmd.h" #include "lua_script.h" #include "lua_libs.h" @@ -351,11 +352,14 @@ int mobj_skin_getter(lua_State *L) if (!mo->skin) return 0; - if (mo->localskin) // pretty cool, but also destructive - lua_pushstring(L, ((skin_t *)mo->localskin)->name); - else + if (hud_running && cv_luaimmersion.value) { + if (mo->localskin) // HUD ONLY!!!!!!!!!! + lua_pushstring(L, ((skin_t *)mo->localskin)->name); + else + lua_pushstring(L, ((skin_t *)mo->skin)->name); + } else { lua_pushstring(L, ((skin_t *)mo->skin)->name); - + } return 1; } @@ -367,12 +371,6 @@ int mobj_skin_setter(lua_State *L) char skin[SKINNAMESIZE+1]; // all skin names are limited to this length strlcpy(skin, luaL_checkstring(L, 2), sizeof skin); strlwr(skin); // all skin names are lowercase - // nope, not this time chief. - if (fastcmp(localskins[players[consoleplayer].localskin - 1].name, skin)) - { - mo->skin = &skins[players[consoleplayer].skin]; // we dont want to use our local skin for this!!!!!!!!! - return 0; - } for (i = 0; i < numskins; i++) { { if (fastcmp(skins[i].name, skin)) diff --git a/src/m_menu.c b/src/m_menu.c index 872af2530..5189cd2e6 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -234,6 +234,8 @@ menu_t SR_MainDef, SR_UnlockChecklistDef; static void M_SinglePlayerMenu(INT32 choice); #endif static void M_Options(INT32 choice); +static void M_LocalSkinMenu(INT32 choice); +static void M_LocalSkinChange(INT32 choice); static void M_Manual(INT32 choice); static void M_SelectableClearMenus(INT32 choice); static void M_Retry(INT32 choice); @@ -350,6 +352,9 @@ 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; @@ -407,6 +412,7 @@ static void M_DrawConnectMenu(void); #endif static void M_DrawJoystick(void); static void M_DrawSetupMultiPlayerMenu(void); +static void M_DrawLocalSkinMenu(void); // Handling functions #ifndef NONET @@ -647,10 +653,11 @@ static menuitem_t MPauseMenu[] = {IT_STRING | IT_SUBMENU, NULL, "Switch Team...", &MISC_ChangeTeamDef, 48}, {IT_STRING | IT_SUBMENU, NULL, "Enter/Spectate...", &MISC_ChangeSpectateDef,48}, {IT_CALL | IT_STRING, NULL, "Player Setup...", M_SetupMultiPlayer, 56}, // alone - {IT_CALL | IT_STRING, NULL, "Options", M_Options, 64}, + {IT_CALL | IT_STRING, NULL, "Local Skin...", M_LocalSkinMenu, 64}, // alone + {IT_CALL | IT_STRING, NULL, "Options", M_Options, 72}, - {IT_CALL | IT_STRING, NULL, "Return to Title", M_EndGame, 80}, - {IT_CALL | IT_STRING, NULL, "Quit Game", M_QuitSRB2, 88}, + {IT_CALL | IT_STRING, NULL, "Return to Title", M_EndGame, 88}, + {IT_CALL | IT_STRING, NULL, "Quit Game", M_QuitSRB2, 96}, }; typedef enum @@ -674,6 +681,7 @@ typedef enum mpause_switchteam, mpause_switchspectate, mpause_psetup, + mpause_localskin, mpause_options, mpause_title, @@ -1128,6 +1136,7 @@ static menuitem_t OP_MainMenu[] = {IT_SUBMENU|IT_STRING, NULL, "Saturn Options...", &OP_SaturnDef, 140}, {IT_SUBMENU|IT_STRING, NULL, "Bird", &OP_BirdDef, 150}, + {IT_CALL|IT_STRING, NULL, "Fork Options...", M_LocalSkinMenu, 160}, }; static menuitem_t OP_ControlsMenu[] = @@ -1812,6 +1821,17 @@ static menuitem_t OP_BirdMenu[] = {IT_STRING | IT_SUBMENU, NULL, "Advanced Music Options...", &OP_AdvancedBirdDef, 120}, }; +static menuitem_t OP_ForkedBirdMenu[] = +{ + {IT_HEADER, NULL, "Local Skins", NULL, 0}, + {IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "Local Skin Name", &cv_fakelocalskin, 10}, + {IT_STRING2 | IT_SPACE, NULL, "Set to None for no Local Skin", NULL, 50}, + {IT_STRING | IT_CALL, NULL, "Apply to All Players", M_LocalSkinChange, 50}, + {IT_STRING | IT_CALL, NULL, "Apply to Displaying Player", M_LocalSkinChange, 60}, + {IT_STRING | IT_CALL, NULL, "Apply to Yourself", M_LocalSkinChange, 70}, + {IT_STRING | IT_CVAR, NULL, "Lua Immersion", &cv_luaimmersion, 90}, +}; + static menuitem_t OP_TiltMenu[] = { {IT_STRING | IT_CVAR, NULL, "Camera Tilting", &cv_tilting, 0}, @@ -2375,6 +2395,10 @@ menu_t OP_BirdDef = DEFAULTMENUSTYLE(NULL, OP_BirdMenu, &OP_MainDef, 30, 30); menu_t OP_TiltDef = DEFAULTMENUSTYLE(NULL, OP_TiltMenu, &OP_BirdDef, 30, 60); menu_t OP_AdvancedBirdDef = DEFAULTMENUSTYLE(NULL, OP_AdvancedBirdMenu, &OP_BirdDef, 30, 60); +menu_t OP_ForkedBirdDef = DEFAULTMENUSTYLE(NULL, OP_ForkedBirdMenu, &OP_MainDef, 30, 30); +menu_t OP_LocalSkinDef = DEFAULTMENUSTYLE(NULL, OP_TiltMenu, &OP_ForkedBirdDef, 30, 60); + + // ========================================================================== // CVAR ONCHANGE EVENTS GO HERE // ========================================================================== @@ -3571,7 +3595,7 @@ void M_StartControlPanel(void) else // multiplayer { MPauseMenu[mpause_switchmap].status = IT_DISABLED; - //MPauseMenu[mpause_addons].status = IT_DISABLED; + MPauseMenu[mpause_addons].status = IT_DISABLED; MPauseMenu[mpause_scramble].status = IT_DISABLED; MPauseMenu[mpause_psetupsplit].status = IT_DISABLED; MPauseMenu[mpause_psetupsplit2].status = IT_DISABLED; @@ -3593,9 +3617,10 @@ void M_StartControlPanel(void) MPauseMenu[mpause_switchteam].alphaKey = 48; MPauseMenu[mpause_switchspectate].alphaKey = 48; - MPauseMenu[mpause_options].alphaKey = 64; - MPauseMenu[mpause_title].alphaKey = 80; - MPauseMenu[mpause_quit].alphaKey = 88; + MPauseMenu[mpause_localskin].alphaKey = 64; + MPauseMenu[mpause_options].alphaKey = 72; + MPauseMenu[mpause_title].alphaKey = 88; + MPauseMenu[mpause_quit].alphaKey = 96; Dummymenuplayer_OnChange(); @@ -3605,6 +3630,9 @@ void M_StartControlPanel(void) MPauseMenu[mpause_addons].status = IT_STRING | IT_CALL; if (G_GametypeHasTeams()) MPauseMenu[mpause_scramble].status = IT_STRING | IT_SUBMENU; + } else { + MPauseMenu[mpause_addons].status = IT_STRING | IT_CALL; + MPauseMenu[mpause_addons].alphaKey += 8; } if (splitscreen) @@ -3618,6 +3646,7 @@ void M_StartControlPanel(void) { MPauseMenu[mpause_switchteam].status = IT_STRING | IT_SUBMENU; MPauseMenu[mpause_switchteam].alphaKey += ((splitscreen+1) * 8); + MPauseMenu[mpause_localskin].alphaKey += 8; MPauseMenu[mpause_options].alphaKey += 8; MPauseMenu[mpause_title].alphaKey += 8; MPauseMenu[mpause_quit].alphaKey += 8; @@ -3626,6 +3655,7 @@ void M_StartControlPanel(void) { MPauseMenu[mpause_switchspectate].status = IT_STRING | IT_SUBMENU; MPauseMenu[mpause_switchspectate].alphaKey += ((splitscreen+1) * 8); + MPauseMenu[mpause_localskin].alphaKey += 8; MPauseMenu[mpause_options].alphaKey += 8; MPauseMenu[mpause_title].alphaKey += 8; MPauseMenu[mpause_quit].alphaKey += 8; @@ -3636,6 +3666,7 @@ void M_StartControlPanel(void) { MPauseMenu[mpause_psetupsplit3].status = IT_STRING | IT_CALL; + MPauseMenu[mpause_localskin].alphaKey += 8; MPauseMenu[mpause_options].alphaKey += 8; MPauseMenu[mpause_title].alphaKey += 8; MPauseMenu[mpause_quit].alphaKey += 8; @@ -3643,6 +3674,7 @@ void M_StartControlPanel(void) if (splitscreen > 2) { MPauseMenu[mpause_psetupsplit4].status = IT_STRING | IT_CALL; + MPauseMenu[mpause_localskin].alphaKey += 8; MPauseMenu[mpause_options].alphaKey += 8; MPauseMenu[mpause_title].alphaKey += 8; MPauseMenu[mpause_quit].alphaKey += 8; @@ -4283,7 +4315,7 @@ static void M_DrawGenericMenu(void) y += STRINGHEIGHT; break; case IT_STRING2: - V_DrawString(x, y, lowercase, currentMenu->menuitems[i].text); + V_DrawString(((BASEVIDWIDTH - V_StringWidth(currentMenu->menuitems[i].text, 0))>>1), y, 0, currentMenu->menuitems[i].text); /* FALLTHRU */ case IT_DYLITLSPACE: y += SMALLLINEHEIGHT; @@ -6691,6 +6723,33 @@ static void M_Options(INT32 choice) OP_MainDef.prevMenu = currentMenu; M_SetupNextMenu(&OP_MainDef); } +static void M_LocalSkinMenu(INT32 choice) +{ + (void)choice; + + OP_ForkedBirdDef.prevMenu = currentMenu; + M_SetupNextMenu(&OP_ForkedBirdDef); +} + +static void M_LocalSkinChange(INT32 choice) +{ + (void)choice; + + switch (itemOn) { + case 3: + COM_BufAddText(va("localskin -a %s", cv_fakelocalskin.string)); + break; + case 4: + COM_BufAddText(va("localskin -d %s", cv_fakelocalskin.string)); + break; + case 5: + COM_BufAddText(va("localskin %s", cv_fakelocalskin.string)); + break; + default: + break; + } + S_StartSound(NULL, sfx_s221); +} static void M_Manual(INT32 choice) { @@ -10470,13 +10529,6 @@ static void M_DrawSetupMultiPlayerMenu(void) // draw box around guy V_DrawFill(mx + 43 - (charw/2), my+65, charw, 84, 239); - - if (setupm_skinlocal) - { - UINT8 *colmap; - colmap = R_GetTranslationColormap(setupm_fakeskin, setupm_fakecolor, GTC_MENUCACHE); - V_DrawFixedPatch(( mx + 43 - (charw/2) + 1 )<wadnum = 0; // god what have you brought to this world skin->prefcolor = SKINCOLOR_BLUE; skin->localskin = false; + skin->localnum = 0; // SRB2kart skin->kartspeed = 8; @@ -2922,6 +2923,20 @@ INT32 R_SkinAvailable(const char *name) return -1; } +// returns true if the skin name is found (loaded from pwad) +// warning return -1 if not found +INT32 R_AnySkinAvailable(const char *name) +{ + INT32 i; + + for (i = 0; i < numallskins; i++) + { + if (stricmp(allskins[i].name,name)==0) + return i; + } + return -1; +} + INT32 R_LocalSkinAvailable(const char *name, boolean local) { INT32 i; @@ -2968,13 +2983,6 @@ void SetLocalPlayerSkin(INT32 playernum, const char *skinname, consvar_t *cvar) { player_t *player = &players[playernum]; INT32 i; - - // this is where we're gonna use major mod for. - if (wadfiles[skins[player->skin].wadnum]->majormod && !demo.playback) - { - CONS_Alert(CONS_ERROR, M_GetText("Cannot set localskin to %s because the player's skin is modifying the game.\n"), skinname); - return; - } if (strcasecmp(skinname, "none")) { @@ -2984,12 +2992,6 @@ void SetLocalPlayerSkin(INT32 playernum, const char *skinname, consvar_t *cvar) if (stricmp(localskins[i].name, skinname) == 0) { player->localskin = 1 + i; - if (wadfiles[localskins[player->localskin - 1].wadnum]->majormod && !demo.playback) - { - CONS_Alert(CONS_ERROR, M_GetText("Cannot set localskin to %s because the localskin is a gameplay-modifying addon.\n"), skinname); - player->localskin = 0; - return; - } player->skinlocal = true; if (player->mo) { @@ -3005,12 +3007,6 @@ void SetLocalPlayerSkin(INT32 playernum, const char *skinname, consvar_t *cvar) if (stricmp(skins[i].name, skinname) == 0) { player->localskin = 1 + i; - if (wadfiles[skins[player->localskin - 1].wadnum]->majormod && !demo.playback) - { - CONS_Alert(CONS_ERROR, M_GetText("Cannot set localskin to %s because the skin is a gameplay-modifying addon.\n"), skinname); - player->localskin = 0; - return; - } player->skinlocal = false; if (player->mo) { @@ -3032,12 +3028,16 @@ void SetLocalPlayerSkin(INT32 playernum, const char *skinname, consvar_t *cvar) } } - /* - if (player->localskin > 0) - CV_StealthSet(cvar, ( (player->skinlocal) ? localskins : skins )[player->localskin - 1].name); - else - CV_StealthSet(cvar, "none"); - */ + if (cvar != NULL) { + if (player->localskin > 0) { + CV_StealthSet(&cv_fakelocalskin, ( (player->skinlocal) ? localskins : skins )[player->localskin - 1].name); + CV_StealthSet(cvar, ( (player->skinlocal) ? localskins : skins )[player->localskin - 1].name); + } + else { + CV_StealthSet(&cv_fakelocalskin, "none"); + CV_StealthSet(cvar, "none"); + } + } } // Same as SetPlayerSkin, but uses the skin #. @@ -3495,6 +3495,11 @@ next_token: } skin->localskin = local; + // so we dont have to guess + if (local) + skin->localnum = numlocalskins; + else + skin->localnum = numskins; // add face graphics if (local) { @@ -3507,12 +3512,14 @@ next_token: if (rendermode == render_opengl) HWR_AddPlayerMD2(( (local) ? numlocalskins : numskins ), local); #endif - skinstats[skin->kartspeed-1][skin->kartweight-1][skinstatscount[skin->kartspeed-1][skin->kartweight-1]] = numskins; - CONS_Debug(DBG_SETUP, M_GetText("Added %d to %d, %d\n"), numskins, skin->kartweight, skin->kartweight); - skinstatscount[skin->kartspeed-1][skin->kartweight-1]++; - CONS_Debug(DBG_SETUP, M_GetText("Incremented %d, %d to %d\n"), skin->kartspeed, skin->kartweight, skinstatscount[skin->kartspeed - 1][skin->kartweight - 1]); - - skinsorted[numskins] = numskins; + if (!local) { + skinstats[skin->kartspeed-1][skin->kartweight-1][skinstatscount[skin->kartspeed-1][skin->kartweight-1]] = numskins; + CONS_Debug(DBG_SETUP, M_GetText("Added %d to %d, %d\n"), numskins, skin->kartweight, skin->kartweight); + skinstatscount[skin->kartspeed-1][skin->kartweight-1]++; + CONS_Debug(DBG_SETUP, M_GetText("Incremented %d, %d to %d\n"), skin->kartspeed, skin->kartweight, skinstatscount[skin->kartspeed - 1][skin->kartweight - 1]); + + skinsorted[numskins] = numskins; + } allskins[numallskins] = ( (local) ? localskins : skins )[( (local) ? numlocalskins : numskins )]; diff --git a/src/r_things.h b/src/r_things.h index af4b98e6b..833edd5fd 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -99,6 +99,7 @@ typedef struct sfxenum_t soundsid[NUMSKINSOUNDS]; // sound # in S_sfx table boolean localskin; + INT32 localnum; } skin_t; extern CV_PossibleValue_t Forceskin_cons_t[]; @@ -218,6 +219,7 @@ boolean SetPlayerSkin(INT32 playernum,const char *skinname); void SetPlayerSkinByNum(INT32 playernum,INT32 skinnum); // Tails 03-16-2002 void SetLocalPlayerSkin(INT32 playernum,const char *skinname, consvar_t *cvar); INT32 R_SkinAvailable(const char *name); +INT32 R_AnySkinAvailable(const char *name); INT32 R_LocalSkinAvailable(const char *name, boolean local); void R_AddSkins(UINT16 wadnum, boolean local); -- 2.54.0 From 71056064754e4c2b22c3959984484b3edc7ad2db Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 19:14:41 +0200 Subject: [PATCH 18/26] more menu shit - Youll now get a preview of what skin is going to be used. - Removed redundant code https://git.do.srb2.org/haya_/Kart-Public/-/commit/a6728c26f76bfc94f7bc07aa076c8979c9bef5c9 --- src/m_menu.c | 176 +++++++++++++++++++++++++++++++++++++++++---------- src/w_wad.c | 9 --- 2 files changed, 143 insertions(+), 42 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 5189cd2e6..c5a2798f6 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1825,11 +1825,11 @@ static menuitem_t OP_ForkedBirdMenu[] = { {IT_HEADER, NULL, "Local Skins", NULL, 0}, {IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "Local Skin Name", &cv_fakelocalskin, 10}, - {IT_STRING2 | IT_SPACE, NULL, "Set to None for no Local Skin", NULL, 50}, - {IT_STRING | IT_CALL, NULL, "Apply to All Players", M_LocalSkinChange, 50}, - {IT_STRING | IT_CALL, NULL, "Apply to Displaying Player", M_LocalSkinChange, 60}, - {IT_STRING | IT_CALL, NULL, "Apply to Yourself", M_LocalSkinChange, 70}, - {IT_STRING | IT_CVAR, NULL, "Lua Immersion", &cv_luaimmersion, 90}, + {IT_STRING2 | IT_SPACE, NULL, "Set to None for no Local Skin", NULL, 20}, + {IT_STRING | IT_CALL, NULL, "Apply to All Players", M_LocalSkinChange, 140}, + {IT_STRING | IT_CALL, NULL, "Apply to Displaying Player", M_LocalSkinChange, 150}, + {IT_STRING | IT_CALL, NULL, "Apply to Yourself", M_LocalSkinChange, 160}, + {IT_STRING | IT_CVAR, NULL, "Lua Immersion", &cv_luaimmersion, 170}, }; static menuitem_t OP_TiltMenu[] = @@ -2395,7 +2395,17 @@ menu_t OP_BirdDef = DEFAULTMENUSTYLE(NULL, OP_BirdMenu, &OP_MainDef, 30, 30); menu_t OP_TiltDef = DEFAULTMENUSTYLE(NULL, OP_TiltMenu, &OP_BirdDef, 30, 60); menu_t OP_AdvancedBirdDef = DEFAULTMENUSTYLE(NULL, OP_AdvancedBirdMenu, &OP_BirdDef, 30, 60); -menu_t OP_ForkedBirdDef = DEFAULTMENUSTYLE(NULL, OP_ForkedBirdMenu, &OP_MainDef, 30, 30); +menu_t OP_ForkedBirdDef = { + NULL, + sizeof(OP_ForkedBirdMenu)/sizeof(menuitem_t), + &OP_MainDef, + OP_ForkedBirdMenu, + M_DrawLocalSkinMenu, + 30, 6, + 0, + NULL +}; + menu_t OP_LocalSkinDef = DEFAULTMENUSTYLE(NULL, OP_TiltMenu, &OP_ForkedBirdDef, 30, 60); @@ -6723,33 +6733,6 @@ static void M_Options(INT32 choice) OP_MainDef.prevMenu = currentMenu; M_SetupNextMenu(&OP_MainDef); } -static void M_LocalSkinMenu(INT32 choice) -{ - (void)choice; - - OP_ForkedBirdDef.prevMenu = currentMenu; - M_SetupNextMenu(&OP_ForkedBirdDef); -} - -static void M_LocalSkinChange(INT32 choice) -{ - (void)choice; - - switch (itemOn) { - case 3: - COM_BufAddText(va("localskin -a %s", cv_fakelocalskin.string)); - break; - case 4: - COM_BufAddText(va("localskin -d %s", cv_fakelocalskin.string)); - break; - case 5: - COM_BufAddText(va("localskin %s", cv_fakelocalskin.string)); - break; - default: - break; - } - S_StartSound(NULL, sfx_s221); -} static void M_Manual(INT32 choice) { @@ -11972,6 +11955,133 @@ static void M_DrawHUDOptions(void) V_DrawRightAlignedString(x, y, highlightflags, "("); } +static void M_LocalSkinMenu(INT32 choice) +{ + (void)choice; + + multi_state = &states[mobjinfo[MT_PLAYER].seestate]; + multi_tics = multi_state->tics; + + OP_ForkedBirdDef.prevMenu = currentMenu; + M_SetupNextMenu(&OP_ForkedBirdDef); +} + +static void M_LocalSkinChange(INT32 choice) +{ + (void)choice; + + switch (itemOn) { + case 3: + COM_BufAddText(va("localskin -a %s", cv_fakelocalskin.string)); + break; + case 4: + COM_BufAddText(va("localskin -d %s", cv_fakelocalskin.string)); + break; + case 5: + COM_BufAddText(va("localskin %s", cv_fakelocalskin.string)); + break; + default: + break; + } + S_StartSound(NULL, sfx_s221); +} + +// Display our localskin in our goofy ahhhh local skin menu +static void M_DrawLocalSkinMenu(void) +{ + INT32 mx, my, st, flags = 0; + spritedef_t *sprdef; + spriteframe_t *sprframe; + patch_t *patch; + UINT8 frame; + UINT8 skintodisplay; + UINT32 speenframe; + + mx = OP_ForkedBirdDef.x; + my = OP_ForkedBirdDef.y; + + // use generic drawer for cursor, items and title + M_DrawGenericMenu(); + + #define charw 72 + + // anim the player in the box + if (--multi_tics <= 0) + { + st = multi_state->nextstate; + if (st != S_NULL) + multi_state = &states[st]; + multi_tics = multi_state->tics; + if (multi_tics == -1) + multi_tics = 15; + } + + // skin 0 is default player sprite + if (R_AnySkinAvailable(cv_fakelocalskin.string) != -1) + { + sprdef = &allskins[R_AnySkinAvailable(cv_fakelocalskin.string)].spritedef; + skintodisplay = R_AnySkinAvailable(cv_fakelocalskin.string); + } + else + { + // ATTEMPT TO FIND REAL SKIN + if (R_AnySkinAvailable(cv_skin.string) != -1) + { + sprdef = &allskins[R_AnySkinAvailable(cv_skin.string)].spritedef; + skintodisplay = R_AnySkinAvailable(cv_skin.string); + } else { // STILL NOTHIN? use sonic instead + sprdef = &allskins[0].spritedef; + skintodisplay = 0; + } + } + + if (!sprdef->numframes) // No frames ?? + return; // Can't render! + + frame = multi_state->frame & FF_FRAMEMASK; + if (frame >= sprdef->numframes) // Walking animation missing + frame = 0; // Try to use standing frame + + sprframe = &sprdef->spriteframes[frame]; + + //minenice's speen css, it's a piece of shit but hey + //patch = W_CachePatchNum(sprframe->lumppat[1], PU_CACHE); + speenframe = (I_GetTime()*cv_skinselectspin.value/TICRATE + 1)%8; + + //this is a very shitty solution for checking if a sprite needs flipping + //but it works + if ((sprframe->lumppat[speenframe] == sprframe->lumppat[8-speenframe]) && (speenframe > 4)) { + flags = V_FLIP; // This sprite is left/right flipped! + } + patch = W_CachePatchNum(sprframe->lumppat[speenframe], PU_CACHE); + + // draw box around guy + V_DrawFill(mx + 220 - (charw/2), my+54, charw, 84, 239); + + // draw player sprite + UINT8 *colormap = R_GetTranslationColormap(skintodisplay, cv_playercolor.value, GTC_MENUCACHE); + colormap = R_GetLocalTranslationColormap(&skins[allskins[skintodisplay].localnum], (allskins[skintodisplay].localskin ? &localskins[allskins[skintodisplay].localnum] : NULL), cv_playercolor.value, GTC_MENUCACHE, allskins[skintodisplay].localskin); + + V_DrawMappedPatch(mx, my+50, 0, W_CachePatchName(allskins[skintodisplay].facewant, PU_CACHE), colormap); + V_DrawMappedPatch(mx+8, my+85, 0, W_CachePatchName(allskins[skintodisplay].facerank, PU_CACHE), colormap); + V_DrawString(mx, my+108, V_ALLOWLOWERCASE, "Character"); + if (strlen(allskins[skintodisplay].realname) > 10) + V_DrawThinString(mx+20, my+118, V_ALLOWLOWERCASE|highlightflags, allskins[skintodisplay].realname); + else + V_DrawString(mx+20, my+118, V_ALLOWLOWERCASE|highlightflags, allskins[skintodisplay].realname); + + if (allskins[skintodisplay].flags & SF_HIRES) + { + V_DrawFixedPatch((mx+220)< Date: Wed, 30 Aug 2023 19:15:22 +0200 Subject: [PATCH 19/26] smol fix --- src/m_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_menu.c b/src/m_menu.c index c5a2798f6..ea58fec96 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -12046,7 +12046,7 @@ static void M_DrawLocalSkinMenu(void) //minenice's speen css, it's a piece of shit but hey //patch = W_CachePatchNum(sprframe->lumppat[1], PU_CACHE); - speenframe = (I_GetTime()*cv_skinselectspin.value/TICRATE + 1)%8; + speenframe = (I_GetTime()*4/TICRATE + 1)%8; //this is a very shitty solution for checking if a sprite needs flipping //but it works -- 2.54.0 From 002c5502637a78e189afdd2bf7972c0c231c3e37 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 19:17:51 +0200 Subject: [PATCH 20/26] more fixes ugh --- src/d_netcmd.c | 2 +- src/m_menu.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 756d5607f..6460b7c62 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -4659,7 +4659,7 @@ Command_Addskins (void) return; } else { */ - P_AddWadFile(COM_Argv(1), 0, true); + P_AddWadFile(COM_Argv(1), true); /* } } else { diff --git a/src/m_menu.c b/src/m_menu.c index ea58fec96..033268539 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -5671,7 +5671,7 @@ static void M_HandleAddons(INT32 choice) // no characters? if (DumbStartsWith("KC_", dirmenu[dir_on[menudepthleft]]+DIR_STRING)) { M_StartMessage(va("%c%s\x80\nYou are loading a local skin.\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),NULL,MM_NOTHING); - COM_BufAddText(va("addskins \"%s%s\" -force", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); + COM_BufAddText(va("addskins \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); } else S_StartSound(NULL, sfx_s26d); -- 2.54.0 From a4e96d2380836f0cf30dcf68b5c6545d1fd26bcb Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 30 Aug 2023 19:20:35 +0200 Subject: [PATCH 21/26] bruh --- src/Makefile | 1 + src/args.c | 48 ++++++++++++++++++++++++------------------------ src/args.h | 20 ++++++++++---------- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/Makefile b/src/Makefile index 6825d5600..064c6b0be 100644 --- a/src/Makefile +++ b/src/Makefile @@ -626,6 +626,7 @@ OBJS:=$(i_main_o) \ $(OBJDIR)/lzf.o \ $(OBJDIR)/vid_copy.o \ $(OBJDIR)/b_bot.o \ + $(OBJDIR)/args.o \ $(i_cdmus_o) \ $(i_net_o) \ $(i_system_o) \ diff --git a/src/args.c b/src/args.c index 465208e47..88eec9092 100644 --- a/src/args.c +++ b/src/args.c @@ -1,4 +1,4 @@ -#include +#include "doomtype.h" #include #include #include @@ -106,7 +106,7 @@ static void vec_free(Vec* vec) { } -static bool vec_add(Vec* vec, void* entry) { +static boolean vec_add(Vec* vec, void* entry) { if (vec->count + 1 > vec->capacity) { int new_capacity = vec->capacity < 8 ? 8 : vec->capacity * 2; void** new_array = realloc(vec->entries, sizeof(void*) * new_capacity); @@ -191,7 +191,7 @@ static MapEntry* map_find(Map* map, const char* key, uint32_t key_hash) { } -static bool map_grow(Map* map) { +static boolean map_grow(Map* map) { MapEntry* old_entries = map->entries; int old_capacity = map->capacity; int new_capacity = old_capacity < 8 ? 8 : old_capacity * 2; @@ -227,7 +227,7 @@ static bool map_grow(Map* map) { // Returns true if the key was found. -static bool map_get(Map* map, const char* key, void** value) { +static boolean map_get(Map* map, const char* key, void** value) { if (map->count == 0) return false; uint32_t key_hash = str_hash(key); @@ -241,7 +241,7 @@ static bool map_get(Map* map, const char* key, void** value) { // Adds a new entry to the map or updates the value of an existing entry. // (Note that the map stores its own internal copy of the key string.) -static bool map_set(Map* map, const char* key, void* value) { +static boolean map_set(Map* map, const char* key, void* value) { if (map->count == map->max_load_threshold) { if (!map_grow(map)) { return false; @@ -269,7 +269,7 @@ static bool map_set(Map* map, const char* key, void* value) { // Convenience wrapper for map_set(). This splits the key string into space- // separated words and adds a separate entry to the map for each word. -static bool map_set_splitkey(Map* map, const char* key_string, void* value) { +static boolean map_set_splitkey(Map* map, const char* key_string, void* value) { char *copy_of_key_string = str_dup(key_string); if (!copy_of_key_string) { return false; @@ -343,7 +343,7 @@ static void option_free(Option* opt) { } -static bool option_append_value(Option* opt, OptionValue value) { +static boolean option_append_value(Option* opt, OptionValue value) { if (opt->count + 1 > opt->capacity) { int new_capacity = opt->capacity < 4 ? 4 : opt->capacity * 2; OptionValue* new_array = realloc(opt->values, sizeof(OptionValue) * new_capacity); @@ -359,7 +359,7 @@ static bool option_append_value(Option* opt, OptionValue value) { } -static bool option_try_set(Option* opt, char* arg) { +static boolean option_try_set(Option* opt, char* arg) { if (opt->type == OPT_STR) { return option_append_value(opt, (OptionValue){.str_val = arg}); } @@ -579,7 +579,7 @@ static char* argstream_next(ArgStream* stream) { } -static bool argstream_has_next(ArgStream* stream) { +static boolean argstream_has_next(ArgStream* stream) { return stream->index < stream->count; } @@ -600,10 +600,10 @@ struct ArgParser { ap_callback_t callback; char* cmd_name; struct ArgParser* cmd_parser; - bool enable_help_command; - bool had_memory_error; + boolean enable_help_command; + boolean had_memory_error; struct ArgParser* parent; - bool first_positional_arg_ends_options; + boolean first_positional_arg_ends_options; }; @@ -748,7 +748,7 @@ char* ap_get_version(ArgParser* parser) { } -void ap_first_pos_arg_ends_options(ArgParser* parser, bool enable) { +void ap_first_pos_arg_ends_options(ArgParser* parser, boolean enable) { parser->first_positional_arg_ends_options = enable; } @@ -832,7 +832,7 @@ int ap_count(ArgParser* parser, const char* name) { // Returns true if the specified flag or option was found. -bool ap_found(ArgParser* parser, const char* name) { +boolean ap_found(ArgParser* parser, const char* name) { Option* opt = ap_get_opt(parser, name); return opt->count > 0; } @@ -913,7 +913,7 @@ double* ap_dbl_values(ArgParser* parser, const char* name) { // Returns true if the parser has found one or more positional arguments. -bool ap_has_args(ArgParser* parser) { +boolean ap_has_args(ArgParser* parser) { return parser->positional_args->count > 0; } @@ -1016,7 +1016,7 @@ void ap_callback(ArgParser* parser, ap_callback_t function) { // Returns true if the parser has found a command. -bool ap_has_cmd(ArgParser* parser) { +boolean ap_has_cmd(ArgParser* parser) { return parser->cmd_name != NULL; } @@ -1034,7 +1034,7 @@ ArgParser* ap_cmd_parser(ArgParser* parser) { // Toggles support for the automatic 'help' command. -void ap_enable_help_command(ArgParser* parser, bool enable) { +void ap_enable_help_command(ArgParser* parser, boolean enable) { parser->enable_help_command = enable; } @@ -1056,7 +1056,7 @@ static void ap_handle_equals_opt(ArgParser* parser, const char* prefix, const ch char *value = strchr(arg, '=') + 1; Option* option; - bool found = map_get(parser->option_map, name, (void**)&option); + boolean found = map_get(parser->option_map, name, (void**)&option); if (!found || option->type == OPT_FLAG) { err(va("%s%s is not a recognised option name", prefix, name)); @@ -1101,7 +1101,7 @@ static void ap_handle_short_opt(ArgParser* parser, const char* arg, ArgStream* s for (size_t i = 0; i < strlen(arg); i++) { char keystr[] = {arg[i], 0}; Option* option; - bool found = map_get(parser->option_map, keystr, (void**)&option); + boolean found = map_get(parser->option_map, keystr, (void**)&option); if (!found) { if (arg[i] == 'h' && parser->helptext != NULL) { CONS_Printf("%s\n", parser->helptext); @@ -1134,7 +1134,7 @@ static void ap_parse_stream(ArgParser* parser, ArgStream* stream) { } ArgParser* cmd_parser; - bool is_first_arg = true; + boolean is_first_arg = true; while (argstream_has_next(stream)) { char* arg = argstream_next(stream); @@ -1216,7 +1216,7 @@ static void ap_parse_stream(ArgParser* parser, ArgStream* stream) { // Parse an array of string arguments. -static bool ap_parse_array(ArgParser* parser, int count, char* args[]) { +static boolean ap_parse_array(ArgParser* parser, int count, char* args[]) { if (parser->had_memory_error) { return false; } @@ -1237,7 +1237,7 @@ static bool ap_parse_array(ArgParser* parser, int count, char* args[]) { // are the arguments passed to main(), i.e. that the first element in [argv] is the program's name // and should be ignored when parsing the actual *arguments*. In some situations [argv] can be // empty, i.e. [argc == 0], which can lead to security vulnerabilities if not explicitly handled. -bool ap_parse(ArgParser* parser, int argc, char* argv[]) { +boolean ap_parse(ArgParser* parser, int argc, char* argv[]) { if (argc > 1) { return ap_parse_array(parser, argc - 1, argv + 1); } @@ -1250,7 +1250,7 @@ bool ap_parse(ArgParser* parser, int argc, char* argv[]) { /* --------------------- */ -bool ap_had_memory_error(ArgParser* parser) { +boolean ap_had_memory_error(ArgParser* parser) { return parser->had_memory_error; } @@ -1294,7 +1294,7 @@ void ap_print(ArgParser* parser) { /* --------------------- */ -void ap_cmd_help(ArgParser* parser, bool enable) { +void ap_cmd_help(ArgParser* parser, boolean enable) { ap_enable_help_command(parser, enable); } diff --git a/src/args.h b/src/args.h index 39cd57b5c..e2db1e501 100644 --- a/src/args.h +++ b/src/args.h @@ -8,7 +8,7 @@ #ifndef args_h #define args_h -#include +#include "doomtype.h" // ----------------------------------------------------------------------------- // Types. @@ -51,7 +51,7 @@ char* ap_get_version(ArgParser* parser); // If toggled to true, the first positional argument ends option parsing; all // subsequent arguments will be treated as positionals. Defaults to false. -void ap_first_pos_arg_ends_options(ArgParser* parser, bool enable); +void ap_first_pos_arg_ends_options(ArgParser* parser, boolean enable); // Parses the application's command line arguments. The parameters are assumed // to be [argc] and [argv] as supplied to main(), i.e. the first element of the @@ -59,7 +59,7 @@ void ap_first_pos_arg_ends_options(ArgParser* parser, bool enable); // if the arguments were successfully parsed. Returns false if parsing failed // due to a memory allocation error. (This memory allocation error may have // occured during set-up rather than during parsing.) -bool ap_parse(ArgParser* parser, int argc, char** argv); +boolean ap_parse(ArgParser* parser, int argc, char** argv); // Frees the memory associated with the parser and any subparsers. void ap_free(ArgParser* parser); @@ -88,7 +88,7 @@ void ap_dbl_opt(ArgParser* parser, const char* name, double fallback); int ap_count(ArgParser* parser, const char* name); // Returns true if the specified flag or option was found. -bool ap_found(ArgParser* parser, const char* name); +boolean ap_found(ArgParser* parser, const char* name); // Returns the value of a string option. char* ap_str_value(ArgParser* parser, const char* name); @@ -128,7 +128,7 @@ double* ap_dbl_values(ArgParser* parser, const char* name); // ----------------------------------------------------------------------------- // Returns true if the parser has found one or more positional arguments. -bool ap_has_args(ArgParser* parser); +boolean ap_has_args(ArgParser* parser); // Returns the number of positional arguments. int ap_count_args(ArgParser* parser); @@ -166,7 +166,7 @@ ArgParser* ap_cmd(ArgParser* parser, const char* name); void ap_callback(ArgParser* parser, ap_callback_t function); // Returns true if the parser has found a command. -bool ap_has_cmd(ArgParser* parser); +boolean ap_has_cmd(ArgParser* parser); // Returns the command name, if the parser has found a command. char* ap_cmd_name(ArgParser* parser); @@ -174,11 +174,11 @@ char* ap_cmd_name(ArgParser* parser); // Returns the command's parser instance, if the parser has found a command. ArgParser* ap_cmd_parser(ArgParser* parser); -// This boolean switch toggles support for an automatic 'help' command that +// This booleanean switch toggles support for an automatic 'help' command that // prints subcommand helptext. The value defaults to false but gets toggled // automatically to true whenever a command is registered. You can use this // function to disable the feature if required. -void ap_enable_help_command(ArgParser* parser, bool enable); +void ap_enable_help_command(ArgParser* parser, boolean enable); // ----------------------------------------------------------------------------- // Debugging utilities. @@ -188,14 +188,14 @@ void ap_enable_help_command(ArgParser* parser, bool enable); void ap_print(ArgParser* parser); // True if an attempt to allocate memory failed. -bool ap_had_memory_error(ArgParser* parser); +boolean ap_had_memory_error(ArgParser* parser); // ----------------------------------------------------------------------------- // Deprecated. // ----------------------------------------------------------------------------- // Replaced by ap_enable_help_command(). -void ap_cmd_help(ArgParser* parser, bool enable); +void ap_cmd_help(ArgParser* parser, boolean enable); // Replaced by ap_set_helptext(). void ap_helptext(ArgParser* parser, const char* helptext); -- 2.54.0 From 9ba5c9a38b3817f558b900fd08abfb2938709c52 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Thu, 31 Aug 2023 03:35:42 +0200 Subject: [PATCH 22/26] bruuuuuh --- src/k_kart.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 5fc7a1bd0..0f2170263 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8665,11 +8665,16 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, pat UINT8 *colormap = R_GetTranslationColormap((mo->colorized) ? TC_RAINBOW : skin, mo->color, GTC_CACHE); if (cv_minihead.value == 1) - V_DrawFixedPatch(amxpos + (2 * FRACUNIT), amypos + (2 * FRACUNIT), FRACUNIT/2, flags, facemmapprefix[skin], colormap); - else if (cv_minihead.value == 0) + { colormap = R_GetLocalTranslationColormap(mo->skin, mo->localskin, mo->color, GTC_CACHE, skinlocal); - V_DrawFixedPatch(amxpos, amypos, FRACUNIT, flags, ( (skinlocal) ? localfacemmapprefix : facemmapprefix )[skin], colormap); - + V_DrawFixedPatch(amxpos + (2 * FRACUNIT), amypos + (2 * FRACUNIT), FRACUNIT/2, flags, ( (skinlocal) ? localfacemmapprefix : facemmapprefix )[skin], colormap); + } + else if (cv_minihead.value == 0) + { + colormap = R_GetLocalTranslationColormap(mo->skin, mo->localskin, mo->color, GTC_CACHE, skinlocal); + V_DrawFixedPatch(amxpos, amypos, FRACUNIT, flags, ( (skinlocal) ? localfacemmapprefix : facemmapprefix )[skin], colormap); + } + if (cv_showminimapnames.value && !(modeattacking || gamestate == GS_TIMEATTACK)) { const char *player_name = va("%c%s", V_GetSkincolorChar(mo->color), player_names[mo->player - players]); -- 2.54.0 From 0a6f700c6fb34fd73db9812f21332207edde3627 Mon Sep 17 00:00:00 2001 From: Indev Date: Thu, 31 Aug 2023 13:59:30 +0300 Subject: [PATCH 23/26] Addon browser can now be in 2 states - loading addons and loading localskins, which fixes its behavior when trying to load character addon as server admin --- src/m_menu.c | 54 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 033268539..ba3df2e82 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -145,6 +145,8 @@ INT32 mapwads[NUMMAPS]; //static char *char_notes = NULL; //static fixed_t char_scroll = 0; +boolean browselocalskins = false; + boolean menuactive = false; boolean fromlevelselect = false; @@ -338,7 +340,9 @@ menu_t OP_MonitorToggleDef; static void M_ScreenshotOptions(INT32 choice); static void M_EraseData(INT32 choice); +static void M_AddonsInternal(); static void M_Addons(INT32 choice); +static void M_LocalSkins(INT32 choice); static void M_AddonsOptions(INT32 choice); static patch_t *addonsp[NUM_EXT+5]; @@ -633,12 +637,13 @@ typedef enum // --------------------- static menuitem_t MPauseMenu[] = { - {IT_STRING | IT_CALL, NULL, "Addons...", M_Addons, 8}, - {IT_STRING | IT_SUBMENU, NULL, "Scramble Teams...", &MISC_ScrambleTeamDef, 16}, - {IT_STRING | IT_CALL, NULL, "Switch Map..." , M_MapChange, 24}, + {IT_STRING | IT_CALL, NULL, "Addons...", M_Addons, 8}, + {IT_STRING | IT_CALL, NULL, "Add local skins...", M_LocalSkins, 16}, + {IT_STRING | IT_SUBMENU, NULL, "Scramble Teams...", &MISC_ScrambleTeamDef, 24}, + {IT_STRING | IT_CALL, NULL, "Switch Map..." , M_MapChange, 32}, #ifdef HAVE_DISCORDRPC - {IT_STRING | IT_SUBMENU, NULL, "Ask To Join Requests...", &MISC_DiscordRequestsDef, 24}, + {IT_STRING | IT_SUBMENU, NULL, "Ask To Join Requests...", &MISC_DiscordRequestsDef, 32}, #endif {IT_CALL | IT_STRING, NULL, "Continue", M_SelectableClearMenus, 40}, @@ -663,6 +668,7 @@ static menuitem_t MPauseMenu[] = typedef enum { mpause_addons = 0, + mpause_addlocalskins, mpause_scramble, mpause_switchmap, #ifdef HAVE_DISCORDRPC @@ -3622,6 +3628,7 @@ void M_StartControlPanel(void) // Reset these in case splitscreen messes things up MPauseMenu[mpause_addons].alphaKey = 8; + MPauseMenu[mpause_addlocalskins].alphaKey = 16; MPauseMenu[mpause_scramble].alphaKey = 8; MPauseMenu[mpause_switchmap].alphaKey = 24; @@ -3640,9 +3647,6 @@ void M_StartControlPanel(void) MPauseMenu[mpause_addons].status = IT_STRING | IT_CALL; if (G_GametypeHasTeams()) MPauseMenu[mpause_scramble].status = IT_STRING | IT_SUBMENU; - } else { - MPauseMenu[mpause_addons].status = IT_STRING | IT_CALL; - MPauseMenu[mpause_addons].alphaKey += 8; } if (splitscreen) @@ -5152,12 +5156,10 @@ static void M_AddonsOptions(INT32 choice) #define LOCATIONSTRING1 "Visit \x83SRB2.ORG/MODS\x80 to get & make addons!" #define LOCATIONSTRING2 "Visit \x88SRB2.ORG/MODS\x80 to get & make addons!" -static void M_Addons(INT32 choice) +static void M_AddonsInternal() { const char *pathname = "."; - (void)choice; - #if 1 if (cv_addons_option.value == 0) pathname = usehome ? srb2home : srb2path; @@ -5218,6 +5220,20 @@ static void M_Addons(INT32 choice) M_SetupNextMenu(&MISC_AddonsDef); } +static void M_Addons(INT32 choice) +{ + (void)choice; + browselocalskins = false; + M_AddonsInternal(); +} + +static void M_LocalSkins(INT32 choice) +{ + (void)choice; + browselocalskins = true; + M_AddonsInternal(); +} + #define width 4 #define vpadding 27 #define h (BASEVIDHEIGHT-(2*vpadding)) @@ -5370,7 +5386,12 @@ static void M_DrawAddons(void) } if (Playing()) - V_DrawCenteredString(BASEVIDWIDTH/2, 5, warningflags, "Adding files mid-game may cause problems."); + { + if (browselocalskins) + V_DrawCenteredString(BASEVIDWIDTH/2, 5, V_ALLOWLOWERCASE, "Load \x83local skins\x80 from addons!"); + else + V_DrawCenteredString(BASEVIDWIDTH/2, 5, warningflags, "Adding files mid-game may cause problems."); + } else V_DrawCenteredString(BASEVIDWIDTH/2, 5, 0, (recommendedflags == V_SKYMAP ? LOCATIONSTRING2 : LOCATIONSTRING1)); @@ -5667,14 +5688,9 @@ static void M_HandleAddons(INT32 choice) case EXT_KART: #endif case EXT_PK3: - if (netgame || multiplayer) { - // no characters? - if (DumbStartsWith("KC_", dirmenu[dir_on[menudepthleft]]+DIR_STRING)) { - M_StartMessage(va("%c%s\x80\nYou are loading a local skin.\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),NULL,MM_NOTHING); - COM_BufAddText(va("addskins \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); - } - else - S_StartSound(NULL, sfx_s26d); + if (browselocalskins) { + M_StartMessage(va("%c%s\x80\nYou are loading a local skin.\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),NULL,MM_NOTHING); + COM_BufAddText(va("addskins \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); } else COM_BufAddText(va("addfile \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); -- 2.54.0 From 5760f25c74edd574c1c49c4704b4d7d463866786 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Thu, 31 Aug 2023 13:41:25 +0200 Subject: [PATCH 24/26] readd the namecheck to addlocalskin menu until we find a better way to check for skins c: --- src/m_menu.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index ba3df2e82..965221e6e 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -5689,8 +5689,12 @@ static void M_HandleAddons(INT32 choice) #endif case EXT_PK3: if (browselocalskins) { - M_StartMessage(va("%c%s\x80\nYou are loading a local skin.\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),NULL,MM_NOTHING); - COM_BufAddText(va("addskins \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); + if (DumbStartsWith("KC_", dirmenu[dir_on[menudepthleft]]+DIR_STRING)) { + M_StartMessage(va("%c%s\x80\nYou are loading a local skin.\nLocal skins will not be usable\nafter going back from\nthe title screen.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),NULL,MM_NOTHING); + COM_BufAddText(va("addskins \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); + } + else + S_StartSound(NULL, sfx_s26d); } else COM_BufAddText(va("addfile \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); -- 2.54.0 From ddcd6b0d314e66e15200d64a50ea982ffa742e8e Mon Sep 17 00:00:00 2001 From: hayaunderscore Date: Sat, 2 Sep 2023 13:06:12 +0800 Subject: [PATCH 25/26] Redo `localskin` command --- src/d_netcmd.c | 141 +++++++++++++++++++++++++++++++++---------------- src/m_menu.c | 2 +- 2 files changed, 97 insertions(+), 46 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 025360b39..f30cc4f75 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -4676,56 +4676,107 @@ Command_Addskins (void) // args n stuff #include "args.h" -static void Command_GLocalSkin (void) { - ArgParser* parser = ap_new(); - ap_set_helptext(parser, "Usage: localskin [options] \n\nOptions: \n\ - -d, --display: Use the first displaying player instead of yourself.\n\ - Has no effect on replays. Omits any player related\n\ - options.\n\ - -a, --all: Set a localskin to all players. Omits any player related\n\ - options.\n\ - -p, --player: Set a localskin to a specific player name.\n\ - If omitted, defaults to the client player, unless -d \n\ - or --display is added."); - ap_set_version(parser, ""); - ap_str_opt(parser, "player p", player_names[consoleplayer]); - ap_flag(parser, "display d"); - ap_flag(parser, "all a"); +static void Command_GLocalSkin (void) +{ + size_t first_option; + size_t option_display; + size_t option_all; + size_t option_player; + + option_player = COM_CheckPartialParm("-p"); + option_display = COM_CheckPartialParm("-d"); + option_all = COM_CheckPartialParm("-a"); - ap_parse(parser, COM_Argc(), COM_ArgvList()); + char* fuck; // local skin name - boolean disply; - boolean allp; + if (!( first_option = COM_FirstOption() )) + first_option = COM_Argc(); - if (ap_found(parser, "display")) disply = true; else disply = false; - if (ap_found(parser, "all")) allp = true; else allp = false; - - INT32 i, idx; - i = 0; - idx = 0; - - for (idx = 0; idx < ap_count_args(parser); idx++) { - if (disply) { - SetLocalPlayerSkin(displayplayers[0], ap_arg(parser, idx), NULL); - return; - } else { - for (i = 0; i < MAXPLAYERS; i++) { - if (allp) { - SetLocalPlayerSkin(i, ap_arg(parser, idx), NULL); - } else { - if (fasticmp(player_names[i], ap_str_value(parser, "player"))) { - if (fasticmp(player_names[i], cv_playername.string)) - SetLocalPlayerSkin(i, ap_arg(parser, idx), &cv_localskin); - else - SetLocalPlayerSkin(i, ap_arg(parser, idx), NULL); - break; - } - } - } - } + if (first_option < 2) + { + /* holy fucking shit */ + CONS_Printf("localskin [-player ] [-display ] [-all]:\n"); + CONS_Printf(M_GetText("Set a localskin via its internal name (usually printed on the console).\n\n\ +* Using \"-player\" will set a localskin to a specified player.\n\ + Defaults to yourself.\n\ +* Using \"-display\" will set a localskin to the displayed player.\n\ + Defaults to 0, which is the first player displayed.\n\ + Can go up to 3 for splitscreen.\n\ +* Using \"-all\" will set a localskin to ALL players.\n\ +* \"localskin none\" removes the localskin, just like how\n\ + \"forceskin none\" does.\n")); + return; } - ap_free(parser); + fuck = ConcatCommandArgv(1, first_option); + + char* player_name = player_names[consoleplayer]; + char* display_num = "0"; + size_t dnum = 0; + + if (option_display) // -display + { + // handle default: 0 + if (COM_Argv(option_display + 1)[0] == "" || COM_Argv(option_display + 1)[0] != "-") + display_num = COM_Argv(option_display + 1); + + if (isdigit(display_num[0]) || display_num == "0") + { + dnum = atoi(display_num); + if (dnum > 3 || dnum < 0) // nuh uh + dnum = 0; + SetLocalPlayerSkin(displayplayers[dnum], fuck, NULL); + + CONS_Printf("Successfully applied localskin to displayed player.\n"); + return; + } + + CONS_Printf("Could not apply localskin.\n"); + + return; + } + else if (option_all) // -all + { + int i; + + for (i = 0; i < MAXPLAYERS; ++i) + { + if (!playeringame[i]) + continue; + SetLocalPlayerSkin(i, fuck, NULL); + } + CONS_Printf("Successfully applied localskin to all players.\n"); + + return; + } + else // -player or no other arguments + { + if (option_player) + { + int i; + player_name = COM_Argv(option_player + 1); + + for (i = 0; i < MAXPLAYERS; ++i) + { + if (fasticmp(player_names[i], player_name)) + SetLocalPlayerSkin(i, fuck, NULL); + } + CONS_Printf("Successfully applied localskin to specified player.\n"); + + return; + } + else + { + SetLocalPlayerSkin(consoleplayer, fuck, &cv_localskin); + CONS_Printf("Successfully applied localskin.\n"); + + return; + } + + CONS_Printf("Could not apply localskin.\n"); + + return; + } } #ifdef DELFILE diff --git a/src/m_menu.c b/src/m_menu.c index ceba6185b..c99bf003d 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -11999,7 +11999,7 @@ static void M_LocalSkinChange(INT32 choice) COM_BufAddText(va("localskin -a %s", cv_fakelocalskin.string)); break; case 4: - COM_BufAddText(va("localskin -d %s", cv_fakelocalskin.string)); + COM_BufAddText(va("localskin -d 0 %s", cv_fakelocalskin.string)); break; case 5: COM_BufAddText(va("localskin %s", cv_fakelocalskin.string)); -- 2.54.0 From 1ecdd3dae69e18af5e9008e0af154d69ae84c401 Mon Sep 17 00:00:00 2001 From: hayaunderscore Date: Thu, 14 Sep 2023 08:54:33 +0800 Subject: [PATCH 26/26] fix compilation error --- src/sdl/i_video.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index d08b267f0..e236d1fca 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1297,7 +1297,7 @@ void I_GetEvent(void) break; case SDL_DROPFILE: dropped_filedir = evt.drop.file; - P_AddWadFile(dropped_filedir); + P_AddWadFile(dropped_filedir, false); SDL_free(dropped_filedir); // Free dropped_filedir memory break; case SDL_QUIT: -- 2.54.0