From a4742c7da7738326916699371f9c70061bfccb2b Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 16 Dec 2021 18:34:51 -0800 Subject: [PATCH 01/48] P_AddWadFile: only load textures in current file --- src/p_setup.c | 2 +- src/r_textures.c | 229 +++++++++++++++++++++++++++-------------------- src/r_textures.h | 1 + 3 files changed, 133 insertions(+), 99 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index fab5429b8..e36c20a0a 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4452,7 +4452,7 @@ boolean P_AddWadFile(const char *wadfilename) // Reload it all anyway, just in case they // added some textures but didn't insert a // TEXTURES/etc. list. - R_LoadTextures(); // numtexture changes + R_LoadTexturesPwad(wadnum); // numtexture changes // Reload ANIMDEFS P_InitPicAnims(); diff --git a/src/r_textures.c b/src/r_textures.c index 4ec110556..76e78f00e 100644 --- a/src/r_textures.c +++ b/src/r_textures.c @@ -926,27 +926,53 @@ Rloadtextures (INT32 i, INT32 w) return i; } -// -// R_LoadTextures -// Initializes the texture list with the textures from the world map. -// -void R_LoadTextures(void) +static INT32 +count_range +( const char * marker_start, + const char * marker_end, + const char * folder, + UINT16 wadnum) { - INT32 i, w; UINT16 j; - UINT16 texstart, texend, texturesLumpPos; + UINT16 texstart, texend; + INT32 count = 0; - // Free previous memory before numtextures change. - if (numtextures) + // Count flats + if (wadfiles[wadnum]->type == RET_PK3) { - for (i = 0; i < numtextures; i++) - { - Z_Free(textures[i]); - Z_Free(texturecache[i]); - } - Z_Free(texturetranslation); - Z_Free(textures); + texstart = W_CheckNumForFolderStartPK3(folder, wadnum, 0); + texend = W_CheckNumForFolderEndPK3(folder, wadnum, texstart); } + else + { + texstart = W_CheckNumForMarkerStartPwad(marker_start, wadnum, 0); + texend = W_CheckNumForNamePwad(marker_end, wadnum, texstart); + } + + if (texstart != INT16_MAX && texend != INT16_MAX) + { + // PK3s have subfolders, so we can't just make a simple sum + if (wadfiles[wadnum]->type == RET_PK3) + { + for (j = texstart; j < texend; j++) + { + if (!W_IsLumpFolder(wadnum, j)) // Check if lump is a folder; if not, then count it + count++; + } + } + else // Add all the textures between markers + { + count += (texend - texstart); + } + } + + return count; +} + +static INT32 R_CountTextures(UINT16 wadnum) +{ + UINT16 texturesLumpPos; + INT32 count = 0; // Load patches and textures. @@ -955,106 +981,76 @@ void R_LoadTextures(void) // the markers. // This system will allocate memory for all duplicate/patched textures even if it never uses them, // but the alternative is to spend a ton of time checking and re-checking all previous entries just to skip any potentially patched textures. - for (w = 0, numtextures = 0; w < numwadfiles; w++) - { + #ifdef WALLFLATS - // Count flats - if (wadfiles[w]->type == RET_PK3) - { - texstart = W_CheckNumForFolderStartPK3("flats/", (UINT16)w, 0); - texend = W_CheckNumForFolderEndPK3("flats/", (UINT16)w, texstart); - } - else - { - texstart = W_CheckNumForMarkerStartPwad("F_START", (UINT16)w, 0); - texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart); - } + count += count_range("F_START", "F_END", "flats/", wadnum); +#endif - if (!( texstart == INT16_MAX || texend == INT16_MAX )) - { - // PK3s have subfolders, so we can't just make a simple sum - if (wadfiles[w]->type == RET_PK3) - { - for (j = texstart; j < texend; j++) - { - if (!W_IsLumpFolder((UINT16)w, j)) // Check if lump is a folder; if not, then count it - numtextures++; - } - } - else // Add all the textures between F_START and F_END - { - numtextures += (UINT32)(texend - texstart); - } - } -#endif/*WALLFLATS*/ + // Count the textures from TEXTURES lumps + texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", wadnum, 0); - // Count the textures from TEXTURES lumps - texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0); - while (texturesLumpPos != INT16_MAX) - { - numtextures += R_CountTexturesInTEXTURESLump((UINT16)w, (UINT16)texturesLumpPos); - texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, texturesLumpPos + 1); - } - - // Count single-patch textures - if (wadfiles[w]->type == RET_PK3) - { - texstart = W_CheckNumForFolderStartPK3("textures/", (UINT16)w, 0); - texend = W_CheckNumForFolderEndPK3("textures/", (UINT16)w, texstart); - } - else - { - texstart = W_CheckNumForMarkerStartPwad(TX_START, (UINT16)w, 0); - texend = W_CheckNumForNamePwad(TX_END, (UINT16)w, 0); - } - - if (texstart == INT16_MAX || texend == INT16_MAX) - continue; - - // PK3s have subfolders, so we can't just make a simple sum - if (wadfiles[w]->type == RET_PK3) - { - for (j = texstart; j < texend; j++) - { - if (!W_IsLumpFolder((UINT16)w, j)) // Check if lump is a folder; if not, then count it - numtextures++; - } - } - else // Add all the textures between TX_START and TX_END - { - numtextures += (UINT32)(texend - texstart); - } + while (texturesLumpPos != INT16_MAX) + { + count += R_CountTexturesInTEXTURESLump(wadnum, texturesLumpPos); + texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", wadnum, texturesLumpPos + 1); } - // If no textures found by this point, bomb out - if (!numtextures) - I_Error("No textures detected in any WADs!\n"); + // Count single-patch textures + count += count_range(TX_START, TX_END, "textures/", wadnum); + + return count; +} + +static void +recallocuser +( void * user, + size_t old, + size_t new) +{ + char *p = Z_Realloc(*(void**)user, + new, PU_STATIC, user); + + if (new > old) + memset(&p[old], 0, (new - old)); +} + +static void R_AllocateTextures(INT32 add) +{ + const INT32 newtextures = (numtextures + add); + const size_t newsize = newtextures * sizeof (void*); + const size_t oldsize = numtextures * sizeof (void*); + + INT32 i; // Allocate memory and initialize to 0 for all the textures we are initialising. - // There are actually 5 buffers allocated in one for convenience. - textures = Z_Calloc((numtextures * sizeof(void *)) * 5, PU_STATIC, NULL); + recallocuser(&textures, oldsize, newsize); // Allocate texture column offset table. - texturecolumnofs = (void *)((UINT8 *)textures + (numtextures * sizeof(void *))); + recallocuser(&texturecolumnofs, oldsize, newsize); // Allocate texture referencing cache. - texturecache = (void *)((UINT8 *)textures + ((numtextures * sizeof(void *)) * 2)); + recallocuser(&texturecache, oldsize, newsize); // Allocate texture width table. - texturewidth = (void *)((UINT8 *)textures + ((numtextures * sizeof(void *)) * 3)); + recallocuser(&texturewidth, oldsize, newsize); // Allocate texture height table. - textureheight = (void *)((UINT8 *)textures + ((numtextures * sizeof(void *)) * 4)); + recallocuser(&textureheight, oldsize, newsize); // Create translation table for global animation. - texturetranslation = Z_Malloc((numtextures + 1) * sizeof(*texturetranslation), PU_STATIC, NULL); + Z_Realloc(texturetranslation, (newtextures + 1) * sizeof(*texturetranslation), PU_STATIC, &texturetranslation); - for (i = 0; i < numtextures; i++) + for (i = numtextures; i < newtextures; ++i) texturetranslation[i] = i; +} - for (i = 0, w = 0; w < numwadfiles; w++) - { +static INT32 R_DefineTextures(INT32 i, UINT16 w) +{ #ifdef WALLFLATS - i = Rloadflats(i, w); + i = Rloadflats(i, w); #endif - i = Rloadtextures(i, w); - } + return Rloadtextures(i, w); +} + +static void R_FinishLoadingTextures(INT32 add) +{ + numtextures += add; #ifdef HWRENDER if (rendermode == render_opengl) @@ -1062,6 +1058,43 @@ void R_LoadTextures(void) #endif } +// +// R_LoadTextures +// Initializes the texture list with the textures from the world map. +// +void R_LoadTextures(void) +{ + INT32 i, w; + INT32 newtextures = 0; + + for (w = 0; w < numwadfiles; w++) + { + newtextures += R_CountTextures((UINT16)w); + } + + // If no textures found by this point, bomb out + if (!newtextures) + I_Error("No textures detected in any WADs!\n"); + + R_AllocateTextures(newtextures); + + for (i = 0, w = 0; w < numwadfiles; w++) + { + i = R_DefineTextures(i, w); + } + + R_FinishLoadingTextures(newtextures); +} + +void R_LoadTexturesPwad(UINT16 wadnum) +{ + INT32 newtextures = R_CountTextures(wadnum); + + R_AllocateTextures(newtextures); + R_DefineTextures(numtextures, wadnum); + R_FinishLoadingTextures(newtextures); +} + static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch) { char *texturesToken; diff --git a/src/r_textures.h b/src/r_textures.h index 6e0cc168a..bd737c231 100644 --- a/src/r_textures.h +++ b/src/r_textures.h @@ -76,6 +76,7 @@ extern UINT8 **texturecache; // graphics data for each generated full-size textu // Load TEXTURES definitions, create lookup tables void R_LoadTextures(void); +void R_LoadTexturesPwad(UINT16 wadnum); void R_FlushTextureCache(void); // Texture generation From 4578e6f8f12248de5afff859658f5237d702c7b9 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 16 Dec 2021 22:10:36 -0800 Subject: [PATCH 02/48] Hash name lookup for textures and lumps --- src/doomdef.h | 16 ++++++++++++++++ src/r_textures.c | 12 ++++++++++-- src/r_textures.h | 1 + src/w_wad.c | 19 ++++++++++++++++--- src/w_wad.h | 1 + 5 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/doomdef.h b/src/doomdef.h index ff6d2c1e5..ee17fb689 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -550,6 +550,22 @@ extern boolean capslock; // i_system.c, replace getchar() once the keyboard has been appropriated INT32 I_GetKey(void); +/* http://www.cse.yorku.ca/~oz/hash.html */ +static inline +UINT32 quickncasehash (const char *p, size_t n) +{ + size_t i = 0; + UINT32 x = 5381; + + while (i < n && p[i]) + { + x = (x * 33) ^ tolower(p[i]); + i++; + } + + return x; +} + #ifndef min // Double-Check with WATTCP-32's cdefs.h #define min(x, y) (((x) < (y)) ? (x) : (y)) #endif diff --git a/src/r_textures.c b/src/r_textures.c index 76e78f00e..23574e8bb 100644 --- a/src/r_textures.c +++ b/src/r_textures.c @@ -59,6 +59,7 @@ INT32 *texturetranslation; // Painfully simple texture id cacheing to make maps load faster. :3 static struct { char name[9]; + UINT32 hash; INT32 id; } *tidcache = NULL; static INT32 tidcachelen = 0; @@ -788,6 +789,7 @@ Rloadflats (INT32 i, INT32 w) // Set texture properties. M_Memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name)); + texture->hash = quickncasehash(texture->name, 8); #ifndef NO_PNG_LUMPS if (Picture_IsLumpPNG(header, lumplength)) @@ -886,6 +888,7 @@ Rloadtextures (INT32 i, INT32 w) // Set texture properties. M_Memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name)); + texture->hash = quickncasehash(texture->name, 8); #ifndef NO_PNG_LUMPS if (Picture_IsLumpPNG((UINT8 *)&patchlump, lumplength)) @@ -1401,6 +1404,7 @@ static texture_t *R_ParseTexture(boolean actuallyLoadTexture) // Allocate memory for a zero-patch texture. Obviously, we'll be adding patches momentarily. resultTexture = (texture_t *)Z_Calloc(sizeof(texture_t),PU_STATIC,NULL); M_Memcpy(resultTexture->name, newTextureName, 8); + resultTexture->hash = quickncasehash(newTextureName, 8); resultTexture->width = newTextureWidth; resultTexture->height = newTextureHeight; resultTexture->type = TEXTURETYPE_COMPOSITE; @@ -1626,25 +1630,29 @@ void R_ClearTextureNumCache(boolean btell) INT32 R_CheckTextureNumForName(const char *name) { INT32 i; + UINT32 hash; // "NoTexture" marker. if (name[0] == '-') return 0; + hash = quickncasehash(name, 8); + for (i = 0; i < tidcachelen; i++) - if (!strncasecmp(tidcache[i].name, name, 8)) + if (tidcache[i].hash == hash && !strncasecmp(tidcache[i].name, name, 8)) return tidcache[i].id; // Need to parse the list backwards, so textures loaded more recently are used in lieu of ones loaded earlier //for (i = 0; i < numtextures; i++) <- old for (i = (numtextures - 1); i >= 0; i--) // <- new - if (!strncasecmp(textures[i]->name, name, 8)) + if (textures[i]->hash == hash && !strncasecmp(textures[i]->name, name, 8)) { tidcachelen++; Z_Realloc(tidcache, tidcachelen * sizeof(*tidcache), PU_STATIC, &tidcache); strncpy(tidcache[tidcachelen-1].name, name, 8); tidcache[tidcachelen-1].name[8] = '\0'; CONS_Debug(DBG_SETUP, "texture #%s: %s\n", sizeu1(tidcachelen), tidcache[tidcachelen-1].name); + tidcache[tidcachelen-1].hash = hash; tidcache[tidcachelen-1].id = i; return i; } diff --git a/src/r_textures.h b/src/r_textures.h index bd737c231..90eadcf5c 100644 --- a/src/r_textures.h +++ b/src/r_textures.h @@ -54,6 +54,7 @@ typedef struct { // Keep name for switch changing, etc. char name[8]; + UINT32 hash; UINT8 type; // TEXTURETYPE_ INT16 width, height; boolean holes; diff --git a/src/w_wad.c b/src/w_wad.c index 60339c426..4e1d00780 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -354,6 +354,7 @@ static lumpinfo_t* ResGetLumpsStandalone (FILE* handle, UINT16* numlumps, const lumpinfo->size = ftell(handle); fseek(handle, 0, SEEK_SET); strcpy(lumpinfo->name, lumpname); + lumpinfo->hash = quickncasehash(lumpname, 8); // Allocate the lump's long name. lumpinfo->longname = Z_Malloc(9 * sizeof(char), PU_STATIC, NULL); @@ -451,6 +452,7 @@ static lumpinfo_t* ResGetLumpsWad (FILE* handle, UINT16* nlmp, const char* filen lump_p->compression = CM_NOCOMPRESSION; memset(lump_p->name, 0x00, 9); strncpy(lump_p->name, fileinfo->name, 8); + lump_p->hash = quickncasehash(lump_p->name, 8); // Allocate the lump's long name. lump_p->longname = Z_Malloc(9 * sizeof(char), PU_STATIC, NULL); @@ -625,6 +627,7 @@ static lumpinfo_t* ResGetLumpsZip (FILE* handle, UINT16* nlmp) memset(lump_p->name, '\0', 9); // Making sure they're initialized to 0. Is it necessary? strncpy(lump_p->name, trimname, min(8, dotpos - trimname)); + lump_p->hash = quickncasehash(lump_p->name, 8); lump_p->longname = Z_Calloc(dotpos - trimname + 1, PU_STATIC, NULL); strlcpy(lump_p->longname, trimname, dotpos - trimname + 1); @@ -974,12 +977,14 @@ UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump) { UINT16 i; static char uname[8 + 1]; + UINT32 hash; if (!TestValidLump(wad,0)) return INT16_MAX; strlcpy(uname, name, sizeof uname); strupr(uname); + hash = quickncasehash(uname, 8); // // scan forward @@ -990,7 +995,7 @@ UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump) { lumpinfo_t *lump_p = wadfiles[wad]->lumpinfo + startlump; for (i = startlump; i < wadfiles[wad]->numlumps; i++, lump_p++) - if (!strncmp(lump_p->name, uname, sizeof(uname) - 1)) + if (lump_p->hash == hash && !strncmp(lump_p->name, uname, sizeof(uname) - 1)) return i; } @@ -1193,15 +1198,20 @@ lumpnum_t W_CheckNumForLongName(const char *name) // TODO: Make it search through cache first, maybe...? lumpnum_t W_CheckNumForMap(const char *name) { + UINT32 hash = quickncasehash(name, 8); UINT16 lumpNum, end; UINT32 i; + lumpinfo_t *p; for (i = numwadfiles - 1; i < numwadfiles; i--) { if (wadfiles[i]->type == RET_WAD) { for (lumpNum = 0; lumpNum < wadfiles[i]->numlumps; lumpNum++) - if (!strncmp(name, (wadfiles[i]->lumpinfo + lumpNum)->name, 8)) + { + p = wadfiles[i]->lumpinfo + lumpNum; + if (p->hash == hash && !strncmp(name, p->name, 8)) return (i<<16) + lumpNum; + } } else if (wadfiles[i]->type == RET_PK3) { @@ -1212,8 +1222,11 @@ lumpnum_t W_CheckNumForMap(const char *name) continue; // Now look for the specified map. for (; lumpNum < end; lumpNum++) - if (!strnicmp(name, (wadfiles[i]->lumpinfo + lumpNum)->name, 8)) + { + p = wadfiles[i]->lumpinfo + lumpNum; + if (p->hash == hash && !strnicmp(name, p->name, 8)) return (i<<16) + lumpNum; + } } } return LUMPERROR; diff --git a/src/w_wad.h b/src/w_wad.h index b6bf94be8..55e3e0072 100644 --- a/src/w_wad.h +++ b/src/w_wad.h @@ -67,6 +67,7 @@ typedef struct unsigned long position; // filelump_t filepos unsigned long disksize; // filelump_t size char name[9]; // filelump_t name[] e.g. "LongEntr" + UINT32 hash; char *longname; // e.g. "LongEntryName" char *fullname; // e.g. "Folder/Subfolder/LongEntryName.extension" size_t size; // real (uncompressed) size From ffa2af7e0745050f65d558df7b48c4340bb6c6e9 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 16 Dec 2021 22:25:08 -0800 Subject: [PATCH 03/48] Disable flat animdefs The speed up is significant. --- src/p_spec.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/p_spec.c b/src/p_spec.c index caf4704d2..d60d9cc06 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -212,6 +212,12 @@ void P_InitPicAnims(void) lastanim->picnum = R_TextureNumForName(animdefs[i].endname); lastanim->basepic = R_TextureNumForName(animdefs[i].startname); } + else + { + CONS_Alert(CONS_WARNING, "ANIMDEFS flats are disabled; flat support in general will be removed soon! (%s, %s)\n", animdefs[i].startname, animdefs[i].endname); + continue; + } +#if 0 else { if ((W_CheckNumForName(animdefs[i].startname)) == LUMPERROR) @@ -220,6 +226,7 @@ void P_InitPicAnims(void) lastanim->picnum = R_GetFlatNumForName(animdefs[i].endname); lastanim->basepic = R_GetFlatNumForName(animdefs[i].startname); } +#endif lastanim->istexture = animdefs[i].istexture; lastanim->numpics = lastanim->picnum - lastanim->basepic + 1; From 8012d006845119e37e4342b4fcb300310671ab05 Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 17 Dec 2021 01:06:38 -0800 Subject: [PATCH 04/48] Add HU_UpdatePatch, recaches patch only if it exists in pwad --- src/hu_stuff.c | 38 +++++++++++++++++++++++++++++++++----- src/hu_stuff.h | 3 ++- src/p_setup.c | 6 ++++++ src/p_setup.h | 2 ++ 4 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 7afc7d531..e9b3d4c41 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -302,19 +302,47 @@ void HU_Init(void) HU_LoadGraphics(); } -patch_t *HU_CachePatch(const char *format, ...) +patch_t *HU_UpdatePatch(patch_t **user, const char *format, ...) { va_list ap; char buffer[9]; + lumpnum_t lump; + patch_t *patch; + va_start (ap, format); - vsprintf(buffer, format, ap); + vsnprintf(buffer, sizeof buffer, format, ap); va_end (ap); - if (W_CheckNumForName(buffer) == LUMPERROR) - return NULL; + if (user && p_adding_file != INT16_MAX) + { + lump = W_CheckNumForNamePwad(buffer, p_adding_file, 0); + + /* no update in this wad */ + if (lump == INT16_MAX) + return *user; + + lump |= (p_adding_file << 16); + } else - return (patch_t *)W_CachePatchName(buffer, PU_HUDGFX); + { + lump = W_CheckNumForName(buffer); + + if (lump == LUMPERROR) + return NULL; + } + + patch = W_CachePatchNum(lump, PU_HUDGFX); + + if (user) + { + if (*user) + Patch_Free(*user); + + *user = patch; + } + + return patch; } static inline void HU_Stop(void) diff --git a/src/hu_stuff.h b/src/hu_stuff.h index 4d686516e..a8d8bee22 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -123,7 +123,8 @@ void HU_Init(void); void HU_LoadGraphics(void); // Load a HUDGFX patch or NULL. -patch_t *HU_CachePatch(const char *format, ...); +patch_t *HU_UpdatePatch(patch_t **user, const char *format, ...); +#define HU_CachePatch(...) HU_UpdatePatch(NULL, __VA_ARGS__) // reset heads up when consoleplayer respawns. void HU_Start(void); diff --git a/src/p_setup.c b/src/p_setup.c index e36c20a0a..62cb26d81 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4319,6 +4319,8 @@ static lumpinfo_t* FindFolder(const char *folName, UINT16 *start, UINT16 *end, l return lumpinfo; } +UINT16 p_adding_file = INT16_MAX; + // // Add a wadfile to the active wad files, // replace sounds, musics, patches, textures, sprites and maps @@ -4356,6 +4358,8 @@ boolean P_AddWadFile(const char *wadfilename) else wadnum = (UINT16)(numwadfiles-1); + p_adding_file = wadnum; + switch(wadfiles[wadnum]->type) { case RET_PK3: @@ -4538,5 +4542,7 @@ boolean P_AddWadFile(const char *wadfilename) refreshdirmenu &= ~REFRESHDIR_GAMEDATA; // Under usual circumstances we'd wait for REFRESHDIR_GAMEDATA to disappear the next frame, but it's a bit too dangerous for that... + p_adding_file = INT16_MAX; + return true; } diff --git a/src/p_setup.h b/src/p_setup.h index 0a7587ec0..cbb697b0e 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -93,6 +93,8 @@ INT32 P_CheckLevelFlat(const char *flatname); extern size_t nummapthings; extern mapthing_t *mapthings; +extern UINT16 p_adding_file; + void P_SetupLevelSky(const char *skytexname, boolean global); #ifdef SCANTHINGS void P_ScanThings(INT16 mapnum, INT16 wadnum, INT16 lumpnum); From 8de36a9ab07304860230c6b31cea3942a654f046 Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 17 Dec 2021 01:40:58 -0800 Subject: [PATCH 05/48] Load titlecard font with font system --- src/hu_stuff.c | 36 +++++++++++------------------------- src/hu_stuff.h | 8 +++----- src/v_video.c | 10 +++++----- 3 files changed, 19 insertions(+), 35 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index e9b3d4c41..2a0bfa90c 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -73,8 +73,6 @@ patch_t *pinggfx[5]; // small ping graphic patch_t *mping[5]; // smaller ping graphic -patch_t *tc_font[2][LT_FONTSIZE]; // Special font stuff for titlecard - patch_t *framecounter; patch_t *frameslash; // framerate stuff. Used in screen.c @@ -180,8 +178,7 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum); void HU_LoadGraphics(void) { - char buffer[9]; - INT32 i, j; + INT32 i; if (dedicated) return; @@ -194,27 +191,6 @@ void HU_LoadGraphics(void) emblemicon = HU_CachePatch("EMBLICON"); songcreditbg = HU_CachePatch("K_SONGCR"); - // Cache titlecard font - j = LT_FONTSTART; - for (i = 0; i < LT_FONTSIZE; i++, j++) - { - // cache the titlecard font - - // Bottom layer - sprintf(buffer, "GTOL%.3d", j); - if (W_CheckNumForName(buffer) == LUMPERROR) - tc_font[0][i] = NULL; - else - tc_font[0][i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX); - - // Top layer - sprintf(buffer, "GTFN%.3d", j); - if (W_CheckNumForName(buffer) == LUMPERROR) - tc_font[1][i] = NULL; - else - tc_font[1][i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX); - } - // cache ping gfx: for (i = 0; i < 5; i++) { @@ -279,6 +255,16 @@ void HU_Init(void) PR ("CRFNT"); REG; + DIG (3); + + ADIM (LT); + + PR ("GTOL"); + REG; + + PR ("GTFN"); + REG; + DIG (1); DIM (0, 10); diff --git a/src/hu_stuff.h b/src/hu_stuff.h index a8d8bee22..392ae27a2 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -39,11 +39,6 @@ #define LT_FONTEND 'z' // the last font characters #define LT_FONTSIZE (LT_FONTEND - LT_FONTSTART + 1) -// Under regular circumstances, we'd use the built in font stuff, however this font is a bit messy because of how we're gonna draw shit. -// tc_font[0][n] is used for the "bottom" layer -// tc_font[1][n] is used for the "top" layer -extern patch_t *tc_font[2][LT_FONTSIZE]; - #define CRED_FONTSTART '!' // the first font character #define CRED_FONTEND 'Z' // the last font character #define CRED_FONTSIZE (CRED_FONTEND - CRED_FONTSTART + 1) @@ -59,6 +54,9 @@ enum X (LT), X (CRED), + X (GTOL), + X (GTFN), + X (TALLNUM), X (NIGHTSNUM), X (PINGNUM), diff --git a/src/v_video.c b/src/v_video.c index 5bd7ba733..6367006d7 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -1701,13 +1701,13 @@ INT32 V_TitleCardStringWidth(const char *str) c -= LT_FONTSTART; // check if character exists, if not, it's a space. - if (c < 0 || c >= LT_FONTSIZE || !tc_font[0][(INT32)c]) + if (c < 0 || c >= LT_FONTSIZE || !fontv[GTOL_FONT].font[(INT32)c]) { xoffs += 10; continue; } - pp = tc_font[1][(INT32)c]; + pp = fontv[GTFN_FONT].font[(INT32)c]; xoffs += pp->width-5; } @@ -1768,14 +1768,14 @@ void V_DrawTitleCardString(INT32 x, INT32 y, const char *str, INT32 flags, boole c -= LT_FONTSTART; // check if character exists, if not, it's a space. - if (c < 0 || c >= LT_FONTSIZE || !tc_font[1][(INT32)c]) + if (c < 0 || c >= LT_FONTSIZE || !fontv[GTFN_FONT].font[(INT32)c]) { xoffs += 10; continue; } - ol = tc_font[0][(INT32)c]; - pp = tc_font[1][(INT32)c]; + ol = fontv[GTOL_FONT].font[(INT32)c]; + pp = fontv[GTFN_FONT].font[(INT32)c]; if (timer) { From 1c0ddc7bca2cfc80f15a9b2c67d2462926208c7f Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 17 Dec 2021 02:38:17 -0800 Subject: [PATCH 06/48] P_AddWadFile: only reload graphics when replaced --- src/font.c | 4 +- src/hu_stuff.c | 14 +- src/k_hud.c | 350 ++++++++++++++++++++++++------------------------- src/p_setup.c | 2 +- src/st_stuff.c | 156 +++++++++++----------- 5 files changed, 263 insertions(+), 263 deletions(-) diff --git a/src/font.c b/src/font.c index aeaabd018..353f21a83 100644 --- a/src/font.c +++ b/src/font.c @@ -27,7 +27,7 @@ FontCache (font_t *fnt) c = fnt->start; for (i = 0; i < fnt->size; ++i, ++c) { - fnt->font[i] = HU_CachePatch( + HU_UpdatePatch(&fnt->font[i], "%s%.*d", fnt->prefix, fnt->digits, @@ -57,7 +57,7 @@ Font_DumbRegister (const font_t *sfnt) memcpy(fnt, sfnt, sizeof (font_t)); - if (!( fnt->font = ZZ_Alloc(sfnt->size * sizeof (patch_t *)) )) + if (!( fnt->font = ZZ_Calloc(sfnt->size * sizeof (patch_t *)) )) return -1; return fontc++; diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 2a0bfa90c..130c1d437 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -186,21 +186,21 @@ void HU_LoadGraphics(void) Font_Load(); // minus for negative tallnums - tallminus = HU_CachePatch("STTMINUS"); + HU_UpdatePatch(&tallminus, "STTMINUS"); - emblemicon = HU_CachePatch("EMBLICON"); - songcreditbg = HU_CachePatch("K_SONGCR"); + HU_UpdatePatch(&emblemicon, "EMBLICON"); + HU_UpdatePatch(&songcreditbg, "K_SONGCR"); // cache ping gfx: for (i = 0; i < 5; i++) { - pinggfx[i] = HU_CachePatch("PINGGFX%d", i+1); - mping[i] = HU_CachePatch("MPING%d", i+1); + HU_UpdatePatch(&pinggfx[i], "PINGGFX%d", i+1); + HU_UpdatePatch(&mping[i], "MPING%d", i+1); } // fps stuff - framecounter = HU_CachePatch("FRAMER"); - frameslash = HU_CachePatch("FRAMESL");; + HU_UpdatePatch(&framecounter, "FRAMER"); + HU_UpdatePatch(&frameslash, "FRAMESL"); } // Initialise Heads up diff --git a/src/k_hud.c b/src/k_hud.c index 7f54abd49..986ea645a 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -170,23 +170,23 @@ void K_LoadKartHUDGraphics(void) char buffer[9]; // Null Stuff - kp_nodraw = W_CachePatchName("K_TRNULL", PU_HUDGFX); + HU_UpdatePatch(&kp_nodraw, "K_TRNULL"); // Stickers - kp_timesticker = W_CachePatchName("K_STTIME", PU_HUDGFX); - kp_timestickerwide = W_CachePatchName("K_STTIMW", PU_HUDGFX); - kp_lapsticker = W_CachePatchName("K_STLAPS", PU_HUDGFX); - kp_lapstickerwide = W_CachePatchName("K_STLAPW", PU_HUDGFX); - kp_lapstickernarrow = W_CachePatchName("K_STLAPN", PU_HUDGFX); - kp_splitlapflag = W_CachePatchName("K_SPTLAP", PU_HUDGFX); - kp_bumpersticker = W_CachePatchName("K_STBALN", PU_HUDGFX); - kp_bumperstickerwide = W_CachePatchName("K_STBALW", PU_HUDGFX); - kp_capsulesticker = W_CachePatchName("K_STCAPN", PU_HUDGFX); - kp_capsulestickerwide = W_CachePatchName("K_STCAPW", PU_HUDGFX); - kp_karmasticker = W_CachePatchName("K_STKARM", PU_HUDGFX); - kp_spheresticker = W_CachePatchName("K_STBSMT", PU_HUDGFX); - kp_splitkarmabomb = W_CachePatchName("K_SPTKRM", PU_HUDGFX); - kp_timeoutsticker = W_CachePatchName("K_STTOUT", PU_HUDGFX); + HU_UpdatePatch(&kp_timesticker, "K_STTIME"); + HU_UpdatePatch(&kp_timestickerwide, "K_STTIMW"); + HU_UpdatePatch(&kp_lapsticker, "K_STLAPS"); + HU_UpdatePatch(&kp_lapstickerwide, "K_STLAPW"); + HU_UpdatePatch(&kp_lapstickernarrow, "K_STLAPN"); + HU_UpdatePatch(&kp_splitlapflag, "K_SPTLAP"); + HU_UpdatePatch(&kp_bumpersticker, "K_STBALN"); + HU_UpdatePatch(&kp_bumperstickerwide, "K_STBALW"); + HU_UpdatePatch(&kp_capsulesticker, "K_STCAPN"); + HU_UpdatePatch(&kp_capsulestickerwide, "K_STCAPW"); + HU_UpdatePatch(&kp_karmasticker, "K_STKARM"); + HU_UpdatePatch(&kp_spheresticker, "K_STBSMT"); + HU_UpdatePatch(&kp_splitkarmabomb, "K_SPTKRM"); + HU_UpdatePatch(&kp_timeoutsticker, "K_STTOUT"); // Pre-start countdown bulbs sprintf(buffer, "K_BULBxx"); @@ -194,7 +194,7 @@ void K_LoadKartHUDGraphics(void) { buffer[6] = '0'+((i+1)/10); buffer[7] = '0'+((i+1)%10); - kp_prestartbulb[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_prestartbulb[i], "%s", buffer); } sprintf(buffer, "K_SBLBxx"); @@ -202,68 +202,68 @@ void K_LoadKartHUDGraphics(void) { buffer[6] = '0'+((i+1)/10); buffer[7] = '0'+((i+1)%10); - kp_prestartbulb_split[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_prestartbulb_split[i], "%s", buffer); } // Pre-start position letters - kp_prestartletters[0] = W_CachePatchName("K_PL_P", PU_HUDGFX); - kp_prestartletters[1] = W_CachePatchName("K_PL_O", PU_HUDGFX); - kp_prestartletters[2] = W_CachePatchName("K_PL_S", PU_HUDGFX); - kp_prestartletters[3] = W_CachePatchName("K_PL_I", PU_HUDGFX); - kp_prestartletters[4] = W_CachePatchName("K_PL_T", PU_HUDGFX); - kp_prestartletters[5] = W_CachePatchName("K_PL_N", PU_HUDGFX); - kp_prestartletters[6] = W_CachePatchName("K_PL_EX", PU_HUDGFX); + HU_UpdatePatch(&kp_prestartletters[0], "K_PL_P"); + HU_UpdatePatch(&kp_prestartletters[1], "K_PL_O"); + HU_UpdatePatch(&kp_prestartletters[2], "K_PL_S"); + HU_UpdatePatch(&kp_prestartletters[3], "K_PL_I"); + HU_UpdatePatch(&kp_prestartletters[4], "K_PL_T"); + HU_UpdatePatch(&kp_prestartletters[5], "K_PL_N"); + HU_UpdatePatch(&kp_prestartletters[6], "K_PL_EX"); - kp_prestartletters_split[0] = W_CachePatchName("K_SPL_P", PU_HUDGFX); - kp_prestartletters_split[1] = W_CachePatchName("K_SPL_O", PU_HUDGFX); - kp_prestartletters_split[2] = W_CachePatchName("K_SPL_S", PU_HUDGFX); - kp_prestartletters_split[3] = W_CachePatchName("K_SPL_I", PU_HUDGFX); - kp_prestartletters_split[4] = W_CachePatchName("K_SPL_T", PU_HUDGFX); - kp_prestartletters_split[5] = W_CachePatchName("K_SPL_N", PU_HUDGFX); - kp_prestartletters_split[6] = W_CachePatchName("K_SPL_EX", PU_HUDGFX); + HU_UpdatePatch(&kp_prestartletters_split[0], "K_SPL_P"); + HU_UpdatePatch(&kp_prestartletters_split[1], "K_SPL_O"); + HU_UpdatePatch(&kp_prestartletters_split[2], "K_SPL_S"); + HU_UpdatePatch(&kp_prestartletters_split[3], "K_SPL_I"); + HU_UpdatePatch(&kp_prestartletters_split[4], "K_SPL_T"); + HU_UpdatePatch(&kp_prestartletters_split[5], "K_SPL_N"); + HU_UpdatePatch(&kp_prestartletters_split[6], "K_SPL_EX"); // Starting countdown - kp_startcountdown[0] = W_CachePatchName("K_CNT3A", PU_HUDGFX); - kp_startcountdown[1] = W_CachePatchName("K_CNT2A", PU_HUDGFX); - kp_startcountdown[2] = W_CachePatchName("K_CNT1A", PU_HUDGFX); - kp_startcountdown[3] = W_CachePatchName("K_CNTGOA", PU_HUDGFX); - kp_startcountdown[4] = W_CachePatchName("K_DUEL1", PU_HUDGFX); - kp_startcountdown[5] = W_CachePatchName("K_CNT3B", PU_HUDGFX); - kp_startcountdown[6] = W_CachePatchName("K_CNT2B", PU_HUDGFX); - kp_startcountdown[7] = W_CachePatchName("K_CNT1B", PU_HUDGFX); - kp_startcountdown[8] = W_CachePatchName("K_CNTGOB", PU_HUDGFX); - kp_startcountdown[9] = W_CachePatchName("K_DUEL2", PU_HUDGFX); + HU_UpdatePatch(&kp_startcountdown[0], "K_CNT3A"); + HU_UpdatePatch(&kp_startcountdown[1], "K_CNT2A"); + HU_UpdatePatch(&kp_startcountdown[2], "K_CNT1A"); + HU_UpdatePatch(&kp_startcountdown[3], "K_CNTGOA"); + HU_UpdatePatch(&kp_startcountdown[4], "K_DUEL1"); + HU_UpdatePatch(&kp_startcountdown[5], "K_CNT3B"); + HU_UpdatePatch(&kp_startcountdown[6], "K_CNT2B"); + HU_UpdatePatch(&kp_startcountdown[7], "K_CNT1B"); + HU_UpdatePatch(&kp_startcountdown[8], "K_CNTGOB"); + HU_UpdatePatch(&kp_startcountdown[9], "K_DUEL2"); // Splitscreen - kp_startcountdown[10] = W_CachePatchName("K_SMC3A", PU_HUDGFX); - kp_startcountdown[11] = W_CachePatchName("K_SMC2A", PU_HUDGFX); - kp_startcountdown[12] = W_CachePatchName("K_SMC1A", PU_HUDGFX); - kp_startcountdown[13] = W_CachePatchName("K_SMCGOA", PU_HUDGFX); - kp_startcountdown[14] = W_CachePatchName("K_SDUEL1", PU_HUDGFX); - kp_startcountdown[15] = W_CachePatchName("K_SMC3B", PU_HUDGFX); - kp_startcountdown[16] = W_CachePatchName("K_SMC2B", PU_HUDGFX); - kp_startcountdown[17] = W_CachePatchName("K_SMC1B", PU_HUDGFX); - kp_startcountdown[18] = W_CachePatchName("K_SMCGOB", PU_HUDGFX); - kp_startcountdown[19] = W_CachePatchName("K_SDUEL2", PU_HUDGFX); + HU_UpdatePatch(&kp_startcountdown[10], "K_SMC3A"); + HU_UpdatePatch(&kp_startcountdown[11], "K_SMC2A"); + HU_UpdatePatch(&kp_startcountdown[12], "K_SMC1A"); + HU_UpdatePatch(&kp_startcountdown[13], "K_SMCGOA"); + HU_UpdatePatch(&kp_startcountdown[14], "K_SDUEL1"); + HU_UpdatePatch(&kp_startcountdown[15], "K_SMC3B"); + HU_UpdatePatch(&kp_startcountdown[16], "K_SMC2B"); + HU_UpdatePatch(&kp_startcountdown[17], "K_SMC1B"); + HU_UpdatePatch(&kp_startcountdown[18], "K_SMCGOB"); + HU_UpdatePatch(&kp_startcountdown[19], "K_SDUEL2"); // Fault - kp_racefault[0] = W_CachePatchName("K_FAULTA", PU_HUDGFX); - kp_racefault[1] = W_CachePatchName("K_FAULTB", PU_HUDGFX); + HU_UpdatePatch(&kp_racefault[0], "K_FAULTA"); + HU_UpdatePatch(&kp_racefault[1], "K_FAULTB"); // Splitscreen - kp_racefault[2] = W_CachePatchName("K_SMFLTA", PU_HUDGFX); - kp_racefault[3] = W_CachePatchName("K_SMFLTB", PU_HUDGFX); + HU_UpdatePatch(&kp_racefault[2], "K_SMFLTA"); + HU_UpdatePatch(&kp_racefault[3], "K_SMFLTB"); // 2P splitscreen - kp_racefault[4] = W_CachePatchName("K_2PFLTA", PU_HUDGFX); - kp_racefault[5] = W_CachePatchName("K_2PFLTB", PU_HUDGFX); + HU_UpdatePatch(&kp_racefault[4], "K_2PFLTA"); + HU_UpdatePatch(&kp_racefault[5], "K_2PFLTB"); // Finish - kp_racefinish[0] = W_CachePatchName("K_FINA", PU_HUDGFX); - kp_racefinish[1] = W_CachePatchName("K_FINB", PU_HUDGFX); + HU_UpdatePatch(&kp_racefinish[0], "K_FINA"); + HU_UpdatePatch(&kp_racefinish[1], "K_FINB"); // Splitscreen - kp_racefinish[2] = W_CachePatchName("K_SMFINA", PU_HUDGFX); - kp_racefinish[3] = W_CachePatchName("K_SMFINB", PU_HUDGFX); + HU_UpdatePatch(&kp_racefinish[2], "K_SMFINA"); + HU_UpdatePatch(&kp_racefinish[3], "K_SMFINB"); // 2P splitscreen - kp_racefinish[4] = W_CachePatchName("K_2PFINA", PU_HUDGFX); - kp_racefinish[5] = W_CachePatchName("K_2PFINB", PU_HUDGFX); + HU_UpdatePatch(&kp_racefinish[4], "K_2PFINA"); + HU_UpdatePatch(&kp_racefinish[5], "K_2PFINB"); // Position numbers sprintf(buffer, "K_POSNxx"); @@ -274,7 +274,7 @@ void K_LoadKartHUDGraphics(void) { //sprintf(buffer, "K_POSN%d%d", i, j); buffer[7] = '0'+j; - kp_positionnum[i][j] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_positionnum[i][j], "%s", buffer); } } @@ -282,7 +282,7 @@ void K_LoadKartHUDGraphics(void) for (i = 0; i < NUMWINFRAMES; i++) { buffer[7] = '0'+i; - kp_winnernum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_winnernum[i], "%s", buffer); } sprintf(buffer, "OPPRNKxx"); @@ -290,128 +290,128 @@ void K_LoadKartHUDGraphics(void) { buffer[6] = '0'+(i/10); buffer[7] = '0'+(i%10); - kp_facenum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_facenum[i], "%s", buffer); } sprintf(buffer, "K_CHILIx"); for (i = 0; i < 8; i++) { buffer[7] = '0'+(i+1); - kp_facehighlight[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_facehighlight[i], "%s", buffer); } - kp_spbminimap = W_CachePatchName("SPBMMAP", PU_HUDGFX); + HU_UpdatePatch(&kp_spbminimap, "SPBMMAP"); // Rings & Lives - kp_ringsticker[0] = W_CachePatchName("RNGBACKA", PU_HUDGFX); - kp_ringsticker[1] = W_CachePatchName("RNGBACKB", PU_HUDGFX); + HU_UpdatePatch(&kp_ringsticker[0], "RNGBACKA"); + HU_UpdatePatch(&kp_ringsticker[1], "RNGBACKB"); sprintf(buffer, "K_RINGx"); for (i = 0; i < 6; i++) { buffer[6] = '0'+(i+1); - kp_ring[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_ring[i], "%s", buffer); } - kp_ringdebtminus = W_CachePatchName("RDEBTMIN", PU_HUDGFX); + HU_UpdatePatch(&kp_ringdebtminus, "RDEBTMIN"); sprintf(buffer, "SPBRNGxx"); for (i = 0; i < 16; i++) { buffer[6] = '0'+((i+1) / 10); buffer[7] = '0'+((i+1) % 10); - kp_ringspblock[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_ringspblock[i], "%s", buffer); } - kp_ringstickersplit[0] = W_CachePatchName("SMRNGBGA", PU_HUDGFX); - kp_ringstickersplit[1] = W_CachePatchName("SMRNGBGB", PU_HUDGFX); + HU_UpdatePatch(&kp_ringstickersplit[0], "SMRNGBGA"); + HU_UpdatePatch(&kp_ringstickersplit[1], "SMRNGBGB"); sprintf(buffer, "K_SRINGx"); for (i = 0; i < 6; i++) { buffer[7] = '0'+(i+1); - kp_smallring[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_smallring[i], "%s", buffer); } - kp_ringdebtminussmall = W_CachePatchName("SRDEBTMN", PU_HUDGFX); + HU_UpdatePatch(&kp_ringdebtminussmall, "SRDEBTMN"); sprintf(buffer, "SPBRGSxx"); for (i = 0; i < 16; i++) { buffer[6] = '0'+((i+1) / 10); buffer[7] = '0'+((i+1) % 10); - kp_ringspblocksmall[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_ringspblocksmall[i], "%s", buffer); } // Speedometer - kp_speedometersticker = W_CachePatchName("K_SPDMBG", PU_HUDGFX); + HU_UpdatePatch(&kp_speedometersticker, "K_SPDMBG"); sprintf(buffer, "K_SPDMLx"); for (i = 0; i < 4; i++) { buffer[7] = '0'+(i+1); - kp_speedometerlabel[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_speedometerlabel[i], "%s", buffer); } // Extra ranking icons - kp_rankbumper = W_CachePatchName("K_BLNICO", PU_HUDGFX); - kp_tinybumper[0] = W_CachePatchName("K_BLNA", PU_HUDGFX); - kp_tinybumper[1] = W_CachePatchName("K_BLNB", PU_HUDGFX); - kp_ranknobumpers = W_CachePatchName("K_NOBLNS", PU_HUDGFX); - kp_rankcapsule = W_CachePatchName("K_CAPICO", PU_HUDGFX); - kp_rankemerald = W_CachePatchName("K_EMERC", PU_HUDGFX); - kp_rankemeraldflash = W_CachePatchName("K_EMERW", PU_HUDGFX); - kp_rankemeraldback = W_CachePatchName("K_EMERBK", PU_HUDGFX); + HU_UpdatePatch(&kp_rankbumper, "K_BLNICO"); + HU_UpdatePatch(&kp_tinybumper[0], "K_BLNA"); + HU_UpdatePatch(&kp_tinybumper[1], "K_BLNB"); + HU_UpdatePatch(&kp_ranknobumpers, "K_NOBLNS"); + HU_UpdatePatch(&kp_rankcapsule, "K_CAPICO"); + HU_UpdatePatch(&kp_rankemerald, "K_EMERC"); + HU_UpdatePatch(&kp_rankemeraldflash, "K_EMERW"); + HU_UpdatePatch(&kp_rankemeraldback, "K_EMERBK"); // Battle graphics - kp_battlewin = W_CachePatchName("K_BWIN", PU_HUDGFX); - kp_battlecool = W_CachePatchName("K_BCOOL", PU_HUDGFX); - kp_battlelose = W_CachePatchName("K_BLOSE", PU_HUDGFX); - kp_battlewait = W_CachePatchName("K_BWAIT", PU_HUDGFX); - kp_battleinfo = W_CachePatchName("K_BINFO", PU_HUDGFX); - kp_wanted = W_CachePatchName("K_WANTED", PU_HUDGFX); - kp_wantedsplit = W_CachePatchName("4PWANTED", PU_HUDGFX); - kp_wantedreticle = W_CachePatchName("MMAPWANT", PU_HUDGFX); + HU_UpdatePatch(&kp_battlewin, "K_BWIN"); + HU_UpdatePatch(&kp_battlecool, "K_BCOOL"); + HU_UpdatePatch(&kp_battlelose, "K_BLOSE"); + HU_UpdatePatch(&kp_battlewait, "K_BWAIT"); + HU_UpdatePatch(&kp_battleinfo, "K_BINFO"); + HU_UpdatePatch(&kp_wanted, "K_WANTED"); + HU_UpdatePatch(&kp_wantedsplit, "4PWANTED"); + HU_UpdatePatch(&kp_wantedreticle, "MMAPWANT"); // Kart Item Windows - kp_itembg[0] = W_CachePatchName("K_ITBG", PU_HUDGFX); - kp_itembg[1] = W_CachePatchName("K_ITBGD", PU_HUDGFX); - kp_itemtimer[0] = W_CachePatchName("K_ITIMER", PU_HUDGFX); - kp_itemmulsticker[0] = W_CachePatchName("K_ITMUL", PU_HUDGFX); - kp_itemx = W_CachePatchName("K_ITX", PU_HUDGFX); + HU_UpdatePatch(&kp_itembg[0], "K_ITBG"); + HU_UpdatePatch(&kp_itembg[1], "K_ITBGD"); + HU_UpdatePatch(&kp_itemtimer[0], "K_ITIMER"); + HU_UpdatePatch(&kp_itemmulsticker[0], "K_ITMUL"); + HU_UpdatePatch(&kp_itemx, "K_ITX"); - kp_superring[0] = W_CachePatchName("K_ITRING", PU_HUDGFX); - kp_sneaker[0] = W_CachePatchName("K_ITSHOE", PU_HUDGFX); - kp_rocketsneaker[0] = W_CachePatchName("K_ITRSHE", PU_HUDGFX); + HU_UpdatePatch(&kp_superring[0], "K_ITRING"); + HU_UpdatePatch(&kp_sneaker[0], "K_ITSHOE"); + HU_UpdatePatch(&kp_rocketsneaker[0], "K_ITRSHE"); sprintf(buffer, "K_ITINVx"); for (i = 0; i < 7; i++) { buffer[7] = '1'+i; - kp_invincibility[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_invincibility[i], "%s", buffer); } - kp_banana[0] = W_CachePatchName("K_ITBANA", PU_HUDGFX); - kp_eggman[0] = W_CachePatchName("K_ITEGGM", PU_HUDGFX); + HU_UpdatePatch(&kp_banana[0], "K_ITBANA"); + HU_UpdatePatch(&kp_eggman[0], "K_ITEGGM"); sprintf(buffer, "K_ITORBx"); for (i = 0; i < 4; i++) { buffer[7] = '1'+i; - kp_orbinaut[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_orbinaut[i], "%s", buffer); } - kp_jawz[0] = W_CachePatchName("K_ITJAWZ", PU_HUDGFX); - kp_mine[0] = W_CachePatchName("K_ITMINE", PU_HUDGFX); - kp_landmine[0] = W_CachePatchName("K_ITLNDM", PU_HUDGFX); - kp_ballhog[0] = W_CachePatchName("K_ITBHOG", PU_HUDGFX); - kp_selfpropelledbomb[0] = W_CachePatchName("K_ITSPB", PU_HUDGFX); - kp_grow[0] = W_CachePatchName("K_ITGROW", PU_HUDGFX); - kp_shrink[0] = W_CachePatchName("K_ITSHRK", PU_HUDGFX); - kp_thundershield[0] = W_CachePatchName("K_ITTHNS", PU_HUDGFX); - kp_bubbleshield[0] = W_CachePatchName("K_ITBUBS", PU_HUDGFX); - kp_flameshield[0] = W_CachePatchName("K_ITFLMS", PU_HUDGFX); - kp_hyudoro[0] = W_CachePatchName("K_ITHYUD", PU_HUDGFX); - kp_pogospring[0] = W_CachePatchName("K_ITPOGO", PU_HUDGFX); - kp_kitchensink[0] = W_CachePatchName("K_ITSINK", PU_HUDGFX); - kp_sadface[0] = W_CachePatchName("K_ITSAD", PU_HUDGFX); + HU_UpdatePatch(&kp_jawz[0], "K_ITJAWZ"); + HU_UpdatePatch(&kp_mine[0], "K_ITMINE"); + HU_UpdatePatch(&kp_landmine[0], "K_ITLNDM"); + HU_UpdatePatch(&kp_ballhog[0], "K_ITBHOG"); + HU_UpdatePatch(&kp_selfpropelledbomb[0], "K_ITSPB"); + HU_UpdatePatch(&kp_grow[0], "K_ITGROW"); + HU_UpdatePatch(&kp_shrink[0], "K_ITSHRK"); + HU_UpdatePatch(&kp_thundershield[0], "K_ITTHNS"); + HU_UpdatePatch(&kp_bubbleshield[0], "K_ITBUBS"); + HU_UpdatePatch(&kp_flameshield[0], "K_ITFLMS"); + HU_UpdatePatch(&kp_hyudoro[0], "K_ITHYUD"); + HU_UpdatePatch(&kp_pogospring[0], "K_ITPOGO"); + HU_UpdatePatch(&kp_kitchensink[0], "K_ITSINK"); + HU_UpdatePatch(&kp_sadface[0], "K_ITSAD"); sprintf(buffer, "FSMFGxxx"); for (i = 0; i < 104; i++) @@ -419,7 +419,7 @@ void K_LoadKartHUDGraphics(void) buffer[5] = '0'+((i+1)/100); buffer[6] = '0'+(((i+1)/10)%10); buffer[7] = '0'+((i+1)%10); - kp_flameshieldmeter[i][0] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_flameshieldmeter[i][0], "%s", buffer); } sprintf(buffer, "FSMBG0xx"); @@ -427,41 +427,41 @@ void K_LoadKartHUDGraphics(void) { buffer[6] = '0'+((i+1)/10); buffer[7] = '0'+((i+1)%10); - kp_flameshieldmeter_bg[i][0] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_flameshieldmeter_bg[i][0], "%s", buffer); } // Splitscreen - kp_itembg[2] = W_CachePatchName("K_ISBG", PU_HUDGFX); - kp_itembg[3] = W_CachePatchName("K_ISBGD", PU_HUDGFX); - kp_itemtimer[1] = W_CachePatchName("K_ISIMER", PU_HUDGFX); - kp_itemmulsticker[1] = W_CachePatchName("K_ISMUL", PU_HUDGFX); + HU_UpdatePatch(&kp_itembg[2], "K_ISBG"); + HU_UpdatePatch(&kp_itembg[3], "K_ISBGD"); + HU_UpdatePatch(&kp_itemtimer[1], "K_ISIMER"); + HU_UpdatePatch(&kp_itemmulsticker[1], "K_ISMUL"); - kp_superring[1] = W_CachePatchName("K_ISRING", PU_HUDGFX); - kp_sneaker[1] = W_CachePatchName("K_ISSHOE", PU_HUDGFX); - kp_rocketsneaker[1] = W_CachePatchName("K_ISRSHE", PU_HUDGFX); + HU_UpdatePatch(&kp_superring[1], "K_ISRING"); + HU_UpdatePatch(&kp_sneaker[1], "K_ISSHOE"); + HU_UpdatePatch(&kp_rocketsneaker[1], "K_ISRSHE"); sprintf(buffer, "K_ISINVx"); for (i = 0; i < 6; i++) { buffer[7] = '1'+i; - kp_invincibility[i+7] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_invincibility[i+7], "%s", buffer); } - kp_banana[1] = W_CachePatchName("K_ISBANA", PU_HUDGFX); - kp_eggman[1] = W_CachePatchName("K_ISEGGM", PU_HUDGFX); - kp_orbinaut[4] = W_CachePatchName("K_ISORBN", PU_HUDGFX); - kp_jawz[1] = W_CachePatchName("K_ISJAWZ", PU_HUDGFX); - kp_mine[1] = W_CachePatchName("K_ISMINE", PU_HUDGFX); - kp_landmine[1] = W_CachePatchName("K_ISLNDM", PU_HUDGFX); - kp_ballhog[1] = W_CachePatchName("K_ISBHOG", PU_HUDGFX); - kp_selfpropelledbomb[1] = W_CachePatchName("K_ISSPB", PU_HUDGFX); - kp_grow[1] = W_CachePatchName("K_ISGROW", PU_HUDGFX); - kp_shrink[1] = W_CachePatchName("K_ISSHRK", PU_HUDGFX); - kp_thundershield[1] = W_CachePatchName("K_ISTHNS", PU_HUDGFX); - kp_bubbleshield[1] = W_CachePatchName("K_ISBUBS", PU_HUDGFX); - kp_flameshield[1] = W_CachePatchName("K_ISFLMS", PU_HUDGFX); - kp_hyudoro[1] = W_CachePatchName("K_ISHYUD", PU_HUDGFX); - kp_pogospring[1] = W_CachePatchName("K_ISPOGO", PU_HUDGFX); - kp_kitchensink[1] = W_CachePatchName("K_ISSINK", PU_HUDGFX); - kp_sadface[1] = W_CachePatchName("K_ISSAD", PU_HUDGFX); + HU_UpdatePatch(&kp_banana[1], "K_ISBANA"); + HU_UpdatePatch(&kp_eggman[1], "K_ISEGGM"); + HU_UpdatePatch(&kp_orbinaut[4], "K_ISORBN"); + HU_UpdatePatch(&kp_jawz[1], "K_ISJAWZ"); + HU_UpdatePatch(&kp_mine[1], "K_ISMINE"); + HU_UpdatePatch(&kp_landmine[1], "K_ISLNDM"); + HU_UpdatePatch(&kp_ballhog[1], "K_ISBHOG"); + HU_UpdatePatch(&kp_selfpropelledbomb[1], "K_ISSPB"); + HU_UpdatePatch(&kp_grow[1], "K_ISGROW"); + HU_UpdatePatch(&kp_shrink[1], "K_ISSHRK"); + HU_UpdatePatch(&kp_thundershield[1], "K_ISTHNS"); + HU_UpdatePatch(&kp_bubbleshield[1], "K_ISBUBS"); + HU_UpdatePatch(&kp_flameshield[1], "K_ISFLMS"); + HU_UpdatePatch(&kp_hyudoro[1], "K_ISHYUD"); + HU_UpdatePatch(&kp_pogospring[1], "K_ISPOGO"); + HU_UpdatePatch(&kp_kitchensink[1], "K_ISSINK"); + HU_UpdatePatch(&kp_sadface[1], "K_ISSAD"); sprintf(buffer, "FSMFSxxx"); for (i = 0; i < 104; i++) @@ -469,7 +469,7 @@ void K_LoadKartHUDGraphics(void) buffer[5] = '0'+((i+1)/100); buffer[6] = '0'+(((i+1)/10)%10); buffer[7] = '0'+((i+1)%10); - kp_flameshieldmeter[i][1] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_flameshieldmeter[i][1], "%s", buffer); } sprintf(buffer, "FSMBS0xx"); @@ -477,7 +477,7 @@ void K_LoadKartHUDGraphics(void) { buffer[6] = '0'+((i+1)/10); buffer[7] = '0'+((i+1)%10); - kp_flameshieldmeter_bg[i][1] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_flameshieldmeter_bg[i][1], "%s", buffer); } // CHECK indicators @@ -485,7 +485,7 @@ void K_LoadKartHUDGraphics(void) for (i = 0; i < 6; i++) { buffer[7] = '1'+i; - kp_check[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_check[i], "%s", buffer); } // Rival indicators @@ -493,7 +493,7 @@ void K_LoadKartHUDGraphics(void) for (i = 0; i < 2; i++) { buffer[7] = '1'+i; - kp_rival[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_rival[i], "%s", buffer); } // Rival indicators @@ -504,33 +504,33 @@ void K_LoadKartHUDGraphics(void) for (j = 0; j < 2; j++) { buffer[7] = '1'+j; - kp_localtag[i][j] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_localtag[i][j], "%s", buffer); } } // Typing indicator - kp_talk = W_CachePatchName("K_TALK", PU_HUDGFX); - kp_typdot = W_CachePatchName("K_TYPDOT", PU_HUDGFX); + HU_UpdatePatch(&kp_talk, "K_TALK"); + HU_UpdatePatch(&kp_typdot, "K_TYPDOT"); // Eggman warning numbers sprintf(buffer, "K_EGGNx"); for (i = 0; i < 4; i++) { buffer[6] = '0'+i; - kp_eggnum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_eggnum[i], "%s", buffer); } // First person mode - kp_fpview[0] = W_CachePatchName("VIEWA0", PU_HUDGFX); - kp_fpview[1] = W_CachePatchName("VIEWB0D0", PU_HUDGFX); - kp_fpview[2] = W_CachePatchName("VIEWC0E0", PU_HUDGFX); + HU_UpdatePatch(&kp_fpview[0], "VIEWA0"); + HU_UpdatePatch(&kp_fpview[1], "VIEWB0D0"); + HU_UpdatePatch(&kp_fpview[2], "VIEWC0E0"); // Input UI Wheel sprintf(buffer, "K_WHEELx"); for (i = 0; i < 5; i++) { buffer[7] = '0'+i; - kp_inputwheel[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_inputwheel[i], "%s", buffer); } // HERE COMES A NEW CHALLENGER @@ -539,7 +539,7 @@ void K_LoadKartHUDGraphics(void) { buffer[6] = '0'+((i+1)/10); buffer[7] = '0'+((i+1)%10); - kp_challenger[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_challenger[i], "%s", buffer); } // Lap start animation @@ -547,7 +547,7 @@ void K_LoadKartHUDGraphics(void) for (i = 0; i < 7; i++) { buffer[6] = '0'+(i+1); - kp_lapanim_lap[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_lapanim_lap[i], "%s", buffer); } sprintf(buffer, "K_LAPFxx"); @@ -555,7 +555,7 @@ void K_LoadKartHUDGraphics(void) { buffer[6] = '0'+((i+1)/10); buffer[7] = '0'+((i+1)%10); - kp_lapanim_final[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_lapanim_final[i], "%s", buffer); } sprintf(buffer, "K_LAPNxx"); @@ -565,7 +565,7 @@ void K_LoadKartHUDGraphics(void) for (j = 0; j < 3; j++) { buffer[7] = '0'+(j+1); - kp_lapanim_number[i][j] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_lapanim_number[i][j], "%s", buffer); } } @@ -573,39 +573,39 @@ void K_LoadKartHUDGraphics(void) for (i = 0; i < 2; i++) { buffer[7] = '0'+(i+1); - kp_lapanim_emblem[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_lapanim_emblem[i], "%s", buffer); } sprintf(buffer, "K_LAPH0x"); for (i = 0; i < 3; i++) { buffer[7] = '0'+(i+1); - kp_lapanim_hand[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_lapanim_hand[i], "%s", buffer); } - kp_yougotem = (patch_t *) W_CachePatchName("YOUGOTEM", PU_HUDGFX); - kp_itemminimap = (patch_t *) W_CachePatchName("MMAPITEM", PU_HUDGFX); + HU_UpdatePatch(&kp_yougotem, "YOUGOTEM"); + HU_UpdatePatch(&kp_itemminimap, "MMAPITEM"); sprintf(buffer, "ALAGLESx"); for (i = 0; i < 10; ++i) { buffer[7] = '0'+i; - kp_alagles[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_alagles[i], "%s", buffer); } sprintf(buffer, "BLAGLESx"); for (i = 0; i < 6; ++i) { buffer[7] = '0'+i; - kp_blagles[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + HU_UpdatePatch(&kp_blagles[i], "%s", buffer); } - kp_cpu = (patch_t *) W_CachePatchName("K_CPU", PU_HUDGFX); + HU_UpdatePatch(&kp_cpu, "K_CPU"); - kp_nametagstem = (patch_t *) W_CachePatchName("K_NAMEST", PU_HUDGFX); + HU_UpdatePatch(&kp_nametagstem, "K_NAMEST"); - kp_trickcool[0] = W_CachePatchName("K_COOL1", PU_HUDGFX); - kp_trickcool[1] = W_CachePatchName("K_COOL2", PU_HUDGFX); + HU_UpdatePatch(&kp_trickcool[0], "K_COOL1"); + HU_UpdatePatch(&kp_trickcool[1], "K_COOL2"); } // For the item toggle menu diff --git a/src/p_setup.c b/src/p_setup.c index 62cb26d81..e0c00fe3e 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4462,7 +4462,7 @@ boolean P_AddWadFile(const char *wadfilename) P_InitPicAnims(); // Flush and reload HUD graphics - ST_UnloadGraphics(); + //ST_UnloadGraphics(); HU_LoadGraphics(); ST_LoadGraphics(); diff --git a/src/st_stuff.c b/src/st_stuff.c index 3e0788f4d..d2f774f95 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -261,114 +261,114 @@ void ST_LoadGraphics(void) // cache the status bar overlay icons (fullscreen mode) // Prefix "STT" is whitelisted (doesn't trigger ISGAMEMODIFIED), btw - sborings = W_CachePatchName("STTRINGS", PU_HUDGFX); - sboredrings = W_CachePatchName("STTRRING", PU_HUDGFX); - sboscore = W_CachePatchName("STTSCORE", PU_HUDGFX); - sbotime = W_CachePatchName("STTTIME", PU_HUDGFX); // Time logo - sboredtime = W_CachePatchName("STTRTIME", PU_HUDGFX); - sbocolon = W_CachePatchName("STTCOLON", PU_HUDGFX); // Colon for time - sboperiod = W_CachePatchName("STTPERIO", PU_HUDGFX); // Period for time centiseconds + HU_UpdatePatch(&sborings, "STTRINGS"); + HU_UpdatePatch(&sboredrings, "STTRRING"); + HU_UpdatePatch(&sboscore, "STTSCORE"); + HU_UpdatePatch(&sbotime, "STTTIME"); // Time logo + HU_UpdatePatch(&sboredtime, "STTRTIME"); + HU_UpdatePatch(&sbocolon, "STTCOLON"); // Colon for time + HU_UpdatePatch(&sboperiod, "STTPERIO"); // Period for time centiseconds - slidgame = W_CachePatchName("SLIDGAME", PU_HUDGFX); - slidtime = W_CachePatchName("SLIDTIME", PU_HUDGFX); - slidover = W_CachePatchName("SLIDOVER", PU_HUDGFX); + HU_UpdatePatch(&slidgame, "SLIDGAME"); + HU_UpdatePatch(&slidtime, "SLIDTIME"); + HU_UpdatePatch(&slidover, "SLIDOVER"); - stlivex = W_CachePatchName("STLIVEX", PU_HUDGFX); - livesback = W_CachePatchName("STLIVEBK", PU_HUDGFX); - nrec_timer = W_CachePatchName("NGRTIMER", PU_HUDGFX); // Timer for NiGHTS - getall = W_CachePatchName("GETALL", PU_HUDGFX); // Special Stage HUD - timeup = W_CachePatchName("TIMEUP", PU_HUDGFX); // Special Stage HUD - race1 = W_CachePatchName("RACE1", PU_HUDGFX); - race2 = W_CachePatchName("RACE2", PU_HUDGFX); - race3 = W_CachePatchName("RACE3", PU_HUDGFX); - racego = W_CachePatchName("RACEGO", PU_HUDGFX); - nightslink = W_CachePatchName("NGHTLINK", PU_HUDGFX); + HU_UpdatePatch(&stlivex, "STLIVEX"); + HU_UpdatePatch(&livesback, "STLIVEBK"); + HU_UpdatePatch(&nrec_timer, "NGRTIMER"); // Timer for NiGHTS + HU_UpdatePatch(&getall, "GETALL"); // Special Stage HUD + HU_UpdatePatch(&timeup, "TIMEUP"); // Special Stage HUD + HU_UpdatePatch(&race1, "RACE1"); + HU_UpdatePatch(&race2, "RACE2"); + HU_UpdatePatch(&race3, "RACE3"); + HU_UpdatePatch(&racego, "RACEGO"); + HU_UpdatePatch(&nightslink, "NGHTLINK"); for (i = 0; i < 6; ++i) { - hunthoming[i] = W_CachePatchName(va("HOMING%d", i+1), PU_HUDGFX); - itemhoming[i] = W_CachePatchName(va("HOMITM%d", i+1), PU_HUDGFX); + HU_UpdatePatch(&hunthoming[i], "HOMING%d", i+1); + HU_UpdatePatch(&itemhoming[i], "HOMITM%d", i+1); } - curweapon = W_CachePatchName("CURWEAP", PU_HUDGFX); - normring = W_CachePatchName("RINGIND", PU_HUDGFX); - bouncering = W_CachePatchName("BNCEIND", PU_HUDGFX); - infinityring = W_CachePatchName("INFNIND", PU_HUDGFX); - autoring = W_CachePatchName("AUTOIND", PU_HUDGFX); - explosionring = W_CachePatchName("BOMBIND", PU_HUDGFX); - scatterring = W_CachePatchName("SCATIND", PU_HUDGFX); - grenadering = W_CachePatchName("GRENIND", PU_HUDGFX); - railring = W_CachePatchName("RAILIND", PU_HUDGFX); - jumpshield = W_CachePatchName("TVWWICON", PU_HUDGFX); - forceshield = W_CachePatchName("TVFOICON", PU_HUDGFX); - ringshield = W_CachePatchName("TVATICON", PU_HUDGFX); - watershield = W_CachePatchName("TVELICON", PU_HUDGFX); - bombshield = W_CachePatchName("TVARICON", PU_HUDGFX); - pityshield = W_CachePatchName("TVPIICON", PU_HUDGFX); - pinkshield = W_CachePatchName("TVPPICON", PU_HUDGFX); - flameshield = W_CachePatchName("TVFLICON", PU_HUDGFX); - bubbleshield = W_CachePatchName("TVBBICON", PU_HUDGFX); - thundershield = W_CachePatchName("TVZPICON", PU_HUDGFX); - invincibility = W_CachePatchName("TVIVICON", PU_HUDGFX); - sneakers = W_CachePatchName("TVSSICON", PU_HUDGFX); - gravboots = W_CachePatchName("TVGVICON", PU_HUDGFX); + HU_UpdatePatch(&curweapon, "CURWEAP"); + HU_UpdatePatch(&normring, "RINGIND"); + HU_UpdatePatch(&bouncering, "BNCEIND"); + HU_UpdatePatch(&infinityring, "INFNIND"); + HU_UpdatePatch(&autoring, "AUTOIND"); + HU_UpdatePatch(&explosionring, "BOMBIND"); + HU_UpdatePatch(&scatterring, "SCATIND"); + HU_UpdatePatch(&grenadering, "GRENIND"); + HU_UpdatePatch(&railring, "RAILIND"); + HU_UpdatePatch(&jumpshield, "TVWWICON"); + HU_UpdatePatch(&forceshield, "TVFOICON"); + HU_UpdatePatch(&ringshield, "TVATICON"); + HU_UpdatePatch(&watershield, "TVELICON"); + HU_UpdatePatch(&bombshield, "TVARICON"); + HU_UpdatePatch(&pityshield, "TVPIICON"); + HU_UpdatePatch(&pinkshield, "TVPPICON"); + HU_UpdatePatch(&flameshield, "TVFLICON"); + HU_UpdatePatch(&bubbleshield, "TVBBICON"); + HU_UpdatePatch(&thundershield, "TVZPICON"); + HU_UpdatePatch(&invincibility, "TVIVICON"); + HU_UpdatePatch(&sneakers, "TVSSICON"); + HU_UpdatePatch(&gravboots, "TVGVICON"); - tagico = W_CachePatchName("TAGICO", PU_HUDGFX); - rflagico = W_CachePatchName("RFLAGICO", PU_HUDGFX); - bflagico = W_CachePatchName("BFLAGICO", PU_HUDGFX); - rmatcico = W_CachePatchName("RMATCICO", PU_HUDGFX); - bmatcico = W_CachePatchName("BMATCICO", PU_HUDGFX); - gotrflag = W_CachePatchName("GOTRFLAG", PU_HUDGFX); - gotbflag = W_CachePatchName("GOTBFLAG", PU_HUDGFX); - fnshico = W_CachePatchName("FNSHICO", PU_HUDGFX); - nonicon = W_CachePatchName("NONICON", PU_HUDGFX); - nonicon2 = W_CachePatchName("NONICON2", PU_HUDGFX); + HU_UpdatePatch(&tagico, "TAGICO"); + HU_UpdatePatch(&rflagico, "RFLAGICO"); + HU_UpdatePatch(&bflagico, "BFLAGICO"); + HU_UpdatePatch(&rmatcico, "RMATCICO"); + HU_UpdatePatch(&bmatcico, "BMATCICO"); + HU_UpdatePatch(&gotrflag, "GOTRFLAG"); + HU_UpdatePatch(&gotbflag, "GOTBFLAG"); + HU_UpdatePatch(&fnshico, "FNSHICO"); + HU_UpdatePatch(&nonicon, "NONICON"); + HU_UpdatePatch(&nonicon2, "NONICON2"); // NiGHTS HUD things - bluestat = W_CachePatchName("BLUESTAT", PU_HUDGFX); - byelstat = W_CachePatchName("BYELSTAT", PU_HUDGFX); - orngstat = W_CachePatchName("ORNGSTAT", PU_HUDGFX); - redstat = W_CachePatchName("REDSTAT", PU_HUDGFX); - yelstat = W_CachePatchName("YELSTAT", PU_HUDGFX); - nbracket = W_CachePatchName("NBRACKET", PU_HUDGFX); - nring = W_CachePatchName("NRNG1", PU_HUDGFX); + HU_UpdatePatch(&bluestat, "BLUESTAT"); + HU_UpdatePatch(&byelstat, "BYELSTAT"); + HU_UpdatePatch(&orngstat, "ORNGSTAT"); + HU_UpdatePatch(&redstat, "REDSTAT"); + HU_UpdatePatch(&yelstat, "YELSTAT"); + HU_UpdatePatch(&nbracket, "NBRACKET"); + HU_UpdatePatch(&nring, "NRNG1"); for (i = 0; i < 12; ++i) { - nhud[i] = W_CachePatchName(va("NHUD%d", i+1), PU_HUDGFX); - nbon[i] = W_CachePatchName(va("NBON%d", i+1), PU_HUDGFX); + HU_UpdatePatch(&nhud[i], "NHUD%d", i+1); + HU_UpdatePatch(&nbon[i], "NBON%d", i+1); } - nsshud = W_CachePatchName("NSSHUD", PU_HUDGFX); - nssbon = W_CachePatchName("NSSBON", PU_HUDGFX); - minicaps = W_CachePatchName("MINICAPS", PU_HUDGFX); + HU_UpdatePatch(&nsshud, "NSSHUD"); + HU_UpdatePatch(&nssbon, "NSSBON"); + HU_UpdatePatch(&minicaps, "MINICAPS"); for (i = 0; i < 8; ++i) { - narrow[i] = W_CachePatchName(va("NARROW%d", i+1), PU_HUDGFX); - nredar[i] = W_CachePatchName(va("NREDAR%d", i+1), PU_HUDGFX); + HU_UpdatePatch(&narrow[i], "NARROW%d", i+1); + HU_UpdatePatch(&nredar[i], "NREDAR%d", i+1); } // non-animated version - narrow[8] = W_CachePatchName("NARROW9", PU_HUDGFX); + HU_UpdatePatch(&narrow[8], "NARROW9"); - drillbar = W_CachePatchName("DRILLBAR", PU_HUDGFX); + HU_UpdatePatch(&drillbar, "DRILLBAR"); for (i = 0; i < 3; ++i) - drillfill[i] = W_CachePatchName(va("DRILLFI%d", i+1), PU_HUDGFX); - capsulebar = W_CachePatchName("CAPSBAR", PU_HUDGFX); - capsulefill = W_CachePatchName("CAPSFILL", PU_HUDGFX); - minus5sec = W_CachePatchName("MINUS5", PU_HUDGFX); + HU_UpdatePatch(&drillfill[i], "DRILLFI%d", i+1); + HU_UpdatePatch(&capsulebar, "CAPSBAR"); + HU_UpdatePatch(&capsulefill, "CAPSFILL"); + HU_UpdatePatch(&minus5sec, "MINUS5"); for (i = 0; i < 7; ++i) - ngradeletters[i] = W_CachePatchName(va("GRADE%d", i), PU_HUDGFX); + HU_UpdatePatch(&ngradeletters[i], "GRADE%d", i); K_LoadKartHUDGraphics(); // Midnight Channel: - hud_tv1 = W_CachePatchName("HUD_TV1", PU_HUDGFX); - hud_tv2 = W_CachePatchName("HUD_TV2", PU_HUDGFX); + HU_UpdatePatch(&hud_tv1, "HUD_TV1"); + HU_UpdatePatch(&hud_tv2, "HUD_TV2"); #ifdef HAVE_DISCORDRPC // Discord Rich Presence - envelope = W_CachePatchName("K_REQUES", PU_HUDGFX); + HU_UpdatePatch(&envelope, "K_REQUES"); #endif } From 0cf65047ec02fffd86947226ddee02d441acbdbc Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 17 Dec 2021 03:09:00 -0800 Subject: [PATCH 07/48] Do not load MUSICDEF twice --- src/p_setup.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index e0c00fe3e..1aabc2227 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4478,11 +4478,6 @@ boolean P_AddWadFile(const char *wadfilename) // S_LoadMusicDefs(wadnum); - // - // edit music defs - // - S_LoadMusicDefs(wadnum); - // // search for maps // From 2179da40bf0878e003f4030cdb92c8661db47771 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 18 Dec 2021 18:23:24 -0500 Subject: [PATCH 08/48] Update brightmap reading - Does it per-wad - Saves hashes for certain bits - Adds R_UpdateTextureBrightmap to respect the zone memory --- src/d_netcmd.c | 2 +- src/k_brightmap.c | 88 +++++++++++++++++++++++------------------------ src/k_brightmap.h | 11 ++++++ src/p_setup.c | 2 +- src/r_textures.h | 2 ++ 5 files changed, 59 insertions(+), 46 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index c221aee90..31004c0b1 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -2571,7 +2571,7 @@ static void Command_Map_f(void) mustmodifygame = !(netgame || multiplayer) && !majormods; - if (mustmodifygame) + if (mustmodifygame && !option_force) { /* May want to be more descriptive? */ CONS_Printf(M_GetText("Sorry, level change disabled in single player.\n")); diff --git a/src/k_brightmap.c b/src/k_brightmap.c index f481938f2..c62d645e6 100644 --- a/src/k_brightmap.c +++ b/src/k_brightmap.c @@ -37,7 +37,7 @@ static size_t maxBrightmapStorage = 0; static brightmapStorage_t *K_NewBrightmap(void) { maxBrightmapStorage++; - brightmapStorage = (brightmapStorage_t *)Z_Realloc(brightmapStorage, sizeof(brightmapStorage_t) * (maxBrightmapStorage + 1), PU_STATIC, NULL); + brightmapStorage = (brightmapStorage_t *)Z_Realloc(brightmapStorage, sizeof(brightmapStorage_t) * (maxBrightmapStorage + 1), PU_STATIC, &brightmapStorage); return &brightmapStorage[ maxBrightmapStorage - 1 ]; } @@ -63,6 +63,7 @@ static brightmapStorage_t *K_GetBrightmapStorageByIndex(size_t checkIndex) --------------------------------------------------*/ static brightmapStorage_t *K_GetBrightmapStorageByTextureName(const char *checkName) { + UINT32 checkHash = quickncasehash(checkName, 8); size_t i; if (maxBrightmapStorage == 0) @@ -74,7 +75,7 @@ static brightmapStorage_t *K_GetBrightmapStorageByTextureName(const char *checkN { brightmapStorage_t *bms = &brightmapStorage[i]; - if (stricmp(checkName, bms->textureName) == 0) + if (checkHash == bms->textureHash) { // Name matches. return bms; @@ -119,6 +120,7 @@ static boolean K_BRIGHTLumpParser(UINT8 *data, size_t size) { bms = K_NewBrightmap(); strncpy(bms->textureName, tkn, 9); + bms->textureHash = quickncasehash(bms->textureName, 8); } Z_Free(tkn); @@ -128,6 +130,7 @@ static boolean K_BRIGHTLumpParser(UINT8 *data, size_t size) if (tkn && pos < size) { strncpy(bms->brightmapName, tkn, 9); + bms->brightmapHash = quickncasehash(bms->brightmapName, 8); } else { @@ -163,57 +166,45 @@ static boolean K_BRIGHTLumpParser(UINT8 *data, size_t size) } /*-------------------------------------------------- - void K_InitBrightmaps(void) + void K_InitBrightmapsPwad(INT32 wadNum) See header file for description. --------------------------------------------------*/ -void K_InitBrightmaps(void) +void K_InitBrightmapsPwad(INT32 wadNum) { - INT32 wadNum; + UINT16 lumpNum; size_t i; I_Assert(brightmapStorage == NULL); - maxBrightmapStorage = 0; - for (wadNum = 0; wadNum < numwadfiles; wadNum++) + // Find BRIGHT lump in the WAD + lumpNum = W_CheckNumForNamePwad("BRIGHT", wadNum, 0); + + while (lumpNum != INT16_MAX) { - UINT16 lumpNum; + UINT8 *data = (UINT8 *)W_CacheLumpNumPwad(wadNum, lumpNum, PU_CACHE); - // Find BRIGHT lump in the WAD - lumpNum = W_CheckNumForNamePwad("BRIGHT", wadNum, 0); - - while (lumpNum != INT16_MAX) + if (data != NULL) { - UINT8 *data; - data = (UINT8 *)W_CacheLumpNumPwad(wadNum, lumpNum, PU_STATIC); + lumpinfo_t *lump_p = &wadfiles[wadNum]->lumpinfo[lumpNum]; + size_t size = W_LumpLengthPwad(wadNum, lumpNum); - // If that didn't exist, we have nothing to do here. - if (data == NULL) - { - lumpNum = W_CheckNumForNamePwad("BRIGHT", (UINT16)wadNum, lumpNum + 1); - continue; - } - else - { - lumpinfo_t *lump_p = &wadfiles[wadNum]->lumpinfo[lumpNum]; - size_t size = W_LumpLengthPwad(wadNum, lumpNum); + size_t nameLength = strlen(wadfiles[wadNum]->filename) + 1 + strlen(lump_p->fullname); // length of file name, '|', and lump name + char *name = malloc(nameLength + 1); - size_t nameLength = strlen(wadfiles[wadNum]->filename) + 1 + strlen(lump_p->fullname); // length of file name, '|', and lump name - char *name = malloc(nameLength + 1); + sprintf(name, "%s|%s", wadfiles[wadNum]->filename, lump_p->fullname); + name[nameLength] = '\0'; - sprintf(name, "%s|%s", wadfiles[wadNum]->filename, lump_p->fullname); - name[nameLength] = '\0'; + size = W_LumpLengthPwad(wadNum, lumpNum); - size = W_LumpLengthPwad(wadNum, lumpNum); + CONS_Printf(M_GetText("Loading BRIGHT from %s\n"), name); + K_BRIGHTLumpParser(data, size); - CONS_Printf(M_GetText("Loading BRIGHT from %s\n"), name); - K_BRIGHTLumpParser(data, size); - - free(name); - } - - lumpNum = W_CheckNumForNamePwad("BRIGHT", (UINT16)wadNum, lumpNum + 1); + free(name); + Z_Free(data); } + + lumpNum = W_CheckNumForNamePwad("BRIGHT", (UINT16)wadNum, lumpNum + 1); } if (maxBrightmapStorage == 0) @@ -237,14 +228,7 @@ void K_InitBrightmaps(void) if (texNum != -1) { bmNum = R_CheckTextureNumForName(bms->brightmapName); - if (bmNum == -1) - { - texturebrightmaps[texNum] = 0; - } - else - { - texturebrightmaps[texNum] = bmNum; - } + R_UpdateTextureBrightmap(texNum, (bmNum == -1 ? 0 : bmNum)); } } @@ -253,4 +237,20 @@ void K_InitBrightmaps(void) // Clear brightmapStorage now that we're done with it. Z_Free(brightmapStorage); brightmapStorage = NULL; + maxBrightmapStorage = 0; +} + +/*-------------------------------------------------- + void K_InitBrightmaps(void) + + See header file for description. +--------------------------------------------------*/ +void K_InitBrightmaps(void) +{ + INT32 wadNum; + + for (wadNum = 0; wadNum < numwadfiles; wadNum++) + { + K_InitBrightmapsPwad(wadNum); + } } diff --git a/src/k_brightmap.h b/src/k_brightmap.h index 8d33ae5cb..72bc7e9df 100644 --- a/src/k_brightmap.h +++ b/src/k_brightmap.h @@ -24,9 +24,20 @@ typedef struct brightmapStorage_s // before putting them into texturebrightmaps. char textureName[9]; // The texture's name. + UINT32 textureHash; // The texture name's hash. + char brightmapName[9]; // The brightmap's name. + UINT32 brightmapHash; // The brightmap name's hash. } brightmapStorage_t; +/*-------------------------------------------------- + void K_InitBrightmapsPwad(INT32 wadNum); + + Finds all BRIGHT lumps for one WAD/PK3 and processes them. +--------------------------------------------------*/ + +void K_InitBrightmapsPwad(INT32 wadNum); + /*-------------------------------------------------- void K_InitBrightmaps(void); diff --git a/src/p_setup.c b/src/p_setup.c index 08826cf64..fcbe9ed07 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4463,7 +4463,7 @@ boolean P_AddWadFile(const char *wadfilename) P_InitPicAnims(); // Reload BRIGHT - K_InitBrightmaps(); + K_InitBrightmapsPwad(wadnum); // Flush and reload HUD graphics //ST_UnloadGraphics(); diff --git a/src/r_textures.h b/src/r_textures.h index 284fce987..fd67427f2 100644 --- a/src/r_textures.h +++ b/src/r_textures.h @@ -96,6 +96,8 @@ void *R_GetFlat(lumpnum_t flatnum); boolean R_CheckPowersOfTwo(void); void R_CheckFlatLength(size_t size); +void R_UpdateTextureBrightmap(INT32 tx, INT32 bm); + // Returns the texture number for the texture name. INT32 R_TextureNumForName(const char *name); INT32 R_CheckTextureNumForName(const char *name); From cd7e1258636a161258f945a244b8aee48663f204 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 12 Mar 2022 18:00:52 +0000 Subject: [PATCH 09/48] Update texturecache user when reallocating # Conflicts: # src/r_textures.c --- src/r_textures.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/r_textures.c b/src/r_textures.c index b48ca9efd..d04935b3e 100644 --- a/src/r_textures.c +++ b/src/r_textures.c @@ -1056,10 +1056,20 @@ static void R_AllocateTextures(INT32 add) // Create brightmap texture table. Z_Realloc(texturebrightmaps, (newtextures + 1) * sizeof(*texturebrightmaps), PU_STATIC, &texturebrightmaps); - for (i = numtextures; i < newtextures; ++i) + for (i = 0; i < numtextures; ++i) + { + // R_FlushTextureCache relies on the user for + // Z_Free, texturecache has been reallocated so the + // user is now garbage memory. + Z_SetUser(texturecache[i], + (void**)&texturecache[i]); + } + + while (i < newtextures) { texturetranslation[i] = i; texturebrightmaps[i] = 0; + i++; } } From b9f91cb7ecadafef72117d417146c3123fe33ee1 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Wed, 30 Mar 2022 15:25:55 -0400 Subject: [PATCH 10/48] Increase bot difficulty range to 13 While I finally pushed to do this because of the epic Blue Sphere reference, I was kinda thinking about doing this for a while, because it gives more room for bots to level up during Hard GP. I thought about just making the new level cap go up normally, but I decided on keeping the bots' passive buffs (like top speed & ring boosts) go up linearly, while rubberbanding range is kept the same. I don't think I can properly explain it, but this basically means level 13s are a touch harder than old level 9s before, and new level 9s are touch easier than old level 9s. Basically think of it as more level range than actually making the bots harder. The expanded range means that Hard GP can start off easier, but end harder. (And of course, Master is even more ridiculous c:) --- src/d_clisrv.c | 2 +- src/d_netcmd.c | 6 +++++- src/k_bot.c | 30 ++++++++++++++++++++---------- src/k_bot.h | 5 ++++- src/k_kart.c | 4 ++-- 5 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 7f6e6f287..f56e07777 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -3413,7 +3413,7 @@ static void Got_AddBot(UINT8 **p, INT32 playernum) { INT16 newplayernum; UINT8 skinnum = 0; - UINT8 difficulty = MAXBOTDIFFICULTY; + UINT8 difficulty = DIFFICULTBOT; if (playernum != serverplayer && !IsPlayerAdmin(playernum)) { diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 51b6b97d6..855353d9f 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -399,9 +399,13 @@ static CV_PossibleValue_t kartbot_cons_t[] = { {7, "Lv.7"}, {8, "Lv.8"}, {9, "Lv.9"}, + {10,"Lv.10"}, + {11,"Lv.11"}, + {12,"Lv.12"}, + {13,"Lv.MAX"}, {0, NULL} }; -consvar_t cv_kartbot = CVAR_INIT ("kartbot", "0", CV_NETVAR|CV_CHEAT, kartbot_cons_t, NULL); +consvar_t cv_kartbot = CVAR_INIT ("kartbot", "0", CV_NETVAR, kartbot_cons_t, NULL); consvar_t cv_karteliminatelast = CVAR_INIT ("karteliminatelast", "Yes", CV_NETVAR|CV_CHEAT|CV_CALL, CV_YesNo, KartEliminateLast_OnChange); diff --git a/src/k_bot.c b/src/k_bot.c index f31317546..7715cec90 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -477,24 +477,34 @@ fixed_t K_BotRubberband(player_t *player) if (wanteddist > player->distancetofinish) { // Whoa, you're too far ahead! Slow back down a little. - rubberband += (MAXBOTDIFFICULTY - player->botvars.difficulty) * (distdiff / 3); + rubberband += (DIFFICULTBOT - min(DIFFICULTBOT, player->botvars.difficulty)) * (distdiff / 3); } else { // Catch up to your position! - rubberband += (2*player->botvars.difficulty) * distdiff; + rubberband += player->botvars.difficulty * distdiff; } } - // Lv. 1: x1.0 max - // Lv. 5: x1.5 max - // Lv. 9: x2.0 max +#if 0 + // Lv. 1: x1.0 max + // Lv. 5: x1.5 max + // Lv. 9: x2.0 max + // Lv. MAX: x2.5 max + max = FRACUNIT + ((FRACUNIT * (player->botvars.difficulty - 1)) / (DIFFICULTBOT - 1)); +#else + // Lv. 1: x1.0 max + // Lv. 5: x1.333 max + // Lv. 9: x1.667 max + // Lv. MAX: x2.0 max max = FRACUNIT + ((FRACUNIT * (player->botvars.difficulty - 1)) / (MAXBOTDIFFICULTY - 1)); +#endif - // Lv. 1: x0.75 min - // Lv. 5: x0.875 min - // Lv. 9: x1.0 min - min = FRACUNIT - (((FRACUNIT/4) * (MAXBOTDIFFICULTY - player->botvars.difficulty)) / (MAXBOTDIFFICULTY - 1)); + // Lv. 1: x0.75 min + // Lv. 5: x0.875 min + // Lv. 9: x1.0 min + // Lv. MAX: x1.0 min + min = FRACUNIT - (((FRACUNIT/4) * (DIFFICULTBOT - min(DIFFICULTBOT, player->botvars.difficulty))) / (DIFFICULTBOT - 1)); if (rubberband > max) { @@ -851,7 +861,7 @@ static UINT8 K_TrySpindash(player_t *player) { INT32 boosthold = starttime - K_GetSpindashChargeTime(player); - boosthold -= (MAXBOTDIFFICULTY - player->botvars.difficulty) * difficultyModifier; + boosthold -= (DIFFICULTBOT - min(DIFFICULTBOT, player->botvars.difficulty)) * difficultyModifier; if (leveltime >= (unsigned)boosthold) { diff --git a/src/k_bot.h b/src/k_bot.h index a04d5c174..be0242449 100644 --- a/src/k_bot.h +++ b/src/k_bot.h @@ -18,7 +18,10 @@ #include "r_defs.h" // Maximum value of botvars.difficulty -#define MAXBOTDIFFICULTY 9 +#define MAXBOTDIFFICULTY 13 + +// Level of a "difficult" bot. The max bot level was increased, but this keeps all of the same calculations. +#define DIFFICULTBOT 9 // How many tics in a row do you need to turn in this direction before we'll let you turn. // Made it as small as possible without making it look like the bots are twitching constantly. diff --git a/src/k_kart.c b/src/k_kart.c index 58cb6fe31..c2f53632c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2982,7 +2982,7 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower) if (K_PlayerUsesBotMovement(player)) { // Increase bot speed by 1-10% depending on difficulty - fixed_t add = (player->botvars.difficulty * (FRACUNIT/10)) / MAXBOTDIFFICULTY; + fixed_t add = (player->botvars.difficulty * (FRACUNIT/10)) / DIFFICULTBOT; finalspeed = FixedMul(finalspeed, FRACUNIT + add); if (player->botvars.rival == true) @@ -7849,7 +7849,7 @@ INT32 K_GetKartRingPower(player_t *player, boolean boosted) if (boosted == true && K_PlayerUsesBotMovement(player)) { // Double for Lv. 9 - ringPower += (player->botvars.difficulty * ringPower) / MAXBOTDIFFICULTY; + ringPower += (player->botvars.difficulty * ringPower) / DIFFICULTBOT; } return ringPower; From 46dad4b7ddb751c9732880580315dd67339ff611 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Wed, 30 Mar 2022 20:28:08 -0400 Subject: [PATCH 11/48] Start on better bot position --- src/k_bot.c | 443 +++++++++++++++++++++++++++++++--------------- src/k_bot.h | 15 ++ src/k_botsearch.c | 151 ++++++++++++++++ 3 files changed, 470 insertions(+), 139 deletions(-) diff --git a/src/k_bot.c b/src/k_bot.c index 7715cec90..8c4028bbe 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -1027,6 +1027,208 @@ static void K_BotTrick(player_t *player, ticcmd_t *cmd, line_t *botController) } } +/*-------------------------------------------------- + static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t *predict) + + Determines inputs for standard track driving. + + Input Arguments:- + player - Player to generate the ticcmd for. + cmd - The player's ticcmd to modify. + predict - Pointer to the bot's prediction. + + Return:- + New value for turn amount. +--------------------------------------------------*/ +static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t *predict, angle_t destangle) +{ + // Handle steering towards waypoints! + INT32 turnamt = 0; + SINT8 turnsign = 0; + angle_t moveangle, angle; + INT16 anglediff; + + I_Assert(predict != NULL); + + moveangle = player->mo->angle; + angle = (moveangle - destangle); + + if (angle < ANGLE_180) + { + turnsign = -1; // Turn right + anglediff = AngleFixed(angle)>>FRACBITS; + } + else + { + turnsign = 1; // Turn left + anglediff = 360-(AngleFixed(angle)>>FRACBITS); + } + + anglediff = abs(anglediff); + turnamt = KART_FULLTURN * turnsign; + + if (anglediff > 90) + { + // Wrong way! + cmd->forwardmove = -MAXPLMOVE; + cmd->buttons |= BT_BRAKE; + } + else + { + const fixed_t playerwidth = (player->mo->radius * 2); + fixed_t realrad = predict->radius - (playerwidth * 4); // Remove a "safe" distance away from the edges of the road + fixed_t rad = realrad; + fixed_t dirdist = K_DistanceOfLineFromPoint( + player->mo->x, player->mo->y, + player->mo->x + FINECOSINE(moveangle >> ANGLETOFINESHIFT), player->mo->y + FINESINE(moveangle >> ANGLETOFINESHIFT), + predict->x, predict->y + ); + + if (anglediff > 0) + { + // Become more precise based on how hard you need to turn + // This makes predictions into turns a little nicer + // Facing 90 degrees away from the predicted point gives you a 1/3 radius + rad = FixedMul(rad, ((135 - anglediff) * FRACUNIT) / 135); + } + + if (rad > realrad) + { + rad = realrad; + } + else if (rad < playerwidth) + { + rad = playerwidth; + } + + cmd->buttons |= BT_ACCELERATE; + + // Full speed ahead! + cmd->forwardmove = MAXPLMOVE; + + if (dirdist <= rad) + { + fixed_t speedmul = FixedDiv(player->speed, K_GetKartSpeed(player, false)); + fixed_t speedrad = rad/4; + + if (speedmul > FRACUNIT) + { + speedmul = FRACUNIT; + } + + // Increase radius with speed + // At low speed, the CPU will try to be more accurate + // At high speed, they're more likely to lawnmower + speedrad += FixedMul(speedmul, rad - speedrad); + + if (speedrad < playerwidth) + { + speedrad = playerwidth; + } + + if (dirdist <= speedrad) + { + // Don't turn at all + turnamt = 0; + } + } + } + + return turnamt; +} + +/*-------------------------------------------------- + static INT32 K_HandleBotReverse(player_t *player, ticcmd_t *cmd, botprediction_t *predict) + + Determines inputs for reversing. + + Input Arguments:- + player - Player to generate the ticcmd for. + cmd - The player's ticcmd to modify. + predict - Pointer to the bot's prediction. + + Return:- + New value for turn amount. +--------------------------------------------------*/ +static INT32 K_HandleBotReverse(player_t *player, ticcmd_t *cmd, botprediction_t *predict, angle_t destangle) +{ + // Handle steering towards waypoints! + INT32 turnamt = 0; + SINT8 turnsign = 0; + angle_t moveangle, angle; + INT16 anglediff; + + if (predict != NULL) + { + // TODO: Should we reverse through bot controllers? + return K_HandleBotTrack(player, cmd, predict, destangle); + } + + if (player->nextwaypoint == NULL + || player->nextwaypoint->mobj != NULL + || P_MobjWasRemoved(player->nextwaypoint->mobj)) + { + // No data available... + return 0; + } + + if ((player->nextwaypoint->prevwaypoints != NULL) + && (player->nextwaypoint->numprevwaypoints > 0U)) + { + size_t i; + for (i = 0U; i < player->nextwaypoint->numprevwaypoints; i++) + { + if (!K_GetWaypointIsEnabled(player->nextwaypoint->prevwaypoints[i])) + { + continue; + } + + destangle = R_PointToAngle2( + player->nextwaypoint->prevwaypoints[i]->mobj->x, player->nextwaypoint->prevwaypoints[i]->mobj->y, + player->nextwaypoint->mobj->x, player->nextwaypoint->mobj->y + ); + + break; + } + } + + moveangle = player->mo->angle; + angle = (moveangle - destangle); + + if (angle < ANGLE_180) + { + turnsign = -1; // Turn right + anglediff = AngleFixed(angle)>>FRACBITS; + } + else + { + turnsign = 1; // Turn left + anglediff = 360-(AngleFixed(angle)>>FRACBITS); + } + + anglediff = abs(anglediff); + turnamt = KART_FULLTURN * turnsign; + + if (anglediff > 90) + { + // We're not facing the track... + cmd->forwardmove = 0; + cmd->buttons |= BT_ACCELERATE|BT_BRAKE; + } + else + { + if (anglediff < 10) + { + turnamt = 0; + } + + cmd->forwardmove = -MAXPLMOVE; + cmd->buttons |= BT_BRAKE|BT_LOOKBACK; + } + + return turnamt; +} + /*-------------------------------------------------- void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) @@ -1036,6 +1238,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) { botprediction_t *predict = NULL; boolean trySpindash = true; + angle_t destangle = 0; UINT8 spindash = 0; INT32 turnamt = 0; line_t *botController = NULL; @@ -1049,13 +1252,11 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) // Remove any existing controls memset(cmd, 0, sizeof(ticcmd_t)); - if ( - gamestate != GS_LEVEL + if (gamestate != GS_LEVEL || player->mo->scale <= 1 || player->playerstate == PST_DEAD || leveltime <= introtime - || (player->exiting && !(gametyperules & GTR_CIRCUIT)) - ) + || !(gametyperules & GTR_BOTS)) { // No need to do anything else. return; @@ -1077,126 +1278,26 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) return; } - if ((player->nextwaypoint != NULL - && player->nextwaypoint->mobj != NULL - && !P_MobjWasRemoved(player->nextwaypoint->mobj)) - || (botController != NULL)) + destangle = player->mo->angle; + + if (botController != NULL && (botController->flags & ML_EFFECT1)) { - // Handle steering towards waypoints! - SINT8 turnsign = 0; - angle_t destangle, moveangle, angle; - INT16 anglediff; + const fixed_t dist = (player->mo->radius * 4); - if (botController != NULL && (botController->flags & ML_EFFECT1)) - { - const fixed_t dist = (player->mo->radius * 4); + // X Offset: Movement direction + destangle = FixedAngle(sides[botController->sidenum[0]].textureoffset); - // X Offset: Movement direction - destangle = FixedAngle(sides[botController->sidenum[0]].textureoffset); + // Overwritten prediction + predict = Z_Calloc(sizeof(botprediction_t), PU_STATIC, NULL); - // Overwritten prediction - predict = Z_Calloc(sizeof(botprediction_t), PU_STATIC, NULL); - - predict->x = player->mo->x + FixedMul(dist, FINECOSINE(destangle >> ANGLETOFINESHIFT)); - predict->y = player->mo->y + FixedMul(dist, FINESINE(destangle >> ANGLETOFINESHIFT)); - predict->radius = (DEFAULT_WAYPOINT_RADIUS / 4) * mapobjectscale; - } - else - { - predict = K_CreateBotPrediction(player); - - K_NudgePredictionTowardsObjects(predict, player); - - destangle = R_PointToAngle2(player->mo->x, player->mo->y, predict->x, predict->y); - } - - moveangle = player->mo->angle; - angle = (moveangle - destangle); - - if (angle < ANGLE_180) - { - turnsign = -1; // Turn right - anglediff = AngleFixed(angle)>>FRACBITS; - } - else - { - turnsign = 1; // Turn left - anglediff = 360-(AngleFixed(angle)>>FRACBITS); - } - - anglediff = abs(anglediff); - turnamt = KART_FULLTURN * turnsign; - - if (anglediff > 90) - { - // Wrong way! - cmd->forwardmove = -MAXPLMOVE; - cmd->buttons |= BT_BRAKE; - } - else - { - const fixed_t playerwidth = (player->mo->radius * 2); - fixed_t realrad = predict->radius - (playerwidth * 4); // Remove a "safe" distance away from the edges of the road - fixed_t rad = realrad; - fixed_t dirdist = K_DistanceOfLineFromPoint( - player->mo->x, player->mo->y, - player->mo->x + FINECOSINE(moveangle >> ANGLETOFINESHIFT), player->mo->y + FINESINE(moveangle >> ANGLETOFINESHIFT), - predict->x, predict->y - ); - - if (anglediff > 0) - { - // Become more precise based on how hard you need to turn - // This makes predictions into turns a little nicer - // Facing 90 degrees away from the predicted point gives you a 1/3 radius - rad = FixedMul(rad, ((135 - anglediff) * FRACUNIT) / 135); - } - - if (rad > realrad) - { - rad = realrad; - } - else if (rad < playerwidth) - { - rad = playerwidth; - } - - cmd->buttons |= BT_ACCELERATE; - - // Full speed ahead! - cmd->forwardmove = MAXPLMOVE; - - if (dirdist <= rad) - { - fixed_t speedmul = FixedDiv(player->speed, K_GetKartSpeed(player, false)); - fixed_t speedrad = rad/4; - - if (speedmul > FRACUNIT) - { - speedmul = FRACUNIT; - } - - // Increase radius with speed - // At low speed, the CPU will try to be more accurate - // At high speed, they're more likely to lawnmower - speedrad += FixedMul(speedmul, rad - speedrad); - - if (speedrad < playerwidth) - { - speedrad = playerwidth; - } - - if (dirdist <= speedrad) - { - // Don't turn at all - turnamt = 0; - } - } - } + predict->x = player->mo->x + FixedMul(dist, FINECOSINE(destangle >> ANGLETOFINESHIFT)); + predict->y = player->mo->y + FixedMul(dist, FINESINE(destangle >> ANGLETOFINESHIFT)); + predict->radius = (DEFAULT_WAYPOINT_RADIUS / 4) * mapobjectscale; } if (leveltime <= starttime && finishBeamLine != NULL) { + // Handle POSITION!! const fixed_t distBase = 384*mapobjectscale; const fixed_t distAdjust = 64*mapobjectscale; @@ -1212,35 +1313,100 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) // Don't run the spindash code at all until we're in the right place trySpindash = false; - // If you're too far, enable spindash & stay still. - // If you're too close, start backing up. +#define QuickDebugPrint(input) \ + if (player - players == displayplayers[0]) \ + CONS_Printf(input); if (distToFinish < closeDist) { - // Silly way of getting us to reverse, but it respects the above code - // where we figure out what the shape of the track looks like. - UINT16 oldButtons = cmd->buttons; - - cmd->buttons &= ~(BT_ACCELERATE|BT_BRAKE); - - if (oldButtons & BT_ACCELERATE) - { - cmd->buttons |= BT_BRAKE; - } - - if (oldButtons & BT_BRAKE) - { - cmd->buttons |= BT_ACCELERATE; - } - - cmd->forwardmove = -cmd->forwardmove; + // We're too close, we need to start backing up. + turnamt = K_HandleBotReverse(player, cmd, predict, destangle); + QuickDebugPrint("Too close\n"); } else if (distToFinish < farDist) { - // We're in about the right place, spindash now. - cmd->forwardmove = 0; - trySpindash = true; + INT32 bullyTurn = INT32_MAX; + + // We're in about the right place, let's do whatever we want to. + + if (player->kartspeed > 3) + { + // Faster characters want to spindash. + // Slower characters will use their momentum. + trySpindash = true; + } + + // Look for characters to bully. + bullyTurn = K_PositionBully(player); + if (bullyTurn == INT32_MAX) + { + // No one to bully, just go for a spindash as anyone. + if (predict == NULL) + { + // Create a prediction. + if (player->nextwaypoint != NULL + && player->nextwaypoint->mobj != NULL + && !P_MobjWasRemoved(player->nextwaypoint->mobj)) + { + predict = K_CreateBotPrediction(player); + K_NudgePredictionTowardsObjects(predict, player); + destangle = R_PointToAngle2(player->mo->x, player->mo->y, predict->x, predict->y); + } + } + + QuickDebugPrint("No one to bully\n"); + turnamt = K_HandleBotTrack(player, cmd, predict, destangle); + cmd->buttons &= ~(BT_ACCELERATE|BT_BRAKE); + cmd->forwardmove = 0; + trySpindash = true; + } + else + { + QuickDebugPrint("Go get 'em\n"); + turnamt = bullyTurn; + + trySpindash = false; + cmd->buttons |= BT_ACCELERATE; + cmd->forwardmove = MAXPLMOVE; + } } + else + { + QuickDebugPrint("Too far\n"); + // Too far away, we need to just drive up. + if (predict == NULL) + { + // Create a prediction. + if (player->nextwaypoint != NULL + && player->nextwaypoint->mobj != NULL + && !P_MobjWasRemoved(player->nextwaypoint->mobj)) + { + predict = K_CreateBotPrediction(player); + K_NudgePredictionTowardsObjects(predict, player); + destangle = R_PointToAngle2(player->mo->x, player->mo->y, predict->x, predict->y); + } + } + + turnamt = K_HandleBotTrack(player, cmd, predict, destangle); + } + } + else + { + // Handle steering towards waypoints! + if (predict == NULL) + { + // Create a prediction. + if (player->nextwaypoint != NULL + && player->nextwaypoint->mobj != NULL + && !P_MobjWasRemoved(player->nextwaypoint->mobj)) + { + predict = K_CreateBotPrediction(player); + K_NudgePredictionTowardsObjects(predict, player); + destangle = R_PointToAngle2(player->mo->x, player->mo->y, predict->x, predict->y); + } + } + + turnamt = K_HandleBotTrack(player, cmd, predict, destangle); } if (trySpindash == true) @@ -1325,4 +1491,3 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) Z_Free(predict); } } - diff --git a/src/k_bot.h b/src/k_bot.h index be0242449..d608fe367 100644 --- a/src/k_bot.h +++ b/src/k_bot.h @@ -223,6 +223,21 @@ boolean K_BotHatesThisSector(player_t *player, sector_t *sec, fixed_t x, fixed_t void K_NudgePredictionTowardsObjects(botprediction_t *predict, player_t *player); +/*-------------------------------------------------- + INT32 K_PositionBully(player_t *player) + + Calculates a turn value to reach a player that can be bullied. + + Input Arguments:- + player - Bot to run this for. + + Return:- + INT32_MAX if couldn't find anything, otherwise a steering value. +--------------------------------------------------*/ + +INT32 K_PositionBully(player_t *player); + + /*-------------------------------------------------- void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd); diff --git a/src/k_botsearch.c b/src/k_botsearch.c index 6e256a9e5..a234bf418 100644 --- a/src/k_botsearch.c +++ b/src/k_botsearch.c @@ -40,6 +40,9 @@ struct globalsmuggle INT64 avoidAvgX[2], avoidAvgY[2]; UINT32 avoidObjs[2]; + fixed_t annoyscore; + mobj_t *annoymo; + fixed_t closestlinedist; fixed_t eggboxx, eggboxy; @@ -771,3 +774,151 @@ void K_NudgePredictionTowardsObjects(botprediction_t *predict, player_t *player) } } } + +/*-------------------------------------------------- + static boolean K_FindPlayersToBully(mobj_t *thing) + + Blockmap search function. + Finds players around the bot to bump. + + Input Arguments:- + thing - Object passed in from iteration. + + Return:- + true continues searching, false ends the search early. +--------------------------------------------------*/ +static boolean K_FindPlayersToBully(mobj_t *thing) +{ + INT16 anglediff; + fixed_t fulldist; + fixed_t ourweight, theirweight, weightdiff; + angle_t ourangle, destangle, angle; + + if (!globalsmuggle.botmo || P_MobjWasRemoved(globalsmuggle.botmo) || !globalsmuggle.botmo->player) + { + return false; + } + + if (thing->health <= 0) + { + return true; + } + + if (!thing->player) + { + return true; + } + + if (globalsmuggle.botmo == thing) + { + return true; + } + + fulldist = R_PointToDist2(globalsmuggle.botmo->x, globalsmuggle.botmo->y, thing->x, thing->y) - thing->radius; + + if (fulldist > globalsmuggle.distancetocheck) + { + return true; + } + + if (P_CheckSight(globalsmuggle.botmo, thing) == false) + { + return true; + } + + ourangle = globalsmuggle.botmo->angle; + destangle = R_PointToAngle2(globalsmuggle.botmo->x, globalsmuggle.botmo->y, thing->x, thing->y); + angle = (ourangle - destangle); + + if (angle < ANGLE_180) + { + anglediff = AngleFixed(angle)>>FRACBITS; + } + else + { + anglediff = 360-(AngleFixed(angle)>>FRACBITS); + } + + anglediff = abs(anglediff); + + ourweight = K_GetMobjWeight(globalsmuggle.botmo, thing); + theirweight = K_GetMobjWeight(thing, globalsmuggle.botmo); + weightdiff = 0; + + if (anglediff >= 90) + { + weightdiff = theirweight - ourweight; + } + else + { + weightdiff = ourweight - theirweight; + } + + if (weightdiff > mapobjectscale && weightdiff > globalsmuggle.annoyscore) + { + globalsmuggle.annoyscore = weightdiff; + globalsmuggle.annoymo = thing; + } + + return true; +} + +/*-------------------------------------------------- + INT32 K_PositionBully(player_t *player) + + See header file for description. +--------------------------------------------------*/ +INT32 K_PositionBully(player_t *player) +{ + INT32 xl, xh, yl, yh, bx, by; + + angle_t ourangle, destangle, angle; + INT16 anglediff; + + globalsmuggle.botmo = player->mo; + globalsmuggle.distancetocheck = 1024*player->mo->scale; + + globalsmuggle.annoymo = NULL; + globalsmuggle.annoyscore = 0; + + xl = (unsigned)(globalsmuggle.botmo->x - globalsmuggle.distancetocheck - bmaporgx)>>MAPBLOCKSHIFT; + xh = (unsigned)(globalsmuggle.botmo->x + globalsmuggle.distancetocheck - bmaporgx)>>MAPBLOCKSHIFT; + yl = (unsigned)(globalsmuggle.botmo->y - globalsmuggle.distancetocheck - bmaporgy)>>MAPBLOCKSHIFT; + yh = (unsigned)(globalsmuggle.botmo->y + globalsmuggle.distancetocheck - bmaporgy)>>MAPBLOCKSHIFT; + + BMBOUNDFIX(xl, xh, yl, yh); + + for (bx = xl; bx <= xh; bx++) + { + for (by = yl; by <= yh; by++) + { + P_BlockThingsIterator(bx, by, K_FindPlayersToBully); + } + } + + if (globalsmuggle.annoymo == NULL) + { + return INT32_MAX; + } + + ourangle = globalsmuggle.botmo->angle; + destangle = R_PointToAngle2(globalsmuggle.botmo->x, globalsmuggle.botmo->y, globalsmuggle.annoymo->x, globalsmuggle.annoymo->y); + angle = (ourangle - destangle); + + if (angle < ANGLE_180) + { + anglediff = AngleFixed(angle)>>FRACBITS; + } + else + { + anglediff = 360-(AngleFixed(angle)>>FRACBITS); + } + + if (anglediff < 30) + return 0; + + if (anglediff < 0) + return -KART_FULLTURN; + + return KART_FULLTURN; +} From 85c03a51d6a98202d64dc60589bcb704b9531e3b Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Wed, 30 Mar 2022 22:38:07 -0400 Subject: [PATCH 12/48] Add perfstats for bot ticcmd Cuz bot ticcmd generation is kinda chunky, and was curious how much time it takes. (It's actually a lot less than I thought ... still pretty hefty though) --- src/d_clisrv.c | 4 ++++ src/m_perfstats.c | 2 ++ src/m_perfstats.h | 1 + 3 files changed, 7 insertions(+) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index f56e07777..d8d52220a 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5092,6 +5092,8 @@ static void SV_Maketic(void) { INT32 i; + ps_botticcmd_time = 0; + for (i = 0; i < MAXPLAYERS; i++) { if (!playeringame[i]) @@ -5099,7 +5101,9 @@ static void SV_Maketic(void) if (K_PlayerUsesBotMovement(&players[i])) { + precise_t t = I_GetPreciseTime(); K_BuildBotTiccmd(&players[i], &netcmds[maketic%BACKUPTICS][i]); + ps_botticcmd_time += I_GetPreciseTime() - t; continue; } diff --git a/src/m_perfstats.c b/src/m_perfstats.c index b58599b6d..03930f495 100644 --- a/src/m_perfstats.c +++ b/src/m_perfstats.c @@ -46,6 +46,7 @@ static precise_t ps_frametime = 0; precise_t ps_tictime = 0; precise_t ps_playerthink_time = 0; +precise_t ps_botticcmd_time = 0; precise_t ps_thinkertime = 0; precise_t ps_thlist_times[NUM_THINKERLISTS]; @@ -363,6 +364,7 @@ static void M_DrawTickStats(void) perfstatrow_t extra_thinker_time_row[] = { {"lthinkf", "LUAh_ThinkFrame:", &ps_lua_thinkframe_time}, + {"botcmd ", "Bot logic: ", &ps_botticcmd_time}, {"other ", "Other: ", &extratime}, {0} }; diff --git a/src/m_perfstats.h b/src/m_perfstats.h index 1ca71957f..dae2f2030 100644 --- a/src/m_perfstats.h +++ b/src/m_perfstats.h @@ -19,6 +19,7 @@ extern precise_t ps_tictime; extern precise_t ps_playerthink_time; +extern precise_t ps_botticcmd_time; extern precise_t ps_thinkertime; extern precise_t ps_thlist_times[]; From 9475c80b9a6c120b6d44ccb79f189492d7e3b3aa Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Thu, 31 Mar 2022 15:45:18 -0400 Subject: [PATCH 13/48] Fix typo preventing reversing from working --- src/k_bot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_bot.c b/src/k_bot.c index 8c4028bbe..106415612 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -1165,7 +1165,7 @@ static INT32 K_HandleBotReverse(player_t *player, ticcmd_t *cmd, botprediction_t } if (player->nextwaypoint == NULL - || player->nextwaypoint->mobj != NULL + || player->nextwaypoint->mobj == NULL || P_MobjWasRemoved(player->nextwaypoint->mobj)) { // No data available... From d9b1bdb8516f28339c54f8c448d65d9dc7ad9eb2 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Thu, 31 Mar 2022 15:45:50 -0400 Subject: [PATCH 14/48] Remove bots without GTR_BOTS --- src/k_bot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_bot.c b/src/k_bot.c index 106415612..8967e57cb 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -167,7 +167,7 @@ void K_UpdateMatchRaceBots(void) } } - if (difficulty == 0 || bossinfo.boss == true) + if (difficulty == 0 || !(gametyperules & GTR_BOTS) || bossinfo.boss == true) { wantedbots = 0; } From 76bb14bd3e56b59b1b46f9e7a1e75e2a342f6631 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Thu, 31 Mar 2022 17:02:12 -0400 Subject: [PATCH 15/48] Scale some bot speed calculations with friction Makes them handle better on ice. Also includes some code to do the same with slopes, but it didn't work for subzero, so I gave up on it. --- src/k_bot.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 114 insertions(+), 8 deletions(-) diff --git a/src/k_bot.c b/src/k_bot.c index 8967e57cb..d34e05131 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -294,6 +294,60 @@ boolean K_BotCanTakeCut(player_t *player) return false; } +/*-------------------------------------------------- + static fixed_t K_BotSpeedScaled(player_t *player, fixed_t speed) + + Gets the bot's speed value, adjusted for predictions. + Mainly to make bots brake earlier when on friction sectors. + + Input Arguments:- + player - The bot player to calculate speed for. + speed - Raw speed value. + + Return:- + The bot's speed value for calculations. +--------------------------------------------------*/ +static fixed_t K_BotSpeedScaled(player_t *player, fixed_t speed) +{ + fixed_t friction = player->mo->friction; + fixed_t result = speed; + +#ifdef SUBZEROFIX // Intended for Subzero Peak's opening, but doesn't work... + // Going uphill: pretend speed is x0 + // Going downhill: pretend speed is x2 + if (player->mo->standingslope != NULL) + { + const pslope_t *slope = player->mo->standingslope; + + if (!(slope->flags & SL_NOPHYSICS) && abs(slope->zdelta) >= FRACUNIT/21) + { + fixed_t slopeMul = FRACUNIT; + angle_t angle = K_MomentumAngle(player->mo) - slope->xydirection; + + if (P_MobjFlip(player->mo) * slope->zdelta < 0) + angle ^= ANGLE_180; + + slopeMul = FRACUNIT + FINECOSINE(angle >> ANGLETOFINESHIFT); + result = FixedMul(result, slopeMul); + } + } +#endif + + // Reverse against friction. Allows for bots to + // acknowledge they'll be moving faster on ice, + // and to steer harder / brake earlier. + + if (friction == 0) + { + // There isn't really a good value to use in this instance. + friction = 1; + } + + result = FixedDiv(speed, friction); + + return result; +} + /*-------------------------------------------------- static line_t *K_FindBotController(mobj_t *mo) @@ -1108,7 +1162,7 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t * if (dirdist <= rad) { - fixed_t speedmul = FixedDiv(player->speed, K_GetKartSpeed(player, false)); + fixed_t speedmul = FixedDiv(K_BotSpeedScaled(player, player->speed), K_GetKartSpeed(player, false)); fixed_t speedrad = rad/4; if (speedmul > FRACUNIT) @@ -1156,7 +1210,7 @@ static INT32 K_HandleBotReverse(player_t *player, ticcmd_t *cmd, botprediction_t INT32 turnamt = 0; SINT8 turnsign = 0; angle_t moveangle, angle; - INT16 anglediff; + INT16 anglediff, momdiff; if (predict != NULL) { @@ -1192,6 +1246,7 @@ static INT32 K_HandleBotReverse(player_t *player, ticcmd_t *cmd, botprediction_t } } + // Calculate turn direction first. moveangle = player->mo->angle; angle = (moveangle - destangle); @@ -1209,21 +1264,72 @@ static INT32 K_HandleBotReverse(player_t *player, ticcmd_t *cmd, botprediction_t anglediff = abs(anglediff); turnamt = KART_FULLTURN * turnsign; - if (anglediff > 90) + // Now calculate momentum + momdiff = 180; + if (player->speed > player->mo->scale) { - // We're not facing the track... + momdiff = 0; + moveangle = K_MomentumAngle(player->mo); + angle = (moveangle - destangle); + + if (angle < ANGLE_180) + { + momdiff = AngleFixed(angle)>>FRACBITS; + } + else + { + momdiff = 360-(AngleFixed(angle)>>FRACBITS); + } + + momdiff = abs(momdiff); + } + + if (anglediff > 90 || momdiff < 90) + { + // We're not facing the track, + // or we're going too fast. + // Let's E-Brake. cmd->forwardmove = 0; cmd->buttons |= BT_ACCELERATE|BT_BRAKE; } else { +#ifdef SUBZEROFIX + fixed_t slopeMul = FRACUNIT; + + if (player->mo->standingslope != NULL) + { + const pslope_t *slope = player->mo->standingslope; + + if (!(slope->flags & SL_NOPHYSICS) && abs(slope->zdelta) >= FRACUNIT/21) + { + angle_t sangle = player->mo->angle - slope->xydirection; + + if (P_MobjFlip(player->mo) * slope->zdelta < 0) + sangle ^= ANGLE_180; + + slopeMul = FRACUNIT - FINECOSINE(sangle >> ANGLETOFINESHIFT); + } + } + + + if (slopeMul > (FRACUNIT + (FRACUNIT >> 4))) + { + // Slope is too steep to reverse -- EBrake. + cmd->forwardmove = 0; + cmd->buttons |= BT_ACCELERATE|BT_BRAKE; + } + else +#endif + { + cmd->forwardmove = -MAXPLMOVE; + cmd->buttons |= BT_BRAKE; //|BT_LOOKBACK + } + if (anglediff < 10) { turnamt = 0; } - - cmd->forwardmove = -MAXPLMOVE; - cmd->buttons |= BT_BRAKE|BT_LOOKBACK; } return turnamt; @@ -1308,7 +1414,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) finishBeamLine->v1->x, finishBeamLine->v1->y, finishBeamLine->v2->x, finishBeamLine->v2->y, player->mo->x, player->mo->y - ) - player->speed; + ) - K_BotSpeedScaled(player, player->speed); // Don't run the spindash code at all until we're in the right place trySpindash = false; From af3499c0248a3b18f30e7326952352ed8b7b2be1 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Thu, 31 Mar 2022 18:21:03 -0400 Subject: [PATCH 16/48] Make bots RETIRE when they NO CONTEST They get replaced with another bot when they NO CONTEST, swapping their skin and resetting their difficulty & points. --- src/k_grandprix.c | 122 ++++++++++++++++++++++++++++++++++++++++++---- src/k_grandprix.h | 26 ++++++++++ src/y_inter.c | 51 ++++++++++++------- 3 files changed, 173 insertions(+), 26 deletions(-) diff --git a/src/k_grandprix.c b/src/k_grandprix.c index c07bf2a81..be29dbad3 100644 --- a/src/k_grandprix.c +++ b/src/k_grandprix.c @@ -95,6 +95,25 @@ INT16 K_CalculateGPRankPoints(UINT8 position, UINT8 numplayers) return points; } +/*-------------------------------------------------- + SINT8 K_BotDefaultSkin(void) + + See header file for description. +--------------------------------------------------*/ +SINT8 K_BotDefaultSkin(void) +{ + const char *defaultbotskinname = "eggrobo"; + SINT8 defaultbotskin = R_SkinAvailable(defaultbotskinname); + + if (defaultbotskin == -1) + { + // This shouldn't happen, but just in case + defaultbotskin = 0; + } + + return defaultbotskin; +} + /*-------------------------------------------------- void K_InitGrandPrixBots(void) @@ -102,8 +121,7 @@ INT16 K_CalculateGPRankPoints(UINT8 position, UINT8 numplayers) --------------------------------------------------*/ void K_InitGrandPrixBots(void) { - const char *defaultbotskinname = "eggrobo"; - SINT8 defaultbotskin = R_SkinAvailable(defaultbotskinname); + const SINT8 defaultbotskin = K_BotDefaultSkin(); const UINT8 startingdifficulty = K_BotStartingDifficulty(grandprixinfo.gamespeed); UINT8 difficultylevels[MAXPLAYERS]; @@ -121,12 +139,6 @@ void K_InitGrandPrixBots(void) UINT8 newplayernum = 0; UINT8 i, j; - if (defaultbotskin == -1) - { - // This shouldn't happen, but just in case - defaultbotskin = 0; - } - memset(competitors, MAXPLAYERS, sizeof (competitors)); memset(botskinlist, defaultbotskin, sizeof (botskinlist)); @@ -144,7 +156,7 @@ void K_InitGrandPrixBots(void) } #if MAXPLAYERS != 16 - I_Error("GP bot difficulty levels need rebalacned for the new player count!\n"); + I_Error("GP bot difficulty levels need rebalanced for the new player count!\n"); #endif if (grandprixinfo.masterbots) @@ -500,6 +512,98 @@ void K_IncreaseBotDifficulty(player_t *bot) } } +/*-------------------------------------------------- + void K_ReplaceBot(player_t *bot) + + See header file for description. +--------------------------------------------------*/ +void K_ReplaceBot(player_t *bot) +{ + const SINT8 defaultbotskin = K_BotDefaultSkin(); + SINT8 newDifficulty; + + boolean skinusable[MAXSKINS]; + UINT8 skinnum; + UINT8 loops = 0; + + UINT8 i; + + // init usable bot skins list + for (i = 0; i < MAXSKINS; i++) + { + if (i < numskins) + { + skinusable[i] = true; + } + else + { + skinusable[i] = false; + } + } + + for (i = 0; i < MAXPLAYERS; i++) + { + if (playeringame[i] && !players[i].spectator) + { + skinusable[players[i].skin] = false; + } + } + + skinnum = P_RandomKey(numskins); + + while (!skinusable[skinnum]) + { + if (loops >= numskins) + { + // no more skins + break; + } + + skinnum++; + + if (skinnum >= numskins) + { + skinnum = 0; + } + + loops++; + } + + if (loops >= numskins) + { + // Use default skin + skinnum = defaultbotskin; + } + + if (!grandprixinfo.gp) // Sure, let's let this happen all the time :) + { + newDifficulty = cv_kartbot.value; + } + else + { + const UINT8 startingdifficulty = K_BotStartingDifficulty(grandprixinfo.gamespeed); + newDifficulty = startingdifficulty - 3 + (grandprixinfo.roundnum - 1); + } + + if (newDifficulty > MAXBOTDIFFICULTY) + { + newDifficulty = MAXBOTDIFFICULTY; + } + else if (newDifficulty < 1) + { + newDifficulty = 1; + } + + bot->botvars.difficulty = newDifficulty; + bot->botvars.diffincrease = 0; + + SetPlayerSkinByNum(bot - players, skinnum); + bot->skincolor = skins[skinnum].prefcolor; + sprintf(player_names[bot - players], "%s", skins[skinnum].realname); + + bot->score = 0; +} + /*-------------------------------------------------- void K_FakeBotResults(player_t *bot) diff --git a/src/k_grandprix.h b/src/k_grandprix.h index 9f27b485b..f951860d8 100644 --- a/src/k_grandprix.h +++ b/src/k_grandprix.h @@ -62,6 +62,16 @@ UINT8 K_BotStartingDifficulty(SINT8 value); INT16 K_CalculateGPRankPoints(UINT8 position, UINT8 numplayers); +/*-------------------------------------------------- + SINT8 K_BotDefaultSkin(void); + + Returns the skin number of the skin the game + uses as a fallback option. +--------------------------------------------------*/ + +SINT8 K_BotDefaultSkin(void); + + /*-------------------------------------------------- void K_InitGrandPrixBots(void); @@ -95,6 +105,22 @@ void K_UpdateGrandPrixBots(void); void K_IncreaseBotDifficulty(player_t *bot); +/*-------------------------------------------------- + void K_ReplaceBot(player_t *bot); + + "Replaces" a bot, by refreshing their difficulty + and changing their skin. + + Input Arguments:- + bot - Player to do this for. + + Return:- + None +--------------------------------------------------*/ + +void K_ReplaceBot(player_t *bot); + + /*-------------------------------------------------- void K_FakeBotResults(player_t *bot); diff --git a/src/y_inter.c b/src/y_inter.c index a1a414d19..69cbf2660 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -316,25 +316,27 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32)) data.pos[data.numplayers] = data.numplayers+1; } - if ((powertype == PWRLV_DISABLED) - && (!rankingsmode) - && !(players[i].pflags & PF_NOCONTEST) - && (data.pos[data.numplayers] < (numplayersingame + numgriefers))) + if (!rankingsmode) { - // Online rank is handled further below in this file. - data.increase[i] = K_CalculateGPRankPoints(data.pos[data.numplayers], numplayersingame + numgriefers); - players[i].score += data.increase[i]; - } + if ((powertype == PWRLV_DISABLED) + && !(players[i].pflags & PF_NOCONTEST) + && (data.pos[data.numplayers] < (numplayersingame + numgriefers))) + { + // Online rank is handled further below in this file. + data.increase[i] = K_CalculateGPRankPoints(data.pos[data.numplayers], numplayersingame + numgriefers); + players[i].score += data.increase[i]; + } - if (demo.recording && !rankingsmode) - { - G_WriteStanding( - data.pos[data.numplayers], - data.name[data.numplayers], - *data.character[data.numplayers], - *data.color[data.numplayers], - data.val[data.numplayers] - ); + if (demo.recording) + { + G_WriteStanding( + data.pos[data.numplayers], + data.name[data.numplayers], + *data.character[data.numplayers], + *data.color[data.numplayers], + data.val[data.numplayers] + ); + } } data.numplayers++; @@ -582,6 +584,12 @@ void Y_IntermissionDrawer(void) V_DrawScaledPatch(x+16, y-4, 0, W_CachePatchName(va("K_CHILI%d", cursorframe+1), PU_CACHE)); } + if (!data.rankingsmode && (players[data.num[i]].pflags & PF_NOCONTEST) && players[data.num[i]].bot) + { + // RETIRED!! + V_DrawScaledPatch(x+12, y-7, 0, W_CachePatchName("K_NOBLNS", PU_CACHE)); + } + STRBUFCPY(strtime, data.name[i]); y2 = y; @@ -803,6 +811,15 @@ void Y_Ticker(void) { if (!data.rankingsmode && sorttic != -1 && (intertic >= sorttic + 8)) { + UINT8 i; + for (i = 0; i < MAXPLAYERS; i++) + { + if ((players[i].pflags & PF_NOCONTEST) && players[i].bot) + { + K_ReplaceBot(&players[i]); + } + } + Y_CalculateMatchData(1, Y_CompareRank); } From 3fb1ebbbb03229dc0813922baaa46a007c11aa22 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 1 Apr 2022 16:00:28 -0400 Subject: [PATCH 17/48] Fix Sub Zero Peak opening Bots adjust their speed caluclations with slopes, so they anticipate moving faster going downhill and will stop sooner. They also EBrake instead reversing when trying to reverse up a hill. --- src/k_bot.c | 65 +++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/src/k_bot.c b/src/k_bot.c index d34e05131..dcacf0120 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -309,12 +309,29 @@ boolean K_BotCanTakeCut(player_t *player) --------------------------------------------------*/ static fixed_t K_BotSpeedScaled(player_t *player, fixed_t speed) { - fixed_t friction = player->mo->friction; + fixed_t moveFactor = player->mo->movefactor; fixed_t result = speed; -#ifdef SUBZEROFIX // Intended for Subzero Peak's opening, but doesn't work... - // Going uphill: pretend speed is x0 - // Going downhill: pretend speed is x2 +#if 0 // I still think this is a good idea, but it makes them move way slower on ice. Needs investigating. + if (moveFactor != FRACUNIT) + { + if (moveFactor == 0) + { + moveFactor = 1; + } + + // Reverse against friction. Allows for bots to + // acknowledge they'll be moving faster on ice, + // and to steer harder / brake earlier. + moveFactor = FixedDiv(FRACUNIT, moveFactor); + + // The full value is way too strong, reduce it. + moveFactor -= (moveFactor - FRACUNIT)*3/4; + + result = FixedMul(result, moveFactor); + } +#endif + if (player->mo->standingslope != NULL) { const pslope_t *slope = player->mo->standingslope; @@ -327,23 +344,14 @@ static fixed_t K_BotSpeedScaled(player_t *player, fixed_t speed) if (P_MobjFlip(player->mo) * slope->zdelta < 0) angle ^= ANGLE_180; + // Going uphill: 0 + // Going downhill: FRACUNIT*2 slopeMul = FRACUNIT + FINECOSINE(angle >> ANGLETOFINESHIFT); - result = FixedMul(result, slopeMul); + + // Range: 0.9 to 1.1 + result = FixedMul(result, (FRACUNIT*9/10) + (slopeMul/10)); } } -#endif - - // Reverse against friction. Allows for bots to - // acknowledge they'll be moving faster on ice, - // and to steer harder / brake earlier. - - if (friction == 0) - { - // There isn't really a good value to use in this instance. - friction = 1; - } - - result = FixedDiv(speed, friction); return result; } @@ -737,7 +745,7 @@ static botprediction_t *K_CreateBotPrediction(player_t *player) const INT16 normal = KART_FULLTURN; // "Standard" handling to compare to const tic_t futuresight = (TICRATE * normal) / max(1, handling); // How far ahead into the future to try and predict - const fixed_t speed = P_AproxDistance(player->mo->momx, player->mo->momy); + const fixed_t speed = K_BotSpeedScaled(player, P_AproxDistance(player->mo->momx, player->mo->momy)); const INT32 startDist = (768 * mapobjectscale) / FRACUNIT; const INT32 distance = ((speed / FRACUNIT) * futuresight) + startDist; @@ -1294,7 +1302,6 @@ static INT32 K_HandleBotReverse(player_t *player, ticcmd_t *cmd, botprediction_t } else { -#ifdef SUBZEROFIX fixed_t slopeMul = FRACUNIT; if (player->mo->standingslope != NULL) @@ -1312,19 +1319,19 @@ static INT32 K_HandleBotReverse(player_t *player, ticcmd_t *cmd, botprediction_t } } - - if (slopeMul > (FRACUNIT + (FRACUNIT >> 4))) +#define STEEP_SLOPE (FRACUNIT*11/10) + if (slopeMul > STEEP_SLOPE) { // Slope is too steep to reverse -- EBrake. cmd->forwardmove = 0; cmd->buttons |= BT_ACCELERATE|BT_BRAKE; } else -#endif { cmd->forwardmove = -MAXPLMOVE; cmd->buttons |= BT_BRAKE; //|BT_LOOKBACK } +#undef STEEP_SLOPE if (anglediff < 10) { @@ -1410,24 +1417,21 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) const fixed_t closeDist = distBase + (distAdjust * (9 - player->kartweight)); const fixed_t farDist = closeDist + (distAdjust * 2); + const tic_t futureSight = (TICRATE >> 1); + fixed_t distToFinish = K_DistanceOfLineFromPoint( finishBeamLine->v1->x, finishBeamLine->v1->y, finishBeamLine->v2->x, finishBeamLine->v2->y, player->mo->x, player->mo->y - ) - K_BotSpeedScaled(player, player->speed); + ) - (K_BotSpeedScaled(player, player->speed) * futureSight); // Don't run the spindash code at all until we're in the right place trySpindash = false; -#define QuickDebugPrint(input) \ - if (player - players == displayplayers[0]) \ - CONS_Printf(input); - if (distToFinish < closeDist) { // We're too close, we need to start backing up. turnamt = K_HandleBotReverse(player, cmd, predict, destangle); - QuickDebugPrint("Too close\n"); } else if (distToFinish < farDist) { @@ -1460,7 +1464,6 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) } } - QuickDebugPrint("No one to bully\n"); turnamt = K_HandleBotTrack(player, cmd, predict, destangle); cmd->buttons &= ~(BT_ACCELERATE|BT_BRAKE); cmd->forwardmove = 0; @@ -1468,7 +1471,6 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) } else { - QuickDebugPrint("Go get 'em\n"); turnamt = bullyTurn; trySpindash = false; @@ -1478,7 +1480,6 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) } else { - QuickDebugPrint("Too far\n"); // Too far away, we need to just drive up. if (predict == NULL) { From 1a25fcee4e1c5eadd2246d7ba6e2f6c01a6af11e Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 1 Apr 2022 16:05:49 -0400 Subject: [PATCH 18/48] Improve spindash conditions --- src/k_bot.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/k_bot.c b/src/k_bot.c index dcacf0120..0aee5902e 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -309,12 +309,15 @@ boolean K_BotCanTakeCut(player_t *player) --------------------------------------------------*/ static fixed_t K_BotSpeedScaled(player_t *player, fixed_t speed) { - fixed_t moveFactor = player->mo->movefactor; fixed_t result = speed; -#if 0 // I still think this is a good idea, but it makes them move way slower on ice. Needs investigating. - if (moveFactor != FRACUNIT) + // I still think this is a good idea, but it makes them move way slower on ice / slopes. + // Needs investigating. +#if 0 + if (player->mo->movefactor != FRACUNIT) { + fixed_t moveFactor = player->mo->movefactor; + if (moveFactor == 0) { moveFactor = 1; @@ -330,7 +333,6 @@ static fixed_t K_BotSpeedScaled(player_t *player, fixed_t speed) result = FixedMul(result, moveFactor); } -#endif if (player->mo->standingslope != NULL) { @@ -352,6 +354,7 @@ static fixed_t K_BotSpeedScaled(player_t *player, fixed_t speed) result = FixedMul(result, (FRACUNIT*9/10) + (slopeMul/10)); } } +#endif return result; } @@ -1439,7 +1442,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) // We're in about the right place, let's do whatever we want to. - if (player->kartspeed > 3) + if (player->kartspeed >= 5) { // Faster characters want to spindash. // Slower characters will use their momentum. @@ -1473,9 +1476,17 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) { turnamt = bullyTurn; - trySpindash = false; - cmd->buttons |= BT_ACCELERATE; - cmd->forwardmove = MAXPLMOVE; + // If already spindashing, wait until we get a relatively OK charge first. + if (player->spindash > 0 && player->spindash <= TICRATE) + { + trySpindash = true; + } + else + { + trySpindash = false; + cmd->buttons |= BT_ACCELERATE; + cmd->forwardmove = MAXPLMOVE; + } } } else From 56875c59e94e8bbdf8f390db2ee254c489748b98 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 1 Apr 2022 16:39:24 -0400 Subject: [PATCH 19/48] Improve bot friction rubberbanding --- src/k_bot.c | 34 +++------------------------------- 1 file changed, 3 insertions(+), 31 deletions(-) diff --git a/src/k_bot.c b/src/k_bot.c index 0aee5902e..33c1598a3 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -311,9 +311,6 @@ static fixed_t K_BotSpeedScaled(player_t *player, fixed_t speed) { fixed_t result = speed; - // I still think this is a good idea, but it makes them move way slower on ice / slopes. - // Needs investigating. -#if 0 if (player->mo->movefactor != FRACUNIT) { fixed_t moveFactor = player->mo->movefactor; @@ -354,7 +351,6 @@ static fixed_t K_BotSpeedScaled(player_t *player, fixed_t speed) result = FixedMul(result, (FRACUNIT*9/10) + (slopeMul/10)); } } -#endif return result; } @@ -648,8 +644,9 @@ fixed_t K_BotTopSpeedRubberband(player_t *player) --------------------------------------------------*/ fixed_t K_BotFrictionRubberband(player_t *player, fixed_t frict) { + const fixed_t value = 1024; fixed_t rubberband = K_BotRubberband(player) - FRACUNIT; - fixed_t origFrict, newFrict; + fixed_t newFrict = frict; if (rubberband <= 0) { @@ -657,32 +654,7 @@ fixed_t K_BotFrictionRubberband(player_t *player, fixed_t frict) return frict; } - if (player->tiregrease > 0) - { - // This isn't great -- it means rubberbanding will slow down when they hit a spring - // But it's better than the opposite where they accelerate into hyperspace :V - // (would appreciate an actual fix though ... could try being additive instead of multiplicative) - return frict; - } - - origFrict = FixedDiv(ORIG_FRICTION, FRACUNIT + (rubberband / 2)); - - if (frict == ORIG_FRICTION) - { - newFrict = origFrict; - } - else - { - // Do some mumbo jumbo to make our friction value - // relative to what it WOULD be for ORIG_FRICTION. - // (I hate multiplicative friction :/) - - fixed_t offset = ORIG_FRICTION - frict; - fixed_t ratio = FixedDiv(frict, ORIG_FRICTION); - - offset = FixedDiv(offset, ratio); - newFrict = frict + offset; - } + newFrict = frict - FixedMul(value, rubberband); if (newFrict < 0) newFrict = 0; From 18dc75e6ca7e831051a44f658a4319602ec4a1df Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 1 Apr 2022 17:23:27 -0400 Subject: [PATCH 20/48] Make more accurate to how it used to work --- src/k_bot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_bot.c b/src/k_bot.c index 33c1598a3..37d5c825b 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -644,7 +644,7 @@ fixed_t K_BotTopSpeedRubberband(player_t *player) --------------------------------------------------*/ fixed_t K_BotFrictionRubberband(player_t *player, fixed_t frict) { - const fixed_t value = 1024; + const fixed_t value = 20776; fixed_t rubberband = K_BotRubberband(player) - FRACUNIT; fixed_t newFrict = frict; From 0eb5c29448e5751d592a0295d9818fb7edda1077 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 1 Apr 2022 17:33:41 -0400 Subject: [PATCH 21/48] Don't do for tire grease again, but for the opposite reason. --- src/k_bot.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/k_bot.c b/src/k_bot.c index 37d5c825b..9c633f422 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -654,6 +654,12 @@ fixed_t K_BotFrictionRubberband(player_t *player, fixed_t frict) return frict; } + if (player->tiregrease > 0) + { + // Bots will lose all of their momentum without this. + return frict; + } + newFrict = frict - FixedMul(value, rubberband); if (newFrict < 0) From 59cd9e6157c3846b044bbf4cc07b66325a0f52a2 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 1 Apr 2022 21:47:50 -0400 Subject: [PATCH 22/48] Harder rubberbanding The old one is too difficult, the new one is too easy ... let's get an inbetween. --- src/k_bot.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/k_bot.c b/src/k_bot.c index 9c633f422..b3f73b8ac 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -547,19 +547,11 @@ fixed_t K_BotRubberband(player_t *player) } } -#if 0 // Lv. 1: x1.0 max - // Lv. 5: x1.5 max - // Lv. 9: x2.0 max - // Lv. MAX: x2.5 max - max = FRACUNIT + ((FRACUNIT * (player->botvars.difficulty - 1)) / (DIFFICULTBOT - 1)); -#else - // Lv. 1: x1.0 max - // Lv. 5: x1.333 max - // Lv. 9: x1.667 max - // Lv. MAX: x2.0 max - max = FRACUNIT + ((FRACUNIT * (player->botvars.difficulty - 1)) / (MAXBOTDIFFICULTY - 1)); -#endif + // Lv. 5: x1.4 max + // Lv. 9: x1.8 max + // Lv. MAX: x2.2 max + max = FRACUNIT + ((FRACUNIT * (player->botvars.difficulty - 1)) / 10); // Lv. 1: x0.75 min // Lv. 5: x0.875 min From 6bdd11533c78c9c7dc04305fa0072c9a7c98156c Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 1 Apr 2022 21:48:28 -0400 Subject: [PATCH 23/48] Don't replace bots on the final race. --- src/k_grandprix.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/k_grandprix.c b/src/k_grandprix.c index be29dbad3..332224479 100644 --- a/src/k_grandprix.c +++ b/src/k_grandprix.c @@ -528,6 +528,12 @@ void K_ReplaceBot(player_t *bot) UINT8 i; + if (grandprixinfo.gp == true && grandprixinfo.roundnum >= grandprixinfo.cup->numlevels) + { + // Was last map, no replacement. + return; + } + // init usable bot skins list for (i = 0; i < MAXSKINS; i++) { @@ -582,7 +588,7 @@ void K_ReplaceBot(player_t *bot) else { const UINT8 startingdifficulty = K_BotStartingDifficulty(grandprixinfo.gamespeed); - newDifficulty = startingdifficulty - 3 + (grandprixinfo.roundnum - 1); + newDifficulty = startingdifficulty - 4 + grandprixinfo.roundnum; } if (newDifficulty > MAXBOTDIFFICULTY) From 5ffba0a678f61bb2d02c1deca8598fd1215943a3 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 2 Apr 2022 14:43:38 -0400 Subject: [PATCH 24/48] review --- src/k_bot.c | 25 +++++++------ src/k_grandprix.c | 94 +++++++++++++++++++++++++++++------------------ src/k_grandprix.h | 14 ++----- src/y_inter.c | 13 ++----- 4 files changed, 78 insertions(+), 68 deletions(-) diff --git a/src/k_bot.c b/src/k_bot.c index b3f73b8ac..aed20e3b5 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -487,7 +487,7 @@ static UINT32 K_BotRubberbandDistance(player_t *player) fixed_t K_BotRubberband(player_t *player) { fixed_t rubberband = FRACUNIT; - fixed_t max, min; + fixed_t rubbermax, rubbermin; player_t *firstplace = NULL; line_t *botController = NULL; UINT8 i; @@ -551,21 +551,21 @@ fixed_t K_BotRubberband(player_t *player) // Lv. 5: x1.4 max // Lv. 9: x1.8 max // Lv. MAX: x2.2 max - max = FRACUNIT + ((FRACUNIT * (player->botvars.difficulty - 1)) / 10); + rubbermax = FRACUNIT + ((FRACUNIT * (player->botvars.difficulty - 1)) / 10); // Lv. 1: x0.75 min // Lv. 5: x0.875 min // Lv. 9: x1.0 min // Lv. MAX: x1.0 min - min = FRACUNIT - (((FRACUNIT/4) * (DIFFICULTBOT - min(DIFFICULTBOT, player->botvars.difficulty))) / (DIFFICULTBOT - 1)); + rubbermin = FRACUNIT - (((FRACUNIT/4) * (DIFFICULTBOT - min(DIFFICULTBOT, player->botvars.difficulty))) / (DIFFICULTBOT - 1)); - if (rubberband > max) + if (rubberband > rubbermax) { - rubberband = max; + rubberband = rubbermax; } - else if (rubberband < min) + else if (rubberband < rubbermin) { - rubberband = min; + rubberband = rubbermin; } return rubberband; @@ -1119,6 +1119,11 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t * predict->x, predict->y ); + if (realrad < player->mo->radius) + { + realrad = player->mo->radius; + } + if (anglediff > 0) { // Become more precise based on how hard you need to turn @@ -1447,11 +1452,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) turnamt = bullyTurn; // If already spindashing, wait until we get a relatively OK charge first. - if (player->spindash > 0 && player->spindash <= TICRATE) - { - trySpindash = true; - } - else + if (player->spindash == 0 || player->spindash > TICRATE) { trySpindash = false; cmd->buttons |= BT_ACCELERATE; diff --git a/src/k_grandprix.c b/src/k_grandprix.c index 332224479..bb14edac6 100644 --- a/src/k_grandprix.c +++ b/src/k_grandprix.c @@ -513,18 +513,16 @@ void K_IncreaseBotDifficulty(player_t *bot) } /*-------------------------------------------------- - void K_ReplaceBot(player_t *bot) + void K_RetireBots(void) See header file for description. --------------------------------------------------*/ -void K_ReplaceBot(player_t *bot) +void K_RetireBots(void) { const SINT8 defaultbotskin = K_BotDefaultSkin(); SINT8 newDifficulty; boolean skinusable[MAXSKINS]; - UINT8 skinnum; - UINT8 loops = 0; UINT8 i; @@ -555,32 +553,6 @@ void K_ReplaceBot(player_t *bot) } } - skinnum = P_RandomKey(numskins); - - while (!skinusable[skinnum]) - { - if (loops >= numskins) - { - // no more skins - break; - } - - skinnum++; - - if (skinnum >= numskins) - { - skinnum = 0; - } - - loops++; - } - - if (loops >= numskins) - { - // Use default skin - skinnum = defaultbotskin; - } - if (!grandprixinfo.gp) // Sure, let's let this happen all the time :) { newDifficulty = cv_kartbot.value; @@ -600,14 +572,64 @@ void K_ReplaceBot(player_t *bot) newDifficulty = 1; } - bot->botvars.difficulty = newDifficulty; - bot->botvars.diffincrease = 0; + for (i = 0; i < MAXPLAYERS; i++) + { + player_t *bot = NULL; - SetPlayerSkinByNum(bot - players, skinnum); - bot->skincolor = skins[skinnum].prefcolor; - sprintf(player_names[bot - players], "%s", skins[skinnum].realname); + if (!playeringame[i] || !players[i].bot) + { + continue; + } - bot->score = 0; + bot = players[i]; + + if (bot->spectator) + { + continue; + } + + if (bot->pflags & PF_NOCONTEST) + { + UINT8 skinnum = P_RandomKey(numskins); + UINT8 loops = 0; + + while (!skinusable[skinnum]) + { + if (loops >= numskins) + { + // no more skins + break; + } + + skinnum++; + + if (skinnum >= numskins) + { + skinnum = 0; + } + + loops++; + } + + if (loops >= numskins) + { + // Use default skin + skinnum = defaultbotskin; + } + + skinusable[skinnum] = false; + + bot->botvars.difficulty = newDifficulty; + bot->botvars.diffincrease = 0; + + SetPlayerSkinByNum(bot - players, skinnum); + bot->skincolor = skins[skinnum].prefcolor; + sprintf(player_names[bot - players], "%s", skins[skinnum].realname); + + bot->score = 0; + bot->pflags &= ~PF_NOCONTEST; + } + } } /*-------------------------------------------------- diff --git a/src/k_grandprix.h b/src/k_grandprix.h index f951860d8..552f75450 100644 --- a/src/k_grandprix.h +++ b/src/k_grandprix.h @@ -106,19 +106,13 @@ void K_IncreaseBotDifficulty(player_t *bot); /*-------------------------------------------------- - void K_ReplaceBot(player_t *bot); + void K_RetireBots(player_t *bot); - "Replaces" a bot, by refreshing their difficulty + Replaces PF_NOCONTEST bots, by refreshing their difficulty and changing their skin. - - Input Arguments:- - bot - Player to do this for. - - Return:- - None --------------------------------------------------*/ -void K_ReplaceBot(player_t *bot); +void K_RetireBots(player_t *bot); /*-------------------------------------------------- @@ -162,7 +156,7 @@ void K_PlayerLoseLife(player_t *player); None Return:- - None + true if can change important gameplay rules, otherwise false. --------------------------------------------------*/ boolean K_CanChangeRules(void); diff --git a/src/y_inter.c b/src/y_inter.c index 69cbf2660..7f48f0798 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -584,7 +584,7 @@ void Y_IntermissionDrawer(void) V_DrawScaledPatch(x+16, y-4, 0, W_CachePatchName(va("K_CHILI%d", cursorframe+1), PU_CACHE)); } - if (!data.rankingsmode && (players[data.num[i]].pflags & PF_NOCONTEST) && players[data.num[i]].bot) + if ((players[data.num[i]].pflags & PF_NOCONTEST) && players[data.num[i]].bot) { // RETIRED!! V_DrawScaledPatch(x+12, y-7, 0, W_CachePatchName("K_NOBLNS", PU_CACHE)); @@ -811,15 +811,7 @@ void Y_Ticker(void) { if (!data.rankingsmode && sorttic != -1 && (intertic >= sorttic + 8)) { - UINT8 i; - for (i = 0; i < MAXPLAYERS; i++) - { - if ((players[i].pflags & PF_NOCONTEST) && players[i].bot) - { - K_ReplaceBot(&players[i]); - } - } - + K_RetireBots(); Y_CalculateMatchData(1, Y_CompareRank); } @@ -1170,6 +1162,7 @@ void Y_StartIntermission(void) // void Y_EndIntermission(void) { + K_RetireBots(); Y_UnloadData(); endtic = -1; From 358cc9f215913be964cee1d9bc19b4debe3b4866 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 2 Apr 2022 14:54:23 -0400 Subject: [PATCH 25/48] Bad function declaration --- src/k_grandprix.c | 2 +- src/k_grandprix.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/k_grandprix.c b/src/k_grandprix.c index bb14edac6..740730c6f 100644 --- a/src/k_grandprix.c +++ b/src/k_grandprix.c @@ -581,7 +581,7 @@ void K_RetireBots(void) continue; } - bot = players[i]; + bot = &players[i]; if (bot->spectator) { diff --git a/src/k_grandprix.h b/src/k_grandprix.h index 552f75450..bd20d3894 100644 --- a/src/k_grandprix.h +++ b/src/k_grandprix.h @@ -106,13 +106,13 @@ void K_IncreaseBotDifficulty(player_t *bot); /*-------------------------------------------------- - void K_RetireBots(player_t *bot); + void K_RetireBots(void); Replaces PF_NOCONTEST bots, by refreshing their difficulty and changing their skin. --------------------------------------------------*/ -void K_RetireBots(player_t *bot); +void K_RetireBots(void); /*-------------------------------------------------- From dd48ec2df5c7d2a2add609a21753dd6fa44f627b Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Thu, 12 May 2022 17:54:12 -0500 Subject: [PATCH 26/48] Add FX for powerup clash collision --- src/deh_tables.c | 4 ++++ src/info.c | 32 ++++++++++++++++++++++++++++++++ src/info.h | 6 ++++++ src/k_collide.c | 23 +++++------------------ src/k_kart.c | 22 ++++++++++++++++++++++ src/k_kart.h | 1 + src/sounds.c | 3 +++ src/sounds.h | 3 +++ 8 files changed, 76 insertions(+), 18 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index c5acec7f8..faa5010ad 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3955,6 +3955,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_INSTASHIELDB6", "S_INSTASHIELDB7", + "S_POWERCLASH", // Invinc/Grow no damage collide VFX + "S_PLAYERARROW", // Above player arrow "S_PLAYERARROW_BOX", "S_PLAYERARROW_ITEM", @@ -5384,6 +5386,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_INSTASHIELDA", "MT_INSTASHIELDB", + "MT_POWERCLASH", // Invinc/Grow no damage clash VFX + "MT_PLAYERARROW", "MT_PLAYERWANTED", diff --git a/src/info.c b/src/info.c index 8d3b31f52..9279f0578 100644 --- a/src/info.c +++ b/src/info.c @@ -24,6 +24,7 @@ #include "lzf.h" // Hey, moron! If you change this table, don't forget about the sprite enum in info.h and the sprite lights in hw_light.c! +// EXCEPT HW_LIGHT.C DOESN'T EXIST ANYMORE LOVE CONTINUOUSLY FALLING ON MY ASS THROUGHOUT THIS CODEBASE - Tyron 2022-05-12 // For the sake of constant merge conflicts, let's spread this out char sprnames[NUMSPRITES + 1][5] = { @@ -600,6 +601,8 @@ char sprnames[NUMSPRITES + 1][5] = "ISTA", // instashield layer A "ISTB", // instashield layer B + "PWCL", // Invinc/grow clash VFX + "ARRO", // player arrows "ITEM", "ITMO", @@ -4498,6 +4501,8 @@ state_t states[NUMSTATES] = {SPR_ISTB, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_INSTASHIELDB7}, // S_INSTASHIELDB6 {SPR_ISTB, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_NULL}, // S_INSTASHIELDB7 + {SPR_PWCL, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE, 10, {NULL}, 9, 1, S_NULL}, + // Above player arrow {SPR_ARRO, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW {SPR_ARRO, FF_FULLBRIGHT|1, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_BOX @@ -25358,6 +25363,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_POWERCLASH + -1, // doomednum + S_POWERCLASH, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 8, // speed + 8*FRACUNIT, // radius + 8*FRACUNIT, // height + 2, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + { // MT_PLAYERARROW -1, // doomednum S_PLAYERARROW, // spawnstate diff --git a/src/info.h b/src/info.h index 5e4ef6418..f8dbb90bd 100644 --- a/src/info.h +++ b/src/info.h @@ -1147,6 +1147,8 @@ typedef enum sprite SPR_ISTA, // instashield layer A SPR_ISTB, // instashield layer B + SPR_PWCL, // Invinc/grow clash VFX + SPR_ARRO, // player arrows SPR_ITEM, SPR_ITMO, @@ -4938,6 +4940,8 @@ typedef enum state S_INSTASHIELDB6, S_INSTASHIELDB7, + S_POWERCLASH, // Grow/Invinc clash VFX + S_PLAYERARROW, // Above player arrow S_PLAYERARROW_BOX, S_PLAYERARROW_ITEM, @@ -6404,6 +6408,8 @@ typedef enum mobj_type MT_INSTASHIELDA, MT_INSTASHIELDB, + MT_POWERCLASH, // Grow/Invinc clash VFX + MT_PLAYERARROW, MT_PLAYERWANTED, diff --git a/src/k_collide.c b/src/k_collide.c index 665a3ff0a..fbe6af02d 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -788,24 +788,8 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) boolean stungT1 = false; boolean stungT2 = false; - // Grow damage - t1Condition = (t1->scale > t2->scale + (mapobjectscale/8)); - t2Condition = (t2->scale > t1->scale + (mapobjectscale/8)); - - if (t1Condition == true && t2Condition == false) - { - P_DamageMobj(t2, t1, t1, 1, DMG_TUMBLE); - return true; - } - else if (t1Condition == false && t2Condition == true) - { - P_DamageMobj(t1, t2, t2, 1, DMG_TUMBLE); - return true; - } - - // Invincibility damage - t1Condition = (t1->player->invincibilitytimer > 0); - t2Condition = (t2->player->invincibilitytimer > 0); + t1Condition = (t1->scale > t2->scale + (mapobjectscale/8)) || (t1->player->invincibilitytimer > 0); + t2Condition = (t2->scale > t1->scale + (mapobjectscale/8)) || (t2->player->invincibilitytimer > 0); if (t1Condition == true && t2Condition == false) { @@ -816,6 +800,9 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) { P_DamageMobj(t1, t2, t2, 1, DMG_TUMBLE); return true; + } else if (t1Condition == true && t2Condition == true) { + K_DoPowerClash(t1->player, t2->player); + return false; } // Flame Shield dash damage diff --git a/src/k_kart.c b/src/k_kart.c index 1071f0371..4edb34b5c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3388,6 +3388,28 @@ void K_DoInstashield(player_t *player) P_SetTarget(&layerb->target, player->mo); } +void K_DoPowerClash(player_t *t1, player_t *t2) { + mobj_t *clash; + + // short-circuit instashield for vfx visibility + t1->instashield = 1; + t2->instashield = 1; + + S_StartSound(t1->mo, sfx_parry); + K_AddHitLag(t1->mo, 6, false); + K_AddHitLag(t2->mo, 6, false); + + clash = P_SpawnMobj((t1->mo->x/2) + (t2->mo->x/2), (t1->mo->y/2) + (t2->mo->y/2), (t1->mo->z/2) + (t2->mo->z/2), MT_POWERCLASH); + + // needs to handle mixed scale collisions (t1 grow t2 invinc)... + clash->z = clash->z + (t1->mo->height/4) + (t2->mo->height/4); + clash->angle = R_PointToAngle2(clash->x, clash->y, t1->mo->x, t1->mo->y) + ANGLE_90; + + // Shrink over time (accidental behavior that looked good) + clash->destscale = (t1->mo->scale/2) + (t2->mo->scale/2); + P_SetScale(clash, 3*clash->destscale/2); +} + void K_BattleAwardHit(player_t *player, player_t *victim, mobj_t *inflictor, UINT8 bumpersRemoved) { UINT8 points = 1; diff --git a/src/k_kart.h b/src/k_kart.h index aef18b19e..d6ba0f720 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -67,6 +67,7 @@ angle_t K_MomentumAngle(mobj_t *mo); void K_AddHitLag(mobj_t *mo, INT32 tics, boolean fromDamage); void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fromDamage); void K_DoInstashield(player_t *player); +void K_DoPowerClash(player_t *t1, player_t *t2); void K_BattleAwardHit(player_t *player, player_t *victim, mobj_t *inflictor, UINT8 bumpersRemoved); void K_SpinPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 type); void K_TumblePlayer(player_t *player, mobj_t *inflictor, mobj_t *source); diff --git a/src/sounds.c b/src/sounds.c index 851c69518..761fa109c 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -1108,6 +1108,9 @@ sfxinfo_t S_sfx[NUMSFX] = {"kdtrg2", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Medium energy, SF_X8AWAYSOUND {"kdtrg3", false, 64, 80, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // High energy, SF_X2AWAYSOUND|SF_X8AWAYSOUND + // SRB2kart - Grow/invinc clash + {"parry", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // SF_X8AWAYSOUND + // SRB2Kart - Engine sounds // Engine class A {"krta00", false, 48, 65, -1, NULL, 0, -1, -1, LUMPERROR, ""}, diff --git a/src/sounds.h b/src/sounds.h index 0686cab46..336cd8b74 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -1172,6 +1172,9 @@ typedef enum sfx_kdtrg2, sfx_kdtrg3, + // SRB2Kart - Powerup clash SFX + sfx_parry, + // Next up: UNIQUE ENGINE SOUNDS! Hoooooo boy... // Engine class A - Low Speed, Low Weight sfx_krta00, From d837961c7bc19f60e4f70dd57da81c907e29ae9d Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 May 2022 16:07:43 -0500 Subject: [PATCH 27/48] This table is not a place of honor --- src/info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index 9279f0578..bd1d60b03 100644 --- a/src/info.c +++ b/src/info.c @@ -4501,7 +4501,7 @@ state_t states[NUMSTATES] = {SPR_ISTB, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_INSTASHIELDB7}, // S_INSTASHIELDB6 {SPR_ISTB, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_NULL}, // S_INSTASHIELDB7 - {SPR_PWCL, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE, 10, {NULL}, 9, 1, S_NULL}, + {SPR_PWCL, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE, 10, {NULL}, 9, 1, S_NULL}, // S_POWERCLASH // Above player arrow {SPR_ARRO, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW From 884064049e8a3e9bd8a4329809ccb2a6b2ab78be Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 14 May 2022 14:56:02 +0100 Subject: [PATCH 28/48] * Allocate the "MISSING" patch only once, statically, at first boot via `missingpat`, and prevent it from being freed. * Rework HU_UpdatePatch to HU_UpdateOrBlankPatch with a "required" boolean. * If desired graphic is not present in resources: * If required is true, return `missingpat`. * If false, return NULL as before (font compatibility). * Add an alias with the previous function signature, so you don't need to add a million `true`s everywhere. * Remove a ton of irrelevant graphics the game attempts to cache only because of code inherited from vanilla SRB2. * Remove the unused hudinfo system, also inherited from vanilla SRB2. --- src/deh_lua.c | 10 --- src/deh_soc.c | 79 ----------------- src/deh_soc.h | 1 - src/dehacked.c | 12 --- src/font.c | 3 +- src/hu_stuff.c | 45 +++++----- src/hu_stuff.h | 15 +--- src/k_hud.c | 4 +- src/lua_baselib.c | 1 - src/lua_hudlib.c | 102 +-------------------- src/lua_libs.h | 1 - src/r_defs.h | 2 + src/r_patch.c | 11 ++- src/st_stuff.c | 219 +--------------------------------------------- src/st_stuff.h | 47 ---------- src/v_video.c | 4 +- src/w_wad.c | 4 +- 17 files changed, 43 insertions(+), 517 deletions(-) diff --git a/src/deh_lua.c b/src/deh_lua.c index 543998584..6e892d5e2 100644 --- a/src/deh_lua.c +++ b/src/deh_lua.c @@ -436,16 +436,6 @@ static inline int lib_getenum(lua_State *L) } return luaL_error(L, "karthud '%s' could not be found.\n", word); } - else if (fastncmp("HUD_",word,4)) { - p = word+4; - for (i = 0; i < NUMHUDITEMS; i++) - if (fastcmp(p, HUDITEMS_LIST[i])) { - lua_pushinteger(L, i); - return 1; - } - if (mathlib) return luaL_error(L, "huditem '%s' could not be found.\n", word); - return 0; - } else if (fastncmp("SKINCOLOR_",word,10)) { p = word+10; for (i = 0; i < NUMCOLORFREESLOTS; i++) { diff --git a/src/deh_soc.c b/src/deh_soc.c index e2dec10d7..aa55ca638 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -2407,66 +2407,6 @@ void readmenu(MYFILE *f, INT32 num) Z_Free(s); } -void readhuditem(MYFILE *f, INT32 num) -{ - char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL); - char *word = s; - char *word2; - char *tmp; - INT32 i; - - do - { - if (myfgets(s, MAXLINELEN, f)) - { - if (s[0] == '\n') - break; - - // First remove trailing newline, if there is one - tmp = strchr(s, '\n'); - if (tmp) - *tmp = '\0'; - - tmp = strchr(s, '#'); - if (tmp) - *tmp = '\0'; - if (s == tmp) - continue; // Skip comment lines, but don't break. - - // Get the part before the " = " - tmp = strchr(s, '='); - if (tmp) - *(tmp-1) = '\0'; - else - break; - strupr(word); - - // Now get the part after - word2 = tmp += 2; - strupr(word2); - - i = atoi(word2); // used for numerical settings - - if (fastcmp(word, "X")) - { - hudinfo[num].x = i; - } - else if (fastcmp(word, "Y")) - { - hudinfo[num].y = i; - } - else if (fastcmp(word, "F")) - { - hudinfo[num].f = i; - } - else - deh_warning("Level header %d: unknown word '%s'", num, word); - } - } while (!myfeof(f)); // finish when the line is empty - - Z_Free(s); -} - void readframe(MYFILE *f, INT32 num) { char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL); @@ -4204,20 +4144,6 @@ sfxenum_t get_sfx(const char *word) return sfx_None; } -hudnum_t get_huditem(const char *word) -{ // Returns the value of HUD_ enumerations - hudnum_t i; - if (*word >= '0' && *word <= '9') - return atoi(word); - if (fastncmp("HUD_",word,4)) - word += 4; // take off the HUD_ - for (i = 0; i < NUMHUDITEMS; i++) - if (fastcmp(word, HUDITEMS_LIST[i])) - return i; - deh_warning("Couldn't find huditem named 'HUD_%s'",word); - return HUD_LIVES; -} - menutype_t get_menutype(const char *word) { // Returns the value of MN_ enumerations menutype_t i; @@ -4461,11 +4387,6 @@ static fixed_t find_const(const char **rword) free(word); return 0; } - else if (fastncmp("HUD_",word,4)) { - r = get_huditem(word); - free(word); - return r; - } else if (fastncmp("GRADE_",word,6)) { char *p = word+6; diff --git a/src/deh_soc.h b/src/deh_soc.h index 0025eb1c4..e2319ab14 100644 --- a/src/deh_soc.h +++ b/src/deh_soc.h @@ -52,7 +52,6 @@ statenum_t get_state(const char *word); spritenum_t get_sprite(const char *word); playersprite_t get_sprite2(const char *word); sfxenum_t get_sfx(const char *word); -hudnum_t get_huditem(const char *word); menutype_t get_menutype(const char *word); //INT16 get_gametype(const char *word); //powertype_t get_power(const char *word); diff --git a/src/dehacked.c b/src/dehacked.c index f86047fed..5f0743a7e 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -495,18 +495,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) ignorelines(f); } } - else if (fastcmp(word, "HUDITEM")) - { - if (i == 0 && word2[0] != '0') // If word2 isn't a number - i = get_huditem(word2); // find a huditem by name - if (i >= 0 && i < NUMHUDITEMS) - readhuditem(f, i); - else - { - deh_warning("HUD item number %d out of range (0 - %d)", i, NUMHUDITEMS-1); - ignorelines(f); - } - } else if (fastcmp(word, "MENU")) { if (i == 0 && word2[0] != '0') // If word2 isn't a number diff --git a/src/font.c b/src/font.c index 353f21a83..39f879ea0 100644 --- a/src/font.c +++ b/src/font.c @@ -27,7 +27,8 @@ FontCache (font_t *fnt) c = fnt->start; for (i = 0; i < fnt->size; ++i, ++c) { - HU_UpdatePatch(&fnt->font[i], + HU_UpdateOrBlankPatch(&fnt->font[i], + false, "%s%.*d", fnt->prefix, fnt->digits, diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 3287c3461..77deff138 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -87,24 +87,12 @@ static boolean headsupactive = false; boolean hu_showscores; // draw rankings static char hu_tick; -patch_t *rflagico; -patch_t *bflagico; -patch_t *rmatcico; -patch_t *bmatcico; -patch_t *tagico; -patch_t *tallminus; -patch_t *tallinfin; - -//------------------------------------------- -// coop hud -//------------------------------------------- - -static patch_t *emblemicon; - //------------------------------------------- // misc vars //------------------------------------------- +patch_t *missingpat; + // song credits static patch_t *songcreditbg; @@ -189,10 +177,6 @@ void HU_LoadGraphics(void) Font_Load(); - // minus for negative tallnums - HU_UpdatePatch(&tallminus, "STTMINUS"); - - HU_UpdatePatch(&emblemicon, "EMBLICON"); HU_UpdatePatch(&songcreditbg, "K_SONGCR"); // cache ping gfx: @@ -222,6 +206,16 @@ void HU_Init(void) RegisterNetXCmd(XD_SAY, Got_Saycmd); #endif + // only allocate if not present, to save us a lot of headache + if (missingpat == NULL) + { + lumpnum_t missingnum = W_GetNumForName("MISSING"); + if (missingnum == LUMPERROR) + I_Error("HU_LoadGraphics: \"MISSING\" patch not present in resource files."); + + missingpat = W_CachePatchNum(W_GetNumForName("MISSING"), PU_STATIC); + } + // set shift translation table shiftxform = english_shiftxform; @@ -292,7 +286,7 @@ void HU_Init(void) HU_LoadGraphics(); } -patch_t *HU_UpdatePatch(patch_t **user, const char *format, ...) +patch_t *HU_UpdateOrBlankPatch(patch_t **user, boolean required, const char *format, ...) { va_list ap; char buffer[9]; @@ -319,7 +313,12 @@ patch_t *HU_UpdatePatch(patch_t **user, const char *format, ...) lump = W_CheckNumForName(buffer); if (lump == LUMPERROR) - return NULL; + { + if (required == true) + *user = missingpat; + + return *user; + } } patch = W_CachePatchNum(lump, PU_HUDGFX); @@ -2151,10 +2150,10 @@ void HU_Drawer(void) if (modeattacking && pausedelay > 0 && !pausebreakkey) { INT32 strength = ((pausedelay - 1 - NEWTICRATE/2)*10)/(NEWTICRATE/3); - INT32 y = hudinfo[HUD_LIVES].y - 13; + INT32 x = BASEVIDWIDTH/2, y = BASEVIDHEIGHT/2; // obviously incorrect values while we scrap hudinfo - V_DrawThinString(hudinfo[HUD_LIVES].x-2, y, - hudinfo[HUD_LIVES].f|((leveltime & 4) ? V_SKYMAP : V_BLUEMAP), + V_DrawThinString(x, y, + ((leveltime & 4) ? V_SKYMAP : V_BLUEMAP), "HOLD TO RETRY..."); if (strength > 9) diff --git a/src/hu_stuff.h b/src/hu_stuff.h index 392ae27a2..d81dba2a6 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -104,14 +104,6 @@ extern patch_t *pinggfx[5]; extern patch_t *framecounter; extern patch_t *frameslash; -extern patch_t *rflagico; -extern patch_t *bflagico; -extern patch_t *rmatcico; -extern patch_t *bmatcico; -extern patch_t *tagico; -extern patch_t *tallminus; -extern patch_t *tallinfin; - // set true whenever the tab rankings are being shown for any reason extern boolean hu_showscores; @@ -120,9 +112,10 @@ void HU_Init(void); void HU_LoadGraphics(void); -// Load a HUDGFX patch or NULL. -patch_t *HU_UpdatePatch(patch_t **user, const char *format, ...); -#define HU_CachePatch(...) HU_UpdatePatch(NULL, __VA_ARGS__) +// Load a HUDGFX patch or NULL/missingpat (dependent on required boolean). +patch_t *HU_UpdateOrBlankPatch(patch_t **user, boolean required, const char *format, ...); +//#define HU_CachePatch(...) HU_UpdateOrBlankPatch(NULL, false, __VA_ARGS__) -- not sure how to default the missingpat here plus not currently used +#define HU_UpdatePatch(user, ...) HU_UpdateOrBlankPatch(user, true, __VA_ARGS__) // reset heads up when consoleplayer respawns. void HU_Start(void); diff --git a/src/k_hud.c b/src/k_hud.c index 8a688d1dc..b7bf9c38d 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -623,14 +623,14 @@ void K_LoadKartHUDGraphics(void) for (i = 0; i < 8; i++) { buffer[7] = '0'+((i+1)%10); - HU_UpdatePatch(&kp_bossbar[i], buffer); + HU_UpdatePatch(&kp_bossbar[i], "%s", buffer); } sprintf(buffer, "K_BOSR0x"); for (i = 0; i < 4; i++) { buffer[7] = '0'+((i+1)%10); - HU_UpdatePatch(&kp_bossret[i], buffer); + HU_UpdatePatch(&kp_bossret[i], "%s", buffer); } } diff --git a/src/lua_baselib.c b/src/lua_baselib.c index decf683f4..85ff45a4c 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -214,7 +214,6 @@ static const struct { {META_BBOX, "bbox"}, - {META_HUDINFO, "hudinfo_t"}, {META_PATCH, "patch_t"}, {META_COLORMAP, "colormap"}, {META_CAMERA, "camera_t"}, diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index 75a84ed18..b5e3d1acc 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -14,7 +14,7 @@ #include "fastcmp.h" #include "r_defs.h" #include "r_local.h" -#include "st_stuff.h" // hudinfo[] +#include "st_stuff.h" #include "g_game.h" #include "i_video.h" // rendermode #include "p_local.h" // camera_t @@ -63,18 +63,6 @@ static const char *const hud_disable_options[] = { "intermissionmessages", NULL}; -enum hudinfo { - hudinfo_x = 0, - hudinfo_y, - hudinfo_f -}; - -static const char *const hudinfo_opt[] = { - "x", - "y", - "f", - NULL}; - enum patch { patch_valid = 0, patch_width, @@ -182,73 +170,6 @@ static const char *const camera_opt[] = { "pnum", NULL}; -static int lib_getHudInfo(lua_State *L) -{ - UINT32 i; - lua_remove(L, 1); - - i = luaL_checkinteger(L, 1); - if (i >= NUMHUDITEMS) - return luaL_error(L, "hudinfo[] index %d out of range (0 - %d)", i, NUMHUDITEMS-1); - LUA_PushUserdata(L, &hudinfo[i], META_HUDINFO); - return 1; -} - -static int lib_hudinfolen(lua_State *L) -{ - lua_pushinteger(L, NUMHUDITEMS); - return 1; -} - -static int hudinfo_get(lua_State *L) -{ - hudinfo_t *info = *((hudinfo_t **)luaL_checkudata(L, 1, META_HUDINFO)); - enum hudinfo field = luaL_checkoption(L, 2, hudinfo_opt[0], hudinfo_opt); - I_Assert(info != NULL); // huditems are always valid - - switch(field) - { - case hudinfo_x: - lua_pushinteger(L, info->x); - break; - case hudinfo_y: - lua_pushinteger(L, info->y); - break; - case hudinfo_f: - lua_pushinteger(L, info->f); - break; - } - return 1; -} - -static int hudinfo_set(lua_State *L) -{ - hudinfo_t *info = *((hudinfo_t **)luaL_checkudata(L, 1, META_HUDINFO)); - enum hudinfo field = luaL_checkoption(L, 2, hudinfo_opt[0], hudinfo_opt); - I_Assert(info != NULL); - - switch(field) - { - case hudinfo_x: - info->x = (INT32)luaL_checkinteger(L, 3); - break; - case hudinfo_y: - info->y = (INT32)luaL_checkinteger(L, 3); - break; - case hudinfo_f: - info->f = (INT32)luaL_checkinteger(L, 3); - break; - } - return 0; -} - -static int hudinfo_num(lua_State *L) -{ - hudinfo_t *info = *((hudinfo_t **)luaL_checkudata(L, 1, META_HUDINFO)); - lua_pushinteger(L, info-hudinfo); - return 1; -} - static int colormap_get(lua_State *L) { const UINT8 *colormap = *((UINT8 **)luaL_checkudata(L, 1, META_COLORMAP)); @@ -1307,27 +1228,6 @@ int LUA_HudLib(lua_State *L) lua_rawseti(L, -2, 6); // HUD[6] = title card rendering functions array lua_setfield(L, LUA_REGISTRYINDEX, "HUD"); - luaL_newmetatable(L, META_HUDINFO); - lua_pushcfunction(L, hudinfo_get); - lua_setfield(L, -2, "__index"); - - lua_pushcfunction(L, hudinfo_set); - lua_setfield(L, -2, "__newindex"); - - lua_pushcfunction(L, hudinfo_num); - lua_setfield(L, -2, "__len"); - lua_pop(L,1); - - lua_newuserdata(L, 0); - lua_createtable(L, 0, 2); - lua_pushcfunction(L, lib_getHudInfo); - lua_setfield(L, -2, "__index"); - - lua_pushcfunction(L, lib_hudinfolen); - lua_setfield(L, -2, "__len"); - lua_setmetatable(L, -2); - lua_setglobal(L, "hudinfo"); - luaL_newmetatable(L, META_COLORMAP); lua_pushcfunction(L, colormap_get); lua_setfield(L, -2, "__index"); diff --git a/src/lua_libs.h b/src/lua_libs.h index c02964467..a6580622b 100644 --- a/src/lua_libs.h +++ b/src/lua_libs.h @@ -81,7 +81,6 @@ extern lua_State *gL; #define META_BBOX "BOUNDING_BOX" -#define META_HUDINFO "HUDINFO_T*" #define META_PATCH "PATCH_T*" #define META_COLORMAP "COLORMAP" #define META_CAMERA "CAMERA_T*" diff --git a/src/r_defs.h b/src/r_defs.h index a466c856c..93353a775 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -691,6 +691,8 @@ typedef struct #endif } patch_t; +extern patch_t *missingpat; + #if defined(_MSC_VER) #pragma pack(1) #endif diff --git a/src/r_patch.c b/src/r_patch.c index 1a08d1892..544c15ae8 100644 --- a/src/r_patch.c +++ b/src/r_patch.c @@ -76,8 +76,7 @@ static void Patch_FreeData(patch_t *patch) for (i = 0; i < 4; i++) { - if (patch->flats[i]) - Z_Free(patch->flats[i]); + Z_Free(patch->flats[i]); } #ifdef ROTSPRITE @@ -96,14 +95,14 @@ static void Patch_FreeData(patch_t *patch) } #endif - if (patch->columnofs) - Z_Free(patch->columnofs); - if (patch->columns) - Z_Free(patch->columns); + Z_Free(patch->columnofs); + Z_Free(patch->columns); } void Patch_Free(patch_t *patch) { + if (patch == missingpat) + return; Patch_FreeData(patch); Z_Free(patch); } diff --git a/src/st_stuff.c b/src/st_stuff.c index 5efcdc6f5..2c2bcec12 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -63,77 +63,6 @@ patch_t *faceprefix[MAXSKINS][NUMFACES]; // status bar overlay // ------------------------------------------ -// icons for overlay -patch_t *sboscore; // Score logo -patch_t *sbotime; // Time logo -patch_t *sbocolon; // Colon for time -patch_t *sboperiod; // Period for time centiseconds -patch_t *livesback; // Lives icon background -patch_t *stlivex; -static patch_t *nrec_timer; // Timer for NiGHTS records -static patch_t *sborings; -static patch_t *slidgame; -static patch_t *slidtime; -static patch_t *slidover; -static patch_t *sboredrings; -static patch_t *sboredtime; -static patch_t *getall; // Special Stage HUD -static patch_t *timeup; // Special Stage HUD -static patch_t *hunthoming[6]; -static patch_t *itemhoming[6]; -static patch_t *race1; -static patch_t *race2; -static patch_t *race3; -static patch_t *racego; -static patch_t *nightslink; -static patch_t *curweapon; -static patch_t *normring; -static patch_t *bouncering; -static patch_t *infinityring; -static patch_t *autoring; -static patch_t *explosionring; -static patch_t *scatterring; -static patch_t *grenadering; -static patch_t *railring; -static patch_t *jumpshield; -static patch_t *forceshield; -static patch_t *ringshield; -static patch_t *watershield; -static patch_t *bombshield; -static patch_t *pityshield; -static patch_t *pinkshield; -static patch_t *flameshield; -static patch_t *bubbleshield; -static patch_t *thundershield; -static patch_t *invincibility; -static patch_t *sneakers; -static patch_t *gravboots; -static patch_t *nonicon; -static patch_t *nonicon2; -static patch_t *bluestat; -static patch_t *byelstat; -static patch_t *orngstat; -static patch_t *redstat; -static patch_t *yelstat; -static patch_t *nbracket; -static patch_t *nring; -static patch_t *nhud[12]; -static patch_t *nsshud; -static patch_t *nbon[12]; -static patch_t *nssbon; -static patch_t *narrow[9]; -static patch_t *nredar[8]; // Red arrow -static patch_t *drillbar; -static patch_t *drillfill[3]; -static patch_t *capsulebar; -static patch_t *capsulefill; -patch_t *ngradeletters[7]; -static patch_t *minus5sec; -static patch_t *minicaps; -static patch_t *gotrflag; -static patch_t *gotbflag; -static patch_t *fnshico; - // Midnight Channel: static patch_t *hud_tv1; static patch_t *hud_tv2; @@ -143,38 +72,6 @@ static patch_t *hud_tv2; static patch_t *envelope; #endif -// SRB2kart - -hudinfo_t hudinfo[NUMHUDITEMS] = -{ - { 16, 176, V_SNAPTOLEFT|V_SNAPTOBOTTOM}, // HUD_LIVES - - { 16, 42, V_SNAPTOLEFT|V_SNAPTOTOP}, // HUD_RINGS - { 96, 42, V_SNAPTOLEFT|V_SNAPTOTOP}, // HUD_RINGSNUM - { 120, 42, V_SNAPTOLEFT|V_SNAPTOTOP}, // HUD_RINGSNUMTICS - - { 16, 10, V_SNAPTOLEFT|V_SNAPTOTOP}, // HUD_SCORE - { 120, 10, V_SNAPTOLEFT|V_SNAPTOTOP}, // HUD_SCORENUM - - { 16, 26, V_SNAPTOLEFT|V_SNAPTOTOP}, // HUD_TIME - { 72, 26, V_SNAPTOLEFT|V_SNAPTOTOP}, // HUD_MINUTES - { 72, 26, V_SNAPTOLEFT|V_SNAPTOTOP}, // HUD_TIMECOLON - { 96, 26, V_SNAPTOLEFT|V_SNAPTOTOP}, // HUD_SECONDS - { 96, 26, V_SNAPTOLEFT|V_SNAPTOTOP}, // HUD_TIMETICCOLON - { 120, 26, V_SNAPTOLEFT|V_SNAPTOTOP}, // HUD_TICS - - { 0, 56, V_SNAPTOLEFT|V_SNAPTOTOP}, // HUD_SS_TOTALRINGS - - { 110, 93, 0}, // HUD_GETRINGS - { 160, 93, 0}, // HUD_GETRINGSNUM - { 124, 160, 0}, // HUD_TIMELEFT - { 168, 176, 0}, // HUD_TIMELEFTNUM - { 130, 93, 0}, // HUD_TIMEUP - { 152, 168, 0}, // HUD_HUNTPICS - - { 288, 176, V_SNAPTORIGHT|V_SNAPTOBOTTOM}, // HUD_POWERUPS -}; - // // STATUS BAR CODE // @@ -249,8 +146,6 @@ void ST_UnloadGraphics(void) void ST_LoadGraphics(void) { - int i; - // SRB2 border patch // st_borderpatchnum = W_GetNumForName("GFZFLR01"); // scr_borderpatch = W_CacheLumpNum(st_borderpatchnum, PU_HUDGFX); @@ -260,107 +155,6 @@ void ST_LoadGraphics(void) // but load them in R_AddSkins, that gets called // first anyway // cache the status bar overlay icons (fullscreen mode) - - // Prefix "STT" is whitelisted (doesn't trigger ISGAMEMODIFIED), btw - HU_UpdatePatch(&sborings, "STTRINGS"); - HU_UpdatePatch(&sboredrings, "STTRRING"); - HU_UpdatePatch(&sboscore, "STTSCORE"); - HU_UpdatePatch(&sbotime, "STTTIME"); // Time logo - HU_UpdatePatch(&sboredtime, "STTRTIME"); - HU_UpdatePatch(&sbocolon, "STTCOLON"); // Colon for time - HU_UpdatePatch(&sboperiod, "STTPERIO"); // Period for time centiseconds - - HU_UpdatePatch(&slidgame, "SLIDGAME"); - HU_UpdatePatch(&slidtime, "SLIDTIME"); - HU_UpdatePatch(&slidover, "SLIDOVER"); - - HU_UpdatePatch(&stlivex, "STLIVEX"); - HU_UpdatePatch(&livesback, "STLIVEBK"); - HU_UpdatePatch(&nrec_timer, "NGRTIMER"); // Timer for NiGHTS - HU_UpdatePatch(&getall, "GETALL"); // Special Stage HUD - HU_UpdatePatch(&timeup, "TIMEUP"); // Special Stage HUD - HU_UpdatePatch(&race1, "RACE1"); - HU_UpdatePatch(&race2, "RACE2"); - HU_UpdatePatch(&race3, "RACE3"); - HU_UpdatePatch(&racego, "RACEGO"); - HU_UpdatePatch(&nightslink, "NGHTLINK"); - - for (i = 0; i < 6; ++i) - { - HU_UpdatePatch(&hunthoming[i], "HOMING%d", i+1); - HU_UpdatePatch(&itemhoming[i], "HOMITM%d", i+1); - } - - HU_UpdatePatch(&curweapon, "CURWEAP"); - HU_UpdatePatch(&normring, "RINGIND"); - HU_UpdatePatch(&bouncering, "BNCEIND"); - HU_UpdatePatch(&infinityring, "INFNIND"); - HU_UpdatePatch(&autoring, "AUTOIND"); - HU_UpdatePatch(&explosionring, "BOMBIND"); - HU_UpdatePatch(&scatterring, "SCATIND"); - HU_UpdatePatch(&grenadering, "GRENIND"); - HU_UpdatePatch(&railring, "RAILIND"); - HU_UpdatePatch(&jumpshield, "TVWWICON"); - HU_UpdatePatch(&forceshield, "TVFOICON"); - HU_UpdatePatch(&ringshield, "TVATICON"); - HU_UpdatePatch(&watershield, "TVELICON"); - HU_UpdatePatch(&bombshield, "TVARICON"); - HU_UpdatePatch(&pityshield, "TVPIICON"); - HU_UpdatePatch(&pinkshield, "TVPPICON"); - HU_UpdatePatch(&flameshield, "TVFLICON"); - HU_UpdatePatch(&bubbleshield, "TVBBICON"); - HU_UpdatePatch(&thundershield, "TVZPICON"); - HU_UpdatePatch(&invincibility, "TVIVICON"); - HU_UpdatePatch(&sneakers, "TVSSICON"); - HU_UpdatePatch(&gravboots, "TVGVICON"); - - HU_UpdatePatch(&tagico, "TAGICO"); - HU_UpdatePatch(&rflagico, "RFLAGICO"); - HU_UpdatePatch(&bflagico, "BFLAGICO"); - HU_UpdatePatch(&rmatcico, "RMATCICO"); - HU_UpdatePatch(&bmatcico, "BMATCICO"); - HU_UpdatePatch(&gotrflag, "GOTRFLAG"); - HU_UpdatePatch(&gotbflag, "GOTBFLAG"); - HU_UpdatePatch(&fnshico, "FNSHICO"); - HU_UpdatePatch(&nonicon, "NONICON"); - HU_UpdatePatch(&nonicon2, "NONICON2"); - - // NiGHTS HUD things - HU_UpdatePatch(&bluestat, "BLUESTAT"); - HU_UpdatePatch(&byelstat, "BYELSTAT"); - HU_UpdatePatch(&orngstat, "ORNGSTAT"); - HU_UpdatePatch(&redstat, "REDSTAT"); - HU_UpdatePatch(&yelstat, "YELSTAT"); - HU_UpdatePatch(&nbracket, "NBRACKET"); - HU_UpdatePatch(&nring, "NRNG1"); - for (i = 0; i < 12; ++i) - { - HU_UpdatePatch(&nhud[i], "NHUD%d", i+1); - HU_UpdatePatch(&nbon[i], "NBON%d", i+1); - } - HU_UpdatePatch(&nsshud, "NSSHUD"); - HU_UpdatePatch(&nssbon, "NSSBON"); - HU_UpdatePatch(&minicaps, "MINICAPS"); - - for (i = 0; i < 8; ++i) - { - HU_UpdatePatch(&narrow[i], "NARROW%d", i+1); - HU_UpdatePatch(&nredar[i], "NREDAR%d", i+1); - } - - // non-animated version - HU_UpdatePatch(&narrow[8], "NARROW9"); - - HU_UpdatePatch(&drillbar, "DRILLBAR"); - for (i = 0; i < 3; ++i) - HU_UpdatePatch(&drillfill[i], "DRILLFI%d", i+1); - HU_UpdatePatch(&capsulebar, "CAPSBAR"); - HU_UpdatePatch(&capsulefill, "CAPSFILL"); - HU_UpdatePatch(&minus5sec, "MINUS5"); - - for (i = 0; i < 7; ++i) - HU_UpdatePatch(&ngradeletters[i], "GRADE%d", i); - K_LoadKartHUDGraphics(); // Midnight Channel: @@ -547,17 +341,6 @@ static INT32 SCR(INT32 r) // ========================================================================= // INTERNAL DRAWING // ========================================================================= -#define ST_DrawTopLeftOverlayPatch(x,y,p) V_DrawScaledPatch(SCX(hudinfo[h+!!r_splitscreen].x), SCY(hudinfo[h+!!r_splitscreen].y), V_SNAPTOTOP|V_SNAPTOLEFT|V_HUDTRANS, p) -#define ST_DrawOverlayNum(x,y,n) V_DrawTallNum(x, y, V_NOSCALESTART|V_HUDTRANS, n) -#define ST_DrawPaddedOverlayNum(x,y,n,d) V_DrawPaddedTallNum(x, y, V_NOSCALESTART|V_HUDTRANS, n, d) -#define ST_DrawOverlayPatch(x,y,p) V_DrawScaledPatch(x, y, V_NOSCALESTART|V_HUDTRANS, p) -#define ST_DrawMappedOverlayPatch(x,y,p,c) V_DrawMappedScaledPatch(x, y, V_NOSCALESTART|V_HUDTRANS, p, c) -#define ST_DrawNumFromHud(h,n) V_DrawTallNum(SCX(hudinfo[h].x), SCY(hudinfo[h].y), V_NOSCALESTART|V_HUDTRANS, n) -#define ST_DrawPadNumFromHud(h,n,q) V_DrawPaddedTallNum(SCX(hudinfo[h].x), SCY(hudinfo[h].y), V_NOSCALESTART|V_HUDTRANS, n, q) -#define ST_DrawPatchFromHud(h,p) V_DrawScaledPatch(SCX(hudinfo[h].x), SCY(hudinfo[h].y), V_NOSCALESTART|V_HUDTRANS, p) -#define ST_DrawNumFromHudWS(h,n) V_DrawTallNum(SCX(hudinfo[h+!!r_splitscreen].x), SCY(hudinfo[h+!!r_splitscreen].y), V_NOSCALESTART|V_HUDTRANS, n) -#define ST_DrawPadNumFromHudWS(h,n,q) V_DrawPaddedTallNum(SCX(hudinfo[h+!!r_splitscreen].x), SCY(hudinfo[h+!!r_splitscreen].y), V_NOSCALESTART|V_HUDTRANS, n, q) -#define ST_DrawPatchFromHudWS(h,p) V_DrawScaledPatch(SCX(hudinfo[h+!!r_splitscreen].x), SCY(hudinfo[h+!!r_splitscreen].y), V_NOSCALESTART|V_HUDTRANS, p) // Devmode information static void ST_drawDebugInfo(void) @@ -807,7 +590,7 @@ void ST_runTitleCard(void) char c = toupper(bossinfo.enemyname[bossinfo.titleshow]); bossinfo.titleshow++; c -= LT_FONTSTART; - if (c < 0 || c >= LT_FONTSIZE || !tc_font[1][(INT32)c] || !bossinfo.titlesound) + if (c < 0 || c >= LT_FONTSIZE || !fontv[GTFN_FONT].font[(INT32)c] || !bossinfo.titlesound) { ; } diff --git a/src/st_stuff.h b/src/st_stuff.h index a17f72c1f..e24343551 100644 --- a/src/st_stuff.h +++ b/src/st_stuff.h @@ -81,54 +81,7 @@ extern UINT32 st_translucency; extern lumpnum_t st_borderpatchnum; // patches, also used in intermission -extern patch_t *sboscore; -extern patch_t *sbotime; -extern patch_t *sbocolon; -extern patch_t *sboperiod; extern patch_t *faceprefix[MAXSKINS][NUMFACES]; -extern patch_t *livesback; -extern patch_t *stlivex; -extern patch_t *ngradeletters[7]; - -/** HUD location information (don't move this comment) - */ -typedef struct -{ - INT32 x, y, f; -} hudinfo_t; - -typedef enum -{ - HUD_LIVES, - - HUD_RINGS, - HUD_RINGSNUM, - HUD_RINGSNUMTICS, - - HUD_SCORE, - HUD_SCORENUM, - - HUD_TIME, - HUD_MINUTES, - HUD_TIMECOLON, - HUD_SECONDS, - HUD_TIMETICCOLON, - HUD_TICS, - - HUD_SS_TOTALRINGS, - - HUD_GETRINGS, - HUD_GETRINGSNUM, - HUD_TIMELEFT, - HUD_TIMELEFTNUM, - HUD_TIMEUP, - HUD_HUNTPICS, - HUD_POWERUPS, - - NUMHUDITEMS -} hudnum_t; - -extern hudinfo_t hudinfo[NUMHUDITEMS]; extern UINT16 objectsdrawn; diff --git a/src/v_video.c b/src/v_video.c index 2f806fb03..7e01f3393 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -2310,8 +2310,8 @@ void V_DrawTallNum(INT32 x, INT32 y, INT32 flags, INT32 num) } while (num); // draw a minus sign if necessary - if (neg) - V_DrawScaledPatch(x - w, y, flags, tallminus); // Tails + //if (neg) + //V_DrawScaledPatch(x - w, y, flags, tallminus); // Tails } // Draws a number with a set number of digits. diff --git a/src/w_wad.c b/src/w_wad.c index e1cb6b1aa..879c75063 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -1796,7 +1796,7 @@ void *W_CachePatchName(const char *name, INT32 tag) num = W_CheckNumForName(name); if (num == LUMPERROR) - return W_CachePatchNum(W_GetNumForName("MISSING"), tag); + return missingpat; return W_CachePatchNum(num, tag); } @@ -1807,7 +1807,7 @@ void *W_CachePatchLongName(const char *name, INT32 tag) num = W_CheckNumForLongName(name); if (num == LUMPERROR) - return W_CachePatchNum(W_GetNumForLongName("MISSING"), tag); + return missingpat; return W_CachePatchNum(num, tag); } From 8593074d19353439acd729cf02a5ed2400e7f457 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 14 May 2022 15:43:50 +0100 Subject: [PATCH 29/48] ANIMDEFS now only reports the "flats are disabled" warning for ANIMDEFs in the most recently loaded file. Notably, this means there are no warnings produced if an added file contains no errors, reducing even MORE of the friction the addons menu has been experiencing in devbuilds lately. --- src/p_spec.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 3fe162bb6..cc1a0f8a9 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -164,6 +164,9 @@ void P_ParseAnimationDefintion(SINT8 istexture); * \sa P_FindAnimatedFlat, P_SetupLevelFlatAnims * \author Steven McGranahan (original), Shadow Hog (had to rewrite it to handle multiple WADs), JTE (had to rewrite it to handle multiple WADs _correctly_) */ + +static boolean animdeftempflats = false; // only until ANIMDEFS flats are removed + void P_InitPicAnims(void) { // Init animation @@ -183,6 +186,7 @@ void P_InitPicAnims(void) while (animdefsLumpNum != INT16_MAX) { + animdeftempflats = ((p_adding_file == INT16_MAX) || p_adding_file == w); P_ParseANIMDEFSLump(w, animdefsLumpNum); animdefsLumpNum = W_CheckNumForNamePwad("ANIMDEFS", (UINT16)w, animdefsLumpNum + 1); } @@ -204,7 +208,7 @@ void P_InitPicAnims(void) lastanim = anims; for (i = 0; animdefs[i].istexture != -1; i++) { - if (animdefs[i].istexture) + if (animdefs[i].istexture == 1) { if (R_CheckTextureNumForName(animdefs[i].startname) == -1) continue; @@ -214,11 +218,13 @@ void P_InitPicAnims(void) } else { - CONS_Alert(CONS_WARNING, "ANIMDEFS flats are disabled; flat support in general will be removed soon! (%s, %s)\n", animdefs[i].startname, animdefs[i].endname); + if (animdefs[i].istexture == 2) + { + CONS_Alert(CONS_WARNING, "ANIMDEFS flats are disabled; flat support in general will be removed soon! (%s, %s)\n", animdefs[i].startname, animdefs[i].endname); + } continue; } #if 0 - else { if ((W_CheckNumForName(animdefs[i].startname)) == LUMPERROR) continue; @@ -374,7 +380,10 @@ void P_ParseAnimationDefintion(SINT8 istexture) Z_Free(animdefsToken); // set texture type - animdefs[i].istexture = istexture; + if (istexture) + animdefs[i].istexture = 1; + else + animdefs[i].istexture = (animdeftempflats ? 2 : 0); // "RANGE" animdefsToken = M_GetToken(NULL); From 80c14cd6ac569ca9a8c49cf6e6d0adce13698d64 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 14 May 2022 19:18:57 +0100 Subject: [PATCH 30/48] use missingnum instead of re-calling W_GetNumForName --- src/hu_stuff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 77deff138..c859df55f 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -213,7 +213,7 @@ void HU_Init(void) if (missingnum == LUMPERROR) I_Error("HU_LoadGraphics: \"MISSING\" patch not present in resource files."); - missingpat = W_CachePatchNum(W_GetNumForName("MISSING"), PU_STATIC); + missingpat = W_CachePatchNum(missingnum, PU_STATIC); } // set shift translation table From a044ea76f7154ed9748b1a17ae90d6b0daa262f1 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 16 May 2022 21:47:20 +0100 Subject: [PATCH 31/48] I made skin loading 2/15ths faster on my machine by inverting this jump conditional --- src/r_things.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/r_things.c b/src/r_things.c index 9441804b1..3108a82fc 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -261,7 +261,9 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16 for (l = startlump; l < endlump; l++) { - if (memcmp(lumpinfo[l].name,sprname,4)==0) + if (memcmp(lumpinfo[l].name,sprname,4)) + continue; + { INT32 width, height; INT16 topoffset, leftoffset; From a83504c1a4edde3d108c0cc0d87fef1dd25dcab1 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Thu, 19 May 2022 03:19:33 -0400 Subject: [PATCH 32/48] WIP title screen --- src/d_clisrv.c | 1 - src/deh_soc.c | 8 +++- src/f_finale.c | 100 +++++++++++++++++++++++++++++++++++++++---------- src/f_finale.h | 4 +- 4 files changed, 88 insertions(+), 25 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 7f6e6f287..433b603b1 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1923,7 +1923,6 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic { if (cl_mode != CL_DOWNLOADFILES && cl_mode != CL_DOWNLOADSAVEGAME) { - F_MenuPresTicker(true); // title sky F_TitleScreenTicker(true); F_TitleScreenDrawer(); } diff --git a/src/deh_soc.c b/src/deh_soc.c index aa55ca638..973daadf1 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -2292,7 +2292,9 @@ void readmenu(MYFILE *f, INT32 num) menupres[num].ttname[0] = 0; menupres[num].hidetitlepics = true; } - else // if (fastcmp(word2, "OLD") || fastcmp(word2, "SSNTAILS")) + else if (fastcmp(word2, "RINGRACERS")) + menupres[num].ttmode = TTMODE_RINGRACERS; + else if (fastcmp(word2, "OLD")) menupres[num].ttmode = TTMODE_OLD; titlechanged = true; } @@ -3385,7 +3387,9 @@ void readmaincfg(MYFILE *f) ttname[0] = 0; hidetitlepics = true; } - else // if (fastcmp(word2, "OLD") || fastcmp(word2, "SSNTAILS")) + else if (fastcmp(word2, "RINGRACERS")) + ttmode = TTMODE_RINGRACERS; + else if (fastcmp(word2, "OLD") || fastcmp(word2, "SSNTAILS")) ttmode = TTMODE_OLD; titlechanged = true; } diff --git a/src/f_finale.c b/src/f_finale.c index 618bc1656..ded90016c 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -44,7 +44,7 @@ // Stage of animation: // 0 = text, 1 = art screen INT32 finalecount; -INT32 titlescrollxspeed = 5; +INT32 titlescrollxspeed = 16; INT32 titlescrollyspeed = 0; UINT8 titlemapinaction = TITLEMAP_OFF; @@ -58,8 +58,6 @@ static tic_t stoptimer; static boolean keypressed = false; -static tic_t xscrolltimer; -static tic_t yscrolltimer; static INT32 menuanimtimer; // Title screen: background animation timing mobj_t *titlemapcameraref = NULL; @@ -81,7 +79,7 @@ static UINT32 demoIdleLeft; // customizable title screen graphics -ttmode_enum ttmode = TTMODE_OLD; +ttmode_enum ttmode = TTMODE_RINGRACERS; UINT8 ttscale = 1; // FRACUNIT / ttscale // ttmode user vars char ttname[9]; @@ -108,6 +106,13 @@ static patch_t *ttcheckers; // *vroom* KART static patch_t *ttkflash; // flash screen */ +static patch_t *kts_bumper; // DR ROBOTNIKS RING RACERS +static patch_t *kts_eggman; // dr. robotnik himself +static patch_t *kts_tails; // tails himself +static patch_t *kts_tails_tails; // tails' tails +static patch_t *kts_electricity[6]; // ring o' electricity +static patch_t *kts_copyright; // (C) SEGA + #define NOWAY #ifdef NOWAY @@ -1688,10 +1693,10 @@ void F_InitMenuPresValues(void) // Set defaults for presentation values strncpy(curbgname, "TITLESKY", 9); curfadevalue = 16; - curbgcolor = 31; - curbgxspeed = (gamestate == GS_TIMEATTACK) ? 0 : titlescrollxspeed; - curbgyspeed = (gamestate == GS_TIMEATTACK) ? 22 : titlescrollyspeed; - curbghide = (gamestate == GS_TIMEATTACK) ? false : true; + curbgcolor = -1; + curbgxspeed = titlescrollxspeed; + curbgyspeed = titlescrollyspeed; + curbghide = false; curhidepics = hidetitlepics; curttmode = ttmode; @@ -1721,24 +1726,26 @@ void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname) INT32 pw, ph; // scaled by dupz patch_t *pat; INT32 i, j; + INT32 xscrolltimer, yscrolltimer; if (rendermode == render_none) return; + V_DrawFill(0, 0, vid.width, vid.height, 31); + if (!patchname || !patchname[0]) { - V_DrawFill(0, 0, vid.width, vid.height, 31); - return; - } - - if (!scrollxspeed && !scrollyspeed) - { - V_DrawPatchFill(W_CachePatchName(patchname, PU_PATCH_LOWPRIORITY)); return; } pat = W_CachePatchName(patchname, PU_PATCH_LOWPRIORITY); + if (scrollxspeed == 0 && scrollyspeed == 0) + { + V_DrawPatchFill(pat); + return; + } + patwidth = pat->width; patheight = pat->height; pw = patwidth * dupz; @@ -1768,8 +1775,6 @@ void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname) V_NOSCALESTART, pat); } } - - W_UnlockCachedPatch(pat); } #define LOADTTGFX(arr, name, maxf) \ @@ -1800,15 +1805,30 @@ else \ static void F_CacheTitleScreen(void) { + UINT16 i; + switch(curttmode) { - case TTMODE_OLD: case TTMODE_NONE: break; + case TTMODE_OLD: + break; // idk do we still want this? + + case TTMODE_RINGRACERS: + kts_bumper = W_CachePatchName("KTSBUMPR1", PU_PATCH_LOWPRIORITY); + kts_eggman = W_CachePatchName("KTSEGG01", PU_PATCH_LOWPRIORITY); + kts_tails = W_CachePatchName("KTSTAL01", PU_PATCH_LOWPRIORITY); + kts_tails_tails = W_CachePatchName("KTSTAL02", PU_PATCH_LOWPRIORITY); + for (i = 0; i < 6; i++) + { + kts_electricity[i] = W_CachePatchName(va("KTSELCT%.1d", i+1), PU_PATCH_LOWPRIORITY); + } + kts_copyright = W_CachePatchName("KTSCR", PU_PATCH_LOWPRIORITY); + break; + case TTMODE_USER: { - UINT16 i; lumpnum_t lumpnum; char lumpname[9]; @@ -1932,8 +1952,46 @@ void F_TitleScreenDrawer(void) switch(curttmode) { - case TTMODE_OLD: case TTMODE_NONE: + break; + + case TTMODE_RINGRACERS: + { + const char *eggName = "eggman"; + INT32 eggSkin = R_SkinAvailable(eggName); + skincolornum_t eggColor = SKINCOLOR_RED; + UINT8 *eggColormap = NULL; + + const char *tailsName = "tails"; + INT32 tailsSkin = R_SkinAvailable(tailsName); + skincolornum_t tailsColor = SKINCOLOR_ORANGE; + UINT8 *tailsColormap = NULL; + + if (eggSkin != -1) + { + eggColor = skins[eggSkin].prefcolor; + } + eggColormap = R_GetTranslationColormap(TC_DEFAULT, eggColor, GTC_MENUCACHE); + + if (tailsSkin != -1) + { + tailsColor = skins[tailsSkin].prefcolor; + } + tailsColormap = R_GetTranslationColormap(TC_DEFAULT, tailsColor, GTC_MENUCACHE); + + V_DrawFixedPatch(0, 0, FRACUNIT, 0, kts_tails_tails, tailsColormap); + V_DrawFixedPatch(0, 0, FRACUNIT, V_ADD, kts_electricity[finalecount % 6], NULL); + + V_DrawFixedPatch(0, 0, FRACUNIT, 0, kts_eggman, eggColormap); + V_DrawFixedPatch(0, 0, FRACUNIT, 0, kts_tails, tailsColormap); + + V_DrawFixedPatch(0, 0, FRACUNIT, 0, kts_bumper, NULL); + + V_DrawFixedPatch(0, 0, FRACUNIT, 0, kts_copyright, NULL); + break; + } + + case TTMODE_OLD: /* if (finalecount < 50) { @@ -2020,6 +2078,8 @@ void F_MenuPresTicker(boolean run) // (no longer) De-Demo'd Title Screen void F_TitleScreenTicker(boolean run) { + F_MenuPresTicker(true); // title sky + if (run) { finalecount++; diff --git a/src/f_finale.h b/src/f_finale.h index a45de5734..82b800f17 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -80,9 +80,9 @@ extern INT32 titlescrollyspeed; typedef enum { TTMODE_NONE = 0, + TTMODE_RINGRACERS, TTMODE_OLD, - TTMODE_USER, - //TTMODE_RINGRACERS + TTMODE_USER } ttmode_enum; #define TTMAX_ALACROIX 30 // max frames for SONIC typeface, plus one for NULL terminating entry From 4a9cf76f37279bbfa7696818270c128d28643753 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Thu, 19 May 2022 14:51:13 -0400 Subject: [PATCH 33/48] Remove old kart title screen sounds --- src/f_finale.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index ded90016c..a9a81da34 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -2084,18 +2084,13 @@ void F_TitleScreenTicker(boolean run) { finalecount++; - if (finalecount == 10) - { - S_StartSound(NULL, sfx_s23e); - } - else if (finalecount == 50) + if (finalecount == 1) { // Now start the music if (menupres[MN_MAIN].musname[0]) S_ChangeMusic(menupres[MN_MAIN].musname, menupres[MN_MAIN].mustrack, menupres[MN_MAIN].muslooping); else S_ChangeMusicInternal("_title", looptitle); - S_StartSound(NULL, sfx_s23c); } } From 852e9b8ce9311a7c8df581bb80b1bc0177f63b42 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Thu, 19 May 2022 15:10:47 -0400 Subject: [PATCH 34/48] Rebrand all console / window stuff --- CMakeLists.txt | 4 ++-- src/Makefile | 2 +- src/console.c | 2 +- src/d_clisrv.c | 10 +++++----- src/d_main.c | 4 ++-- src/d_netcmd.c | 4 ++-- src/d_netfil.c | 2 +- src/dehacked.c | 12 ++++++++---- src/f_finale.c | 4 ++-- src/filesrch.c | 2 +- src/g_demo.c | 4 ++-- src/g_game.c | 4 ++-- src/m_menu.c | 4 ++-- src/m_misc.c | 8 ++++---- src/mserv.c | 2 +- src/sdl/i_main.c | 2 +- src/sdl/i_system.c | 24 ++++++++++++------------ src/sdl/i_video.c | 6 +++--- src/win32/Srb2win.rc | 12 ++++++------ src/win32/win_dbg.c | 4 ++-- src/win32/win_main.c | 8 ++++---- src/win32/win_net.c | 2 +- src/win32/win_sys.c | 10 +++++----- 23 files changed, 70 insertions(+), 66 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc4f6ec6b..e554cca0a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,7 +113,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") # Set EXE names so the assets CMakeLists can refer to its target -set(SRB2_SDL2_EXE_NAME srb2kart CACHE STRING "Executable binary output name") +set(SRB2_SDL2_EXE_NAME drrr CACHE STRING "Executable binary output name") include_directories(${CMAKE_CURRENT_BINARY_DIR}/src) @@ -146,7 +146,7 @@ if("${SRB2_CPACK_GENERATOR}" STREQUAL "") endif() set(CPACK_GENERATOR ${SRB2_CPACK_GENERATOR}) -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Sonic Robo Blast 2 Kart" CACHE STRING "Program name for display purposes") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Dr. Robotnik's Ring Racers" CACHE STRING "Program name for display purposes") set(CPACK_PACKAGE_VENDOR "Kart Krew" CACHE STRING "Vendor name for display purposes") #set(CPACK_PACKAGE_DESCRIPTION_FILE ) set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") diff --git a/src/Makefile b/src/Makefile index 9659a4994..d32c6d6b4 100644 --- a/src/Makefile +++ b/src/Makefile @@ -235,7 +235,7 @@ bin:=../bin endif # default EXENAME (usually set by platform) -EXENAME?=srb2 +EXENAME?=drrr DBGNAME?=$(EXENAME).debug exe:=$(bin)/$(EXENAME) diff --git a/src/console.c b/src/console.c index f92cce3c9..c0e5d1877 100644 --- a/src/console.c +++ b/src/console.c @@ -1576,7 +1576,7 @@ void CONS_Error(const char *msg) #if defined(RPC_NO_WINDOWS_H) && defined(_WINDOWS) if (!graphics_started) { - MessageBoxA(vid.WndParent, msg, "SRB2Kart Warning", MB_OK); + MessageBoxA(vid.WndParent, msg, "Dr. Robotnik's Ring Racers Warning", MB_OK); return; } #endif diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 433b603b1..9d3f6eb3e 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1515,7 +1515,7 @@ static boolean CL_FinishedFileList(void) M_StartMessage(M_GetText( "You have too many WAD files loaded\n" "to add ones the server is using.\n" - "Please restart SRB2Kart before connecting.\n\n" + "Please restart Ring Racers before connecting.\n\n" "Press ESC\n" ), NULL, MM_NOTHING); return false; @@ -1529,7 +1529,7 @@ static boolean CL_FinishedFileList(void) "You have the wrong addons loaded.\n\n" "To play on this server, restart\n" "the game and don't load any addons.\n" - "SRB2Kart will automatically add\n" + "Ring Racers will automatically add\n" "everything you need when you join.\n\n" "Press ESC\n" ), NULL, MM_NOTHING); @@ -3064,7 +3064,7 @@ static void Joinable_OnChange(void) // called one time at init void D_ClientServerInit(void) { - DEBFILE(va("- - -== SRB2Kart v%d.%d "VERSIONSTRING" debugfile ==- - -\n", + DEBFILE(va("- - -== Ring Racers v%d.%d "VERSIONSTRING" debugfile ==- - -\n", VERSION, SUBVERSION)); #ifndef NONET @@ -3715,10 +3715,10 @@ static void HandleConnect(SINT8 node) SV_SendRefuse(node, "Incompatible packet formats."); else if (strncmp(netbuffer->u.clientcfg.application, SRB2APPLICATION, sizeof netbuffer->u.clientcfg.application)) - SV_SendRefuse(node, "Different SRB2 modifications\nare not compatible."); + SV_SendRefuse(node, "Different Ring Racers modifications\nare not compatible."); else if (netbuffer->u.clientcfg.version != VERSION || netbuffer->u.clientcfg.subversion != SUBVERSION) - SV_SendRefuse(node, va(M_GetText("Different SRB2Kart versions cannot\nplay a netgame!\n(server version %d.%d)"), VERSION, SUBVERSION)); + SV_SendRefuse(node, va(M_GetText("Different Ring Racers versions cannot\nplay a netgame!\n(server version %d.%d)"), VERSION, SUBVERSION)); else if (!cv_allownewplayer.value && node) SV_SendRefuse(node, M_GetText("The server is not accepting\njoins for the moment.")); else if (D_NumPlayers() >= maxplayers) diff --git a/src/d_main.c b/src/d_main.c index a78f857fb..6d6f0e2ce 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1233,8 +1233,8 @@ void D_SRB2Main(void) // Print GPL notice for our console users (Linux) CONS_Printf( - "\n\nSonic Robo Blast 2 Kart\n" - "Copyright (C) 1998-2020 by Kart Krew & STJr\n\n" + "\n\nDr. Robotnik's Ring Racers\n" + "Copyright (C) 1998-2022 by Kart Krew & STJr\n\n" "This program comes with ABSOLUTELY NO WARRANTY.\n\n" "This is free software, and you are welcome to redistribute it\n" "and/or modify it under the terms of the GNU General Public License\n" diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 51b6b97d6..3b75bf302 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -4314,9 +4314,9 @@ static void Command_ListDoomednums_f(void) static void Command_Version_f(void) { #ifdef DEVELOP - CONS_Printf("SRB2Kart %s-%s (%s %s)\n", compbranch, comprevision, compdate, comptime); + CONS_Printf("Ring Racers %s-%s (%s %s)\n", compbranch, comprevision, compdate, comptime); #else - CONS_Printf("SRB2Kart %s (%s %s %s %s) ", VERSIONSTRING, compdate, comptime, comprevision, compbranch); + CONS_Printf("Ring Racers %s (%s %s %s %s) ", VERSIONSTRING, compdate, comptime, comprevision, compbranch); #endif // Base library diff --git a/src/d_netfil.c b/src/d_netfil.c index 041c7c35f..e160536e3 100644 --- a/src/d_netfil.c +++ b/src/d_netfil.c @@ -1725,7 +1725,7 @@ void CURLPrepareFile(const char* url, int dfilenum) // Only allow HTTP and HTTPS curl_easy_setopt(http_handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP|CURLPROTO_HTTPS); - curl_easy_setopt(http_handle, CURLOPT_USERAGENT, va("SRB2Kart/v%d.%d", VERSION, SUBVERSION)); // Set user agent as some servers won't accept invalid user agents. + curl_easy_setopt(http_handle, CURLOPT_USERAGENT, va("Ring Racers/v%d.%d", VERSION, SUBVERSION)); // Set user agent as some servers won't accept invalid user agents. // Authenticate if the user so wishes login = CURLGetLogin(url, NULL); diff --git a/src/dehacked.c b/src/dehacked.c index 5f0743a7e..7288ac374 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -576,7 +576,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) readcupheader(f, cup); } - else if (fastcmp(word, "SRB2KART")) + else if (fastcmp(word, "RINGRACERS")) { if (isdigit(word2[0])) { @@ -584,7 +584,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) if (i != PATCHVERSION) { deh_warning( - "Patch is for SRB2Kart version %d, " + "Patch is for Ring Racers version %d, " "only version %d is supported", i, PATCHVERSION @@ -594,12 +594,16 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) else { deh_warning( - "SRB2Kart version definition has incorrect format, " - "use \"SRB2KART %d\"", + "Ring Racers version definition has incorrect format, " + "use \"RINGRACERS %d\"", PATCHVERSION ); } } + else if (fastcmp(word, "SRB2KART")) + { + deh_warning("Patch is only compatible with SRB2Kart."); + } else if (fastcmp(word, "SRB2")) { deh_warning("Patch is only compatible with base SRB2."); diff --git a/src/f_finale.c b/src/f_finale.c index a9a81da34..ed57b9e7a 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -526,7 +526,7 @@ boolean F_IntroResponder(event_t *event) // CREDITS // ========= static const char *credits[] = { - "\1SRB2Kart", + "\1Dr. Robotnik's Ring Racers", "\1Credits", "", "\1Game Design", @@ -2032,7 +2032,7 @@ void F_TitleScreenDrawer(void) V_DrawSmallScaledPatch(84, 36, transval<filepath); + CONS_Alert(CONS_ERROR, M_GetText("%s is not a Ring Racers replay file.\n"), pdemo->filepath); pdemo->type = MD_INVALID; sprintf(pdemo->title, "INVALID REPLAY"); Z_Free(infobuffer); @@ -2760,7 +2760,7 @@ void G_DoPlayDemo(char *defdemoname) demo.playback = true; if (memcmp(demo_p, DEMOHEADER, 12)) { - snprintf(msg, 1024, M_GetText("%s is not a SRB2Kart replay file.\n"), pdemoname); + snprintf(msg, 1024, M_GetText("%s is not a Ring Racers replay file.\n"), pdemoname); CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); diff --git a/src/g_game.c b/src/g_game.c index dd4723c91..aebdff940 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3972,7 +3972,7 @@ void G_LoadGameData(void) // Version check if (READUINT32(save_p) != 0xFCAFE211) { - const char *gdfolder = "the SRB2Kart folder"; + const char *gdfolder = "the Ring Racers folder"; if (strcmp(srb2home,".")) gdfolder = srb2home; @@ -4062,7 +4062,7 @@ void G_LoadGameData(void) // Landing point for corrupt gamedata datacorrupt: { - const char *gdfolder = "the SRB2Kart folder"; + const char *gdfolder = "the Ring Racers folder"; if (strcmp(srb2home,".")) gdfolder = srb2home; diff --git a/src/m_menu.c b/src/m_menu.c index c1c8c114d..bcbd62d11 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3516,7 +3516,7 @@ void M_Init(void) quitmsg[QUIT3MSG1] = M_GetText("Come on, just ONE more netgame!\n\n(Press 'Y' to quit)"); quitmsg[QUIT3MSG2] = M_GetText("Press 'N' to unlock\nthe Golden Kart!\n\n(Press 'Y' to quit)"); quitmsg[QUIT3MSG3] = M_GetText("Couldn't handle\nthe banana meta?\n\n(Press 'Y' to quit)"); - quitmsg[QUIT3MSG4] = M_GetText("Every time you press 'Y', an\nSRB2Kart Developer cries...\n\n(Press 'Y' to quit)"); + quitmsg[QUIT3MSG4] = M_GetText("Every time you press 'Y', a\nRing Racers Developer cries...\n\n(Press 'Y' to quit)"); quitmsg[QUIT3MSG5] = M_GetText("You'll be back to play soon, though...\n...right?\n\n(Press 'Y' to quit)"); quitmsg[QUIT3MSG6] = M_GetText("Aww, is Eggman's Nightclub too\ndifficult for you?\n\n(Press 'Y' to quit)"); @@ -8804,7 +8804,7 @@ static void M_ConnectMenuModChecks(INT32 choice) if (modifiedgame) { - M_StartMessage(M_GetText("You have addons loaded.\nYou won't be able to join netgames!\n\nTo play online, restart the game\nand don't load any addons.\nSRB2Kart will automatically add\neverything you need when you join.\n\n(Press a key)\n"), FUNCPTRCAST(M_ConnectMenu), MM_EVENTHANDLER); + M_StartMessage(M_GetText("You have addons loaded.\nYou won't be able to join netgames!\n\nTo play online, restart the game\nand don't load any addons.\nRing Racers will automatically add\neverything you need when you join.\n\n(Press a key)\n"), FUNCPTRCAST(M_ConnectMenu), MM_EVENTHANDLER); return; } diff --git a/src/m_misc.c b/src/m_misc.c index 8146cceec..1d8f5d394 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -650,7 +650,7 @@ void M_SaveConfig(const char *filename) } // header message - fprintf(f, "// SRB2Kart configuration file.\n"); + fprintf(f, "// Dr. Robotnik's Ring Racers configuration file.\n"); // print execversion FIRST, because subsequent consvars need to be filtered // always print current EXECVERSION @@ -803,10 +803,10 @@ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png char keytxt[SRB2PNGTXT][12] = { "Title", "Description", "Playername", "Mapnum", "Mapname", "Location", "Interface", "Render Mode", "Revision", "Build Date", "Build Time"}; - char titletxt[] = "SRB2Kart " VERSIONSTRING; + char titletxt[] = "Dr. Robotnik's Ring Racers " VERSIONSTRING; png_charp playertxt = cv_playername[0].zstring; - char desctxt[] = "SRB2Kart Screenshot"; - char Movietxt[] = "SRB2Kart Movie"; + char desctxt[] = "Ring Racers Screenshot"; + char Movietxt[] = "Ring Racers Movie"; size_t i; char interfacetxt[] = #ifdef HAVE_SDL diff --git a/src/mserv.c b/src/mserv.c index 0c715e78f..37a5ea89c 100644 --- a/src/mserv.c +++ b/src/mserv.c @@ -71,7 +71,7 @@ static CV_PossibleValue_t masterserver_update_rate_cons_t[] = { consvar_t cv_masterserver = CVAR_INIT ("masterserver", "https://ms.kartkrew.org/ms/api", CV_SAVE|CV_CALL, NULL, MasterServer_OnChange); consvar_t cv_rendezvousserver = CVAR_INIT ("rendezvousserver", "relay.kartkrew.org", CV_SAVE|CV_CALL, NULL, RendezvousServer_OnChange); -consvar_t cv_servername = CVAR_INIT ("servername", "SRB2Kart server", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Update_parameters); +consvar_t cv_servername = CVAR_INIT ("servername", "Ring Racers server", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Update_parameters); consvar_t cv_server_contact = CVAR_INIT ("server_contact", "", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Update_parameters); consvar_t cv_masterserver_update_rate = CVAR_INIT ("masterserver_update_rate", "15", CV_SAVE|CV_CALL|CV_NOINIT, masterserver_update_rate_cons_t, MasterClient_Ticker); diff --git a/src/sdl/i_main.c b/src/sdl/i_main.c index 5b205503e..de3ea3c9a 100644 --- a/src/sdl/i_main.c +++ b/src/sdl/i_main.c @@ -269,7 +269,7 @@ int main(int argc, char **argv) #endif // startup SRB2 - CONS_Printf("Setting up SRB2Kart...\n"); + CONS_Printf("Setting up Dr. Robotnik's Ring Racers...\n"); D_SRB2Main(); #ifdef LOGMESSAGES if (!M_CheckParm("-nolog")) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 854c35793..627da09a4 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -145,10 +145,10 @@ typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T); // Locations for searching for main.kart #if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) -#define DEFAULTWADLOCATION1 "/usr/local/share/games/SRB2Kart" -#define DEFAULTWADLOCATION2 "/usr/local/games/SRB2Kart" -#define DEFAULTWADLOCATION3 "/usr/share/games/SRB2Kart" -#define DEFAULTWADLOCATION4 "/usr/games/SRB2Kart" +#define DEFAULTWADLOCATION1 "/usr/local/share/games/DRRR" +#define DEFAULTWADLOCATION2 "/usr/local/games/DRRR" +#define DEFAULTWADLOCATION3 "/usr/share/games/DRRR" +#define DEFAULTWADLOCATION4 "/usr/games/DRRR" #define DEFAULTSEARCHPATH1 "/usr/local/games" #define DEFAULTSEARCHPATH2 "/usr/games" #define DEFAULTSEARCHPATH3 "/usr/local" @@ -247,8 +247,8 @@ static void write_backtrace(INT32 signal) void *array[BT_SIZE]; char timestr[STR_SIZE]; - const char *error = "An error occurred within SRB2! Send this stack trace to someone who can help!\n"; - const char *error2 = "(Or find crash-log.txt in your SRB2 directory.)\n"; // Shown only to stderr. + const char *error = "An error occurred within Dr. Robotnik's Ring Racers! Send this stack trace to someone who can help!\n"; + const char *error2 = "(Or find crash-log.txt in your Ring Racers directory.)\n"; // Shown only to stderr. fd = open(va("%s" PATHSEP "%s", srb2home, "crash-log.txt"), O_CREAT|O_APPEND|O_RDWR, S_IRUSR|S_IWUSR); @@ -682,7 +682,7 @@ static void I_StartupConsole(void) if (gotConsole) { - SetConsoleTitleA("SRB2Kart Console"); + SetConsoleTitleA("Dr. Robotnik's Ring Racers Console"); consolevent = SDL_TRUE; } @@ -1513,8 +1513,8 @@ void I_UpdateMumble(const mobj_t *mobj, const listener_t listener) return; if(mumble->uiVersion != 2) { - wcsncpy(mumble->name, L"SRB2Kart "VERSIONSTRINGW, 256); - wcsncpy(mumble->description, L"Sonic Robo Blast 2 Kart with integrated Mumble Link support.", 2048); + wcsncpy(mumble->name, L"Dr. Robotnik's Ring Racers "VERSIONSTRINGW, 256); + wcsncpy(mumble->description, L"Dr. Robotnik's Ring Racers with integrated Mumble Link support.", 2048); mumble->uiVersion = 2; } mumble->uiTick++; @@ -1853,7 +1853,7 @@ INT32 I_StartupSystem(void) I_OutputMsg("Linked with SDL version: %d.%d.%d\n", SDLlinked.major, SDLlinked.minor, SDLlinked.patch); if (SDL_Init(0) < 0) - I_Error("SRB2: SDL System Error: %s", SDL_GetError()); //Alam: Oh no.... + I_Error("Dr. Robotnik's Ring Racers: SDL System Error: %s", SDL_GetError()); //Alam: Oh no.... #ifndef NOMUMBLE I_SetupMumble(); #endif @@ -1976,7 +1976,7 @@ void I_Error(const char *error, ...) // on the target system if (!M_CheckParm("-dedicated")) SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, - "SRB2Kart "VERSIONSTRING" Recursive Error", + "Dr. Robotnik's Ring Racers "VERSIONSTRING" Recursive Error", buffer, NULL); W_Shutdown(); @@ -2025,7 +2025,7 @@ void I_Error(const char *error, ...) // on the target system if (!M_CheckParm("-dedicated")) SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, - "SRB2Kart "VERSIONSTRING" Error", + "Dr. Robotnik's Ring Racers "VERSIONSTRING" Error", buffer, NULL); // Note that SDL_ShowSimpleMessageBox does *not* require SDL to be diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 9f96a2177..ceba0f330 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1729,7 +1729,7 @@ INT32 VID_SetMode(INT32 modeNum) src_rect.w = vid.width; src_rect.h = vid.height; - //Impl_SetWindowName("SRB2Kart "VERSIONSTRING); + //Impl_SetWindowName("Dr. Robotnik's Ring Racers "VERSIONSTRING); VID_CheckRenderer(); return SDL_TRUE; } @@ -1756,7 +1756,7 @@ static SDL_bool Impl_CreateWindow(SDL_bool fullscreen) #endif // Create a window - window = SDL_CreateWindow("SRB2Kart "VERSIONSTRING, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, + window = SDL_CreateWindow("Dr. Robotnik's Ring Racers "VERSIONSTRING, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, realwidth, realheight, flags); @@ -1932,7 +1932,7 @@ void I_StartupGraphics(void) // Create window //Impl_CreateWindow(USE_FULLSCREEN); - //Impl_SetWindowName("SRB2Kart "VERSIONSTRING); + //Impl_SetWindowName("Dr. Robotnik's Ring Racers "VERSIONSTRING); VID_SetMode(VID_GetModeForSize(BASEVIDWIDTH, BASEVIDHEIGHT)); vid.width = BASEVIDWIDTH; // Default size for startup diff --git a/src/win32/Srb2win.rc b/src/win32/Srb2win.rc index b3925c873..dbd11991a 100644 --- a/src/win32/Srb2win.rc +++ b/src/win32/Srb2win.rc @@ -94,16 +94,16 @@ BEGIN BEGIN BLOCK "04090000" BEGIN - VALUE "Comments", "Go go-karting with Dr. Eggman!\0" + VALUE "Comments", "Go go-karting with Dr. Robotnik!\0" VALUE "CompanyName", "Kart Krew\0" - VALUE "FileDescription", "SRB2Kart\0" + VALUE "FileDescription", "Dr. Robotnik's Ring Racers\0" VALUE "FileVersion", VERSIONSTRING_RC - VALUE "InternalName", "srb2kart\0" + VALUE "InternalName", "drrr\0" VALUE "LegalCopyright", "Copyright 2018-2020 by Kart Krew\0" - VALUE "LegalTrademarks", "Dr. Eggman and related characters are trademarks of Sega.\0" - VALUE "OriginalFilename", "srb2kart.exe\0" + VALUE "LegalTrademarks", "Dr. Robotnik and related characters are trademarks of Sega.\0" + VALUE "OriginalFilename", "drrr.exe\0" VALUE "PrivateBuild", "\0" - VALUE "ProductName", "SRB2Kart\0" + VALUE "ProductName", "Dr. Robotnik's Ring Racers\0" VALUE "ProductVersion", VERSIONSTRING_RC VALUE "SpecialBuild", "\0" END diff --git a/src/win32/win_dbg.c b/src/win32/win_dbg.c index 4230e962f..b5e3767dc 100644 --- a/src/win32/win_dbg.c +++ b/src/win32/win_dbg.c @@ -74,7 +74,7 @@ BOOL InitBugTrap(void) if (g_hmodBugTrap) { - lpfnBT_SetAppName(TEXT("Sonic Robo Blast 2")); + lpfnBT_SetAppName(TEXT("Dr. Robotnik's Ring Racers")); lpfnBT_SetAppVersion(TEXT(VERSIONSTRING)); lpfnBT_SetFlags(BTF_DETAILEDMODE | BTF_ATTACHREPORT); lpfnBT_SetSupportURL(TEXT("http://www.srb2.org/")); @@ -454,7 +454,7 @@ LONG WINAPI RecordExceptionInfo(PEXCEPTION_POINTERS data/*, LPCSTR Message, LPST FPrintf(fileHandle, "Email Sonic Team Junior so we can fix the bugs\r\n"); // Tails FPrintf(fileHandle, "Make sure you tell us what you were doing to cause the crash, and if possible, record a demo!\r\n"); // Tails FPrintf(fileHandle, "\r\n\r\n\r\n\r\n"); - FPrintf(fileHandle, "SRB2Kart %s -ERROR LOG-\r\n\r\n", VERSIONSTRING); + FPrintf(fileHandle, "Dr. Robotnik's Ring Racers %s -ERROR LOG-\r\n\r\n", VERSIONSTRING); FPrintf(fileHandle, "\r\n"); // VirtualQuery can be used to get the allocation base associated with a // code address, which is the same as the ModuleHandle. This can be used diff --git a/src/win32/win_main.c b/src/win32/win_main.c index 54b489751..70b0d7201 100644 --- a/src/win32/win_main.c +++ b/src/win32/win_main.c @@ -325,8 +325,8 @@ static inline VOID OpenTextConsole(VOID) { if (AllocConsole()) //Let get the real console HANDLEs, because Mingw's Bash is bad! { - SetConsoleTitleA("SRB2Kart Console"); - CONS_Printf(M_GetText("Hello, it's me, SRB2Kart's Console Window\n")); + SetConsoleTitleA("Dr. Robotnik's Ring Racers Console"); + CONS_Printf(M_GetText("Hello, it's me, Dr. Robotnik's Ring Racers' Console Window\n")); } else { @@ -612,7 +612,7 @@ static int WINAPI HandledWinMain(HINSTANCE hInstance) #endif // open a dummy window, both OpenGL and DirectX need one. - if ((hWndMain = OpenMainWindow(hInstance, va("SRB2Kart "VERSIONSTRING))) == INVALID_HANDLE_VALUE) + if ((hWndMain = OpenMainWindow(hInstance, va("Dr. Robotnik's Ring Racers "VERSIONSTRING))) == INVALID_HANDLE_VALUE) { tlErrorMessage(TEXT("Couldn't open window")); return FALSE; @@ -624,7 +624,7 @@ static int WINAPI HandledWinMain(HINSTANCE hInstance) MakeCodeWritable(); // startup SRB2 - CONS_Printf("Setting up SRB2Kart...\n"); + CONS_Printf("Setting up Dr. Robotnik's Ring Racers...\n"); D_SRB2Main(); CONS_Printf("Entering main game loop...\n"); // never return diff --git a/src/win32/win_net.c b/src/win32/win_net.c index c06919550..4e958da60 100644 --- a/src/win32/win_net.c +++ b/src/win32/win_net.c @@ -33,7 +33,7 @@ boolean I_InitNetwork(void) { if (M_CheckParm ("-net")) { - I_Error("The Win32 version of SRB2Kart doesn't work with external drivers like ipxsetup, sersetup, or doomatic\n" + I_Error("The Win32 version of Dr. Robotnik's Ring Racers doesn't work with external drivers like ipxsetup, sersetup, or doomatic\n" "Read the documentation about \"-server\" and \"-connect\" parameters or just use the launcher\n"); } diff --git a/src/win32/win_sys.c b/src/win32/win_sys.c index 9b2c5bd07..8d4819dd8 100644 --- a/src/win32/win_sys.c +++ b/src/win32/win_sys.c @@ -513,7 +513,7 @@ static void signal_handler(int num) } #endif - MessageBoxA(hWndMain, va("signal_handler(): %s", sigmsg), "SRB2Kart error", MB_OK|MB_ICONERROR); + MessageBoxA(hWndMain, va("signal_handler(): %s", sigmsg), "Dr. Robotnik's Ring Racers error", MB_OK|MB_ICONERROR); signal(num, SIG_DFL); // default signal action raise(num); @@ -630,7 +630,7 @@ void I_Error(const char *error, ...) va_end(argptr); OutputDebugStringA(txt); - MessageBoxA(hWndMain, txt, "SRB2Kart Recursive Error", MB_OK|MB_ICONERROR); + MessageBoxA(hWndMain, txt, "Dr. Robotnik's Ring Racers Recursive Error", MB_OK|MB_ICONERROR); W_Shutdown(); exit(-1); // recursive errors detected } @@ -673,7 +673,7 @@ void I_Error(const char *error, ...) } #endif - MessageBoxA(hWndMain, txt, "SRB2Kart Error", MB_OK|MB_ICONERROR); + MessageBoxA(hWndMain, txt, "Dr. Robotnik's Ring Racers Error", MB_OK|MB_ICONERROR); W_Shutdown(); exit(-1); @@ -3092,8 +3092,8 @@ void I_UpdateMumble(const mobj_t *mobj, const listener_t listener) return; if(mumble->uiVersion != 2) { - wcsncpy(mumble->name, L"SRB2Kart "VERSIONSTRINGW, 256); - wcsncpy(mumble->description, L"SRB2Kart with integrated Mumble Link support.", 2048); + wcsncpy(mumble->name, L"Dr. Robotnik's Ring Racers "VERSIONSTRINGW, 256); + wcsncpy(mumble->description, L"Dr. Robotnik's Ring Racers with integrated Mumble Link support.", 2048); mumble->uiVersion = 2; } mumble->uiTick++; From 56c23339be5c4a6276e8912b88fe116371bcb53f Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 20 May 2022 01:45:16 -0400 Subject: [PATCH 35/48] Directional Influence Pretty much just copy+pasted from Snap the Sentinel!! - Hold left/right to adjust the momentum angle after hitlag, up to 22.5 degrees. (Only angle can be adjusted, so you can't adjust your speed, only your direction.) - It's relative to your angle, so sometimes you need to use forward/back, or even diagonals (forward/back throws now store full analog data for this to work) - Bananas flip DI direction, to make them not baby easy mode - Tumble has x3 DI (so angle adjustments of 67.5!!), and hitlag on each bounce to allow even more control. --- src/d_clisrv.c | 3 +- src/d_player.h | 2 + src/d_ticcmd.h | 7 ++- src/deh_tables.c | 2 - src/g_demo.c | 28 ++++++++--- src/g_game.c | 19 +++++-- src/k_bot.c | 4 +- src/k_botitem.c | 10 +--- src/k_kart.c | 120 +++++++++++++++++++++++++++++++++++++++++++- src/k_kart.h | 1 + src/lua_playerlib.c | 12 +++++ src/p_inter.c | 6 +++ src/p_mobj.c | 5 ++ src/p_saveg.c | 6 +++ src/p_user.c | 34 ++++++++----- 15 files changed, 215 insertions(+), 44 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 7f6e6f287..21016d41c 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -4143,7 +4143,8 @@ static void HandlePacketFromAwayNode(SINT8 node) static boolean CheckForSpeedHacks(UINT8 p) { if (netcmds[maketic%BACKUPTICS][p].forwardmove > MAXPLMOVE || netcmds[maketic%BACKUPTICS][p].forwardmove < -MAXPLMOVE - || netcmds[maketic%BACKUPTICS][p].turning > KART_FULLTURN || netcmds[maketic%BACKUPTICS][p].turning < -KART_FULLTURN) + || netcmds[maketic%BACKUPTICS][p].turning > KART_FULLTURN || netcmds[maketic%BACKUPTICS][p].turning < -KART_FULLTURN + || netcmds[maketic%BACKUPTICS][p].throwdir > KART_FULLTURN || netcmds[maketic%BACKUPTICS][p].throwdir < -KART_FULLTURN) { CONS_Alert(CONS_WARNING, M_GetText("Illegal movement value received from node %d\n"), playernode[p]); //D_Clearticcmd(k); diff --git a/src/d_player.h b/src/d_player.h index 60ca7c4bd..bd999641c 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -402,6 +402,8 @@ typedef struct player_s UINT8 justbumped; // Prevent players from endlessly bumping into each other UINT8 tumbleBounces; UINT16 tumbleHeight; // In *mobjscaled* fracunits, or mfu, not raw fu + boolean justDI; // Directional Influence ended, true until letting go of turn + boolean flipDI; // Bananas flip the DI direction. Was a bug, but it made bananas much more interesting. SINT8 drift; // (-5 to 5) - Drifting Left or Right, plus a bigger counter = sharper turn fixed_t driftcharge; // Charge your drift so you can release a burst of speed diff --git a/src/d_ticcmd.h b/src/d_ticcmd.h index 226c8f4d8..4b264a68a 100644 --- a/src/d_ticcmd.h +++ b/src/d_ticcmd.h @@ -30,13 +30,11 @@ typedef enum BT_DRIFT = 1<<2, // Drift (direction is cmd->turning) BT_BRAKE = 1<<3, // Brake BT_ATTACK = 1<<4, // Use Item - BT_FORWARD = 1<<5, // Aim Item Forward - BT_BACKWARD = 1<<6, // Aim Item Backward - BT_LOOKBACK = 1<<7, // Look Backward + BT_LOOKBACK = 1<<5, // Look Backward BT_EBRAKEMASK = (BT_ACCELERATE|BT_BRAKE), - // free: 1<<9 to 1<<12 + // free: 1<<6 to 1<<12 // Lua garbage BT_CUSTOM1 = 1<<13, @@ -65,6 +63,7 @@ typedef struct { SINT8 forwardmove; // -MAXPLMOVE to MAXPLMOVE (50) INT16 turning; // Turn speed + INT16 throwdir; // Aiming direction INT16 aiming; // vertical aiming, see G_BuildTicCmd UINT16 buttons; UINT8 latency; // Netgames: how many tics ago was this ticcmd generated from this player's end? diff --git a/src/deh_tables.c b/src/deh_tables.c index faa5010ad..a45e0ddab 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -6549,8 +6549,6 @@ struct int_const_s const INT_CONST[] = { {"BT_DRIFT",BT_DRIFT}, {"BT_BRAKE",BT_BRAKE}, {"BT_ATTACK",BT_ATTACK}, - {"BT_FORWARD",BT_FORWARD}, - {"BT_BACKWARD",BT_BACKWARD}, {"BT_CUSTOM1",BT_CUSTOM1}, // Lua customizable {"BT_CUSTOM2",BT_CUSTOM2}, // Lua customizable {"BT_CUSTOM3",BT_CUSTOM3}, // Lua customizable diff --git a/src/g_demo.c b/src/g_demo.c index c53166e8e..db1e1db0f 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -128,13 +128,16 @@ demoghost *ghosts = NULL; #define DEMO_SHRINKME 0x04 // For demos -#define ZT_FWD 0x01 -#define ZT_SIDE 0x02 -#define ZT_TURNING 0x04 -#define ZT_BUTTONS 0x08 -#define ZT_AIMING 0x10 -#define ZT_LATENCY 0x20 -#define ZT_FLAGS 0x40 +#define ZT_FWD 0x01 +#define ZT_SIDE 0x02 +#define ZT_TURNING 0x04 +#define ZT_THROWDIR 0x08 +#define ZT_BUTTONS 0x10 +#define ZT_AIMING 0x20 +#define ZT_LATENCY 0x40 +#define ZT_FLAGS 0x80 +// OUT OF ZIPTICS... + #define DEMOMARKER 0x80 // demoend UINT8 demo_extradata[MAXPLAYERS]; @@ -524,6 +527,8 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum) oldcmd[playernum].forwardmove = READSINT8(demo_p); if (ziptic & ZT_TURNING) oldcmd[playernum].turning = READINT16(demo_p); + if (ziptic & ZT_THROWDIR) + oldcmd[playernum].throwdir = READINT16(demo_p); if (ziptic & ZT_BUTTONS) oldcmd[playernum].buttons = READUINT16(demo_p); if (ziptic & ZT_AIMING) @@ -567,6 +572,13 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum) ziptic |= ZT_TURNING; } + if (cmd->throwdir != oldcmd[playernum].throwdir) + { + WRITEINT16(demo_p,cmd->throwdir); + oldcmd[playernum].throwdir = cmd->throwdir; + ziptic |= ZT_THROWDIR; + } + if (cmd->buttons != oldcmd[playernum].buttons) { WRITEUINT16(demo_p,cmd->buttons); @@ -1128,6 +1140,8 @@ void G_GhostTicker(void) g->p++; if (ziptic & ZT_TURNING) g->p += 2; + if (ziptic & ZT_THROWDIR) + g->p += 2; if (ziptic & ZT_BUTTONS) g->p += 2; if (ziptic & ZT_AIMING) diff --git a/src/g_game.c b/src/g_game.c index dd4723c91..411f85860 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1027,10 +1027,15 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) } // But forward/backward IS used for aiming. - if (PlayerInputDown(ssplayer, gc_aimforward) || (joystickvector.yaxis < 0)) - cmd->buttons |= BT_FORWARD; - if (PlayerInputDown(ssplayer, gc_aimbackward) || (joystickvector.yaxis > 0)) - cmd->buttons |= BT_BACKWARD; + if (PlayerInputDown(ssplayer, gc_aimforward)) + cmd->throwdir += KART_FULLTURN; + if (PlayerInputDown(ssplayer, gc_aimbackward)) + cmd->throwdir -= KART_FULLTURN; + + if (analogjoystickmove && joystickvector.yaxis != 0) + { + cmd->throwdir -= (joystickvector.yaxis * KART_FULLTURN) >> 10; + } } // fire with any button/key @@ -1160,6 +1165,11 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) else if (cmd->turning < -KART_FULLTURN) cmd->turning = -KART_FULLTURN; + if (cmd->throwdir > KART_FULLTURN) + cmd->throwdir = KART_FULLTURN; + else if (cmd->throwdir < -KART_FULLTURN) + cmd->throwdir = -KART_FULLTURN; + // Reset away view if a command is given. if ((cmd->forwardmove || cmd->buttons) && !r_splitscreen && displayplayers[0] != consoleplayer && ssplayer == 1) @@ -1183,6 +1193,7 @@ ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n) { dest[i].forwardmove = src[i].forwardmove; dest[i].turning = (INT16)SHORT(src[i].turning); + dest[i].throwdir = (INT16)SHORT(src[i].throwdir); dest[i].aiming = (INT16)SHORT(src[i].aiming); dest[i].buttons = (UINT16)SHORT(src[i].buttons); dest[i].latency = src[i].latency; diff --git a/src/k_bot.c b/src/k_bot.c index 9e1212b1f..473ad5844 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -1008,10 +1008,10 @@ static void K_BotTrick(player_t *player, ticcmd_t *cmd, line_t *botController) cmd->turning = -KART_FULLTURN; break; case 3: - cmd->buttons |= BT_FORWARD; + cmd->throwdir = KART_FULLTURN; break; case 4: - cmd->buttons |= BT_BACKWARD; + cmd->throwdir = -KART_FULLTURN; break; } } diff --git a/src/k_botitem.c b/src/k_botitem.c index 6f8e82034..4e509df0c 100644 --- a/src/k_botitem.c +++ b/src/k_botitem.c @@ -332,15 +332,7 @@ static boolean K_BotGenericPressItem(player_t *player, ticcmd_t *cmd, SINT8 dir) return false; } - if (dir == 1) - { - cmd->buttons |= BT_FORWARD; - } - else if (dir == -1) - { - cmd->buttons |= BT_BACKWARD; - } - + cmd->throwdir = KART_FULLTURN * dir; cmd->buttons |= BT_ATTACK; player->botvars.itemconfirm = 0; return true; diff --git a/src/k_kart.c b/src/k_kart.c index 4edb34b5c..c8d3d4ef2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3312,6 +3312,13 @@ void K_AddHitLag(mobj_t *mo, INT32 tics, boolean fromDamage) mo->hitlag += tics; mo->hitlag = min(mo->hitlag, MAXHITLAGTICS); + if (mo->player != NULL) + { + // Reset each time. We want to explicitly set this for bananas afterwards, + // so make sure an old value doesn't possibly linger. + mo->player->flipDI = false; + } + if (fromDamage == true) { // Dunno if this should flat-out &~ the flag out too. @@ -3560,6 +3567,7 @@ static boolean K_LastTumbleBounceCondition(player_t *player) static void K_HandleTumbleBounce(player_t *player) { fixed_t gravityadjust; + player->tumbleBounces++; player->tumbleHeight = (player->tumbleHeight * ((player->tumbleHeight > 100) ? 3 : 4)) / 5; player->pflags &= ~PF_TUMBLESOUND; @@ -3590,6 +3598,10 @@ static void K_HandleTumbleBounce(player_t *player) } } + // A bit of damage hitlag. + // This gives a window for DI!! + K_AddHitLag(player->mo, 6, true); + if (P_IsDisplayPlayer(player) && player->tumbleHeight >= 40) P_StartQuake((player->tumbleHeight*3/2)<justDI == true) + { + // No turning until you let go after DI-ing. + return 0; + } + currentSpeed = FixedHypot(player->mo->momx, player->mo->momy); if ((currentSpeed <= 0) // Not moving @@ -10115,7 +10133,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) K_trickPanelTimingVisual(player, momz); } - else if (player->throwdir == 1) + else if (cmd->throwdir > 0) { if (player->mo->momz * P_MobjFlip(player->mo) > 0) { @@ -10130,7 +10148,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) K_trickPanelTimingVisual(player, momz); } - else if (player->throwdir == -1) + else if (cmd->throwdir < 0) { boolean relative = true; @@ -10338,4 +10356,102 @@ boolean K_IsSPBInGame(void) return false; } +void K_HandleDirectionalInfluence(player_t *player) +{ + fixed_t strength = FRACUNIT >> 1; // 1.0 == 45 degrees + + ticcmd_t *cmd = NULL; + angle_t sideAngle = ANGLE_MAX; + + INT16 inputX, inputY; + INT16 inputLen; + + fixed_t diX, diY; + fixed_t diLen; + fixed_t diMul; + + fixed_t dot, invDot; + + fixed_t finalX, finalY; + fixed_t finalLen; + fixed_t speed; + + if (player->playerstate != PST_LIVE || player->spectator) + { + // ded + return; + } + + // DI attempted!! + player->justDI = true; + + cmd = &player->cmd; + + inputX = cmd->throwdir; + inputY = -cmd->turning; + + if (player->flipDI == true) + { + // Bananas flip the DI direction. + // Otherwise, DIing bananas is a little brain-dead easy :p + inputX = -inputX; + inputY = -inputY; + } + + if (inputX == 0 && inputY == 0) + { + // No DI input, no need to do anything else. + return; + } + + inputLen = FixedHypot(inputX, inputY); + if (inputLen > KART_FULLTURN) + { + inputLen = KART_FULLTURN; + } + + if (player->tumbleBounces > 0) + { + // Very strong DI for tumble. + strength *= 3; + } + + sideAngle = player->mo->angle - ANGLE_90; + + diX = FixedMul(inputX, FINECOSINE(player->mo->angle >> ANGLETOFINESHIFT)) + FixedMul(inputY, FINECOSINE(sideAngle >> ANGLETOFINESHIFT)); + diY = FixedMul(inputX, FINESINE(player->mo->angle >> ANGLETOFINESHIFT)) + FixedMul(inputY, FINESINE(sideAngle >> ANGLETOFINESHIFT)); + diLen = FixedHypot(diX, diY); + + // Normalize + diMul = (KART_FULLTURN * FRACUNIT) / inputLen; + if (diLen > 0) + { + diX = FixedMul(diMul, FixedDiv(diX, diLen)); + diY = FixedMul(diMul, FixedDiv(diY, diLen)); + } + + // Now that we got the DI direction, we can + // actually preform the velocity redirection. + + speed = FixedHypot(player->mo->momx, player->mo->momy); + finalX = FixedDiv(player->mo->momx, speed); + finalY = FixedDiv(player->mo->momy, speed); + + dot = FixedMul(diX, finalX) + FixedMul(diY, finalY); + invDot = FRACUNIT - abs(dot); + + finalX += FixedMul(FixedMul(diX, invDot), strength); + finalY += FixedMul(FixedMul(diY, invDot), strength); + finalLen = FixedHypot(finalX, finalY); + + if (finalLen > 0) + { + finalX = FixedDiv(finalX, finalLen); + finalY = FixedDiv(finalY, finalLen); + } + + player->mo->momx = FixedMul(speed, finalX); + player->mo->momy = FixedMul(speed, finalY); +} + //} diff --git a/src/k_kart.h b/src/k_kart.h index d6ba0f720..89f176d29 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -143,6 +143,7 @@ UINT8 K_GetInvincibilityItemFrame(void); UINT8 K_GetOrbinautItemFrame(UINT8 count); boolean K_IsSPBInGame(void); void K_KartEbrakeVisuals(player_t *p); +void K_HandleDirectionalInfluence(player_t *player); // sound stuff for lua void K_PlayAttackTaunt(mobj_t *source); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 3d05d9c15..506d6b96a 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -238,6 +238,10 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->tumbleBounces); else if (fastcmp(field,"tumbleHeight")) lua_pushinteger(L, plr->tumbleHeight); + else if (fastcmp(field,"justDI")) + lua_pushboolean(L, plr->justDI); + else if (fastcmp(field,"flipDI")) + lua_pushboolean(L, plr->flipDI); else if (fastcmp(field,"drift")) lua_pushinteger(L, plr->drift); else if (fastcmp(field,"driftcharge")) @@ -584,6 +588,10 @@ static int player_set(lua_State *L) plr->tumbleBounces = luaL_checkinteger(L, 3); else if (fastcmp(field,"tumbleHeight")) plr->tumbleHeight = luaL_checkinteger(L, 3); + else if (fastcmp(field,"justDI")) + plr->justDI = luaL_checkboolean(L, 3); + else if (fastcmp(field,"flipDI")) + plr->flipDI = luaL_checkboolean(L, 3); else if (fastcmp(field,"drift")) plr->drift = luaL_checkinteger(L, 3); else if (fastcmp(field,"driftcharge")) @@ -891,6 +899,8 @@ static int ticcmd_get(lua_State *L) lua_pushinteger(L, cmd->forwardmove); else if (fastcmp(field,"turning")) lua_pushinteger(L, cmd->turning); + else if (fastcmp(field,"throwdir")) + lua_pushinteger(L, cmd->throwdir); else if (fastcmp(field,"aiming")) lua_pushinteger(L, cmd->aiming); else if (fastcmp(field,"buttons")) @@ -919,6 +929,8 @@ static int ticcmd_set(lua_State *L) cmd->forwardmove = (SINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"turning")) cmd->turning = (INT16)luaL_checkinteger(L, 3); + else if (fastcmp(field,"throwdir")) + cmd->throwdir = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"aiming")) cmd->aiming = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"buttons")) diff --git a/src/p_inter.c b/src/p_inter.c index aceb8336c..9e98a8808 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2095,6 +2095,12 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da player->instashield = 15; K_SetHitLagForObjects(target, inflictor, laglength, true); + + if (inflictor && !P_MobjWasRemoved(inflictor) && inflictor->type == MT_BANANA) + { + player->flipDI = true; + } + return true; } } diff --git a/src/p_mobj.c b/src/p_mobj.c index c9f68b8f3..e21c2731e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9150,6 +9150,11 @@ void P_MobjThinker(mobj_t *mobj) mobj->spriteyscale = 5*FRACUNIT; } + if (mobj->player != NULL && mobj->hitlag == 0 && (mobj->eflags & MFE_DAMAGEHITLAG)) + { + K_HandleDirectionalInfluence(mobj->player); + } + return; } diff --git a/src/p_saveg.c b/src/p_saveg.c index bebc5c161..84157decb 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -244,6 +244,9 @@ static void P_NetArchivePlayers(void) WRITEUINT8(save_p, players[i].tumbleBounces); WRITEUINT16(save_p, players[i].tumbleHeight); + WRITEUINT8(save_p, players[i].justDI); + WRITEUINT8(save_p, players[i].flipDI); + WRITESINT8(save_p, players[i].drift); WRITEFIXED(save_p, players[i].driftcharge); WRITEUINT8(save_p, players[i].driftboost); @@ -514,6 +517,9 @@ static void P_NetUnArchivePlayers(void) players[i].tumbleBounces = READUINT8(save_p); players[i].tumbleHeight = READUINT16(save_p); + players[i].justDI = (boolean)READUINT8(save_p); + players[i].flipDI = (boolean)READUINT8(save_p); + players[i].drift = READSINT8(save_p); players[i].driftcharge = READFIXED(save_p); players[i].driftboost = READUINT8(save_p); diff --git a/src/p_user.c b/src/p_user.c index 51016d80e..40cf52720 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2095,6 +2095,11 @@ void P_MovePlayer(player_t *player) P_3dMovement(player); + if (cmd->turning == 0) + { + player->justDI = false; + } + // Kart frames if (player->tumbleBounces > 0) { @@ -4332,10 +4337,10 @@ void P_PlayerThink(player_t *player) } // Track airtime - if (P_IsObjectOnGround(player->mo)) + if (P_IsObjectOnGround(player->mo) + && !P_PlayerInPain(player)) // This isn't airtime, but it's control loss all the same. { - if (!P_PlayerInPain(player)) - player->airtime = 0; + player->airtime = 0; } else { @@ -4347,17 +4352,20 @@ void P_PlayerThink(player_t *player) // SRB2kart // Save the dir the player is holding // to allow items to be thrown forward or backward. - if (cmd->buttons & BT_FORWARD) { - player->throwdir = 1; - } - else if (cmd->buttons & BT_BACKWARD) - { - player->throwdir = -1; - } - else - { - player->throwdir = 0; + const INT16 threshold = 0; //(KART_FULLTURN / 2); + if (cmd->throwdir > threshold) + { + player->throwdir = 1; + } + else if (cmd->throwdir < -threshold) + { + player->throwdir = -1; + } + else + { + player->throwdir = 0; + } } // Accessibility - kickstart your acceleration From 6e8e0ad0f54ba3d8c0c03211d8f7db4be95d1e09 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 20 May 2022 18:12:34 -0400 Subject: [PATCH 36/48] Lightning Shield fixs - Rename to Lightning Shield (it keeps fucking me up when I want to kartgiveitem it to myself) - Fix inflictors causing damage being considered damage hitlag. Fixes the player using Lightning Shield being in damage hitlag state (most notable in the DI branch because hurting someone with it lets you DI afterwards, which also fucks with your turning) - Rewrote attack function to use custom blockmap search instead of P_NukeEnemies. - It can no longer attack below you, only above & around you. - Increased the attack radius, so that it actually lines up with the sprites... - Fixed extremely inconsistent ring blockmap search by moving it to playerafterthink (don't ask me why) - Rings get joulsted by Lightning Shield when you pass by them without - Added MAXRADIUS to the blockmap checks for lightning shield & mines, to reduce blockmap inconsistencies --- src/d_netcmd.c | 2 +- src/d_netcmd.h | 2 +- src/d_player.h | 4 +- src/deh_tables.c | 56 +++++++++--------- src/info.c | 60 +++++++++---------- src/info.h | 50 ++++++++-------- src/k_botitem.c | 10 ++-- src/k_botsearch.c | 8 +-- src/k_collide.c | 87 ++++++++++++++++++++++++++-- src/k_collide.h | 1 + src/k_hud.c | 18 +++--- src/k_kart.c | 143 ++++++++++++++++++++++++++++++++-------------- src/m_menu.c | 2 +- src/p_enemy.c | 95 +++++++++++++++++++----------- src/p_mobj.c | 18 +++--- src/p_user.c | 2 +- 16 files changed, 362 insertions(+), 196 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 51b6b97d6..14a0338ad 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -354,7 +354,7 @@ consvar_t cv_ballhog = CVAR_INIT ("ballhog", "On", CV_NETVAR|CV_CHEAT, CV consvar_t cv_selfpropelledbomb = CVAR_INIT ("selfpropelledbomb", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL); consvar_t cv_grow = CVAR_INIT ("grow", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL); consvar_t cv_shrink = CVAR_INIT ("shrink", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL); -consvar_t cv_thundershield = CVAR_INIT ("thundershield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL); +consvar_t cv_lightningshield = CVAR_INIT ("lightningshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL); consvar_t cv_bubbleshield = CVAR_INIT ("bubbleshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL); consvar_t cv_flameshield = CVAR_INIT ("flameshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL); consvar_t cv_hyudoro = CVAR_INIT ("hyudoro", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 5dc3418b0..f6d172bcc 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -63,7 +63,7 @@ extern consvar_t cv_restrictskinchange, cv_allowteamchange, cv_ingamecap, cv_res extern consvar_t cv_superring, cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana; extern consvar_t cv_eggmanmonitor, cv_orbinaut, cv_jawz, cv_mine, cv_landmine, cv_droptarget; extern consvar_t cv_ballhog, cv_selfpropelledbomb, cv_grow, cv_shrink; -extern consvar_t cv_thundershield, cv_bubbleshield, cv_flameshield; +extern consvar_t cv_lightningshield, cv_bubbleshield, cv_flameshield; extern consvar_t cv_hyudoro, cv_pogospring, cv_kitchensink; extern consvar_t cv_dualsneaker, cv_triplesneaker, cv_triplebanana, cv_decabanana; diff --git a/src/d_player.h b/src/d_player.h index 60ca7c4bd..e1943d557 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -145,7 +145,7 @@ Run this macro, then #undef FOREACH afterward FOREACH (SPB, 11),\ FOREACH (GROW, 12),\ FOREACH (SHRINK, 13),\ - FOREACH (THUNDERSHIELD, 14),\ + FOREACH (LIGHTNINGSHIELD, 14),\ FOREACH (BUBBLESHIELD, 15),\ FOREACH (FLAMESHIELD, 16),\ FOREACH (HYUDORO, 17),\ @@ -177,7 +177,7 @@ typedef enum typedef enum { KSHIELD_NONE = 0, - KSHIELD_THUNDER = 1, + KSHIELD_LIGHTNING = 1, KSHIELD_BUBBLE = 2, KSHIELD_FLAME = 3, NUMKARTSHIELDS diff --git a/src/deh_tables.c b/src/deh_tables.c index faa5010ad..7ebc00b6b 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3640,31 +3640,31 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_SPB20", "S_SPB_DEAD", - // Thunder Shield - "S_THUNDERSHIELD1", - "S_THUNDERSHIELD2", - "S_THUNDERSHIELD3", - "S_THUNDERSHIELD4", - "S_THUNDERSHIELD5", - "S_THUNDERSHIELD6", - "S_THUNDERSHIELD7", - "S_THUNDERSHIELD8", - "S_THUNDERSHIELD9", - "S_THUNDERSHIELD10", - "S_THUNDERSHIELD11", - "S_THUNDERSHIELD12", - "S_THUNDERSHIELD13", - "S_THUNDERSHIELD14", - "S_THUNDERSHIELD15", - "S_THUNDERSHIELD16", - "S_THUNDERSHIELD17", - "S_THUNDERSHIELD18", - "S_THUNDERSHIELD19", - "S_THUNDERSHIELD20", - "S_THUNDERSHIELD21", - "S_THUNDERSHIELD22", - "S_THUNDERSHIELD23", - "S_THUNDERSHIELD24", + // Lightning Shield + "S_LIGHTNINGSHIELD1", + "S_LIGHTNINGSHIELD2", + "S_LIGHTNINGSHIELD3", + "S_LIGHTNINGSHIELD4", + "S_LIGHTNINGSHIELD5", + "S_LIGHTNINGSHIELD6", + "S_LIGHTNINGSHIELD7", + "S_LIGHTNINGSHIELD8", + "S_LIGHTNINGSHIELD9", + "S_LIGHTNINGSHIELD10", + "S_LIGHTNINGSHIELD11", + "S_LIGHTNINGSHIELD12", + "S_LIGHTNINGSHIELD13", + "S_LIGHTNINGSHIELD14", + "S_LIGHTNINGSHIELD15", + "S_LIGHTNINGSHIELD16", + "S_LIGHTNINGSHIELD17", + "S_LIGHTNINGSHIELD18", + "S_LIGHTNINGSHIELD19", + "S_LIGHTNINGSHIELD20", + "S_LIGHTNINGSHIELD21", + "S_LIGHTNINGSHIELD22", + "S_LIGHTNINGSHIELD23", + "S_LIGHTNINGSHIELD24", // Bubble Shield "S_BUBBLESHIELD1", @@ -4049,7 +4049,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BATTLEPOINT3H", "S_BATTLEPOINT3I", - // Thunder shield use stuff; + // Lightning shield use stuff; "S_KSPARK1", // Sparkling Radius "S_KSPARK2", "S_KSPARK3", @@ -5306,7 +5306,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_SPB", // Self-Propelled Bomb "MT_SPBEXPLOSION", - "MT_THUNDERSHIELD", // Shields + "MT_LIGHTNINGSHIELD", // Shields "MT_BUBBLESHIELD", "MT_FLAMESHIELD", "MT_FLAMESHIELDUNDERLAY", @@ -6711,7 +6711,7 @@ struct int_const_s const INT_CONST[] = { // kartshields_t {"KSHIELD_NONE",KSHIELD_NONE}, - {"KSHIELD_THUNDER",KSHIELD_THUNDER}, + {"KSHIELD_LIGHTNING",KSHIELD_LIGHTNING}, {"KSHIELD_BUBBLE",KSHIELD_BUBBLE}, {"KSHIELD_FLAME",KSHIELD_FLAME}, {"NUMKARTSHIELDS",NUMKARTSHIELDS}, diff --git a/src/info.c b/src/info.c index bd1d60b03..643e8b6ca 100644 --- a/src/info.c +++ b/src/info.c @@ -562,7 +562,7 @@ char sprnames[NUMSPRITES + 1][5] = "BHOG", // Ballhog "BHBM", // Ballhog BOOM "SPBM", // Self-Propelled Bomb - "THNS", // Thunder Shield + "THNS", // Lightning Shield "BUBS", // Bubble Shield (not Bubs) "BWVE", // Bubble Shield waves "FLMS", // Flame Shield @@ -4197,30 +4197,30 @@ state_t states[NUMSTATES] = {SPR_SPBM, 8, 1, {A_SPBChase}, 0, 0, S_SPB1}, // S_SPB20 {SPR_SPBM, 8, 175, {NULL}, 0, 0, S_NULL}, // S_SPB_DEAD - {SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_THUNDERSHIELD2}, // S_THUNDERSHIELD1 - {SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_THUNDERSHIELD3}, // S_THUNDERSHIELD2 - {SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_THUNDERSHIELD4}, // S_THUNDERSHIELD3 - {SPR_THNS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_THUNDERSHIELD5}, // S_THUNDERSHIELD4 - {SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_THUNDERSHIELD6}, // S_THUNDERSHIELD5 - {SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_THUNDERSHIELD7}, // S_THUNDERSHIELD6 - {SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_THUNDERSHIELD8}, // S_THUNDERSHIELD7 - {SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_THUNDERSHIELD9}, // S_THUNDERSHIELD8 - {SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_THUNDERSHIELD10}, // S_THUNDERSHIELD9 - {SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_THUNDERSHIELD11}, // S_THUNDERSHIELD10 - {SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_THUNDERSHIELD12}, // S_THUNDERSHIELD11 - {SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_THUNDERSHIELD13}, // S_THUNDERSHIELD12 - {SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_THUNDERSHIELD14}, // S_THUNDERSHIELD13 - {SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_THUNDERSHIELD15}, // S_THUNDERSHIELD14 - {SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_THUNDERSHIELD16}, // S_THUNDERSHIELD15 - {SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_THUNDERSHIELD17}, // S_THUNDERSHIELD16 - {SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_THUNDERSHIELD18}, // S_THUNDERSHIELD17 - {SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_THUNDERSHIELD19}, // S_THUNDERSHIELD18 - {SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_THUNDERSHIELD20}, // S_THUNDERSHIELD19 - {SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_THUNDERSHIELD21}, // S_THUNDERSHIELD20 - {SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_THUNDERSHIELD22}, // S_THUNDERSHIELD21 - {SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_THUNDERSHIELD23}, // S_THUNDERSHIELD22 - {SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_THUNDERSHIELD24}, // S_THUNDERSHIELD23 - {SPR_THNS, FF_FULLBRIGHT|0, 2, {NULL}, 0, 0, S_THUNDERSHIELD1}, // S_THUNDERSHIELD24 + {SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD2}, // S_LIGHTNINGSHIELD1 + {SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD3}, // S_LIGHTNINGSHIELD2 + {SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD4}, // S_LIGHTNINGSHIELD3 + {SPR_THNS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD5}, // S_LIGHTNINGSHIELD4 + {SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD6}, // S_LIGHTNINGSHIELD5 + {SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD7}, // S_LIGHTNINGSHIELD6 + {SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD8}, // S_LIGHTNINGSHIELD7 + {SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD9}, // S_LIGHTNINGSHIELD8 + {SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD10}, // S_LIGHTNINGSHIELD9 + {SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD11}, // S_LIGHTNINGSHIELD10 + {SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD12}, // S_LIGHTNINGSHIELD11 + {SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD13}, // S_LIGHTNINGSHIELD12 + {SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD14}, // S_LIGHTNINGSHIELD13 + {SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD15}, // S_LIGHTNINGSHIELD14 + {SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD16}, // S_LIGHTNINGSHIELD15 + {SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD17}, // S_LIGHTNINGSHIELD16 + {SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD18}, // S_LIGHTNINGSHIELD17 + {SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD19}, // S_LIGHTNINGSHIELD18 + {SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD20}, // S_LIGHTNINGSHIELD19 + {SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD21}, // S_LIGHTNINGSHIELD20 + {SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD22}, // S_LIGHTNINGSHIELD21 + {SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD23}, // S_LIGHTNINGSHIELD22 + {SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD24}, // S_LIGHTNINGSHIELD23 + {SPR_THNS, FF_FULLBRIGHT|0, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD1}, // S_LIGHTNINGSHIELD24 {SPR_BUBS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_BUBBLESHIELD2}, // S_BUBBLESHIELD1 {SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD3}, // S_BUBBLESHIELD2 @@ -7562,7 +7562,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = MT_FLINGRING, // reactiontime sfx_None, // attacksound S_NULL, // painstate - 0, // painchance + MT_RING, // painchance sfx_None, // painsound S_NULL, // meleestate S_NULL, // missilestate @@ -7613,10 +7613,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 1000, // spawnhealth S_NULL, // seestate sfx_None, // seesound - MT_FLINGRING, // reactiontime + 0, // reactiontime sfx_None, // attacksound S_NULL, // painstate - MT_RING, // painchance + 0, // painchance sfx_None, // painsound S_NULL, // meleestate S_NULL, // missilestate @@ -23716,9 +23716,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - { // MT_THUNDERSHIELD + { // MT_LIGHTNINGSHIELD -1, // doomednum - S_THUNDERSHIELD1, // spawnstate + S_LIGHTNINGSHIELD1, // spawnstate 1000, // spawnhealth S_NULL, // seestate sfx_None, // seesound diff --git a/src/info.h b/src/info.h index f8dbb90bd..06d60e792 100644 --- a/src/info.h +++ b/src/info.h @@ -4626,30 +4626,30 @@ typedef enum state S_SPB_DEAD, // Thunder Shield - S_THUNDERSHIELD1, - S_THUNDERSHIELD2, - S_THUNDERSHIELD3, - S_THUNDERSHIELD4, - S_THUNDERSHIELD5, - S_THUNDERSHIELD6, - S_THUNDERSHIELD7, - S_THUNDERSHIELD8, - S_THUNDERSHIELD9, - S_THUNDERSHIELD10, - S_THUNDERSHIELD11, - S_THUNDERSHIELD12, - S_THUNDERSHIELD13, - S_THUNDERSHIELD14, - S_THUNDERSHIELD15, - S_THUNDERSHIELD16, - S_THUNDERSHIELD17, - S_THUNDERSHIELD18, - S_THUNDERSHIELD19, - S_THUNDERSHIELD20, - S_THUNDERSHIELD21, - S_THUNDERSHIELD22, - S_THUNDERSHIELD23, - S_THUNDERSHIELD24, + S_LIGHTNINGSHIELD1, + S_LIGHTNINGSHIELD2, + S_LIGHTNINGSHIELD3, + S_LIGHTNINGSHIELD4, + S_LIGHTNINGSHIELD5, + S_LIGHTNINGSHIELD6, + S_LIGHTNINGSHIELD7, + S_LIGHTNINGSHIELD8, + S_LIGHTNINGSHIELD9, + S_LIGHTNINGSHIELD10, + S_LIGHTNINGSHIELD11, + S_LIGHTNINGSHIELD12, + S_LIGHTNINGSHIELD13, + S_LIGHTNINGSHIELD14, + S_LIGHTNINGSHIELD15, + S_LIGHTNINGSHIELD16, + S_LIGHTNINGSHIELD17, + S_LIGHTNINGSHIELD18, + S_LIGHTNINGSHIELD19, + S_LIGHTNINGSHIELD20, + S_LIGHTNINGSHIELD21, + S_LIGHTNINGSHIELD22, + S_LIGHTNINGSHIELD23, + S_LIGHTNINGSHIELD24, // Bubble Shield S_BUBBLESHIELD1, @@ -6328,7 +6328,7 @@ typedef enum mobj_type MT_SPB, // SPB stuff MT_SPBEXPLOSION, - MT_THUNDERSHIELD, // Shields + MT_LIGHTNINGSHIELD, // Shields MT_BUBBLESHIELD, MT_FLAMESHIELD, MT_FLAMESHIELDUNDERLAY, diff --git a/src/k_botitem.c b/src/k_botitem.c index 6f8e82034..922029dc5 100644 --- a/src/k_botitem.c +++ b/src/k_botitem.c @@ -1021,9 +1021,9 @@ static void K_BotItemJawz(player_t *player, ticcmd_t *cmd) } /*-------------------------------------------------- - static void K_BotItemThunder(player_t *player, ticcmd_t *cmd) + static void K_BotItemLightning(player_t *player, ticcmd_t *cmd) - Item usage for Thunder Shield. + Item usage for Lightning Shield. Input Arguments:- player - Bot to do this for. @@ -1032,7 +1032,7 @@ static void K_BotItemJawz(player_t *player, ticcmd_t *cmd) Return:- None --------------------------------------------------*/ -static void K_BotItemThunder(player_t *player, ticcmd_t *cmd) +static void K_BotItemLightning(player_t *player, ticcmd_t *cmd) { if (K_BotUseItemNearPlayer(player, cmd, 192*player->mo->scale) == false) { @@ -1355,8 +1355,8 @@ void K_BotItemUsage(player_t *player, ticcmd_t *cmd, INT16 turnamt) K_BotItemDropTarget(player, cmd); } break; - case KITEM_THUNDERSHIELD: - K_BotItemThunder(player, cmd); + case KITEM_LIGHTNINGSHIELD: + K_BotItemLightning(player, cmd); break; case KITEM_BUBBLESHIELD: K_BotItemBubble(player, cmd); diff --git a/src/k_botsearch.c b/src/k_botsearch.c index 6e256a9e5..49f04ea5e 100644 --- a/src/k_botsearch.c +++ b/src/k_botsearch.c @@ -478,7 +478,7 @@ static boolean K_FindObjectsForNudging(mobj_t *thing) if ((RINGTOTAL(globalsmuggle.botmo->player) < 20 && !(globalsmuggle.botmo->player->pflags & PF_RINGLOCK) && P_CanPickupItem(globalsmuggle.botmo->player, 0)) && !thing->extravalue1 - && (globalsmuggle.botmo->player->itemtype != KITEM_THUNDERSHIELD)) + && (globalsmuggle.botmo->player->itemtype != KITEM_LIGHTNINGSHIELD)) { K_AddAttackObject(thing, side, (RINGTOTAL(globalsmuggle.botmo->player) < 3) ? 5 : 1); } @@ -505,10 +505,10 @@ static boolean K_FindObjectsForNudging(mobj_t *thing) { break; } - // Thunder Shield + // Lightning Shield else if (K_PlayerAttackSteer(thing, side, 20, - globalsmuggle.botmo->player->itemtype == KITEM_THUNDERSHIELD, - thing->player->itemtype == KITEM_THUNDERSHIELD + globalsmuggle.botmo->player->itemtype == KITEM_LIGHTNINGSHIELD, + thing->player->itemtype == KITEM_LIGHTNINGSHIELD )) { break; diff --git a/src/k_collide.c b/src/k_collide.c index fbe6af02d..92c4bd7fd 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -352,10 +352,10 @@ void K_DoMineSearch(mobj_t *actor, fixed_t size) explodedist = FixedMul(size, actor->scale); grenade = actor; - yh = (unsigned)(actor->y + explodedist - bmaporgy)>>MAPBLOCKSHIFT; - yl = (unsigned)(actor->y - explodedist - bmaporgy)>>MAPBLOCKSHIFT; - xh = (unsigned)(actor->x + explodedist - bmaporgx)>>MAPBLOCKSHIFT; - xl = (unsigned)(actor->x - explodedist - bmaporgx)>>MAPBLOCKSHIFT; + yh = (unsigned)(actor->y + (explodedist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT; + yl = (unsigned)(actor->y - (explodedist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT; + xh = (unsigned)(actor->x + (explodedist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT; + xl = (unsigned)(actor->x - (explodedist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT; BMBOUNDFIX (xl, xh, yl, yh); @@ -664,6 +664,85 @@ boolean K_DropTargetCollide(mobj_t *t1, mobj_t *t2) return true; } +static mobj_t *lightningSource; +static fixed_t lightningDist; + +static inline boolean PIT_LightningShieldAttack(mobj_t *thing) +{ + if (lightningSource == NULL || P_MobjWasRemoved(lightningSource)) + { + // Invalid? + return false; + } + + if (thing == lightningSource) + { + // Don't explode yourself!! + return true; + } + + if (thing->health <= 0) + { + // Dead + return true; + } + + if (!(thing->flags & MF_SHOOTABLE) || (thing->flags & MF_SCENERY)) + { + // Not shootable + return true; + } + + if (thing->player && thing->player->spectator) + { + // Spectator + return true; + } + + if ((lightningSource->eflags & MFE_VERTICALFLIP) + ? (thing->z > lightningSource->z + lightningSource->height) + : (thing->z + thing->height < lightningSource->z)) + { + // Underneath + return true; + } + + if (P_AproxDistance(thing->x - lightningSource->x, thing->y - lightningSource->y) > lightningDist + thing->radius) + { + // Too far away + return true; + } + + if (P_CheckSight(lightningSource, thing) == false) + { + // Not in sight + return true; + } + + P_DamageMobj(thing, lightningSource, lightningSource, 1, DMG_NORMAL|DMG_CANTHURTSELF|DMG_WOMBO); + return true; +} + +void K_LightningShieldAttack(mobj_t *actor, fixed_t size) +{ + INT32 bx, by, xl, xh, yl, yh; + + lightningDist = FixedMul(size, actor->scale); + lightningSource = actor; + + // Use blockmap to check for nearby shootables + yh = (unsigned)(actor->y + lightningDist - bmaporgy)>>MAPBLOCKSHIFT; + yl = (unsigned)(actor->y - lightningDist - bmaporgy)>>MAPBLOCKSHIFT; + xh = (unsigned)(actor->x + lightningDist - bmaporgx)>>MAPBLOCKSHIFT; + xl = (unsigned)(actor->x - lightningDist - bmaporgx)>>MAPBLOCKSHIFT; + + BMBOUNDFIX (xl, xh, yl, yh); + + for (by = yl; by <= yh; by++) + for (bx = xl; bx <= xh; bx++) + P_BlockThingsIterator(bx, by, PIT_LightningShieldAttack); +} + boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2) { if (t2->type == MT_PLAYER) diff --git a/src/k_collide.h b/src/k_collide.h index 49cc3fa08..cf1ee5dc7 100644 --- a/src/k_collide.h +++ b/src/k_collide.h @@ -19,6 +19,7 @@ boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2); boolean K_DropTargetCollide(mobj_t *t1, mobj_t *t2); +void K_LightningShieldAttack(mobj_t *actor, fixed_t size); boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2); boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2); diff --git a/src/k_hud.c b/src/k_hud.c index b7bf9c38d..00537f81b 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -126,7 +126,7 @@ static patch_t *kp_ballhog[2]; static patch_t *kp_selfpropelledbomb[2]; static patch_t *kp_grow[2]; static patch_t *kp_shrink[2]; -static patch_t *kp_thundershield[2]; +static patch_t *kp_lightningshield[2]; static patch_t *kp_bubbleshield[2]; static patch_t *kp_flameshield[2]; static patch_t *kp_hyudoro[2]; @@ -416,7 +416,7 @@ void K_LoadKartHUDGraphics(void) HU_UpdatePatch(&kp_selfpropelledbomb[0], "K_ITSPB"); HU_UpdatePatch(&kp_grow[0], "K_ITGROW"); HU_UpdatePatch(&kp_shrink[0], "K_ITSHRK"); - HU_UpdatePatch(&kp_thundershield[0], "K_ITTHNS"); + HU_UpdatePatch(&kp_lightningshield[0], "K_ITTHNS"); HU_UpdatePatch(&kp_bubbleshield[0], "K_ITBUBS"); HU_UpdatePatch(&kp_flameshield[0], "K_ITFLMS"); HU_UpdatePatch(&kp_hyudoro[0], "K_ITHYUD"); @@ -467,7 +467,7 @@ void K_LoadKartHUDGraphics(void) HU_UpdatePatch(&kp_selfpropelledbomb[1], "K_ISSPB"); HU_UpdatePatch(&kp_grow[1], "K_ISGROW"); HU_UpdatePatch(&kp_shrink[1], "K_ISSHRK"); - HU_UpdatePatch(&kp_thundershield[1], "K_ISTHNS"); + HU_UpdatePatch(&kp_lightningshield[1], "K_ISTHNS"); HU_UpdatePatch(&kp_bubbleshield[1], "K_ISBUBS"); HU_UpdatePatch(&kp_flameshield[1], "K_ISFLMS"); HU_UpdatePatch(&kp_hyudoro[1], "K_ISHYUD"); @@ -670,7 +670,7 @@ const char *K_GetItemPatch(UINT8 item, boolean tiny) return (tiny ? "K_ISGROW" : "K_ITGROW"); case KITEM_SHRINK: return (tiny ? "K_ISSHRK" : "K_ITSHRK"); - case KITEM_THUNDERSHIELD: + case KITEM_LIGHTNINGSHIELD: return (tiny ? "K_ISTHNS" : "K_ITTHNS"); case KITEM_BUBBLESHIELD: return (tiny ? "K_ISBUBS" : "K_ITBUBS"); @@ -1170,8 +1170,8 @@ static void K_drawKartItem(void) localpatch = kp_ballhog[offset]; //localcolor = SKINCOLOR_LILAC; break; - case 13: // Thunder Shield - localpatch = kp_thundershield[offset]; + case 13: // Lightning Shield + localpatch = kp_lightningshield[offset]; //localcolor = SKINCOLOR_CYAN; break; case 14: // Super Ring @@ -1290,8 +1290,8 @@ static void K_drawKartItem(void) case KITEM_SHRINK: localpatch = kp_shrink[offset]; break; - case KITEM_THUNDERSHIELD: - localpatch = kp_thundershield[offset]; + case KITEM_LIGHTNINGSHIELD: + localpatch = kp_lightningshield[offset]; localbg = kp_itembg[offset+1]; break; case KITEM_BUBBLESHIELD: @@ -4578,7 +4578,7 @@ static void K_drawDistributionDebugger(void) kp_selfpropelledbomb[1], kp_grow[1], kp_shrink[1], - kp_thundershield[1], + kp_lightningshield[1], kp_bubbleshield[1], kp_flameshield[1], kp_hyudoro[1], diff --git a/src/k_kart.c b/src/k_kart.c index 4edb34b5c..b09b22274 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -36,6 +36,7 @@ #include "k_hud.h" #include "k_terrain.h" #include "k_director.h" +#include "k_collide.h" // SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H: // gamespeed is cc (0 for easy, 1 for normal, 2 for hard) @@ -220,7 +221,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_selfpropelledbomb); CV_RegisterVar(&cv_grow); CV_RegisterVar(&cv_shrink); - CV_RegisterVar(&cv_thundershield); + CV_RegisterVar(&cv_lightningshield); CV_RegisterVar(&cv_bubbleshield); CV_RegisterVar(&cv_flameshield); CV_RegisterVar(&cv_hyudoro); @@ -327,7 +328,7 @@ consvar_t *KartItemCVars[NUMKARTRESULTS-1] = &cv_selfpropelledbomb, &cv_grow, &cv_shrink, - &cv_thundershield, + &cv_lightningshield, &cv_bubbleshield, &cv_flameshield, &cv_hyudoro, @@ -362,7 +363,7 @@ static INT32 K_KartItemOddsRace[NUMKARTRESULTS-1][8] = /*Self-Propelled Bomb*/ { 0, 0, 0, 0, 0, 2, 4, 0 }, // Self-Propelled Bomb /*Grow*/ { 0, 0, 0, 1, 2, 3, 0, 0 }, // Grow /*Shrink*/ { 0, 0, 0, 0, 0, 0, 2, 0 }, // Shrink - /*Thunder Shield*/ { 1, 2, 0, 0, 0, 0, 0, 0 }, // Thunder Shield + /*Lightning Shield*/ { 1, 2, 0, 0, 0, 0, 0, 0 }, // Lightning Shield /*Bubble Shield*/ { 0, 1, 2, 1, 0, 0, 0, 0 }, // Bubble Shield /*Flame Shield*/ { 0, 0, 0, 0, 0, 1, 3, 5 }, // Flame Shield /*Hyudoro*/ { 0, 0, 0, 1, 1, 0, 0, 0 }, // Hyudoro @@ -395,7 +396,7 @@ static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][2] = /*Self-Propelled Bomb*/ { 0, 0 }, // Self-Propelled Bomb /*Grow*/ { 2, 1 }, // Grow /*Shrink*/ { 0, 0 }, // Shrink - /*Thunder Shield*/ { 4, 0 }, // Thunder Shield + /*Lightning Shield*/ { 4, 0 }, // Lightning Shield /*Bubble Shield*/ { 1, 0 }, // Bubble Shield /*Flame Shield*/ { 0, 0 }, // Flame Shield /*Hyudoro*/ { 2, 0 }, // Hyudoro @@ -437,7 +438,7 @@ INT32 K_GetShieldFromItem(INT32 item) { switch (item) { - case KITEM_THUNDERSHIELD: return KSHIELD_THUNDER; + case KITEM_LIGHTNINGSHIELD: return KSHIELD_LIGHTNING; case KITEM_BUBBLESHIELD: return KSHIELD_BUBBLE; case KITEM_FLAMESHIELD: return KSHIELD_FLAME; default: return KSHIELD_NONE; @@ -733,7 +734,7 @@ INT32 K_KartGetItemOdds( if (pingame-1 <= pexiting) newodds = 0; break; - case KITEM_THUNDERSHIELD: + case KITEM_LIGHTNINGSHIELD: cooldownOnStart = true; powerItem = true; @@ -3361,7 +3362,7 @@ void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fromDam } K_AddHitLag(mo1, finalTics, fromDamage); - K_AddHitLag(mo2, finalTics, fromDamage); + K_AddHitLag(mo2, finalTics, false); // mo2 is the inflictor, so don't use the damage property. } void K_DoInstashield(player_t *player) @@ -5249,7 +5250,12 @@ void K_PuntMine(mobj_t *origMine, mobj_t *punter) #define THUNDERRADIUS 320 -static void K_DoThunderShield(player_t *player) +// Rough size of the outer-rim sprites, after scaling. +// (The hitbox is already pretty strict due to only 1 active frame, +// we don't need to have it disjointedly small too...) +#define THUNDERSPRITE 80 + +static void K_DoLightningShield(player_t *player) { mobj_t *mo; int i = 0; @@ -5258,7 +5264,7 @@ static void K_DoThunderShield(player_t *player) angle_t an; S_StartSound(player->mo, sfx_zio3); - P_NukeEnemies(player->mo, player->mo, RING_DIST/4); + K_LightningShieldAttack(player->mo, (THUNDERRADIUS + THUNDERSPRITE) * FRACUNIT); // spawn vertical bolt mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK); @@ -5299,6 +5305,7 @@ static void K_DoThunderShield(player_t *player) } #undef THUNDERRADIUS +#undef THUNDERSPRITE static void K_FlameDashLeftoverSmoke(mobj_t *src) { @@ -5708,9 +5715,9 @@ void K_DropHnextList(player_t *player, boolean keepshields) if (shield != KSHIELD_NONE && !keepshields) { - if (shield == KSHIELD_THUNDER) + if (shield == KSHIELD_LIGHTNING) { - K_DoThunderShield(player); + K_DoLightningShield(player); } player->curshield = KSHIELD_NONE; @@ -6988,39 +6995,85 @@ void K_KartPlayerHUDUpdate(player_t *player) // SRB2Kart: blockmap iterate for attraction shield users static mobj_t *attractmo; static fixed_t attractdist; +static fixed_t attractzdist; + static inline boolean PIT_AttractingRings(mobj_t *thing) { - if (!attractmo || P_MobjWasRemoved(attractmo)) + if (attractmo == NULL || P_MobjWasRemoved(attractmo) || attractmo->player == NULL) + { return false; + } - if (!attractmo->player) - return false; // not a player + if (thing == NULL || P_MobjWasRemoved(thing)) + { + return true; // invalid + } - if (thing->health <= 0 || !thing) - return true; // dead + if (thing == attractmo) + { + return true; // invalid + } - if (thing->type != MT_RING && thing->type != MT_FLINGRING) + if (!(thing->type == MT_RING || thing->type == MT_FLINGRING)) + { return true; // not a ring + } + + if (thing->health <= 0) + { + return true; // dead + } if (thing->extravalue1) + { return true; // in special ring animation + } - if (thing->cusval) + if (thing->tracer != NULL && P_MobjWasRemoved(thing->tracer) == false) + { return true; // already attracted + } // see if it went over / under - if (attractmo->z - (attractdist>>2) > thing->z + thing->height) + if (attractmo->z - attractzdist > thing->z + thing->height) + { return true; // overhead - if (attractmo->z + attractmo->height + (attractdist>>2) < thing->z) + } + + if (attractmo->z + attractmo->height + attractzdist < thing->z) + { return true; // underneath + } - if (P_AproxDistance(attractmo->x - thing->x, attractmo->y - thing->y) < attractdist) + if (P_AproxDistance(attractmo->x - thing->x, attractmo->y - thing->y) > attractdist + thing->radius) + { return true; // Too far away + } + + if (RINGTOTAL(attractmo->player) >= 20 || (attractmo->player->pflags & PF_RINGLOCK)) + { + // Already reached max -- just joustle rings around. + + // Regular ring -> fling ring + if (thing->info->reactiontime && thing->type != (mobjtype_t)thing->info->reactiontime) + { + thing->type = thing->info->reactiontime; + thing->info = &mobjinfo[thing->type]; + thing->flags = thing->info->flags; + + P_InstaThrust(thing, P_RandomRange(0,7) * ANGLE_45, 2 * thing->scale); + P_SetObjectMomZ(thing, 8<fuse = 120*TICRATE; + + thing->cusval = 0; // Reset attraction flag + } + } + else + { + // set target + P_SetTarget(&thing->tracer, attractmo); + } - // set target - P_SetTarget(&thing->tracer, attractmo); - // flag to show it's been attracted once before - thing->cusval = 1; return true; // find other rings } @@ -7032,15 +7085,18 @@ static inline boolean PIT_AttractingRings(mobj_t *thing) static void K_LookForRings(mobj_t *pmo) { INT32 bx, by, xl, xh, yl, yh; - attractdist = FixedMul(RING_DIST, pmo->scale)>>2; - - // Use blockmap to check for nearby rings - yh = (unsigned)(pmo->y + attractdist - bmaporgy)>>MAPBLOCKSHIFT; - yl = (unsigned)(pmo->y - attractdist - bmaporgy)>>MAPBLOCKSHIFT; - xh = (unsigned)(pmo->x + attractdist - bmaporgx)>>MAPBLOCKSHIFT; - xl = (unsigned)(pmo->x - attractdist - bmaporgx)>>MAPBLOCKSHIFT; attractmo = pmo; + attractdist = (400 * pmo->scale); + attractzdist = attractdist >> 2; + + // Use blockmap to check for nearby rings + yh = (unsigned)(pmo->y + (attractdist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT; + yl = (unsigned)(pmo->y - (attractdist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT; + xh = (unsigned)(pmo->x + (attractdist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT; + xl = (unsigned)(pmo->x - (attractdist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT; + + BMBOUNDFIX(xl, xh, yl, yh); for (by = yl; by <= yh; by++) for (bx = xl; bx <= xh; bx++) @@ -7462,12 +7518,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } } - if (player->itemtype == KITEM_THUNDERSHIELD) - { - if (RINGTOTAL(player) < 20 && !(player->pflags & PF_RINGLOCK)) - K_LookForRings(player->mo); - } - if (player->itemtype == KITEM_BUBBLESHIELD) { if (player->bubblecool) @@ -7678,6 +7728,11 @@ void K_KartPlayerAfterThink(player_t *player) player->lastjawztarget = -1; player->jawztargetdelay = 0; } + + if (player->itemtype == KITEM_LIGHTNINGSHIELD) + { + K_LookForRings(player->mo); + } } /*-------------------------------------------------- @@ -9751,23 +9806,23 @@ void K_MoveKartPlayer(player_t *player, boolean onground) K_PlayPowerGloatSound(player->mo); } break; - case KITEM_THUNDERSHIELD: - if (player->curshield != KSHIELD_THUNDER) + case KITEM_LIGHTNINGSHIELD: + if (player->curshield != KSHIELD_LIGHTNING) { - mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THUNDERSHIELD); + mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_LIGHTNINGSHIELD); P_SetScale(shield, (shield->destscale = (5*shield->destscale)>>2)); P_SetTarget(&shield->target, player->mo); S_StartSound(player->mo, sfx_s3k41); - player->curshield = KSHIELD_THUNDER; + player->curshield = KSHIELD_LIGHTNING; } if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) { - K_DoThunderShield(player); + K_DoLightningShield(player); if (player->itemamount > 0) { // Why is this a conditional? - // Thunder shield: the only item that allows you to + // Lightning shield: the only item that allows you to // activate a mine while you're out of its radius, // the SAME tic it sets your itemamount to 0 // ...:dumbestass: diff --git a/src/m_menu.c b/src/m_menu.c index c1c8c114d..6c7b79a50 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1590,7 +1590,7 @@ static menuitem_t OP_MonitorToggleMenu[] = {IT_KEYHANDLER | IT_NOTHING, NULL, "Invinciblity", {.routine = M_HandleMonitorToggles}, KITEM_INVINCIBILITY}, {IT_KEYHANDLER | IT_NOTHING, NULL, "Grow", {.routine = M_HandleMonitorToggles}, KITEM_GROW}, {IT_KEYHANDLER | IT_NOTHING, NULL, "Shrink", {.routine = M_HandleMonitorToggles}, KITEM_SHRINK}, - {IT_KEYHANDLER | IT_NOTHING, NULL, "Thunder Shields", {.routine = M_HandleMonitorToggles}, KITEM_THUNDERSHIELD}, + {IT_KEYHANDLER | IT_NOTHING, NULL, "Lightning Shields", {.routine = M_HandleMonitorToggles}, KITEM_LIGHTNINGSHIELD}, {IT_KEYHANDLER | IT_NOTHING, NULL, "Hyudoros", {.routine = M_HandleMonitorToggles}, KITEM_HYUDORO}, {IT_KEYHANDLER | IT_NOTHING, NULL, "Pogo Springs", {.routine = M_HandleMonitorToggles}, KITEM_POGOSPRING}, {IT_KEYHANDLER | IT_NOTHING, NULL, "Super Rings", {.routine = M_HandleMonitorToggles}, KITEM_SUPERRING}, diff --git a/src/p_enemy.c b/src/p_enemy.c index 7b6d12983..65f00e116 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -4044,57 +4044,76 @@ void A_AttractChase(mobj_t *actor) actor->renderflags &= ~RF_DONTDRAW; // spilled rings get capped to a certain speed - if (actor->type == (mobjtype_t)actor->info->reactiontime) + if (actor->info->reactiontime && actor->type == (mobjtype_t)actor->info->reactiontime) { - const fixed_t maxspeed = 4<scale; fixed_t oldspeed = R_PointToDist2(0, 0, actor->momx, actor->momy); if (oldspeed > maxspeed) { - fixed_t newspeed = max(maxspeed, oldspeed-FRACUNIT); + fixed_t newspeed = max(maxspeed, oldspeed - actor->scale); actor->momx = FixedMul(FixedDiv(actor->momx, oldspeed), newspeed); actor->momy = FixedMul(FixedDiv(actor->momy, oldspeed), newspeed); } } - if (actor->tracer && actor->tracer->player && actor->tracer->health - //&& P_CheckSight(actor, actor->tracer) - && actor->tracer->player->itemtype == KITEM_THUNDERSHIELD - && RINGTOTAL(actor->tracer->player) < 20 - && !(actor->tracer->player->pflags & PF_RINGLOCK)) + if (actor->tracer != NULL && P_MobjWasRemoved(actor->tracer) == false) { - fixed_t dist; - angle_t hang, vang; + // Set attraction flag + actor->cusval = 1; - // If a flung ring gets attracted by a shield, change it into a normal ring. - if (actor->type == (mobjtype_t)actor->info->reactiontime) + if ( + actor->tracer->player && actor->tracer->health + && actor->tracer->player->itemtype == KITEM_LIGHTNINGSHIELD + && RINGTOTAL(actor->tracer->player) < 20 + && !(actor->tracer->player->pflags & PF_RINGLOCK) + //&& P_CheckSight(actor, actor->tracer) + ) { - P_SpawnMobj(actor->x, actor->y, actor->z, actor->info->painchance); - P_RemoveMobj(actor); - return; + fixed_t dist; + angle_t hang, vang; + + // If a flung ring gets attracted by a shield, change it into a normal ring. + if (actor->info->painchance && actor->type != (mobjtype_t)actor->info->painchance) + { +#if 0 // old + P_SpawnMobj(actor->x, actor->y, actor->z, actor->info->painchance); + P_RemoveMobj(actor); + return; +#else // new + actor->type = actor->info->painchance; + actor->info = &mobjinfo[actor->type]; + actor->flags = actor->info->flags; +#endif + } + + // Keep stuff from going down inside floors and junk + actor->flags &= ~MF_NOCLIPHEIGHT; + + // Let attracted rings move through walls and such. + actor->flags |= MF_NOCLIP; + + // P_Attract is too "smart" for Kart; keep it simple, stupid! + dist = P_AproxDistance(P_AproxDistance(actor->x - actor->tracer->x, actor->y - actor->tracer->y), actor->z - actor->tracer->z); + hang = R_PointToAngle2(actor->x, actor->y, actor->tracer->x, actor->tracer->y); + vang = R_PointToAngle2(actor->z, 0, actor->tracer->z, dist); + + actor->momx -= actor->momx>>4, actor->momy -= actor->momy>>4, actor->momz -= actor->momz>>4; + actor->momx += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINECOSINE(hang>>ANGLETOFINESHIFT), 4*actor->scale)); + actor->momy += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINESINE(hang>>ANGLETOFINESHIFT), 4*actor->scale)); + actor->momz += FixedMul(FINECOSINE(vang>>ANGLETOFINESHIFT), 4*actor->scale); + } + else + { + P_SetTarget(&actor->tracer, NULL); } - - // Keep stuff from going down inside floors and junk - actor->flags &= ~MF_NOCLIPHEIGHT; - - // Let attracted rings move through walls and such. - actor->flags |= MF_NOCLIP; - - // P_Attract is too "smart" for Kart; keep it simple, stupid! - dist = P_AproxDistance(P_AproxDistance(actor->x - actor->tracer->x, actor->y - actor->tracer->y), actor->z - actor->tracer->z); - hang = R_PointToAngle2(actor->x, actor->y, actor->tracer->x, actor->tracer->y); - vang = R_PointToAngle2(actor->z , 0, actor->tracer->z, dist); - - actor->momx -= actor->momx>>4, actor->momy -= actor->momy>>4, actor->momz -= actor->momz>>4; - actor->momx += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINECOSINE(hang>>ANGLETOFINESHIFT), 4*actor->scale)); - actor->momy += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINESINE(hang>>ANGLETOFINESHIFT), 4*actor->scale)); - actor->momz += FixedMul(FINECOSINE(vang>>ANGLETOFINESHIFT), 4*actor->scale); } else { // Turn rings back into flung rings if lost if (actor->cusval && actor->info->reactiontime && actor->type != (mobjtype_t)actor->info->reactiontime) { +#if 0 // old mobj_t *newring; newring = P_SpawnMobj(actor->x, actor->y, actor->z, actor->info->reactiontime); P_InstaThrust(newring, P_RandomRange(0,7) * ANGLE_45, 2<fuse = 120*TICRATE; P_RemoveMobj(actor); return; +#else // new + actor->type = actor->info->reactiontime; + actor->info = &mobjinfo[actor->type]; + actor->flags = actor->info->flags; + + P_InstaThrust(actor, P_RandomRange(0,7) * ANGLE_45, 2 * actor->scale); + P_SetObjectMomZ(actor, 8<fuse = 120*TICRATE; +#endif } - /*else - P_LookForShield(actor);*/ - // SRB2Kart: now it's the PLAYER'S job to use the blockmap to find rings, not the ring's. + + actor->cusval = 0; // Reset attraction flag } } } diff --git a/src/p_mobj.c b/src/p_mobj.c index c9f68b8f3..6d5950d98 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5904,8 +5904,8 @@ static void P_MobjSceneryThink(mobj_t *mobj) mobj->tracer->frame = KITEM_BALLHOG; //localcolor = SKINCOLOR_LILAC; break; - case 13: // Thunder Shield - mobj->tracer->frame = KITEM_THUNDERSHIELD; + case 13: // Lightning Shield + mobj->tracer->frame = KITEM_LIGHTNINGSHIELD; //localcolor = SKINCOLOR_CYAN; break; case 14: // Super Ring @@ -6507,6 +6507,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) // No need to check water. Who cares? P_RingThinker(mobj); + if (mobj->flags2 & MF2_NIGHTSPULL) P_NightsItemChase(mobj); else @@ -7385,11 +7386,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->renderflags = (mobj->renderflags & ~RF_TRANSMASK)|(trans << RF_TRANSSHIFT); } break; - case MT_THUNDERSHIELD: + case MT_LIGHTNINGSHIELD: { fixed_t destx, desty; if (!mobj->target || !mobj->target->health || !mobj->target->player - || mobj->target->player->curshield != KSHIELD_THUNDER) + || mobj->target->player->curshield != KSHIELD_LIGHTNING) { P_RemoveMobj(mobj); return false; @@ -7408,7 +7409,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) else viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, camera[0].x, camera[0].y); - if (curstate > S_THUNDERSHIELD15 && curstate <= S_THUNDERSHIELD24) + if (curstate > S_LIGHTNINGSHIELD15 && curstate <= S_LIGHTNINGSHIELD24) viewingangle += ANGLE_180; destx = mobj->target->x + P_ReturnThrustX(mobj->target, viewingangle, mobj->scale>>4); @@ -9338,10 +9339,13 @@ void P_MobjThinker(mobj_t *mobj) || mobj->type == MT_FALLINGROCK || mobj->type == MT_ORBINAUT || mobj->type == MT_JAWZ || mobj->type == MT_JAWZ_DUD - || (mobj->type == MT_DROPTARGET && mobj->reactiontime)) { + || (mobj->type == MT_DROPTARGET && mobj->reactiontime)) + { P_TryMove(mobj, mobj->x, mobj->y, true); // Sets mo->standingslope correctly + if (P_MobjWasRemoved(mobj)) // anything that calls checkposition can be lethal return; + //if (mobj->standingslope) CONS_Printf("slope physics on mobj\n"); P_ButteredSlope(mobj); } @@ -9668,7 +9672,7 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) thing->shadowscale = 5*FRACUNIT/4; thing->whiteshadow = true; break; - case MT_THUNDERSHIELD: + case MT_LIGHTNINGSHIELD: case MT_BUBBLESHIELD: case MT_BUBBLESHIELDTRAP: case MT_FLAMESHIELD: diff --git a/src/p_user.c b/src/p_user.c index 51016d80e..bdad3adbd 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2507,7 +2507,7 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius) if (mo->flags & MF_BOSS) //don't OHKO bosses nor players! P_DamageMobj(mo, inflictor, source, 1, DMG_NORMAL|DMG_CANTHURTSELF); - else if (mo->type == MT_PLAYER) // Thunder shield: Combo players. + else if (mo->type == MT_PLAYER) // Lightning shield: Combo players. P_DamageMobj(mo, inflictor, source, 1, DMG_NORMAL|DMG_CANTHURTSELF|DMG_WOMBO); else P_DamageMobj(mo, inflictor, source, 1000, DMG_NORMAL|DMG_CANTHURTSELF); From 99a5290e2e348b80555bc38d5a2bcbdab8422d68 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 20 May 2022 18:18:41 -0400 Subject: [PATCH 37/48] Lightning Shield has infinite draft distance now It's really pointless on Flame Shield, and Lightning Shield is boring. Flame Shield should just get a different passive. --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index b09b22274..efb593ef7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1760,9 +1760,9 @@ static void K_UpdateDraft(player_t *player) UINT8 leniency; UINT8 i; - if (player->itemtype == KITEM_FLAMESHIELD) + if (player->itemtype == KITEM_LIGHTNINGSHIELD) { - // Flame Shield gets infinite draft distance as its passive effect. + // Lightning Shield gets infinite draft distance as its (other) passive effect. draftdistance = 0; } else From 98016ef390a6acd28cec4000921d25a80036b45e Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 20 May 2022 19:42:34 -0400 Subject: [PATCH 38/48] Icons + other tweaks to rebranding Replaced most drrr (mostly only used in system / exe stuff) with the more verbose "ringracers" --- CMakeLists.txt | 2 +- srb2.png | Bin 262991 -> 2798 bytes srb2banner.png | Bin 156839 -> 89147 bytes src/Makefile | 2 +- src/filesrch.c | 2 +- src/sdl/SDL_icon.xpm | 146 ++++++++++++++---------------------------- src/sdl/Srb2SDL.ico | Bin 125191 -> 101314 bytes src/sdl/i_system.c | 8 +-- src/sdl/srb2icon.png | Bin 3074 -> 521 bytes src/sdl12/Srb2SDL.ico | Bin 125191 -> 101314 bytes src/sdl12/i_main.c | 4 +- src/sdl12/i_system.c | 54 ++++++++-------- src/sdl12/i_video.c | 6 +- src/sdl12/sdl_sound.c | 10 +-- src/win32/Srb2win.ico | Bin 125191 -> 101314 bytes 15 files changed, 92 insertions(+), 142 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e554cca0a..0d37514f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,7 +113,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") # Set EXE names so the assets CMakeLists can refer to its target -set(SRB2_SDL2_EXE_NAME drrr CACHE STRING "Executable binary output name") +set(SRB2_SDL2_EXE_NAME ringracers CACHE STRING "Executable binary output name") include_directories(${CMAKE_CURRENT_BINARY_DIR}/src) diff --git a/srb2.png b/srb2.png index fccde9c3fadfdbff655cec6e128125a269533798..dd84db0a0a5d9d1e36482f347178354278794834 100644 GIT binary patch literal 2798 zcmd5;ZA?>V6uyKxrpB?_gn{xgThfNittpK)4N8X=YLim5nh0^&t)&GgjD_mJP`>6e z+fiUzvbNGm!iX-5(E%nzMM}0>Cc2&Ntbm#3wdRek$KNd3*xLo?4 z^FHS}&v_1--6HeBZ-%@uqvmSo)s zRGl-`97_D*s~TVO4bq8@n($XI?_$-JSN%D?_1R=Y>)_bku&!cRL+_8{%ze{-VfF?PSRtygxZYcQ_o8GEKo*wlGByv%8hZ#d**mtxanBje1X`xCD} zs1OcK=5tT6bW?I9$aR$lue%$4`Q(ttKA?#`$wH~3$xOg^Ku{)7TnQf)9}Q?~3%cp1Gy8ce{yWNb`Fm$zh|XTnvwRA%rl>K$Q!3&J@} zyKMkef@VVy7O99PA4Vk=kPi!?fYvO$0ySILUVy5uu^?8%aMg0e985V5_ zs(w@{o=Ij>6d@M62F~c(^%@dWwv2FGK4WUUCe*59p!jO1$}<*OIa_1i$*cD}=#82E zG&vA&-O#20#=fh?sT7R17K)=#X3}AhW!;rugA|zl2gg0nvH+#GRPFzTTq5eHA@LG8 z>Ei$?>=+Oxffe464QR0;(S>-SmWY6uOr&(g%nMm4+uf~&$ws@WT<)#w?zx=BIZfdC=QxIOrGIlNR(vbHc`lY)OUMo9 z@FsXUl~EizbQ~|w;q3r_+4E+_Lx?26ZXVAEANls(1q(zH;H36CN+LWNxlc3@Nnk`( z-~0&gCPbbLRSGcdaXlN44$~o$PyxXBI;HvwLnd0BKF+P!fu=$NdU&1;s&8`#r-1=B zR~Z8%JfcKXFrWuSX054>59Gk`PS^ptBx7iV3S`63`s7d{gPK1@g6d#c=aYeXJ=lpF z7=|HL8Nqby;5ZiO7z}6kKwOV=75FG!?nF1UAx#DH*fF?o203f73~ z$M4;G#7OWzJ#Mb>%tortG+uWjBm0}ywc8*1S~sWm;-blB;SF0dlxDiz%fXdnIla^Z z+{os(CDl5DCYVjV4cHN>xT{#)f*e&nuAvpfHbPC!>VK%jg{0mBe4@_b*5W-Tj%t<# z)s%4_sM-2k%M0^z=-TIEarH|F?}jaUHGx2n`M?{>@xVK36CrTfLy*xD@U5^^0u3uH zl>lvpr4kqj%?@;tfQo3T#NvsTO5`|bsYd_3O^dmfzL)^xN8D|hIXF-n+AvG1(M0QT z8_Yk240uV3>X&}B>fBpgmB$ge_;huZUTtcCT}lIsSyl_nhObT|SQKg!nqlcsBEBgV z>shx$?balyvOoj=t2+tUx*3PMZ60;KKSe}MqfLp literal 262991 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 diff --git a/srb2banner.png b/srb2banner.png index 9c13eae9a5d1ca26167abfe56486e2e7a642cd6c..ee4d3230eb3d362b06b45be79543c99452b16a7a 100644 GIT binary patch literal 89147 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 z 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�IrtfIllM)_D963UEmlCzjBsFx)fw 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 bk8A!v$wO)E=fNMA00000NkvXXu0mjfyU|>T diff --git a/src/Makefile b/src/Makefile index d32c6d6b4..904aa0bbe 100644 --- a/src/Makefile +++ b/src/Makefile @@ -235,7 +235,7 @@ bin:=../bin endif # default EXENAME (usually set by platform) -EXENAME?=drrr +EXENAME?=ringracers DBGNAME?=$(EXENAME).debug exe:=$(bin)/$(EXENAME) diff --git a/src/filesrch.c b/src/filesrch.c index 7729652d0..1d8d7bb6b 100644 --- a/src/filesrch.c +++ b/src/filesrch.c @@ -312,7 +312,7 @@ closedir (DIR * dirp) static CV_PossibleValue_t addons_cons_t[] = {{0, "Default"}, #if 1 - {1, "HOME"}, {2, "DRRR"}, + {1, "HOME"}, {2, "RINGRACERS"}, #endif {3, "CUSTOM"}, {0, NULL}}; diff --git a/src/sdl/SDL_icon.xpm b/src/sdl/SDL_icon.xpm index 0acac88ec..4feaa7ebe 100644 --- a/src/sdl/SDL_icon.xpm +++ b/src/sdl/SDL_icon.xpm @@ -1,100 +1,50 @@ /* XPM */ -static const char *SDL_icon_xpm[] = { +static char *_33e5d9ff7304dc1d1d0f768ae4abba7V9uNpHhxS4n6jAPA[] = { /* columns rows colors chars-per-pixel */ -"64 64 32 1", -" c None", -". c #E7E7E7", -"+ c #DFDFDF", -"@ c #AFAFAF", -"# c #979797", -"$ c #8F8F8F", -"% c #B7B7B7", -"& c #F7F7F7", -"* c #D7D7D7", -"= c #4F4F4F", -"- c #0F0F0F", -"; c #070707", -"> c #575757", -", c #C7C7C7", -"' c #676767", -") c #7F7F7F", -"! c #5F5F5F", -"~ c #777777", -"{ c #474747", -"] c #878787", -"^ c #6F6F6F", -"/ c #BFBFBF", -"( c #373737", -"_ c #1F1F1F", -": c #272727", -"< c #2F2F2F", -"[ c #3F3F3F", -"} c #EFEFEF", -"| c #A7A7A7", -"1 c #9F9F9F", -"2 c #171717", -"3 c #CFCFCF", -" ", -" .................... ", -" ...+@##$$$$###@%&....... ", -" ..*=-;;;-;;;;;;;;@........ ", -" ..+-;;;;--;;;;;;;>.......... ", -" ...,')!!'~>{!)$)>'....*]>^%&.. ", -" ../(__(>:{<)$![[[%&...^!!!!!~*. ", -" ..@;;;;;({=]:;;;;;~..*_;;;;;;;_.. ", -" .}>;;;;;^#=;;;;;;>...<;;;;;;;;;|.. ", -" ..*1)))))%]))))))%&..1])))))))))#}. ", -" ..%[;;;;;[2;;;;;;;:..#;;;2[[-;;;;;=.. ", -" .&:;[{;;;{;;;~={:;^.._;;'}...>;;;;;,. ", -" .}<;;:{;_:2!'-;;;]*.&(_].|{=@.~___[/.. ", -" ..*$))]@%//,111111}..|1*.@1111@.3111|&. ", -" .,:;;;;;'#^;;;;;;;]./;;+);;;;;;$*;;;;.. ", -" .^;;;;;;));;;;;;;;$.~;$*;;;;;;;-+^;;;#. ", -" ..$;;;;;;>;;;;;;;;>}.^-.!;;;;;;;;)*:;;|. ", -" .&@$|#)))|)))1||#]+..$/}]))))))))$.3))#.. ", -" .#;;;[{;->;-^[;;;;].~;@];;;;;;;;;;1#;;-}. ", -" .{;;;;{<[:(~-;;;;;$.(-.<;;;;;;;;;;{};;;3. ", -" ..);;;;;~~[!;;;;;;-/.>=.>;;;;;;;;;;2}^;:3. ", -" .&#)))))$}@)))))))@.}]3.*))))))))))).,)).. ", -" .3;;;;;;;);;;;;;;;2+|;%.';;;;;;;;;;;]1;;1. ", -" .1_(:;;;;{;;;[=[:;;.];}.);;;;;;;;;;;=,;;]. ", -" .%2-(!2;2{;_':;;;;).1;..+:;;;;;;;;;;_.;;1. ", -" .+))))@1$1#@))))))3.,@...1))))))))))].1#3. ", -" .{;;;;;^<>);;;;;;;-.[). .-;;;;;;;;;;;3{;#. ", -" ._;;;;;-~];;;;;;;;;};#. ._;;;;;;;;;;;/^;#. ", -" .$'!!!!!1]!!!!!!!!%}[,. .'[[[[[[[[[[[,|>}. ", -" ..'{::___!{___:(>___:[@...~[[[[[[[[[[[1#{,. ", -" .+;-<=(;;[:;;(=-;;;;;;;;;;;;;;;;;;;;;;;;;). ", -" .*;;;;[=;[_;{(;;;;;;;;;;;;;;;;;;;;;;;;;;-#. ", -" .&)!!!!)$]~)$!!!!!!!!!!!!!!!!!!!!!!!!!!!^+. ", -" .&(_____!$)!____________________________<3. ", -" .%;;;;;;;@|;;;;;;;;;;;;==))))))))))))))]*&. ", -" .*22;;;;;({;;;;;_-;;;;%.&.................. ", -" .&+~#]!!!~]!=[!^>[[[[{}... ", -" ../__:^^:(!_[$>[[[[[[{+. ", -" .<;;;;<^2{;'2;;;;;;;;]. ", -" .;;;;;;:~=>:;;;;;;;;;]. ", -" .@!!!!!!]3|!!!!!!!!!!*. ", -" .#_______#_____:<____~.. ", -" .^_{[_;;;=2;;;<<-;;;;;,.................. ", -" .@<;;{~2;_>;;((;;;;;;;3,-----------|.$-!. ", -" ..@))))|@)|)$|)))))))#}&/))))))))))}./)/. ", -" .&:;;;;;=>>;^;;;;;;;;;_.[;;;;;;;;;;^.{;|. ", -" ..2;;;;;;{#<[;;;;;;;;;;+';;;;;;;;;;~*;;.. ", -" .^;;;;;;;'%;;;;;;;;;;{&}#;;;;;;;;[+|;-.. ", -" .&3$1$))))%))))1]))))]+&}$))))))@&./)@. ", -" ..(;_<'{;;(-;;[2;;;;;;-@3;;;;;;;_}};;~. ", -" .=;;;;:~<-(;-[;;;;;;;;:.=;;;;;;>.!;;,. ", -" ./:;;;;;!!!;=-;;;;;;;;>.+$;;;;[.&_;=.. ", -" ..&|)))))$,|%)))))))))]1&.|]]@&.|]]}. ", -" .&;;;;;;;:@=;;;;;;;;;;;-/....3:;;;}. ", -" ..!;;;;;;;([;;;;_2;;;;;;;>)){;;;;^.. ", -" ..=2_:-;;;(;;;2<;;;;;;;;;;;;;;-).. ", -" ...%$#@%#)#))|))))))))))))))|}&. ", -" ..!;;;2!]{_-[;;;;;;;;;;;;;;;&.. ", -" ..^-;;;;^)(:;;;;;;;;;;;;;;'.. ", -" ..*'-;;;:]-;;;;;;;;;;;;-$.. ", -" ....}./1))))))))))))]/... ", -" ........}3||1#$$$]1... ", -" ................... ", -" "}; +"16 16 28 1 ", +" c None", +". c #470000", +"X c #5F0000", +"o c #7F0000", +"O c #533F1F", +"+ c #752900", +"@ c #7F532F", +"# c #21224E", +"$ c #AF0000", +"% c #DF0000", +"& c #FF3F3F", +"* c #874307", +"= c #9B5B13", +"- c #B37347", +"; c #FF5F5F", +": c #C39B2F", +"> c yellow", +", c #E39767", +"< c #EBDB57", +"1 c #414183", +"2 c #5252FF", +"3 c #979797", +"4 c gray75", +"5 c #FFB78B", +"6 c #FFCB97", +"7 c #FFCFB3", +"8 c #E4E4E4", +"9 c white", +/* pixels */ +" 9999 ", +" 99----99 ", +" 9-,6666,-9 ", +" 9@,679976,@9 ", +"99O-66677666-O99", +"*+X,61166116,X+*", +"==*+-22,,22-+*==", +"+*=*+##&&##+*=*+", +"=====*$;;$*=====", +"+++++++;;+++++++", +".X+5483883845+X.", +"oo:-59499495-:oo", +"oo::+,5665,+::oo", +"$%<>>-++++->><%$", +"%%>>:$$$$$$:>>%%", +"%%>:$%%%%%%$:>%%" +}; diff --git a/src/sdl/Srb2SDL.ico b/src/sdl/Srb2SDL.ico index 4e3f81336fa0835b1fdaea4cd5b4f43838647c5a..f9caf642c5b06da6cc73ec080ed152d4dbdc1bfa 100644 GIT binary patch literal 101314 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 FV1h@XzeNB5 diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 627da09a4..af46d6632 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -145,10 +145,10 @@ typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T); // Locations for searching for main.kart #if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) -#define DEFAULTWADLOCATION1 "/usr/local/share/games/DRRR" -#define DEFAULTWADLOCATION2 "/usr/local/games/DRRR" -#define DEFAULTWADLOCATION3 "/usr/share/games/DRRR" -#define DEFAULTWADLOCATION4 "/usr/games/DRRR" +#define DEFAULTWADLOCATION1 "/usr/local/share/games/RingRacers" +#define DEFAULTWADLOCATION2 "/usr/local/games/RingRacers" +#define DEFAULTWADLOCATION3 "/usr/share/games/RingRacers" +#define DEFAULTWADLOCATION4 "/usr/games/RingRacers" #define DEFAULTSEARCHPATH1 "/usr/local/games" #define DEFAULTSEARCHPATH2 "/usr/games" #define DEFAULTSEARCHPATH3 "/usr/local" diff --git a/src/sdl/srb2icon.png b/src/sdl/srb2icon.png index 2aca4b20423b9bce269943c508518091b02c35b2..17de4468e7402bc637d6a74bfa0c5da5fe9ff924 100644 GIT binary patch delta 491 zcmZpY=wz87Day>iz%X}v;~OBwSRCZ;#IWw1%*%<2!u8<+J|V6^(f|MdZ!UI!JU#vY z>FM>s`v1>w4z`zXcV;iuWQb>AaCB^*9W5Lb^j}fQ@4vnMdZ7CFcy}PVy?g)u{ZF1e znLd4bJp;qx+4}bx7+&8F|NkFoB*S_Yl?)&yTN30K3^X4bs0Rx&M7BN80;=RJ@Q5sC zV9-+nVa8RD?oI+aSIE=FF(ktM?o@Z7W(NW0-r{qdkN@w#{7TnXl;r zU;a5>J@{Bol6lSgW3o2ySW~$j8Y+~Q$)OV^_mTUze;)fufda9Q4lzeU?;MH!(7NL0 zLdS0Q{I-VnN-jAbmOlmp)9u?kX30uz*=D_*8*rWge literal 3074 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 QF#rGn07*qoM6N<$f+jcW`~Uy| diff --git a/src/sdl12/Srb2SDL.ico b/src/sdl12/Srb2SDL.ico index 4e3f81336fa0835b1fdaea4cd5b4f43838647c5a..f9caf642c5b06da6cc73ec080ed152d4dbdc1bfa 100644 GIT binary patch literal 101314 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 FV1h@XzeNB5 diff --git a/src/sdl12/i_main.c b/src/sdl12/i_main.c index adcaae2fd..2cf2753aa 100644 --- a/src/sdl12/i_main.c +++ b/src/sdl12/i_main.c @@ -44,7 +44,7 @@ static char netmask[16] = {0}; #include PSP_HEAP_SIZE_KB(24*1024); PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER | PSP_THREAD_ATTR_VFPU); -PSP_MAIN_THREAD_NAME("SRB2Kart"); +PSP_MAIN_THREAD_NAME("Dr. Robotnik's Ring Racers"); PSP_MAIN_THREAD_STACK_SIZE_KB(256); #endif @@ -228,7 +228,7 @@ int main(int argc, char **argv) #endif #endif // startup SRB2 - CONS_Printf("%s", M_GetText("Setting up SRB2...\n")); + CONS_Printf("%s", M_GetText("Setting up Dr. Robotnik's Ring Racers...\n")); D_SRB2Main(); CONS_Printf("%s", M_GetText("Entering main game loop...\n")); // never return diff --git a/src/sdl12/i_system.c b/src/sdl12/i_system.c index 14d183748..b388a9bf5 100644 --- a/src/sdl12/i_system.c +++ b/src/sdl12/i_system.c @@ -155,9 +155,9 @@ void __set_fpscr(long); // in libgcc / kernel's startup.s? //#define DEFAULTSEARCHPATH3 "/pc/home/alam/srb2code/data" #elif defined (GP2X) #define DEFAULTWADLOCATION1 "/mnt/sd" -#define DEFAULTWADLOCATION2 "/mnt/sd/SRB2Kart" +#define DEFAULTWADLOCATION2 "/mnt/sd/RingRacers" #define DEFAULTWADLOCATION3 "/tmp/mnt/sd" -#define DEFAULTWADLOCATION4 "/tmp/mnt/sd/SRB2Kart" +#define DEFAULTWADLOCATION4 "/tmp/mnt/sd/RingRacers" #define DEFAULTSEARCHPATH1 "/mnt/sd" #define DEFAULTSEARCHPATH2 "/tmp/mnt/sd" #elif defined (_WII) @@ -184,10 +184,10 @@ void __set_fpscr(long); // in libgcc / kernel's startup.s? #define DEFAULTSEARCHPATH1 "host0:/" #define DEFAULTSEARCHPATH2 "ms0:/PSP/GAME/SRB2PSP" #elif defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) -#define DEFAULTWADLOCATION1 "/usr/local/share/games/SRB2Kart" -#define DEFAULTWADLOCATION2 "/usr/local/games/SRB2Kart" -#define DEFAULTWADLOCATION3 "/usr/share/games/SRB2Kart" -#define DEFAULTWADLOCATION4 "/usr/games/SRB2Kart" +#define DEFAULTWADLOCATION1 "/usr/local/share/games/RingRacers" +#define DEFAULTWADLOCATION2 "/usr/local/games/RingRacers" +#define DEFAULTWADLOCATION3 "/usr/share/games/RingRacers" +#define DEFAULTWADLOCATION4 "/usr/games/RingRacers" #define DEFAULTSEARCHPATH1 "/usr/local/games" #define DEFAULTSEARCHPATH2 "/usr/games" #define DEFAULTSEARCHPATH3 "/usr/local" @@ -196,21 +196,21 @@ void __set_fpscr(long); // in libgcc / kernel's startup.s? #ifdef __GNUC__ #include #endif -#define DEFAULTWADLOCATION1 "c:\\srb2kart" -#define DEFAULTWADLOCATION2 "d:\\srb2kart" -#define DEFAULTWADLOCATION3 "e:\\srb2kart" -#define DEFAULTWADLOCATION4 "f:\\srb2kart" -#define DEFAULTWADLOCATION5 "g:\\srb2kart" -#define DEFAULTWADLOCATION6 "h:\\srb2kart" -#define DEFAULTWADLOCATION7 "i:\\srb2kart" +#define DEFAULTWADLOCATION1 "c:\\ringracers" +#define DEFAULTWADLOCATION2 "d:\\ringracers" +#define DEFAULTWADLOCATION3 "e:\\ringracers" +#define DEFAULTWADLOCATION4 "f:\\ringracers" +#define DEFAULTWADLOCATION5 "g:\\ringracers" +#define DEFAULTWADLOCATION6 "h:\\ringracers" +#define DEFAULTWADLOCATION7 "i:\\ringracers" #elif defined (_WIN32_WCE) #define NOCWD #define NOHOME -#define DEFAULTWADLOCATION1 "\\Storage Card\\SRB2Kart" +#define DEFAULTWADLOCATION1 "\\Storage Card\\RingRacers" #define DEFAULTSEARCHPATH1 "\\Storage Card" #elif defined (_WIN32) -#define DEFAULTWADLOCATION1 "c:\\games\\srb2kart" -#define DEFAULTWADLOCATION2 "\\games\\srb2kart" +#define DEFAULTWADLOCATION1 "c:\\games\\ringracers" +#define DEFAULTWADLOCATION2 "\\games\\ringracers" #define DEFAULTSEARCHPATH1 "c:\\games" #define DEFAULTSEARCHPATH2 "\\games" #endif @@ -701,7 +701,7 @@ static void I_StartupConsole(void) if (gotConsole) { - SetConsoleTitleA("SRB2Kart Console"); + SetConsoleTitleA("Dr. Robotnik's Ring Racers Console"); consolevent = SDL_TRUE; } @@ -2333,8 +2333,8 @@ void I_UpdateMumble(const mobj_t *mobj, const listener_t listener) return; if(mumble->uiVersion != 2) { - wcsncpy(mumble->name, L"SRB2Kart "VERSIONSTRING, 256); - wcsncpy(mumble->description, L"Sonic Robo Blast 2 Kart with integrated Mumble Link support.", 2048); + wcsncpy(mumble->name, L"Dr. Robotnik's Ring Racers "VERSIONSTRING, 256); + wcsncpy(mumble->description, L"Dr. Robotnik's Ring Racers with integrated Mumble Link support.", 2048); mumble->uiVersion = 2; } mumble->uiTick++; @@ -2905,7 +2905,7 @@ void I_StartupTimer(void) I_AddExitFunc(I_ShutdownTimer); #elif 0 //#elif !defined (_arch_dreamcast) && !defined(GP2X) // the DC have it own timer and GP2X have broken pthreads? if (SDL_InitSubSystem(SDL_INIT_TIMER) < 0) - I_Error("SRB2: Needs SDL_Timer, Error: %s", SDL_GetError()); + I_Error("Dr. Robotnik's Ring Racers: Needs SDL_Timer, Error: %s", SDL_GetError()); #endif } @@ -2925,13 +2925,13 @@ INT32 I_StartupSystem(void) const SDL_version *SDLlinked; #ifdef _XBOX #ifdef __GNUC__ - char DP[] =" Sonic Robo Blast 2!\n"; + char DP[] =" Dr. Robotnik's Ring Racers!\n"; debugPrint(DP); #endif - unlink("e:/Games/SRB2/stdout.txt"); - freopen("e:/Games/SRB2/stdout.txt", "w+", stdout); - unlink("e:/Games/SRB2/stderr.txt"); - freopen("e:/Games/SRB2/stderr.txt", "w+", stderr); + unlink("e:/Games/RingRacers/stdout.txt"); + freopen("e:/Games/RingRacers/stdout.txt", "w+", stdout); + unlink("e:/Games/RingRacers/stderr.txt"); + freopen("e:/Games/RingRacers/stderr.txt", "w+", stderr); #endif #ifdef _arch_dreamcast #ifdef _DEBUG @@ -2954,7 +2954,7 @@ INT32 I_StartupSystem(void) #else if (SDL_Init(SDL_INIT_NOPARACHUTE) < 0) #endif - I_Error("SRB2: SDL System Error: %s", SDL_GetError()); //Alam: Oh no.... + I_Error("Dr. Robotnik's Ring Racers: SDL System Error: %s", SDL_GetError()); //Alam: Oh no.... #ifndef NOMUMBLE I_SetupMumble(); #endif @@ -3106,7 +3106,7 @@ void I_Error(const char *error, ...) } #endif OutputDebugStringA(buffer); - MessageBoxA(vid.WndParent, buffer, "SRB2 Recursive Error", MB_OK|MB_ICONERROR); + MessageBoxA(vid.WndParent, buffer, "Dr. Robotnik's Ring Racers Recursive Error", MB_OK|MB_ICONERROR); #else // Don't print garbage va_start(argptr, error); diff --git a/src/sdl12/i_video.c b/src/sdl12/i_video.c index 45ce67cf5..e32885a3c 100644 --- a/src/sdl12/i_video.c +++ b/src/sdl12/i_video.c @@ -1719,7 +1719,7 @@ INT32 VID_SetMode(INT32 modeNum) BitsPerPixel = (Uint8)cv_scr_depth.value; //vid.bpp = BitsPerPixel==8?1:2; // Window title - SDL_WM_SetCaption("SRB2Kart "VERSIONSTRING, "SRB2Kart"); + SDL_WM_SetCaption("Dr. Robotnik's Ring Racers "VERSIONSTRING, "Dr. Robotnik's Ring Racers"); if (render_soft == rendermode) { @@ -1881,9 +1881,9 @@ void I_StartupGraphics(void) // Window title #ifdef _WIN32_WCE - SDL_WM_SetCaption("SRB2Kart "VERSIONSTRING, "SRB2Kart"); + SDL_WM_SetCaption("Dr. Robotnik's Ring Racers "VERSIONSTRING, "Dr. Robotnik's Ring Racers"); #else - SDL_WM_SetCaption("SRB2Kart: Starting up", "SRB2Kart"); + SDL_WM_SetCaption("Dr. Robotnik's Ring Racers: Starting up", "Dr. Robotnik's Ring Racers"); #endif // Window icon diff --git a/src/sdl12/sdl_sound.c b/src/sdl12/sdl_sound.c index 1a7525fee..eebcb65df 100644 --- a/src/sdl12/sdl_sound.c +++ b/src/sdl12/sdl_sound.c @@ -154,16 +154,16 @@ static SDL_mutex *Msc_Mutex = NULL; #ifdef _arch_dreamcast #define MIDI_PATH "/ram" #elif defined(GP2X) -#define MIDI_PATH "/mnt/sd/srb2" -#define MIDI_PATH2 "/tmp/mnt/sd/srb2" +#define MIDI_PATH "/mnt/sd/ringracers" +#define MIDI_PATH2 "/tmp/mnt/sd/ringracers" #else #define MIDI_PATH srb2home #if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) #define MIDI_PATH2 "/tmp" #endif #endif -#define MIDI_TMPFILE "srb2music" -#define MIDI_TMPFILE2 "srb2wav" +#define MIDI_TMPFILE "ringracersmusic" +#define MIDI_TMPFILE2 "ringracerswav" static INT32 musicvol = 62; #if SDL_MIXER_VERSION_ATLEAST(1,2,2) @@ -1932,7 +1932,7 @@ boolean I_StartDigSong(const char *musicname, boolean looping) loopstartDig = 0.0l; #else if (looping && strcmp(data, "OggS") == 0) - I_OutputMsg("I_StartDigSong: SRB2 was not compiled with looping music support(no Mix_FadeInMusicPos)\n"); + I_OutputMsg("I_StartDigSong: Ring Racers was not compiled with looping music support(no Mix_FadeInMusicPos)\n"); #endif if (!LoadSong(data, lumplength, 1)) diff --git a/src/win32/Srb2win.ico b/src/win32/Srb2win.ico index 4e3f81336fa0835b1fdaea4cd5b4f43838647c5a..f9caf642c5b06da6cc73ec080ed152d4dbdc1bfa 100644 GIT binary patch literal 101314 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 FV1h@XzeNB5 From 45606cadd96ebe62b19571f707e4b768f7807079 Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 20 May 2022 16:55:21 -0700 Subject: [PATCH 39/48] Fix SDL_icon.xpm compile --- src/sdl/SDL_icon.xpm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sdl/SDL_icon.xpm b/src/sdl/SDL_icon.xpm index 4feaa7ebe..89404702f 100644 --- a/src/sdl/SDL_icon.xpm +++ b/src/sdl/SDL_icon.xpm @@ -1,5 +1,5 @@ /* XPM */ -static char *_33e5d9ff7304dc1d1d0f768ae4abba7V9uNpHhxS4n6jAPA[] = { +static const char *SDL_icon_xpm[] = { /* columns rows colors chars-per-pixel */ "16 16 28 1 ", " c None", From 34f40c48ca7d2ff8aebd82461e039dfdcf6d03b5 Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 20 May 2022 17:01:13 -0700 Subject: [PATCH 40/48] Makefile: change EXE name to ringracers --- src/Makefile.d/nix.mk | 2 -- src/Makefile.d/win32.mk | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Makefile.d/nix.mk b/src/Makefile.d/nix.mk index 98703e769..97bcf018e 100644 --- a/src/Makefile.d/nix.mk +++ b/src/Makefile.d/nix.mk @@ -2,8 +2,6 @@ # Makefile options for unices (linux, bsd...) # -EXENAME?=lsdl2srb2kart - opts+=-DUNIXCOMMON -DLUA_USE_POSIX libs+=-lm diff --git a/src/Makefile.d/win32.mk b/src/Makefile.d/win32.mk index 83edc3c45..3f93ddeaf 100644 --- a/src/Makefile.d/win32.mk +++ b/src/Makefile.d/win32.mk @@ -3,9 +3,9 @@ # ifndef MINGW64 -EXENAME?=srb2kart.exe +EXENAME?=ringracers.exe else -EXENAME?=srb2kart64.exe +EXENAME?=ringracers64.exe endif # disable dynamicbase if under msys2 From 1d79eb70c1c5f57f74654a09c5f97453879335f9 Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 20 May 2022 17:08:18 -0700 Subject: [PATCH 41/48] Replace just a few more instances of SRB2Kart --- src/dehacked.c | 2 +- src/doomdef.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 7288ac374..f13f45a4e 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -602,7 +602,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) } else if (fastcmp(word, "SRB2KART")) { - deh_warning("Patch is only compatible with SRB2Kart."); + deh_warning("Patch is only compatible with Ring Racers."); } else if (fastcmp(word, "SRB2")) { diff --git a/src/doomdef.h b/src/doomdef.h index 4d16e5547..f36eb07a0 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -168,7 +168,7 @@ extern char logfilename[1024]; // The string used in the alert that pops up in the event of an update being available. // Please change to apply to your modification (we don't want everyone asking where your mod is on SRB2.org!). #define UPDATE_ALERT_STRING \ -"A new update is available for SRB2Kart.\n"\ +"A new update is available for Ring Racers.\n"\ "Please visit kartkrew.org to download it.\n"\ "\n"\ "You are using version: %s\n"\ From 0906252f41f9e52277dc6576674f3d2854b4cdf0 Mon Sep 17 00:00:00 2001 From: SteelT Date: Fri, 20 May 2022 20:07:28 -0400 Subject: [PATCH 42/48] Replace SDL_icon.xpm with copy exported from GIMP Wasn't actually being displayed on the window before --- src/sdl/SDL_icon.xpm | 145 ++++++++++++++++++++++++++++--------------- 1 file changed, 96 insertions(+), 49 deletions(-) diff --git a/src/sdl/SDL_icon.xpm b/src/sdl/SDL_icon.xpm index 89404702f..b0ae75d5b 100644 --- a/src/sdl/SDL_icon.xpm +++ b/src/sdl/SDL_icon.xpm @@ -1,50 +1,97 @@ /* XPM */ -static const char *SDL_icon_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 16 28 1 ", -" c None", -". c #470000", -"X c #5F0000", -"o c #7F0000", -"O c #533F1F", -"+ c #752900", -"@ c #7F532F", -"# c #21224E", -"$ c #AF0000", -"% c #DF0000", -"& c #FF3F3F", -"* c #874307", -"= c #9B5B13", -"- c #B37347", -"; c #FF5F5F", -": c #C39B2F", -"> c yellow", -", c #E39767", -"< c #EBDB57", -"1 c #414183", -"2 c #5252FF", -"3 c #979797", -"4 c gray75", -"5 c #FFB78B", -"6 c #FFCB97", -"7 c #FFCFB3", -"8 c #E4E4E4", -"9 c white", -/* pixels */ -" 9999 ", -" 99----99 ", -" 9-,6666,-9 ", -" 9@,679976,@9 ", -"99O-66677666-O99", -"*+X,61166116,X+*", -"==*+-22,,22-+*==", -"+*=*+##&&##+*=*+", -"=====*$;;$*=====", -"+++++++;;+++++++", -".X+5483883845+X.", -"oo:-59499495-:oo", -"oo::+,5665,+::oo", -"$%<>>-++++->><%$", -"%%>>:$$$$$$:>>%%", -"%%>:$%%%%%%$:>%%" -}; +static const char * SDL_icon_xpm[] = { +"64 64 30 1", +" c None", +". c #000000", +"+ c #FFFFFF", +"@ c #B37347", +"# c #E39767", +"$ c #FFCB97", +"% c #7F532F", +"& c #FFCFB3", +"* c #533F1F", +"= c #874307", +"- c #752900", +"; c #5F0000", +"> c #414183", +", c #9B5B13", +"' c #5252FF", +") c #21224E", +"! c #FF3F3F", +"~ c #AF0000", +"{ c #FF5F5F", +"] c #470000", +"^ c #FFB78B", +"/ c #BFBFBF", +"( c #E4E4E4", +"_ c #979797", +": c #7F0000", +"< c #C39B2F", +"[ c #DF0000", +"} c #EBDB57", +"| c #FFFF00", +"1 c #000000", +" ++++++++++++++++ ", +" ++++++++++++++++ ", +" ++++++++++++++++ ", +" ++++++++++++++++ ", +" ++++++++@@@@@@@@@@@@@@@@++++++++ ", +" ++++++++@@@@@@@@@@@@@@@@++++++++ ", +" ++++++++@@@@@@@@@@@@@@@@++++++++ ", +" ++++++++@@@@@@@@@@@@@@@@++++++++ ", +" ++++@@@@####$$$$$$$$$$$$$$$$####@@@@++++ ", +" ++++@@@@####$$$$$$$$$$$$$$$$####@@@@++++ ", +" ++++@@@@####$$$$$$$$$$$$$$$$####@@@@++++ ", +" ++++@@@@####$$$$$$$$$$$$$$$$####@@@@++++ ", +" ++++%%%%####$$$$&&&&++++++++&&&&$$$$####%%%%++++ ", +" ++++%%%%####$$$$&&&&++++++++&&&&$$$$####%%%%++++ ", +" ++++%%%%####$$$$&&&&++++++++&&&&$$$$####%%%%++++ ", +" ++++%%%%####$$$$&&&&++++++++&&&&$$$$####%%%%++++ ", +"++++++++****@@@@$$$$$$$$$$$$&&&&&&&&$$$$$$$$$$$$@@@@****++++++++", +"++++++++****@@@@$$$$$$$$$$$$&&&&&&&&$$$$$$$$$$$$@@@@****++++++++", +"++++++++****@@@@$$$$$$$$$$$$&&&&&&&&$$$$$$$$$$$$@@@@****++++++++", +"++++++++****@@@@$$$$$$$$$$$$&&&&&&&&$$$$$$$$$$$$@@@@****++++++++", +"====----;;;;####$$$$>>>>>>>>$$$$$$$$>>>>>>>>$$$$####;;;;----====", +"====----;;;;####$$$$>>>>>>>>$$$$$$$$>>>>>>>>$$$$####;;;;----====", +"====----;;;;####$$$$>>>>>>>>$$$$$$$$>>>>>>>>$$$$####;;;;----====", +"====----;;;;####$$$$>>>>>>>>$$$$$$$$>>>>>>>>$$$$####;;;;----====", +",,,,,,,,====----@@@@''''''''########''''''''@@@@----====,,,,,,,,", +",,,,,,,,====----@@@@''''''''########''''''''@@@@----====,,,,,,,,", +",,,,,,,,====----@@@@''''''''########''''''''@@@@----====,,,,,,,,", +",,,,,,,,====----@@@@''''''''########''''''''@@@@----====,,,,,,,,", +"----====,,,,====----))))))))!!!!!!!!))))))))----====,,,,====----", +"----====,,,,====----))))))))!!!!!!!!))))))))----====,,,,====----", +"----====,,,,====----))))))))!!!!!!!!))))))))----====,,,,====----", +"----====,,,,====----))))))))!!!!!!!!))))))))----====,,,,====----", +",,,,,,,,,,,,,,,,,,,,====~~~~{{{{{{{{~~~~====,,,,,,,,,,,,,,,,,,,,", +",,,,,,,,,,,,,,,,,,,,====~~~~{{{{{{{{~~~~====,,,,,,,,,,,,,,,,,,,,", +",,,,,,,,,,,,,,,,,,,,====~~~~{{{{{{{{~~~~====,,,,,,,,,,,,,,,,,,,,", +",,,,,,,,,,,,,,,,,,,,====~~~~{{{{{{{{~~~~====,,,,,,,,,,,,,,,,,,,,", +"----------------------------{{{{{{{{----------------------------", +"----------------------------{{{{{{{{----------------------------", +"----------------------------{{{{{{{{----------------------------", +"----------------------------{{{{{{{{----------------------------", +"]]]];;;;----^^^^////((((____((((((((____((((////^^^^----;;;;]]]]", +"]]]];;;;----^^^^////((((____((((((((____((((////^^^^----;;;;]]]]", +"]]]];;;;----^^^^////((((____((((((((____((((////^^^^----;;;;]]]]", +"]]]];;;;----^^^^////((((____((((((((____((((////^^^^----;;;;]]]]", +"::::::::<<<<@@@@^^^^++++////++++++++////++++^^^^@@@@<<<<::::::::", +"::::::::<<<<@@@@^^^^++++////++++++++////++++^^^^@@@@<<<<::::::::", +"::::::::<<<<@@@@^^^^++++////++++++++////++++^^^^@@@@<<<<::::::::", +"::::::::<<<<@@@@^^^^++++////++++++++////++++^^^^@@@@<<<<::::::::", +"::::::::<<<<<<<<----####^^^^$$$$$$$$^^^^####----<<<<<<<<::::::::", +"::::::::<<<<<<<<----####^^^^$$$$$$$$^^^^####----<<<<<<<<::::::::", +"::::::::<<<<<<<<----####^^^^$$$$$$$$^^^^####----<<<<<<<<::::::::", +"::::::::<<<<<<<<----####^^^^$$$$$$$$^^^^####----<<<<<<<<::::::::", +"~~~~[[[[}}}}||||||||@@@@----------------@@@@||||||||}}}}[[[[~~~~", +"~~~~[[[[}}}}||||||||@@@@----------------@@@@||||||||}}}}[[[[~~~~", +"~~~~[[[[}}}}||||||||@@@@----------------@@@@||||||||}}}}[[[[~~~~", +"~~~~[[[[}}}}||||||||@@@@----------------@@@@||||||||}}}}[[[[~~~~", +"[[[[[[[[||||||||<<<<~~~~~~~~~~~~~~~~~~~~~~~~<<<<||||||||[[[[[[[[", +"[[[[[[[[||||||||<<<<~~~~~~~~~~~~~~~~~~~~~~~~<<<<||||||||[[[[[[[[", +"[[[[[[[[||||||||<<<<~~~~~~~~~~~~~~~~~~~~~~~~<<<<||||||||[[[[[[[[", +"[[[[[[[[||||||||<<<<~~~~~~~~~~~~~~~~~~~~~~~~<<<<||||||||[[[[[[[[", +"[[[[[[[[||||<<<<~~~~[[[[[[[[[[[[[[[[[[[[[[[[~~~~<<<<||||[[[[[[[[", +"[[[[[[[[||||<<<<~~~~[[[[[[[[[[[[[[[[[[[[[[[[~~~~<<<<||||[[[[[[[[", +"[[[[[[[[||||<<<<~~~~[[[[[[[[[[[[[[[[[[[[[[[[~~~~<<<<||||[[[[[[[[", +"[[[[[[[[||||<<<<~~~~[[[[[[[[[[[[[[[[[[[[[[[[~~~~<<<<||||[[[[[[[["}; From 36cd517dce97b3d56b1b7958488d0a0df3d0dc46 Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 20 May 2022 17:23:34 -0700 Subject: [PATCH 43/48] Revert wrong replace 1d79eb70c --- src/dehacked.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dehacked.c b/src/dehacked.c index f13f45a4e..7288ac374 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -602,7 +602,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) } else if (fastcmp(word, "SRB2KART")) { - deh_warning("Patch is only compatible with Ring Racers."); + deh_warning("Patch is only compatible with SRB2Kart."); } else if (fastcmp(word, "SRB2")) { From 69aa74b9bf3b7ed9872c58144e368f92318acefa Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 20 May 2022 21:59:45 -0400 Subject: [PATCH 44/48] Allow pathfind traversal thru shortcuts when starting from one Fixes shortcut pathfinding behavior when the entire shortcut's waypoints have the flag instead of only the entrance. --- src/k_pathfind.c | 2 +- src/k_pathfind.h | 2 +- src/k_waypoint.c | 13 +++++++++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/k_pathfind.c b/src/k_pathfind.c index eb91dda2b..857f0343a 100644 --- a/src/k_pathfind.c +++ b/src/k_pathfind.c @@ -427,7 +427,7 @@ boolean K_PathfindAStar(path_t *const path, pathfindsetup_t *const pathfindsetup else { // skip this node if it isn't traversable - if (pathfindsetup->gettraversable(checknodedata) == false) + if (pathfindsetup->gettraversable(checknodedata, currentnode->nodedata) == false) { continue; } diff --git a/src/k_pathfind.h b/src/k_pathfind.h index ba0e38f47..7b7f1475f 100644 --- a/src/k_pathfind.h +++ b/src/k_pathfind.h @@ -27,7 +27,7 @@ typedef UINT32*(*getnodeconnectioncostsfunc)(void*); typedef UINT32(*getnodeheuristicfunc)(void*, void*); // function pointer for getting if a node is traversable from its base data -typedef boolean(*getnodetraversablefunc)(void*); +typedef boolean(*getnodetraversablefunc)(void*, void*); // A pathfindnode contains information about a node from the pathfinding diff --git a/src/k_waypoint.c b/src/k_waypoint.c index 903e66e2a..ec50a96be 100644 --- a/src/k_waypoint.c +++ b/src/k_waypoint.c @@ -975,10 +975,12 @@ static UINT32 K_WaypointPathfindGetHeuristic(void *data1, void *data2) Return:- True if the waypoint is traversable, false otherwise. --------------------------------------------------*/ -static boolean K_WaypointPathfindTraversableAllEnabled(void *data) +static boolean K_WaypointPathfindTraversableAllEnabled(void *data, void *prevdata) { boolean traversable = false; + (void)prevdata; + if (data == NULL) { CONS_Debug(DBG_GAMELOGIC, "K_WaypointPathfindTraversableAllEnabled received NULL data.\n"); @@ -1004,18 +1006,21 @@ static boolean K_WaypointPathfindTraversableAllEnabled(void *data) Return:- True if the waypoint is traversable, false otherwise. --------------------------------------------------*/ -static boolean K_WaypointPathfindTraversableNoShortcuts(void *data) +static boolean K_WaypointPathfindTraversableNoShortcuts(void *data, void *prevdata) { boolean traversable = false; - if (data == NULL) + if (data == NULL || prevdata == NULL) { CONS_Debug(DBG_GAMELOGIC, "K_WaypointPathfindTraversableNoShortcuts received NULL data.\n"); } else { waypoint_t *waypoint = (waypoint_t *)data; - traversable = ((K_GetWaypointIsShortcut(waypoint) == false) && (K_GetWaypointIsEnabled(waypoint) == true)); + waypoint_t *prevWaypoint = (waypoint_t *)prevdata; + + traversable = ((K_GetWaypointIsEnabled(waypoint) == true) + && (K_GetWaypointIsShortcut(waypoint) == false || K_GetWaypointIsShortcut(prevWaypoint) == true)); // Allow shortcuts to be used if the starting waypoint is already a shortcut. } return traversable; From a3592da4f107f09332cb5044290a793c8a6b99c7 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 20 May 2022 22:32:23 -0400 Subject: [PATCH 45/48] More waypoint debug visualizations - Shortcut waypoints are pink now instead of blue. (barkley's ran into the issue of a shortcut waypoint on the main path too many times) - Waypoint debug uses a shaded blue sphere sprite instead of a thok sprite, because it makes the color easier to see on different backgrounds. - Use 1 splat for waypoint radius instead of shittons of orbs --- src/deh_tables.c | 2 ++ src/info.c | 3 +++ src/info.h | 3 +++ src/k_waypoint.c | 40 +++++++++++++++++++++------------------- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index faa5010ad..6452e45d3 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4415,6 +4415,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BATTLECAPSULE_SUPPORT", "S_BATTLECAPSULE_SUPPORTFLY", + "S_WAYPOINTORB", + "S_WAYPOINTSPLAT", "S_EGOORB", "S_WATERTRAIL1", diff --git a/src/info.c b/src/info.c index bd1d60b03..367bb673d 100644 --- a/src/info.c +++ b/src/info.c @@ -742,6 +742,7 @@ char sprnames[NUMSPRITES + 1][5] = "DBOS", // Drift boost flame + "WAYP", "EGOO", "WTRL", // Water Trail @@ -4996,6 +4997,8 @@ state_t states[NUMSTATES] = {SPR_CAPS, 4, -1, {NULL}, 0, 0, S_NULL}, // S_BATTLECAPSULE_SUPPORT {SPR_CAPS, FF_ANIMATE|5, -1, {NULL}, 3, 1, S_NULL}, // S_BATTLECAPSULE_SUPPORTFLY + {SPR_WAYP, 0, 1, {NULL}, 0, 0, S_NULL}, // S_WAYPOINTORB + {SPR_WAYP, 1|FF_FLOORSPRITE, 1, {NULL}, 0, 0, S_NULL}, // S_WAYPOINTSPLAT {SPR_EGOO, 0, 1, {NULL}, 0, 0, S_NULL}, // S_EGOORB // Water Trail diff --git a/src/info.h b/src/info.h index f8dbb90bd..8d8fe1228 100644 --- a/src/info.h +++ b/src/info.h @@ -1288,6 +1288,7 @@ typedef enum sprite SPR_DBOS, // Drift boost flame + SPR_WAYP, SPR_EGOO, SPR_WTRL, // Water Trail @@ -5420,6 +5421,8 @@ typedef enum state S_BATTLECAPSULE_SUPPORT, S_BATTLECAPSULE_SUPPORTFLY, + S_WAYPOINTORB, + S_WAYPOINTSPLAT, S_EGOORB, S_WATERTRAIL1, diff --git a/src/k_waypoint.c b/src/k_waypoint.c index ec50a96be..62652ee01 100644 --- a/src/k_waypoint.c +++ b/src/k_waypoint.c @@ -558,11 +558,9 @@ static void K_DebugWaypointsSpawnLine(waypoint_t *const waypoint1, waypoint_t *c --------------------------------------------------*/ static void K_DebugWaypointDrawRadius(waypoint_t *const waypoint) { + const fixed_t spriteRadius = 96*FRACUNIT; mobj_t *radiusOrb; mobj_t *waypointmobj; - const INT32 numRadiusMobjs = 64; - INT32 i = 0; - angle_t spawnAngle = 0U; fixed_t spawnX= 0; fixed_t spawnY= 0; fixed_t spawnZ= 0; @@ -572,22 +570,21 @@ static void K_DebugWaypointDrawRadius(waypoint_t *const waypoint) waypointmobj = waypoint->mobj; - for (i = 0; i < numRadiusMobjs; i++) - { - spawnAngle = (ANGLE_MAX / numRadiusMobjs) * i; + spawnX = waypointmobj->x; + spawnY = waypointmobj->y; + spawnZ = waypointmobj->z + 16*mapobjectscale; - spawnZ = waypointmobj->z; - spawnX = waypointmobj->x + P_ReturnThrustX(waypointmobj, spawnAngle, waypointmobj->radius); - spawnY = waypointmobj->y + P_ReturnThrustY(waypointmobj, spawnAngle, waypointmobj->radius); + radiusOrb = P_SpawnMobj(spawnX, spawnY, spawnZ, MT_SPARK); - radiusOrb = P_SpawnMobj(spawnX, spawnY, spawnZ, MT_SPARK); - P_SetMobjState(radiusOrb, S_THOK); - radiusOrb->tics = 1; - radiusOrb->frame &= ~FF_TRANSMASK; - radiusOrb->frame |= FF_FULLBRIGHT; - radiusOrb->color = SKINCOLOR_PURPLE; - radiusOrb->scale = radiusOrb->scale / 4; - } + P_SetMobjState(radiusOrb, S_WAYPOINTSPLAT); + radiusOrb->tics = 1; + + radiusOrb->frame &= ~FF_TRANSMASK; + radiusOrb->frame |= FF_FULLBRIGHT; + radiusOrb->color = SKINCOLOR_PURPLE; + + radiusOrb->destscale = FixedDiv(waypointmobj->radius, spriteRadius); + P_SetScale(radiusOrb, radiusOrb->destscale); } /*-------------------------------------------------- @@ -620,10 +617,10 @@ void K_DebugWaypointsVisualise(void) waypoint = K_SearchWaypointHeapForMobj(waypointmobj); debugmobj = P_SpawnMobj(waypointmobj->x, waypointmobj->y, waypointmobj->z, MT_SPARK); - P_SetMobjState(debugmobj, S_THOK); + P_SetMobjState(debugmobj, S_WAYPOINTORB); debugmobj->frame &= ~FF_TRANSMASK; - debugmobj->frame |= FF_TRANS20|FF_FULLBRIGHT; + debugmobj->frame |= FF_FULLBRIGHT; //FF_TRANS20 // There's a waypoint setup for this mobj! So draw that it's a valid waypoint and draw lines to its connections if (waypoint != NULL) @@ -648,6 +645,11 @@ void K_DebugWaypointsVisualise(void) else { debugmobj->color = SKINCOLOR_BLUE; + + if (K_GetWaypointIsShortcut(waypoint)) + { + debugmobj->color = SKINCOLOR_PINK; + } } if (!K_GetWaypointIsEnabled(waypoint)) From e02ebfa20d3792d551e75e5269cebec76f44b4c9 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 20 May 2022 22:41:52 -0400 Subject: [PATCH 46/48] No respawn waypoints are transparent --- src/k_waypoint.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/k_waypoint.c b/src/k_waypoint.c index 62652ee01..06d0a1a84 100644 --- a/src/k_waypoint.c +++ b/src/k_waypoint.c @@ -657,6 +657,11 @@ void K_DebugWaypointsVisualise(void) debugmobj->color = SKINCOLOR_GREY; } + if (!K_GetWaypointIsSpawnpoint(waypoint)) + { + debugmobj->frame |= FF_TRANS40; + } + // Valid waypoint, so draw lines of SPARKLES to its next or previous waypoints if (cv_kartdebugwaypoints.value == 1) { From 8e67946a589446fa7f0e255c5390c30a75743e27 Mon Sep 17 00:00:00 2001 From: SteelT Date: Fri, 20 May 2022 23:08:28 -0400 Subject: [PATCH 47/48] Replace default home folder name and base filename used for screenshot/gifs --- src/doomdef.h | 4 ++-- src/m_misc.c | 28 ++++++++++++++-------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/doomdef.h b/src/doomdef.h index f36eb07a0..0b7745be2 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -443,9 +443,9 @@ enum { // Name of local directory for config files and savegames #if (((defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON)) && !defined (__CYGWIN__)) && !defined (__APPLE__) -#define DEFAULTDIR ".srb2kart" +#define DEFAULTDIR ".ringracers" #else -#define DEFAULTDIR "srb2kart" +#define DEFAULTDIR "ringracers" #endif #include "g_state.h" diff --git a/src/m_misc.c b/src/m_misc.c index 1d8f5d394..7962e0689 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -697,20 +697,20 @@ static void M_CreateScreenShotPalette(void) #if NUMSCREENS > 2 static const char *Newsnapshotfile(const char *pathname, const char *ext) { - static char freename[13] = "kartXXXX.ext"; + static char freename[19] = "ringracersXXXX.ext"; int i = 5000; // start in the middle: num screenshots divided by 2 int add = i; // how much to add or subtract if wrong; gets divided by 2 each time int result; // -1 = guess too high, 0 = correct, 1 = guess too low // find a file name to save it to - strcpy(freename+9,ext); + strcpy(freename+15,ext); for (;;) { - freename[4] = (char)('0' + (char)(i/1000)); - freename[5] = (char)('0' + (char)((i/100)%10)); - freename[6] = (char)('0' + (char)((i/10)%10)); - freename[7] = (char)('0' + (char)(i%10)); + freename[10] = (char)('0' + (char)(i/1000)); + freename[11] = (char)('0' + (char)((i/100)%10)); + freename[12] = (char)('0' + (char)((i/10)%10)); + freename[13] = (char)('0' + (char)(i%10)); if (FIL_WriteFileOK(va(pandf,pathname,freename))) // access succeeds result = 1; // too low @@ -719,10 +719,10 @@ static const char *Newsnapshotfile(const char *pathname, const char *ext) if (!i) break; // not too high, so it must be equal! YAY! - freename[4] = (char)('0' + (char)((i-1)/1000)); - freename[5] = (char)('0' + (char)(((i-1)/100)%10)); - freename[6] = (char)('0' + (char)(((i-1)/10)%10)); - freename[7] = (char)('0' + (char)((i-1)%10)); + freename[10] = (char)('0' + (char)((i-1)/1000)); + freename[11] = (char)('0' + (char)(((i-1)/100)%10)); + freename[12] = (char)('0' + (char)(((i-1)/10)%10)); + freename[13] = (char)('0' + (char)((i-1)%10)); if (!FIL_WriteFileOK(va(pandf,pathname,freename))) // access fails result = -1; // too high else @@ -740,10 +740,10 @@ static const char *Newsnapshotfile(const char *pathname, const char *ext) return NULL; } - freename[4] = (char)('0' + (char)(i/1000)); - freename[5] = (char)('0' + (char)((i/100)%10)); - freename[6] = (char)('0' + (char)((i/10)%10)); - freename[7] = (char)('0' + (char)(i%10)); + freename[10] = (char)('0' + (char)(i/1000)); + freename[11] = (char)('0' + (char)((i/100)%10)); + freename[12] = (char)('0' + (char)((i/10)%10)); + freename[13] = (char)('0' + (char)(i%10)); return freename; } From 97b7178d36f070af6a35b4cd5a41065c303c4d7c Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 21 May 2022 03:36:17 -0400 Subject: [PATCH 48/48] Move to new Discord rich presence app --- src/discord.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/discord.c b/src/discord.c index 652303f65..7172eb45d 100644 --- a/src/discord.c +++ b/src/discord.c @@ -32,7 +32,7 @@ #include "doomdef.h" // Feel free to provide your own, if you care enough to create another Discord app for this :P -#define DISCORD_APPID "503531144395096085" +#define DISCORD_APPID "977470696852684833" // length of IP strings #define IP_SIZE 21