From 2e3f0481b1ab44e5b0a0830925409f91be8a01a2 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 24 Sep 2018 09:49:53 -0400 Subject: [PATCH 01/80] Version number update part 1 - Change from "v1.4.8" to "v1.0.0" - Remove the random additional "DevEXE" moniker outside of DEVELOP mode - For some reason, the version number of "1.4.8" was also set separately in DEVELOP mode, even though in vanilla it's intended to always be 0. Changed this back. TODO (*after* feature freeze): - Request and update MODID - Undef DEVELOP mode --- src/doomdef.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/doomdef.h b/src/doomdef.h index b5519f6f..97f0d325 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -142,17 +142,17 @@ extern FILE *logstream; #define DEVELOP // Disable this for release builds to remove excessive cheat commands and enable MD5 checking and stuff, all in one go. :3 #ifdef DEVELOP -#define VERSION 104 // Game version -#define SUBVERSION 8 // more precise version number +#define VERSION 0 // Game version +#define SUBVERSION 0 // more precise version number #define VERSIONSTRING "Development EXE" -#define VERSIONSTRINGW "v1.4.8" +#define VERSIONSTRINGW L"Development EXE" // most interface strings are ignored in development mode. // we use comprevision and compbranch instead. #else -#define VERSION 104 // Game version -#define SUBVERSION 8 // more precise version number -#define VERSIONSTRING "DevEXE v1.4.8" -#define VERSIONSTRINGW L"v1.4.8" +#define VERSION 100 // Game version +#define SUBVERSION 0 // more precise version number +#define VERSIONSTRING "v1.0.0" +#define VERSIONSTRINGW L"v1.0.0" // Hey! If you change this, add 1 to the MODVERSION below! // Otherwise we can't force updates! #endif From ec04ebdda33bef82dd58c7bb09a147f05392c745 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 24 Sep 2018 09:53:11 -0400 Subject: [PATCH 02/80] Say "mb.srb2.org" instead of "the forums on srb2.org" :V --- src/doomdef.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/doomdef.h b/src/doomdef.h index 97f0d325..4c81ad53 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -176,7 +176,7 @@ extern FILE *logstream; // 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"\ -"Please visit the forums on SRB2.org to download it.\n"\ +"Please visit mb.srb2.org to download it.\n"\ "\n"\ "You are using version: %s\n"\ "The newest version is: %s\n"\ @@ -193,7 +193,7 @@ extern FILE *logstream; // Generally less filled with newlines, since Windows gives you lots more room to work with. #define UPDATE_ALERT_STRING_CONSOLE \ "A new update is available for SRB2Kart.\n"\ -"Please visit the forums on SRB2.org to download it.\n"\ +"Please visit mb.srb2.org to download it.\n"\ "\n"\ "You are using version: %s\n"\ "The newest version is: %s\n"\ From 06c0e609c3fed10a05f8f4381fc9577b8a15c639 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 24 Sep 2018 09:56:02 -0400 Subject: [PATCH 03/80] Prefix with Kart --- src/doomdef.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/doomdef.h b/src/doomdef.h index 4c81ad53..dcbd0775 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -151,8 +151,8 @@ extern FILE *logstream; #else #define VERSION 100 // Game version #define SUBVERSION 0 // more precise version number -#define VERSIONSTRING "v1.0.0" -#define VERSIONSTRINGW L"v1.0.0" +#define VERSIONSTRING "Kart v1.0.0" +#define VERSIONSTRINGW L"Kart v1.0.0" // Hey! If you change this, add 1 to the MODVERSION below! // Otherwise we can't force updates! #endif From c75e40d08d3f33aeb6d7c08119aef3814a804fbb Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 1 Oct 2018 16:24:38 -0400 Subject: [PATCH 04/80] MODID acquired DEVELOP and USE_PATCH_KART undef'd as well --- src/doomdef.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/doomdef.h b/src/doomdef.h index dcbd0775..31a32a6c 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -140,7 +140,7 @@ extern FILE *logstream; #endif -#define DEVELOP // Disable this for release builds to remove excessive cheat commands and enable MD5 checking and stuff, all in one go. :3 +//#define DEVELOP // Disable this for release builds to remove excessive cheat commands and enable MD5 checking and stuff, all in one go. :3 #ifdef DEVELOP #define VERSION 0 // Game version #define SUBVERSION 0 // more precise version number @@ -162,7 +162,7 @@ extern FILE *logstream; //#define USE_PATCH_DTA // Kart has it's own, as well. -#define USE_PATCH_KART +//#define USE_PATCH_KART // Modification options // If you want to take advantage of the Master Server's ability to force clients to update @@ -211,7 +211,8 @@ extern FILE *logstream; // The Modification ID; must be obtained from Rob ( https://mb.srb2.org/private.php?do=newpm&u=546 ). // DO NOT try to set this otherwise, or your modification will be unplayable through the Master Server. // "12" is the default mod ID for version 2.1 -#define MODID 12 +// "17" is the 2.1 Kart's mod ID +#define MODID 17 // The Modification Version, starting from 1. Do not follow your version string for this, // it's only for detection of the version the player is using so the MS can alert them of an update. From 39ca58d0a427c5444f4bde021b910c89bdff3acb Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 17 Oct 2018 20:30:34 -0400 Subject: [PATCH 05/80] Add more hash stuff UNFINISHED, still need to add in legitimate hashes for non-CMake builds when we've finalized the content. --- assets/CMakeLists.txt | 7 ++++--- src/config.h.in | 26 +++++++++++++++++++------- src/d_main.c | 4 ++-- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/assets/CMakeLists.txt b/assets/CMakeLists.txt index 76441597..dae68cf7 100644 --- a/assets/CMakeLists.txt +++ b/assets/CMakeLists.txt @@ -3,8 +3,9 @@ # MD5 generation set(SRB2_ASSET_ALL ${CMAKE_CURRENT_SOURCE_DIR}/srb2.srb - ${CMAKE_CURRENT_SOURCE_DIR}/chars.kart + ${CMAKE_CURRENT_SOURCE_DIR}/patch.dta ${CMAKE_CURRENT_SOURCE_DIR}/gfx.kart + ${CMAKE_CURRENT_SOURCE_DIR}/chars.kart ${CMAKE_CURRENT_SOURCE_DIR}/maps.kart ${CMAKE_CURRENT_SOURCE_DIR}/sounds.kart ${CMAKE_CURRENT_SOURCE_DIR}/music.dta @@ -13,10 +14,10 @@ set(SRB2_ASSET_ALL set(SRB2_ASSET_HASHED srb2.srb - chars.kart + patch.dta gfx.kart + chars.kart maps.kart - sounds.kart ) foreach(SRB2_ASSET ${SRB2_ASSET_HASHED}) diff --git a/src/config.h.in b/src/config.h.in index 22a0dfa0..68c29782 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -11,14 +11,20 @@ #ifdef CMAKECONFIG +// Base SRB2 hashes #define ASSET_HASH_SRB2_SRB "${SRB2_ASSET_srb2.srb_HASH}" -#define ASSET_HASH_PLAYER_DTA "${SRB2_ASSET_player.dta_HASH}" -#define ASSET_HASH_RINGS_DTA "${SRB2_ASSET_rings.dta_HASH}" -#define ASSET_HASH_ZONES_DTA "${SRB2_ASSET_zones.dta_HASH}" #ifdef USE_PATCH_DTA #define ASSET_HASH_PATCH_DTA "${SRB2_ASSET_patch.dta_HASH}" #endif +// SRB2Kart-specific hashes +#define ASSET_HASH_GFX_KART "${SRB2_ASSET_gfx.kart_HASH}" +#define ASSET_HASH_CHARS_KART "${SRB2_ASSET_chars.kart_HASH}" +#define ASSET_HASH_MAPS_KART "${SRB2_ASSET_maps.kart_HASH}" +#ifdef USE_PATCH_KART +#define ASSET_HASH_PATCH_KART "${SRB2_ASSET_patch.kart_HASH}" +#endif + #define SRB2_COMP_REVISION "${SRB2_COMP_REVISION}" #define SRB2_COMP_BRANCH "${SRB2_COMP_BRANCH}" #define SRB2_GIT_DESCRIBE "${SRB2_GIT_DESCRIBE}" @@ -32,14 +38,20 @@ * YYYY MM DD * Last updated 2017 / 02 / 20 */ -#define ASSET_HASH_SRB2_SRB "c1b9577687f8a795104aef4600720ea7" -#define ASSET_HASH_GFX_DTA "ff653bb9c0dcb685fb7c1c5880bcaff1" -#define ASSET_HASH_CHARS_DTA "24c2641472bc187980eedc3c86691863" -#define ASSET_HASH_MAPS_DTA "13db5d4427f568f1c8f0599f2d14a7aa" +// Base SRB2 hashes +#define ASSET_HASH_SRB2_SRB "c1b9577687f8a795104aef4600720ea7" #ifdef USE_PATCH_DTA #define ASSET_HASH_PATCH_DTA "dbbf8bc6121618ee3be2d5b14650429b" #endif +// SRB2Kart-specific hashes +#define ASSET_HASH_GFX_KART "00000000000000000000000000000000" +#define ASSET_HASH_CHARS_KART "00000000000000000000000000000000" +#define ASSET_HASH_MAPS_KART "00000000000000000000000000000000" +#ifdef USE_PATCH_KART +#define ASSET_HASH_PATCH_KART "00000000000000000000000000000000" +#endif + #endif #endif diff --git a/src/d_main.c b/src/d_main.c index e56a631a..e5fe67f1 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1263,9 +1263,9 @@ void D_SRB2Main(void) #ifdef USE_PATCH_DTA mainwads++; // patch.dta #endif - mainwads++; // gfx.kart + mainwads++; // gfx.kart mainwads++; // chars.kart - mainwads++; // maps.kart + mainwads++; // maps.kart mainwads++; // sounds.kart #ifdef USE_PATCH_KART mainwads++; // patch.kart From 3a87596fbeaa608d912951d4f546ed3fb938e0c8 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 22 Oct 2018 00:29:17 +0100 Subject: [PATCH 06/80] Initial commit, revert this before merging the branch: Make it so it uses a seperate copy of gfx.kart with the Lua lumps hardcoded taken out, for easier work without conflict. --- src/d_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_main.c b/src/d_main.c index e1bcce8c..b38cdb01 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -953,7 +953,7 @@ static void IdentifyVersion(void) } // SRB2kart - Add graphics (temp) // The command for md5 checks is "W_VerifyFileMD5" - looks for ASSET_HASH_SRB2_SRB in config.h.in - D_AddFile(va(pandf,srb2waddir,"gfx.kart")); + D_AddFile(va(pandf,srb2waddir,"gfxHC.kart")); // temporary, don't let this line get merged D_AddFile(va(pandf,srb2waddir,"chars.kart")); D_AddFile(va(pandf,srb2waddir,"maps.kart")); //D_AddFile(va(pandf,srb2waddir,"sounds.kart")); From dceab0ce70fa3fea48b3077d6df71df4d9129e0f Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 22 Oct 2018 00:34:47 +0100 Subject: [PATCH 07/80] Hardcoding start! toast's stuff specifically. * Marble Zone! * Torch decoration. * Incense burner decoration. * CD Special Stage 1! * The UFO, now with improved death animation! * Turns out I duplicated sounds that already existed in sounds.kart. When we touch up the files later, yalls can remove both `DSFUFOx`'s from it. --- src/dehacked.c | 20 +++++++ src/info.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++- src/info.h | 23 ++++++++ src/p_enemy.c | 23 +++++++- src/p_inter.c | 14 +++++ src/p_mobj.c | 32 +++++++++++ 6 files changed, 256 insertions(+), 3 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 60d38a63..ff0739b3 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1838,6 +1838,7 @@ static actionpointer_t actionpointers[] = {{A_MineExplode}, "A_MINEEXPLODE"}, // SRB2kart {{A_BallhogExplode}, "A_BALLHOGEXPLODE"}, // SRB2kart {{A_LightningFollowPlayer}, "A_LIGHTNINGFOLLOWPLAYER"}, //SRB2kart + {{A_FlameParticle}, "A_FLAMEPARTICLE"}, // SRB2kart {{A_OrbitNights}, "A_ORBITNIGHTS"}, {{A_GhostMe}, "A_GHOSTME"}, {{A_SetObjectState}, "A_SETOBJECTSTATE"}, @@ -6770,6 +6771,16 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_KLIT11", "S_KLIT12", + // Marble Zone + "S_FLAMEPARTICLE", + "S_MARBLETORCH", + "S_MARBLELIGHT", + "S_MARBLEBURNER", + + // CD Special Stage + "S_CDUFO", + "S_CDUFO_DIE", + #ifdef SEENAMES "S_NAMECHECK", #endif @@ -7423,6 +7434,15 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_KARMAHITBOX", "MT_KARMAWHEEL", + // Marble Zone + "MT_FLAMEPARTICLE", + "MT_MARBLETORCH", + "MT_MARBLELIGHT", + "MT_MARBLEBURNER", + + // CD Special Stage + "MT_CDUFO", + #ifdef SEENAMES "MT_NAMECHECK", #endif diff --git a/src/info.c b/src/info.c index 2efa68ab..19403f51 100644 --- a/src/info.c +++ b/src/info.c @@ -61,7 +61,7 @@ char sprnames[NUMSPRITES + 1][5] = "DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM", "SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB", "ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK", - "LZI1","LZI2","KLIT","VIEW" + "LZI1","LZI2","KLIT","MARB","FUFO","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -3066,6 +3066,16 @@ state_t states[NUMSTATES] = {SPR_KLIT, FF_FULLBRIGHT|FF_PAPERSPRITE|5, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT12}, // S_KLIT11 {SPR_NULL, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT1}, // S_KLIT12 + // Marble Zone + {SPR_MARB, FF_FULLBRIGHT|FF_ANIMATE|5, TICRATE, {NULL}, 3, 3, S_NULL}, // S_FLAMEPARTICLE + {SPR_MARB, FF_FULLBRIGHT|FF_ANIMATE, 8*3, {A_FlameParticle}, 3, 3, S_MARBLETORCH}, // S_MARBLETORCH + {SPR_MARB, FF_FULLBRIGHT|FF_TRANS80|4, -1, {NULL}, 1, 29, S_NULL}, // S_MARBLELIGHT + {SPR_MARB, 9, -1, {NULL}, 0, 0, S_NULL}, // S_MARBLEBURNER + + // CD Special Stage + {SPR_FUFO, 0, 1, {A_Thrust}, 5, 2, S_CDUFO}, // S_CDUFO + {SPR_FUFO, 0, 4, {A_BossScream}, 0, MT_EXPLODE, S_CDUFO_DIE}, // S_CDUFO_DIE + #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK #endif @@ -17211,6 +17221,141 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_FLAMEPARTICLE + -1, // doomednum + S_FLAMEPARTICLE,// 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 + 0, // speed + FRACUNIT, // radius + FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY|MF_SCENERY|MF_NOCLIPTHING|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + + { // MT_MARBLETORCH + 1969, // doomednum + S_MARBLETORCH, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + MT_FLAMEPARTICLE,// painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 12*FRACUNIT, // radius + 45*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_SCENERY|MF_NOGRAVITY|MF_FIRE|MF_PAIN, // flags + S_NULL // raisestate + }, + + { // MT_MARBLELIGHT + -1, // doomednum + S_MARBLELIGHT, // 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 + 0, // speed + FRACUNIT, // radius + FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY|MF_SCENERY|MF_NOCLIPTHING|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + + { // MT_MARBLEBURNER + 1970, // doomednum + S_MARBLEBURNER, // 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 + 0, // speed + 24*FRACUNIT, // radius + 96*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOTHINK|MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_CDUFO + 4050, // doomednum + S_CDUFO, // spawnstate + 1, // 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_CDUFO_DIE, // deathstate + S_NULL, // xdeathstate + sfx_cdfm19, // deathsound + 0, // speed + 70*FRACUNIT, // radius + 70*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_SPECIAL, // flags + S_NULL // raisestate + }, + // ============================================================================================================================// #ifdef SEENAMES diff --git a/src/info.h b/src/info.h index f14d2121..7c3f3757 100644 --- a/src/info.h +++ b/src/info.h @@ -169,6 +169,7 @@ void A_JawzExplode(); // SRB2kart void A_MineExplode(); // SRB2kart void A_BallhogExplode(); // SRB2kart void A_LightningFollowPlayer(); // SRB2kart: Lightning shield effect player chasing +void A_FlameParticle(); void A_OrbitNights(); void A_GhostMe(); void A_SetObjectState(); @@ -653,6 +654,9 @@ typedef enum sprite SPR_LZI2, // ditto SPR_KLIT, // You have a twisted mind. But this actually is for the diagonal lightning. + SPR_MARB, // Marble Zone sprites + SPR_FUFO, // CD Special Stage UFO (don't ask me why it begins with an F) + SPR_VIEW, // First person view sprites; this is a sprite so that it can be replaced by a specialized MD2 draw! SPR_FIRSTFREESLOT, @@ -3613,6 +3617,16 @@ typedef enum state S_KLIT11, S_KLIT12, + // Marble Zone + S_FLAMEPARTICLE, + S_MARBLETORCH, + S_MARBLELIGHT, + S_MARBLEBURNER, + + // CD Special Stage + S_CDUFO, + S_CDUFO_DIE, + #ifdef SEENAMES S_NAMECHECK, #endif @@ -4283,6 +4297,15 @@ typedef enum mobj_type MT_KARMAHITBOX, MT_KARMAWHEEL, + // Marble Zone + MT_FLAMEPARTICLE, + MT_MARBLETORCH, + MT_MARBLELIGHT, + MT_MARBLEBURNER, + + // CD Special Stage + MT_CDUFO, + #ifdef SEENAMES MT_NAMECHECK, #endif diff --git a/src/p_enemy.c b/src/p_enemy.c index 37dd5899..9e6ce386 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -193,6 +193,7 @@ void A_JawzExplode(mobj_t *actor); // SRB2kart void A_MineExplode(mobj_t *actor); // SRB2kart void A_BallhogExplode(mobj_t *actor); // SRB2kart void A_LightningFollowPlayer(mobj_t *actor); // SRB2kart +void A_FlameParticle(mobj_t *actor); // SRB2kart void A_OrbitNights(mobj_t *actor); void A_GhostMe(mobj_t *actor); void A_SetObjectState(mobj_t *actor); @@ -8403,7 +8404,9 @@ void A_LightningFollowPlayer(mobj_t *actor) if (LUA_CallAction("A_LightningFollowPlayer", actor)) return; #endif - if (actor->target) + if (!actor->target) + return; + { if (actor->extravalue1) // Make the radius also follow the player somewhat accuratly { @@ -8418,7 +8421,23 @@ void A_LightningFollowPlayer(mobj_t *actor) actor->momy = actor->target->momy; actor->momz = actor->target->momz; // Give momentum since we don't teleport to our player literally every frame. } - return; +} + +void A_FlameParticle(mobj_t *actor) +{ + fixed_t rad = actor->radius>>FRACBITS, hei = actor->radius>>FRACBITS; + mobj_t *par; +#ifdef HAVE_BLUA + if (LUA_CallAction("A_FlameParticle", actor)) + return; +#endif + + par = P_SpawnMobj( + actor->x + (P_RandomRange(-rad, rad)<y + (P_RandomRange(-rad, rad)<z + (P_RandomRange(hei/2, hei)<info->painchance); + par->momz = actor->scale<<1; } //} diff --git a/src/p_inter.c b/src/p_inter.c index 5e532c61..96733f27 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -577,6 +577,20 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) special->target->player->kartstuff[k_eggmanblame] = -1; } return; + case MT_CDUFO: // SRB2kart + if (special->fuse || !P_CanPickupItem(player, 1) || (G_BattleGametype() && player->kartstuff[k_bumper] <= 0)) + return; + + player->kartstuff[k_itemroulette] = 1; + player->kartstuff[k_roulettetype] = 1; + + S_StartSound(toucher, sfx_cdfm73); // they don't make this sound in the original game but it's nice to have a "reward" for good play + + //special->momx = special->momy = special->momz = 0; + special->momz = -(3*special->scale)/2; + //P_SetTarget(&special->target, toucher); + special->fuse = 2*TICRATE; + break; // ***************************************** // // Rings, coins, spheres, weapon panels, etc // diff --git a/src/p_mobj.c b/src/p_mobj.c index 84163f1c..981ac8a9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7434,6 +7434,10 @@ void P_MobjThinker(mobj_t *mobj) case MT_MINEEXPLOSIONSOUND: P_RemoveMobj(mobj); return; + case MT_CDUFO: + if (mobj->fuse > TICRATE) + mobj->flags2 ^= MF2_DONTDRAW; // only by good fortune does this end with it having MF2_DONTDRAW... don't touch! + break; //} default: break; @@ -8480,6 +8484,31 @@ void P_MobjThinker(mobj_t *mobj) } } } + break; + case MT_CDUFO: + if (!mobj->spawnpoint || mobj->fuse) + break; + + if (mobj->movecount) + { + mobj->movecount--; + break; + } + else if (P_AproxDistance(mobj->x - (mobj->spawnpoint->x<y - (mobj->spawnpoint->y<movecount = 3; + + { + angle_t facing = P_RandomRange(0, 90); + if (facing >= 45) + facing = InvAngle((facing - 45)*ANG1); + else + facing *= ANG1; + + mobj->angle = R_PointToAngle2(mobj->x, mobj->y, mobj->spawnpoint->x<spawnpoint->y<color = SKINCOLOR_AQUA; break; } + case MT_MARBLETORCH: + P_SpawnMobj(mobj->x, mobj->y, mobj->z + (29< Date: Mon, 22 Oct 2018 21:56:14 +0100 Subject: [PATCH 08/80] Rusty Rig plus minor touchups to what I did already (I haven't made a new exe this stuff is simple enough, and I'll test it when I do the balloon panic stuff) --- src/dehacked.c | 8 +++++++ src/info.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++-- src/info.h | 10 ++++++++ src/p_mobj.c | 5 +++- 4 files changed, 82 insertions(+), 3 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index ff0739b3..96a1d1cf 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6781,6 +6781,10 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_CDUFO", "S_CDUFO_DIE", + // Rusty Rig + "S_RUSTYLAMP_ORANGE", + "S_RUSTYCHAIN", + #ifdef SEENAMES "S_NAMECHECK", #endif @@ -7443,6 +7447,10 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s // CD Special Stage "MT_CDUFO", + // Rusty Rig + "MT_RUSTYLAMP_ORANGE", + "MT_RUSTYCHAIN", + #ifdef SEENAMES "MT_NAMECHECK", #endif diff --git a/src/info.c b/src/info.c index 19403f51..9c44edbb 100644 --- a/src/info.c +++ b/src/info.c @@ -61,7 +61,7 @@ char sprnames[NUMSPRITES + 1][5] = "DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM", "SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB", "ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK", - "LZI1","LZI2","KLIT","MARB","FUFO","VIEW" + "LZI1","LZI2","KLIT","MARB","FUFO","RUST","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -3073,9 +3073,13 @@ state_t states[NUMSTATES] = {SPR_MARB, 9, -1, {NULL}, 0, 0, S_NULL}, // S_MARBLEBURNER // CD Special Stage - {SPR_FUFO, 0, 1, {A_Thrust}, 5, 2, S_CDUFO}, // S_CDUFO + {SPR_FUFO, 0, 1, {A_Thrust}, 5, 2, S_CDUFO}, // S_CDUFO {SPR_FUFO, 0, 4, {A_BossScream}, 0, MT_EXPLODE, S_CDUFO_DIE}, // S_CDUFO_DIE + // Rusty Rig + {SPR_RUST, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_RUSTYLAMP_ORANGE + {SPR_RUST, 1, -1, {NULL}, 0, 0, S_NULL}, // S_RUSTYCHAIN + #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK #endif @@ -17356,6 +17360,60 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_RUSTYLAMP_ORANGE + 1988, // doomednum + S_RUSTYLAMP_ORANGE, // 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 + 0, // speed + 12*FRACUNIT, // radius + 45*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_SCENERY|MF_NOGRAVITY|MF_NOBLOCKMAP, // flags + S_NULL // raisestate + }, + + { // MT_RUSTYCHAIN + 1989, // doomednum + S_RUSTYCHAIN, // 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 + 0, // speed + 12*FRACUNIT, // radius + 45*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_SCENERY|MF_NOBLOCKMAP, // flags + S_NULL // raisestate + }, + // ============================================================================================================================// #ifdef SEENAMES diff --git a/src/info.h b/src/info.h index 7c3f3757..ac9a24e9 100644 --- a/src/info.h +++ b/src/info.h @@ -657,6 +657,8 @@ typedef enum sprite SPR_MARB, // Marble Zone sprites SPR_FUFO, // CD Special Stage UFO (don't ask me why it begins with an F) + SPR_RUST, // Rusty Rig sprites + SPR_VIEW, // First person view sprites; this is a sprite so that it can be replaced by a specialized MD2 draw! SPR_FIRSTFREESLOT, @@ -3627,6 +3629,10 @@ typedef enum state S_CDUFO, S_CDUFO_DIE, + // Rusty Rig + S_RUSTYLAMP_ORANGE, + S_RUSTYCHAIN, + #ifdef SEENAMES S_NAMECHECK, #endif @@ -4306,6 +4312,10 @@ typedef enum mobj_type // CD Special Stage MT_CDUFO, + // Rusty Rig + MT_RUSTYLAMP_ORANGE, + MT_RUSTYCHAIN, + #ifdef SEENAMES MT_NAMECHECK, #endif diff --git a/src/p_mobj.c b/src/p_mobj.c index 981ac8a9..f832b4eb 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9380,7 +9380,10 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) break; } case MT_MARBLETORCH: - P_SpawnMobj(mobj->x, mobj->y, mobj->z + (29<x, mobj->y, mobj->z + (29*mobj->scale), MT_MARBLELIGHT); + break; + case MT_RUSTYLAMP_ORANGE: + P_SpawnMobj(mobj->x, mobj->y, mobj->z + (68*mobj->scale), MT_MARBLELIGHT); break; default: break; From 43bb6749fed638749d48de631edc9b4faf11b136 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 22 Oct 2018 22:36:04 +0100 Subject: [PATCH 09/80] D2 Balloon Panic, plus minor, minor touchup to Rusty Rig lamp's light positioning. (Sorry, Drt.) --- src/dehacked.c | 9 +++++++++ src/info.c | 35 ++++++++++++++++++++++++++++++++++- src/info.h | 11 +++++++++++ src/p_enemy.c | 2 ++ src/p_inter.c | 5 ++++- src/p_mobj.c | 7 ++++++- 6 files changed, 66 insertions(+), 3 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 96a1d1cf..2c2d0232 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6785,6 +6785,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_RUSTYLAMP_ORANGE", "S_RUSTYCHAIN", + // D2 Balloon Panic + "S_BALLOON", + "S_BALLOONPOP1", + "S_BALLOONPOP2", + "S_BALLOONPOP3", + #ifdef SEENAMES "S_NAMECHECK", #endif @@ -7451,6 +7457,9 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_RUSTYLAMP_ORANGE", "MT_RUSTYCHAIN", + // D2 Balloon Panic + "MT_BALLOON", + #ifdef SEENAMES "MT_NAMECHECK", #endif diff --git a/src/info.c b/src/info.c index 9c44edbb..fb80e5a1 100644 --- a/src/info.c +++ b/src/info.c @@ -61,7 +61,7 @@ char sprnames[NUMSPRITES + 1][5] = "DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM", "SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB", "ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK", - "LZI1","LZI2","KLIT","MARB","FUFO","RUST","VIEW" + "LZI1","LZI2","KLIT","MARB","FUFO","RUST","BLON","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -3080,6 +3080,12 @@ state_t states[NUMSTATES] = {SPR_RUST, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_RUSTYLAMP_ORANGE {SPR_RUST, 1, -1, {NULL}, 0, 0, S_NULL}, // S_RUSTYCHAIN + // D2 Balloon Panic + {SPR_BLON, FF_ANIMATE, -1, {NULL}, 2, 5, S_BALLOON}, // S_BALLOON + {SPR_BLON, FF_ANIMATE|3, 2, {NULL}, 1, 1, S_BALLOONPOP2}, // S_BALLOONPOP1 + {SPR_NULL, 0, 15*TICRATE, {NULL}, 0, 0, S_BALLOONPOP3}, // S_BALLOONPOP2 + {SPR_NULL, 0, 0, {A_SpawnFreshCopy}, 0, 0, S_NULL}, // S_BALLOONPOP3 + #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK #endif @@ -17414,6 +17420,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BALLOON + 462, // doomednum + S_BALLOON, // 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_BALLOONPOP1, // deathstate + S_NULL, // xdeathstate + sfx_s3k77, // deathsound + 0, // speed + 32*FRACUNIT, // radius + 64*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + // ============================================================================================================================// #ifdef SEENAMES diff --git a/src/info.h b/src/info.h index ac9a24e9..c4807c9c 100644 --- a/src/info.h +++ b/src/info.h @@ -659,6 +659,8 @@ typedef enum sprite SPR_RUST, // Rusty Rig sprites + SPR_BLON, // D2 Balloon Panic + SPR_VIEW, // First person view sprites; this is a sprite so that it can be replaced by a specialized MD2 draw! SPR_FIRSTFREESLOT, @@ -3633,6 +3635,12 @@ typedef enum state S_RUSTYLAMP_ORANGE, S_RUSTYCHAIN, + // D2 Balloon Panic + S_BALLOON, + S_BALLOONPOP1, + S_BALLOONPOP2, + S_BALLOONPOP3, + #ifdef SEENAMES S_NAMECHECK, #endif @@ -4316,6 +4324,9 @@ typedef enum mobj_type MT_RUSTYLAMP_ORANGE, MT_RUSTYCHAIN, + // D2 Balloon Panic + MT_BALLOON, + #ifdef SEENAMES MT_NAMECHECK, #endif diff --git a/src/p_enemy.c b/src/p_enemy.c index 9e6ce386..a21d4d30 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -10583,4 +10583,6 @@ void A_SpawnFreshCopy(mobj_t *actor) if (newObject->info->seesound) S_StartSound(newObject, newObject->info->seesound); + + newObject->color = actor->color; // SRB2Kart } diff --git a/src/p_inter.c b/src/p_inter.c index 96733f27..ece7b3a0 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -577,7 +577,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) special->target->player->kartstuff[k_eggmanblame] = -1; } return; - case MT_CDUFO: // SRB2kart + case MT_CDUFO: // SRB2kart if (special->fuse || !P_CanPickupItem(player, 1) || (G_BattleGametype() && player->kartstuff[k_bumper] <= 0)) return; @@ -591,6 +591,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) //P_SetTarget(&special->target, toucher); special->fuse = 2*TICRATE; break; + case MT_BALLOON: // SRB2kart + P_SetObjectMomZ(toucher, 20<x, mobj->y, mobj->z + (29*mobj->scale), MT_MARBLELIGHT); break; case MT_RUSTYLAMP_ORANGE: - P_SpawnMobj(mobj->x, mobj->y, mobj->z + (68*mobj->scale), MT_MARBLELIGHT); + P_SpawnMobj(mobj->x, mobj->y, mobj->z + (69*mobj->scale), MT_MARBLELIGHT); break; default: break; @@ -11044,6 +11044,11 @@ ML_NOCLIMB : Direction not controllable case MT_TRAPGOYLELONG: if (mthing->angle >= 360) mobj->tics += 7*(mthing->angle / 360) + 1; // starting delay + break; + case MT_BALLOON: // SRB2Kart + if (mthing->angle < MAXSKINCOLORS && mthing->angle > 0) + mobj->color = mthing->angle; + break; default: break; } From 2426d4e34812a20f4b204fa43fd655b2c2128881 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 22 Oct 2018 23:28:38 +0100 Subject: [PATCH 10/80] SOC_PALM (untested) --- src/dehacked.c | 16 ++++++ src/info.c | 146 ++++++++++++++++++++++++++++++++++++++++++++++++- src/info.h | 23 ++++++++ 3 files changed, 184 insertions(+), 1 deletion(-) diff --git a/src/dehacked.c b/src/dehacked.c index 2c2d0232..584014dd 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6771,6 +6771,14 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_KLIT11", "S_KLIT12", + // Various plants + "S_PALMTREE", + "S_SHRUB", + "S_TALLBUSH", + "S_AZURECITYTREE", + + "S_DKRBALLOON", // Diddy Kong Racing + // Marble Zone "S_FLAMEPARTICLE", "S_MARBLETORCH", @@ -7444,6 +7452,14 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_KARMAHITBOX", "MT_KARMAWHEEL", + // Various plants + "MT_PALMTREE", + "MT_SHRUB", + "MT_TALLBUSH", + "MT_AZURECITYTREE", + + "MT_DKRBALLOON", // Diddy Kong Racing + // Marble Zone "MT_FLAMEPARTICLE", "MT_MARBLETORCH", diff --git a/src/info.c b/src/info.c index fb80e5a1..c1659687 100644 --- a/src/info.c +++ b/src/info.c @@ -61,7 +61,8 @@ char sprnames[NUMSPRITES + 1][5] = "DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM", "SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB", "ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK", - "LZI1","LZI2","KLIT","MARB","FUFO","RUST","BLON","VIEW" + "LZI1","LZI2","KLIT","PALM","SHRB","TWEE","BALN","MARB","FUFO","RUST", + "BLON","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -3066,6 +3067,14 @@ state_t states[NUMSTATES] = {SPR_KLIT, FF_FULLBRIGHT|FF_PAPERSPRITE|5, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT12}, // S_KLIT11 {SPR_NULL, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT1}, // S_KLIT12 + // Various plants + {SPR_PALM, 0, -1, {NULL}, 0, 0, S_NULL}, // S_PALMTREE + {SPR_SHRB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SHRUB + {SPR_BUS2, 1, -1, {NULL}, 0, 0, S_NULL}, // S_TALLBUSH + {SPR_TWEE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_AZURECITYTREE + + {SPR_BALN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_DKRBALLOON + // Marble Zone {SPR_MARB, FF_FULLBRIGHT|FF_ANIMATE|5, TICRATE, {NULL}, 3, 3, S_NULL}, // S_FLAMEPARTICLE {SPR_MARB, FF_FULLBRIGHT|FF_ANIMATE, 8*3, {A_FlameParticle}, 3, 3, S_MARBLETORCH}, // S_MARBLETORCH @@ -17231,6 +17240,141 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_PALMTREE, + 1482, // doomednum + S_PALMTREE, // 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 + 0, // speed + 16*FRACUNIT, // radius + 189*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_SHRUB, + 4022, // doomednum + S_SHRUB, // 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 + 0, // speed + 91*FRACUNIT, // radius + 166*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_TALLBUSH, + 1485, // doomednum + S_TALLBUSH, // 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 + 0, // speed + 91*FRACUNIT, // radius + 166*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_AZURECITYTREE, + 1486, // doomednum + S_AZURECITYTREE,// 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 + 0, // speed + 91*FRACUNIT, // radius + 166*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_DKRBALLOON, + 2807, // doomednum + S_DKRBALLOON, // 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 + 0, // speed + 91*FRACUNIT, // radius + 166*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + { // MT_FLAMEPARTICLE -1, // doomednum S_FLAMEPARTICLE,// spawnstate diff --git a/src/info.h b/src/info.h index c4807c9c..a8ef3bc8 100644 --- a/src/info.h +++ b/src/info.h @@ -654,6 +654,13 @@ typedef enum sprite SPR_LZI2, // ditto SPR_KLIT, // You have a twisted mind. But this actually is for the diagonal lightning. + // Various plants + SPR_PALM, + SPR_SHRB, + SPR_TWEE, + + SPR_BALN, // Diddy Kong Racing + SPR_MARB, // Marble Zone sprites SPR_FUFO, // CD Special Stage UFO (don't ask me why it begins with an F) @@ -3621,6 +3628,14 @@ typedef enum state S_KLIT11, S_KLIT12, + // Various plants + S_PALMTREE, + S_SHRUB, + S_TALLBUSH, + S_AZURECITYTREE, + + S_DKRBALLOON, // Diddy Kong Racing + // Marble Zone S_FLAMEPARTICLE, S_MARBLETORCH, @@ -4311,6 +4326,14 @@ typedef enum mobj_type MT_KARMAHITBOX, MT_KARMAWHEEL, + // Various plants + MT_PALMTREE, + MT_SHRUB, + MT_TALLBUSH, + MT_AZURECITYTREE, + + MT_DKRBALLOON, // Diddy Kong Racing + // Marble Zone MT_FLAMEPARTICLE, MT_MARBLETORCH, From 2c06d55f46d19c202a717f3b04ba58bcc719e79f Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 23 Oct 2018 14:59:09 +0100 Subject: [PATCH 11/80] SOC_XMAS (untested). Well, mostly. At least, all elements with sprites provided - there are two bushes that, weirdly enough, do not have their graphics provided in gfx.kart but ARE soc'd, and I feel like there's no point hardcoding that stuff..? Also, I'm being cheeky and doing this in the middle of a lecture. :shitsfree: --- src/dehacked.c | 8 ++++ src/info.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++++- src/info.h | 12 +++++ 3 files changed, 136 insertions(+), 2 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 584014dd..50d2b7ec 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -5268,6 +5268,10 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_XMASPOLE", "S_CANDYCANE", "S_SNOWMAN", + "S_SNOWMANHAT", + "S_LAMPPOST1", + "S_LAMPPOST2", + "S_HANGSTAR", // Botanic Serenity's loads of scenery states "S_BSZTALLFLOWER_RED", @@ -7085,6 +7089,10 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_XMASPOLE", "MT_CANDYCANE", "MT_SNOWMAN", + "MT_SNOWMANHAT", + "MT_LAMPPOST1", + "MT_LAMPPOST2", + "MT_HANGSTAR", // Botanic Serenity "MT_BSZTALLFLOWER_RED", diff --git a/src/info.c b/src/info.c index c1659687..22c4056e 100644 --- a/src/info.c +++ b/src/info.c @@ -62,7 +62,9 @@ char sprnames[NUMSPRITES + 1][5] = "SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB", "ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK", "LZI1","LZI2","KLIT","PALM","SHRB","TWEE","BALN","MARB","FUFO","RUST", - "BLON","VIEW" + "BLON", + "XMS4","XMS5", + "VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -1535,6 +1537,10 @@ state_t states[NUMSTATES] = {SPR_XMS1, 0, -1, {NULL}, 0, 0, S_NULL}, // S_XMASPOLE {SPR_XMS2, 0, -1, {NULL}, 0, 0, S_NULL}, // S_CANDYCANE {SPR_XMS3, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SNOWMAN + {SPR_XMS3, 1, -1, {NULL}, 0, 0, S_NULL}, // S_SNOWMANHAT + {SPR_XMS4, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LAMPPOST1 + {SPR_XMS4, 1, -1, {NULL}, 0, 0, S_NULL}, // S_LAMPPOST2 + {SPR_XMS5, 0, -1, {NULL}, 0, 0, S_NULL}, // S_HANGSTAR // Loads of Botanic Serenity bullshit {SPR_BSZ1, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BSZTALLFLOWER_RED @@ -9086,7 +9092,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = sfx_None, // deathsound 25*FRACUNIT, // speed 16*FRACUNIT, // radius - 40*FRACUNIT, // height + 64*FRACUNIT, // height 0, // display offset 100, // mass 1, // damage @@ -9095,6 +9101,114 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_SNOWMANHAT + 1853, // doomednum + S_SNOWMANHAT, // 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 + 25*FRACUNIT, // speed + 16*FRACUNIT, // radius + 80*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SLIDEME|MF_SOLID|MF_PUSHABLE, // flags + S_NULL // raisestate + }, + + { // MT_LAMPPOST1 + 1854, // doomednum + S_LAMPPOST1, // 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 + 0, // speed + 8*FRACUNIT, // radius + 120*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SOLID|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_LAMPPOST2 + 1855, // doomednum + S_LAMPPOST2, // 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 + 0, // speed + 8*FRACUNIT, // radius + 120*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SOLID|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_HANGSTAR + 1856, // doomednum + S_HANGSTAR, // 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 + 0, // speed + FRACUNIT, // radius + 80*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_SPAWNCEILING|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + // No, I did not do all of this by hand. // I made a script to make all of these for me. // Ha HA. ~Inuyasha diff --git a/src/info.h b/src/info.h index a8ef3bc8..2a578bf6 100644 --- a/src/info.h +++ b/src/info.h @@ -668,6 +668,10 @@ typedef enum sprite SPR_BLON, // D2 Balloon Panic + // Xmas-specific sprites that don't fit aboxe + SPR_XMS4, + SPR_XMS5, + SPR_VIEW, // First person view sprites; this is a sprite so that it can be replaced by a specialized MD2 draw! SPR_FIRSTFREESLOT, @@ -2125,6 +2129,10 @@ typedef enum state S_XMASPOLE, S_CANDYCANE, S_SNOWMAN, + S_SNOWMANHAT, + S_LAMPPOST1, + S_LAMPPOST2, + S_HANGSTAR, // Botanic Serenity's loads of scenery states S_BSZTALLFLOWER_RED, @@ -3959,6 +3967,10 @@ typedef enum mobj_type MT_XMASPOLE, MT_CANDYCANE, MT_SNOWMAN, + MT_SNOWMANHAT, + MT_LAMPPOST1, + MT_LAMPPOST2, + MT_HANGSTAR, // Botanic Serenity scenery MT_BSZTALLFLOWER_RED, From 86c4542a98ee87f13b0f69376dba0e3e810291a2 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 23 Oct 2018 17:47:15 +0100 Subject: [PATCH 12/80] Remove all of the DKRBALLOON stuff I added from SOC_PALM, as the object already existed as MT_DOOD_BALLOON. --- src/dehacked.c | 4 ---- src/info.c | 40 +++++----------------------------------- src/info.h | 6 ------ 3 files changed, 5 insertions(+), 45 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 50d2b7ec..72d3e551 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6781,8 +6781,6 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_TALLBUSH", "S_AZURECITYTREE", - "S_DKRBALLOON", // Diddy Kong Racing - // Marble Zone "S_FLAMEPARTICLE", "S_MARBLETORCH", @@ -7466,8 +7464,6 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_TALLBUSH", "MT_AZURECITYTREE", - "MT_DKRBALLOON", // Diddy Kong Racing - // Marble Zone "MT_FLAMEPARTICLE", "MT_MARBLETORCH", diff --git a/src/info.c b/src/info.c index 22c4056e..c6bc6d48 100644 --- a/src/info.c +++ b/src/info.c @@ -61,8 +61,7 @@ char sprnames[NUMSPRITES + 1][5] = "DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM", "SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB", "ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK", - "LZI1","LZI2","KLIT","PALM","SHRB","TWEE","BALN","MARB","FUFO","RUST", - "BLON", + "LZI1","LZI2","KLIT","PALM","SHRB","TWEE","MARB","FUFO","RUST","BLON", "XMS4","XMS5", "VIEW" }; @@ -3079,8 +3078,6 @@ state_t states[NUMSTATES] = {SPR_BUS2, 1, -1, {NULL}, 0, 0, S_NULL}, // S_TALLBUSH {SPR_TWEE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_AZURECITYTREE - {SPR_BALN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_DKRBALLOON - // Marble Zone {SPR_MARB, FF_FULLBRIGHT|FF_ANIMATE|5, TICRATE, {NULL}, 3, 3, S_NULL}, // S_FLAMEPARTICLE {SPR_MARB, FF_FULLBRIGHT|FF_ANIMATE, 8*3, {A_FlameParticle}, 3, 3, S_MARBLETORCH}, // S_MARBLETORCH @@ -16507,13 +16504,13 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 1048576, // radius - 2097152, // height + 91*FRACUNIT, // radius + 166*FRACUNIT, // height 0, // display offset - 100, // mass + 0, // mass 0, // damage sfx_None, // activesound - 33554944, // flags + MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY|MF_NOGRAVITY, // flags S_NULL // raisestate }, @@ -17462,33 +17459,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - { // MT_DKRBALLOON, - 2807, // doomednum - S_DKRBALLOON, // 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 - 0, // speed - 91*FRACUNIT, // radius - 166*FRACUNIT, // height - 0, // display offset - 0, // mass - 0, // damage - sfx_None, // activesound - MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY|MF_NOGRAVITY, // flags - S_NULL // raisestate - }, - { // MT_FLAMEPARTICLE -1, // doomednum S_FLAMEPARTICLE,// spawnstate diff --git a/src/info.h b/src/info.h index 2a578bf6..ef6e5d61 100644 --- a/src/info.h +++ b/src/info.h @@ -659,8 +659,6 @@ typedef enum sprite SPR_SHRB, SPR_TWEE, - SPR_BALN, // Diddy Kong Racing - SPR_MARB, // Marble Zone sprites SPR_FUFO, // CD Special Stage UFO (don't ask me why it begins with an F) @@ -3642,8 +3640,6 @@ typedef enum state S_TALLBUSH, S_AZURECITYTREE, - S_DKRBALLOON, // Diddy Kong Racing - // Marble Zone S_FLAMEPARTICLE, S_MARBLETORCH, @@ -4344,8 +4340,6 @@ typedef enum mobj_type MT_TALLBUSH, MT_AZURECITYTREE, - MT_DKRBALLOON, // Diddy Kong Racing - // Marble Zone MT_FLAMEPARTICLE, MT_MARBLETORCH, From 75669a4b9b8b8fd4630aba62d87a226c894c8187 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 23 Oct 2018 20:44:54 +0100 Subject: [PATCH 13/80] SOC_COAT and SOC_SMOK. To make the MT_PETSMOKER make vaping clouds for Volcanic Valley instead, apply MTF_OBJECTSPECIAL on the spawnpoint. Since I had to compile, I ALSO discovered SOC_PALM's palmtree was already hardcoded as well!!!! Gosh dang inconsistencies... --- src/dehacked.c | 22 +++++++- src/info.c | 133 +++++++++++++++++++++++++++++++++++++------------ src/info.h | 24 ++++++++- src/p_enemy.c | 2 + src/p_mobj.c | 8 +++ 5 files changed, 153 insertions(+), 36 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 72d3e551..ba079671 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6776,7 +6776,6 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_KLIT12", // Various plants - "S_PALMTREE", "S_SHRUB", "S_TALLBUSH", "S_AZURECITYTREE", @@ -6801,6 +6800,21 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_BALLOONPOP2", "S_BALLOONPOP3", + // Smokin' & Vapin' (Don't try this at home, kids!) + "S_PETSMOKE0", + "S_PETSMOKE1", + "S_PETSMOKE2", + "S_PETSMOKE3", + "S_PETSMOKE4", + "S_PETSMOKE5", + "S_VVVAPING0", + "S_VVVAPING1", + "S_VVVAPING2", + "S_VVVAPING3", + "S_VVVAPING4", + "S_VVVAPING5", + "S_VVVAPE", + #ifdef SEENAMES "S_NAMECHECK", #endif @@ -7459,7 +7473,6 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_KARMAWHEEL", // Various plants - "MT_PALMTREE", "MT_SHRUB", "MT_TALLBUSH", "MT_AZURECITYTREE", @@ -7480,6 +7493,11 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s // D2 Balloon Panic "MT_BALLOON", + // Smokin' & Vapin' (Don't try this at home, kids!) + "MT_PETSMOKER", + "MT_PETSMOKE", + "MT_VVVAPE", + #ifdef SEENAMES "MT_NAMECHECK", #endif diff --git a/src/info.c b/src/info.c index c6bc6d48..b885084d 100644 --- a/src/info.c +++ b/src/info.c @@ -62,6 +62,7 @@ char sprnames[NUMSPRITES + 1][5] = "SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB", "ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK", "LZI1","LZI2","KLIT","PALM","SHRB","TWEE","MARB","FUFO","RUST","BLON", + "VAPE", "XMS4","XMS5", "VIEW" }; @@ -3073,7 +3074,6 @@ state_t states[NUMSTATES] = {SPR_NULL, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT1}, // S_KLIT12 // Various plants - {SPR_PALM, 0, -1, {NULL}, 0, 0, S_NULL}, // S_PALMTREE {SPR_SHRB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SHRUB {SPR_BUS2, 1, -1, {NULL}, 0, 0, S_NULL}, // S_TALLBUSH {SPR_TWEE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_AZURECITYTREE @@ -3098,6 +3098,21 @@ state_t states[NUMSTATES] = {SPR_NULL, 0, 15*TICRATE, {NULL}, 0, 0, S_BALLOONPOP3}, // S_BALLOONPOP2 {SPR_NULL, 0, 0, {A_SpawnFreshCopy}, 0, 0, S_NULL}, // S_BALLOONPOP3 + // Smokin' & Vapin' (Don't try this at home, kids!) + {SPR_SMOK, 0, 1, {A_SetScale}, FRACUNIT/2, 0, S_PETSMOKE1}, // S_PETSMOKE0 + {SPR_SMOK, 0, 5, {A_SetScale}, FRACUNIT*2, 1, S_PETSMOKE2}, // S_PETSMOKE1 + {SPR_SMOK, 1, 5, {A_BubbleRise}, 0, 50096, S_PETSMOKE3}, // S_PETSMOKE2 + {SPR_SMOK, 2, 15, {A_BubbleRise}, 0, 50096, S_PETSMOKE4}, // S_PETSMOKE3 + {SPR_SMOK, 3, 25, {A_BubbleRise}, 0, 50096, S_PETSMOKE5}, // S_PETSMOKE4 + {SPR_SMOK, 4, 35, {A_BubbleRise}, 0, 50096, S_NULL}, // S_PETSMOKE5 + {SPR_VAPE, 0, 1, {NULL}, 0, 0, S_VVVAPING1}, // S_VVVAPING0 + {SPR_SMOK, 0, 5, {A_SetScale}, FRACUNIT*2, 1, S_VVVAPING2}, // S_VVVAPING1 + {SPR_VAPE, 1, 5, {A_BubbleRise}, 0, 50096, S_VVVAPING3}, // S_VVVAPING2 + {SPR_VAPE, 2, 15, {A_BubbleRise}, 0, 50096, S_VVVAPING4}, // S_VVVAPING3 + {SPR_VAPE, 3, 25, {A_BubbleRise}, 0, 50096, S_VVVAPING5}, // S_VVVAPING4 + {SPR_VAPE, 4, 35, {A_BubbleRise}, 0, 50096, S_NULL}, // S_VVVAPING5 + {SPR_VAPE, FF_ANIMATE|FF_TRANS30, -1, {NULL}, 6, 6, S_NULL}, // S_VVVAPE + #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK #endif @@ -16152,14 +16167,14 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // deathstate S_NULL, // xdeathstate sfx_None, // deathsound - 8, // speed + 0, // speed 16*FRACUNIT, // radius - 40*FRACUNIT, // height + 189*FRACUNIT, // height 0, // display offset - 100, // mass + 0, // mass 0, // damage sfx_None, // activesound - MF_NOCLIP|MF_SCENERY, // flags + MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags S_NULL // raisestate }, @@ -17351,33 +17366,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - { // MT_PALMTREE, - 1482, // doomednum - S_PALMTREE, // 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 - 0, // speed - 16*FRACUNIT, // radius - 189*FRACUNIT, // height - 0, // display offset - 0, // mass - 0, // damage - sfx_None, // activesound - MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP|MF_SCENERY, // flags - S_NULL // raisestate - }, - { // MT_SHRUB, 4022, // doomednum S_SHRUB, // spawnstate @@ -17675,6 +17663,87 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_PETSMOKER + 2018, // doomednum + S_INVISIBLE, // 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 + 0, // speed + 24*FRACUNIT, // radius + 64*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_SCENERY|MF_NOBLOCKMAP|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_PETSMOKE + -1, // doomednum + S_PETSMOKE0, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_VVVAPING0, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 8*FRACUNIT, // radius + 12*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_SCENERY|MF_RUNSPAWNFUNC, // flags + S_NULL // raisestate + }, + + { // MT_VVVAPE + 1600, // doomednum + S_VVVAPE, // 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 + 0, // speed + 16*FRACUNIT, // radius + 64*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SCENERY|MF_NOGRAVITY|MF_NOBLOCKMAP, // flags + S_NULL // raisestate + }, + // ============================================================================================================================// #ifdef SEENAMES diff --git a/src/info.h b/src/info.h index ef6e5d61..237cc451 100644 --- a/src/info.h +++ b/src/info.h @@ -666,6 +666,8 @@ typedef enum sprite SPR_BLON, // D2 Balloon Panic + SPR_VAPE, // Volcanic Valley + // Xmas-specific sprites that don't fit aboxe SPR_XMS4, SPR_XMS5, @@ -3635,7 +3637,6 @@ typedef enum state S_KLIT12, // Various plants - S_PALMTREE, S_SHRUB, S_TALLBUSH, S_AZURECITYTREE, @@ -3660,6 +3661,21 @@ typedef enum state S_BALLOONPOP2, S_BALLOONPOP3, + // Smokin' & Vapin' (Don't try this at home, kids!) + S_PETSMOKE0, + S_PETSMOKE1, + S_PETSMOKE2, + S_PETSMOKE3, + S_PETSMOKE4, + S_PETSMOKE5, + S_VVVAPING0, + S_VVVAPING1, + S_VVVAPING2, + S_VVVAPING3, + S_VVVAPING4, + S_VVVAPING5, + S_VVVAPE, + #ifdef SEENAMES S_NAMECHECK, #endif @@ -4335,7 +4351,6 @@ typedef enum mobj_type MT_KARMAWHEEL, // Various plants - MT_PALMTREE, MT_SHRUB, MT_TALLBUSH, MT_AZURECITYTREE, @@ -4356,6 +4371,11 @@ typedef enum mobj_type // D2 Balloon Panic MT_BALLOON, + // Smokin' & Vapin' (Don't try this at home, kids!) + MT_PETSMOKER, + MT_PETSMOKE, + MT_VVVAPE, + #ifdef SEENAMES MT_NAMECHECK, #endif diff --git a/src/p_enemy.c b/src/p_enemy.c index a21d4d30..d808512d 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -9755,6 +9755,8 @@ void A_SetScale(mobj_t *actor) return; } + locvar1 = FixedMul(locvar1, mapheaderinfo[gamemap-1]->mobj_scale); // SRB2Kart + target->destscale = locvar1; // destination scale if (!(locvar2 & 65535)) P_SetScale(target, locvar1); // this instantly changes current scale to var1 if used, if not destscale will alter scale to var1 anyway diff --git a/src/p_mobj.c b/src/p_mobj.c index 5ff1afa5..c24547da 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7031,6 +7031,14 @@ void P_MobjThinker(mobj_t *mobj) return; } break; + case MT_PETSMOKER: + if (!(leveltime % 10)) + { + mobj_t *smok = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_PETSMOKE); + if (mobj->spawnpoint && mobj->spawnpoint->options & MTF_OBJECTSPECIAL) + P_SetMobjStateNF(smok, smok->info->painstate); // same function, diff sprite + } + break; //} case MT_WATERDROP: P_SceneryCheckWater(mobj); From 2b968a5087e476429d3dab46320284bafbab23bf Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 23 Oct 2018 22:16:40 +0100 Subject: [PATCH 14/80] With the permission of Sev, SOC_SEV, SOC_SG, SOC_PEAC and SOC_DHST are now done. --- src/dehacked.c | 32 +++++ src/info.c | 345 ++++++++++++++++++++++++++++++++++++++++++++++++- src/info.h | 49 ++++++- 3 files changed, 423 insertions(+), 3 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index ba079671..0cf08b50 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6776,6 +6776,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_KLIT12", // Various plants + "S_SONICBUSH", "S_SHRUB", "S_TALLBUSH", "S_AZURECITYTREE", @@ -6815,6 +6816,21 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_VVVAPING5", "S_VVVAPE", + // Hill Top Zone + "S_HTZTREE", + "S_HTZBUSH", + + // Ports of gardens + "S_SGVINE1", + "S_SGVINE2", + "S_SGVINE3", + "S_PGTREE", + "S_PGFLOWER1", + "S_PGFLOWER2", + "S_PGFLOWER3", + "S_PGBUSH", + "S_DHPILLAR", + #ifdef SEENAMES "S_NAMECHECK", #endif @@ -7473,6 +7489,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_KARMAWHEEL", // Various plants + "MT_SONICBUSH", "MT_SHRUB", "MT_TALLBUSH", "MT_AZURECITYTREE", @@ -7498,6 +7515,21 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_PETSMOKE", "MT_VVVAPE", + // Hill Top Zone + "MT_HTZTREE", + "MT_HTZBUSH", + + // Ports of gardens + "MT_SGVINE1", + "MT_SGVINE2", + "MT_SGVINE3", + "MT_PGTREE", + "MT_PGFLOWER1", + "MT_PGFLOWER2", + "MT_PGFLOWER3", + "MT_PGBUSH", + "MT_DHPILLAR", + #ifdef SEENAMES "MT_NAMECHECK", #endif diff --git a/src/info.c b/src/info.c index b885084d..617975b0 100644 --- a/src/info.c +++ b/src/info.c @@ -61,8 +61,9 @@ char sprnames[NUMSPRITES + 1][5] = "DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM", "SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB", "ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK", - "LZI1","LZI2","KLIT","PALM","SHRB","TWEE","MARB","FUFO","RUST","BLON", - "VAPE", + "LZI1","LZI2","KLIT","SBUS","SHRB","TWEE","MARB","FUFO","RUST","BLON", + "VAPE","HTZA","HTZB","SGVA","SGVB","SGVC","PGTR","PGF1","PGF2","PGF3", + "PGBH","DPLR", "XMS4","XMS5", "VIEW" }; @@ -3074,6 +3075,7 @@ state_t states[NUMSTATES] = {SPR_NULL, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT1}, // S_KLIT12 // Various plants + {SPR_SBUS, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SONICBUSH {SPR_SHRB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SHRUB {SPR_BUS2, 1, -1, {NULL}, 0, 0, S_NULL}, // S_TALLBUSH {SPR_TWEE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_AZURECITYTREE @@ -3113,6 +3115,21 @@ state_t states[NUMSTATES] = {SPR_VAPE, 4, 35, {A_BubbleRise}, 0, 50096, S_NULL}, // S_VVVAPING5 {SPR_VAPE, FF_ANIMATE|FF_TRANS30, -1, {NULL}, 6, 6, S_NULL}, // S_VVVAPE + // Hill Top Zone + {SPR_HTZA, 0, -1, {A_SetScale}, 2*FRACUNIT, 0, S_NULL}, // S_HTZTREE + {SPR_HTZB, 0, -1, {A_SetScale}, 2*FRACUNIT, 0, S_NULL}, // S_HTZBUSH + + // Ports of gardens + {SPR_SGVA, 0, 1, {NULL}, 0, 0, S_NULL}, // S_SGVINE1 + {SPR_SGVB, 0, 1, {NULL}, 0, 0, S_NULL}, // S_SGVINE2 + {SPR_SGVC, 0, 1, {NULL}, 0, 0, S_NULL}, // S_SGVINE3 + {SPR_PGTR, 0, 1, {NULL}, 0, 0, S_NULL}, // S_PGTREE + {SPR_PGF1, 0, 1, {NULL}, 0, 0, S_NULL}, // S_PGFLOWER1 + {SPR_PGF2, 0, 1, {NULL}, 0, 0, S_NULL}, // S_PGFLOWER2 + {SPR_PGF3, 0, 1, {NULL}, 0, 0, S_NULL}, // S_PGFLOWER3 + {SPR_PGBH, 0, 1, {NULL}, 0, 0, S_NULL}, // S_PGBUSH + {SPR_DPLR, 0, 1, {NULL}, 0, 0, S_NULL}, // S_DHPILLAR + #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK #endif @@ -17366,6 +17383,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_SONICBUSH, + 715, // doomednum + S_SONICBUSH, // 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 + 0, // speed + 192*FRACUNIT, // radius + 922*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOTHINK|MF_SOLID, // flags + S_NULL // raisestate + }, + { // MT_SHRUB, 4022, // doomednum S_SHRUB, // spawnstate @@ -17744,6 +17788,303 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_HTZTREE + 716, // doomednum + S_HTZTREE, // 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 + 0, // speed + 5*FRACUNIT, // radius + 204*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SCENERY|MF_SOLID|MF_RUNSPAWNFUNC|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + + { // MT_HTZBUSH + 717, // doomednum + S_HTZBUSH, // 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 + 0, // speed + 24*FRACUNIT, // radius + 38*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOTHINK|MF_SCENERY|MF_RUNSPAWNFUNC, // flags + S_NULL // raisestate + }, + + { // MT_SGVINE1 + 718, // doomednum + S_SGVINE1, // 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 + 0, // speed + 32*FRACUNIT, // radius + 256*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_SGVINE2 + 719, // doomednum + S_SGVINE2, // 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 + 0, // speed + 17*FRACUNIT, // radius + 48*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOTHINK|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_SGVINE3 + 720, // doomednum + S_SGVINE3, // 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 + 0, // speed + 17*FRACUNIT, // radius + 48*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOTHINK|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_PGTREE + 711, // doomednum + S_PGTREE, // 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 + 0, // speed + 30*FRACUNIT, // radius + 504*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_PGFLOWER1 + 712, // doomednum + S_PGFLOWER1, // 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 + 0, // speed + 17*FRACUNIT, // radius + 48*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOTHINK|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_PGFLOWER2 + 713, // doomednum + S_PGFLOWER2, // 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 + 0, // speed + 17*FRACUNIT, // radius + 48*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOTHINK|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_PGFLOWER3 + 714, // doomednum + S_PGFLOWER3, // 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 + 0, // speed + 17*FRACUNIT, // radius + 48*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOTHINK|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_PGBUSH + 715, // doomednum + S_PGBUSH, // 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 + 0, // speed + 384*FRACUNIT, // radius + 922*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_DHPILLAR + 1960, // doomednum + S_DHPILLAR, // 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 + 0, // speed + 58*FRACUNIT, // radius + 256*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOTHINK|MF_NOBLOCKMAP|MF_NOCLIP, // flags + S_NULL // raisestate + }, + // ============================================================================================================================// #ifdef SEENAMES diff --git a/src/info.h b/src/info.h index 237cc451..53f8b507 100644 --- a/src/info.h +++ b/src/info.h @@ -655,7 +655,7 @@ typedef enum sprite SPR_KLIT, // You have a twisted mind. But this actually is for the diagonal lightning. // Various plants - SPR_PALM, + SPR_SBUS, SPR_SHRB, SPR_TWEE, @@ -668,6 +668,21 @@ typedef enum sprite SPR_VAPE, // Volcanic Valley + // Hill Top Zone + SPR_HTZA, + SPR_HTZB, + + // Ports of gardens + SPR_SGVA, + SPR_SGVB, + SPR_SGVC, + SPR_PGTR, + SPR_PGF1, + SPR_PGF2, + SPR_PGF3, + SPR_PGBH, + SPR_DPLR, + // Xmas-specific sprites that don't fit aboxe SPR_XMS4, SPR_XMS5, @@ -3637,6 +3652,7 @@ typedef enum state S_KLIT12, // Various plants + S_SONICBUSH, S_SHRUB, S_TALLBUSH, S_AZURECITYTREE, @@ -3676,6 +3692,21 @@ typedef enum state S_VVVAPING5, S_VVVAPE, + // Hill Top Zone + S_HTZTREE, + S_HTZBUSH, + + // Ports of gardens + S_SGVINE1, + S_SGVINE2, + S_SGVINE3, + S_PGTREE, + S_PGFLOWER1, + S_PGFLOWER2, + S_PGFLOWER3, + S_PGBUSH, + S_DHPILLAR, + #ifdef SEENAMES S_NAMECHECK, #endif @@ -4351,6 +4382,7 @@ typedef enum mobj_type MT_KARMAWHEEL, // Various plants + MT_SONICBUSH, MT_SHRUB, MT_TALLBUSH, MT_AZURECITYTREE, @@ -4376,6 +4408,21 @@ typedef enum mobj_type MT_PETSMOKE, MT_VVVAPE, + // Hill Top Zone + MT_HTZTREE, + MT_HTZBUSH, + + // Ports of gardens + MT_SGVINE1, + MT_SGVINE2, + MT_SGVINE3, + MT_PGTREE, + MT_PGFLOWER1, + MT_PGFLOWER2, + MT_PGFLOWER3, + MT_PGBUSH, + MT_DHPILLAR, + #ifdef SEENAMES MT_NAMECHECK, #endif From 03a4cca0b6bfe76c8300425f506227c19b2aedf6 Mon Sep 17 00:00:00 2001 From: toaster Date: Wed, 24 Oct 2018 21:48:09 +0100 Subject: [PATCH 15/80] SPR_VAPE on S_VVVAPING1 --- src/info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index 617975b0..daf16609 100644 --- a/src/info.c +++ b/src/info.c @@ -3108,7 +3108,7 @@ state_t states[NUMSTATES] = {SPR_SMOK, 3, 25, {A_BubbleRise}, 0, 50096, S_PETSMOKE5}, // S_PETSMOKE4 {SPR_SMOK, 4, 35, {A_BubbleRise}, 0, 50096, S_NULL}, // S_PETSMOKE5 {SPR_VAPE, 0, 1, {NULL}, 0, 0, S_VVVAPING1}, // S_VVVAPING0 - {SPR_SMOK, 0, 5, {A_SetScale}, FRACUNIT*2, 1, S_VVVAPING2}, // S_VVVAPING1 + {SPR_VAPE, 0, 5, {A_SetScale}, FRACUNIT*2, 1, S_VVVAPING2}, // S_VVVAPING1 {SPR_VAPE, 1, 5, {A_BubbleRise}, 0, 50096, S_VVVAPING3}, // S_VVVAPING2 {SPR_VAPE, 2, 15, {A_BubbleRise}, 0, 50096, S_VVVAPING4}, // S_VVVAPING3 {SPR_VAPE, 3, 25, {A_BubbleRise}, 0, 50096, S_VVVAPING5}, // S_VVVAPING4 From d78368d4d2bef8317cbece2c91a64b38d2a7dcdb Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 27 Oct 2018 15:43:33 +0100 Subject: [PATCH 16/80] Felt like cleaning up the character frame list. Definitely won't merge conflict with anything else. Requires charscleanup.kart. Ezo, if you want me to, I can fix up bonuschars for this tweaked system. --- src/d_main.c | 2 +- src/info.c | 46 +++++++++++++++++++++++----------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index e1bcce8c..500f6116 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -954,7 +954,7 @@ static void IdentifyVersion(void) // SRB2kart - Add graphics (temp) // The command for md5 checks is "W_VerifyFileMD5" - looks for ASSET_HASH_SRB2_SRB in config.h.in D_AddFile(va(pandf,srb2waddir,"gfx.kart")); - D_AddFile(va(pandf,srb2waddir,"chars.kart")); + D_AddFile(va(pandf,srb2waddir,"charscleanup.kart")); D_AddFile(va(pandf,srb2waddir,"maps.kart")); //D_AddFile(va(pandf,srb2waddir,"sounds.kart")); MUSICTEST("sounds.kart") diff --git a/src/info.c b/src/info.c index cde74cee..5f699146 100644 --- a/src/info.c +++ b/src/info.c @@ -97,25 +97,25 @@ state_t states[NUMSTATES] = {SPR_PLAY, 3, 1, {NULL}, 0, 0, S_KART_STND1_L}, // S_KART_STND2_L D {SPR_PLAY, 4, 1, {NULL}, 0, 0, S_KART_STND2_R}, // S_KART_STND1_R E {SPR_PLAY, 5, 1, {NULL}, 0, 0, S_KART_STND1_R}, // S_KART_STND2_R F - {SPR_PLAY, 6, 1, {NULL}, 0, 0, S_KART_WALK2}, // S_KART_WALK1 G - {SPR_PLAY, 7, 1, {NULL}, 0, 0, S_KART_WALK1}, // S_KART_WALK2 H - {SPR_PLAY, 8, 1, {NULL}, 0, 0, S_KART_WALK2_L}, // S_KART_WALK1_L I - {SPR_PLAY, 9, 1, {NULL}, 0, 0, S_KART_WALK1_L}, // S_KART_WALK2_L J - {SPR_PLAY, 10, 1, {NULL}, 0, 0, S_KART_WALK2_R}, // S_KART_WALK1_R K - {SPR_PLAY, 11, 1, {NULL}, 0, 0, S_KART_WALK1_R}, // S_KART_WALK2_R L - {SPR_PLAY, 12, 1, {NULL}, 0, 0, S_KART_RUN2}, // S_KART_RUN1 M - {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_KART_RUN1}, // S_KART_RUN2 N - {SPR_PLAY, 14, 1, {NULL}, 0, 0, S_KART_RUN2_L}, // S_KART_RUN1_L O - {SPR_PLAY, 15, 1, {NULL}, 0, 0, S_KART_RUN1_L}, // S_KART_RUN2_L P - {SPR_PLAY, 16, 1, {NULL}, 0, 0, S_KART_RUN2_R}, // S_KART_RUN1_R Q - {SPR_PLAY, 17, 1, {NULL}, 0, 0, S_KART_RUN1_R}, // S_KART_RUN2_R R - {SPR_PLAY, 18, 1, {NULL}, 0, 0, S_KART_DRIFT2_L}, // S_KART_DRIFT1_L S - {SPR_PLAY, 19, 1, {NULL}, 0, 0, S_KART_DRIFT1_L}, // S_KART_DRIFT2_L T - {SPR_PLAY, 20, 1, {NULL}, 0, 0, S_KART_DRIFT2_R}, // S_KART_DRIFT1_R U - {SPR_PLAY, 21, 1, {NULL}, 0, 0, S_KART_DRIFT1_R}, // S_KART_DRIFT2_R V - {SPR_PLAY, 22, -1, {NULL}, 0, 0, S_KART_SPIN}, // S_KART_SPIN W - {SPR_PLAY, 22, 350, {NULL}, 0, 0, S_KART_STND1}, // S_KART_PAIN W - {SPR_PLAY, 23, 350, {NULL}, 0, 0, S_KART_STND1}, // S_KART_SQUISH X + {SPR_PLAY, 6, 1, {NULL}, 0, 0, S_KART_WALK2}, // S_KART_WALK1 A + {SPR_PLAY, 7, 1, {NULL}, 0, 0, S_KART_WALK1}, // S_KART_WALK2 G + {SPR_PLAY, 8, 1, {NULL}, 0, 0, S_KART_WALK2_L}, // S_KART_WALK1_L C + {SPR_PLAY, 9, 1, {NULL}, 0, 0, S_KART_WALK1_L}, // S_KART_WALK2_L H + {SPR_PLAY, 10, 1, {NULL}, 0, 0, S_KART_WALK2_R}, // S_KART_WALK1_R E + {SPR_PLAY, 11, 1, {NULL}, 0, 0, S_KART_WALK1_R}, // S_KART_WALK2_R I + {SPR_PLAY, 12, 1, {NULL}, 0, 0, S_KART_RUN2}, // S_KART_RUN1 A + {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_KART_RUN1}, // S_KART_RUN2 J + {SPR_PLAY, 14, 1, {NULL}, 0, 0, S_KART_RUN2_L}, // S_KART_RUN1_L C + {SPR_PLAY, 15, 1, {NULL}, 0, 0, S_KART_RUN1_L}, // S_KART_RUN2_L K + {SPR_PLAY, 16, 1, {NULL}, 0, 0, S_KART_RUN2_R}, // S_KART_RUN1_R E + {SPR_PLAY, 17, 1, {NULL}, 0, 0, S_KART_RUN1_R}, // S_KART_RUN2_R L + {SPR_PLAY, 18, 1, {NULL}, 0, 0, S_KART_DRIFT2_L}, // S_KART_DRIFT1_L M + {SPR_PLAY, 19, 1, {NULL}, 0, 0, S_KART_DRIFT1_L}, // S_KART_DRIFT2_L N + {SPR_PLAY, 20, 1, {NULL}, 0, 0, S_KART_DRIFT2_R}, // S_KART_DRIFT1_R O + {SPR_PLAY, 21, 1, {NULL}, 0, 0, S_KART_DRIFT1_R}, // S_KART_DRIFT2_R P + {SPR_PLAY, 22, -1, {NULL}, 0, 0, S_KART_SPIN}, // S_KART_SPIN Q + {SPR_PLAY, 22, 350, {NULL}, 0, 0, S_KART_STND1}, // S_KART_PAIN Q + {SPR_PLAY, 23, 350, {NULL}, 0, 0, S_KART_STND1}, // S_KART_SQUISH R /* {SPR_PLAY, 0, 105, {NULL}, 0, 0, S_PLAY_TAP1}, // S_PLAY_STND {SPR_PLAY, 1, 16, {NULL}, 0, 0, S_PLAY_TAP2}, // S_PLAY_TAP1 @@ -178,14 +178,14 @@ state_t states[NUMSTATES] = // 1-Up Box Sprites (uses player sprite) // Kart: default to signpost just to ensure there are no missing sprite errors... - {SPR_PLAY, 24, 2, {NULL}, 0, 16, S_PLAY_BOX2}, // S_PLAY_BOX1 + {SPR_PLAY, 18, 2, {NULL}, 0, 16, S_PLAY_BOX2}, // S_PLAY_BOX1 {SPR_NULL, 0, 1, {NULL}, 0, 0, S_PLAY_BOX1}, // S_PLAY_BOX2 - {SPR_PLAY, 24, 4, {NULL}, 0, 4, S_PLAY_ICON2}, // S_PLAY_ICON1 + {SPR_PLAY, 18, 4, {NULL}, 0, 4, S_PLAY_ICON2}, // S_PLAY_ICON1 {SPR_NULL, 0, 12, {NULL}, 0, 0, S_PLAY_ICON3}, // S_PLAY_ICON2 - {SPR_PLAY, 24, 18, {NULL}, 0, 4, S_NULL}, // S_PLAY_ICON3 + {SPR_PLAY, 18, 18, {NULL}, 0, 4, S_NULL}, // S_PLAY_ICON3 // Level end sign (uses player sprite) - {SPR_PLAY, 24, 1, {NULL}, 0, 24, S_PLAY_SIGN}, // S_PLAY_SIGN + {SPR_PLAY, 18, 1, {NULL}, 0, 18, S_PLAY_SIGN}, // S_PLAY_SIGN S // Blue Crawla {SPR_POSS, 0, 5, {A_Look}, 0, 0, S_POSS_STND}, // S_POSS_STND From bd36816b395de675e267846b0f57d87cb85ebd99 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 27 Oct 2018 16:25:25 +0100 Subject: [PATCH 17/80] dumbass who forgot to stage most of the actual changes because she actually deleted all the changes and then remade them by accident --- src/info.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/info.c b/src/info.c index 5f699146..ea2240f4 100644 --- a/src/info.c +++ b/src/info.c @@ -97,25 +97,25 @@ state_t states[NUMSTATES] = {SPR_PLAY, 3, 1, {NULL}, 0, 0, S_KART_STND1_L}, // S_KART_STND2_L D {SPR_PLAY, 4, 1, {NULL}, 0, 0, S_KART_STND2_R}, // S_KART_STND1_R E {SPR_PLAY, 5, 1, {NULL}, 0, 0, S_KART_STND1_R}, // S_KART_STND2_R F - {SPR_PLAY, 6, 1, {NULL}, 0, 0, S_KART_WALK2}, // S_KART_WALK1 A - {SPR_PLAY, 7, 1, {NULL}, 0, 0, S_KART_WALK1}, // S_KART_WALK2 G - {SPR_PLAY, 8, 1, {NULL}, 0, 0, S_KART_WALK2_L}, // S_KART_WALK1_L C - {SPR_PLAY, 9, 1, {NULL}, 0, 0, S_KART_WALK1_L}, // S_KART_WALK2_L H - {SPR_PLAY, 10, 1, {NULL}, 0, 0, S_KART_WALK2_R}, // S_KART_WALK1_R E - {SPR_PLAY, 11, 1, {NULL}, 0, 0, S_KART_WALK1_R}, // S_KART_WALK2_R I - {SPR_PLAY, 12, 1, {NULL}, 0, 0, S_KART_RUN2}, // S_KART_RUN1 A - {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_KART_RUN1}, // S_KART_RUN2 J - {SPR_PLAY, 14, 1, {NULL}, 0, 0, S_KART_RUN2_L}, // S_KART_RUN1_L C - {SPR_PLAY, 15, 1, {NULL}, 0, 0, S_KART_RUN1_L}, // S_KART_RUN2_L K - {SPR_PLAY, 16, 1, {NULL}, 0, 0, S_KART_RUN2_R}, // S_KART_RUN1_R E - {SPR_PLAY, 17, 1, {NULL}, 0, 0, S_KART_RUN1_R}, // S_KART_RUN2_R L - {SPR_PLAY, 18, 1, {NULL}, 0, 0, S_KART_DRIFT2_L}, // S_KART_DRIFT1_L M - {SPR_PLAY, 19, 1, {NULL}, 0, 0, S_KART_DRIFT1_L}, // S_KART_DRIFT2_L N - {SPR_PLAY, 20, 1, {NULL}, 0, 0, S_KART_DRIFT2_R}, // S_KART_DRIFT1_R O - {SPR_PLAY, 21, 1, {NULL}, 0, 0, S_KART_DRIFT1_R}, // S_KART_DRIFT2_R P - {SPR_PLAY, 22, -1, {NULL}, 0, 0, S_KART_SPIN}, // S_KART_SPIN Q - {SPR_PLAY, 22, 350, {NULL}, 0, 0, S_KART_STND1}, // S_KART_PAIN Q - {SPR_PLAY, 23, 350, {NULL}, 0, 0, S_KART_STND1}, // S_KART_SQUISH R + {SPR_PLAY, 0, 1, {NULL}, 0, 0, S_KART_WALK2}, // S_KART_WALK1 A + {SPR_PLAY, 6, 1, {NULL}, 0, 0, S_KART_WALK1}, // S_KART_WALK2 G + {SPR_PLAY, 2, 1, {NULL}, 0, 0, S_KART_WALK2_L}, // S_KART_WALK1_L C + {SPR_PLAY, 7, 1, {NULL}, 0, 0, S_KART_WALK1_L}, // S_KART_WALK2_L H + {SPR_PLAY, 4, 1, {NULL}, 0, 0, S_KART_WALK2_R}, // S_KART_WALK1_R E + {SPR_PLAY, 8, 1, {NULL}, 0, 0, S_KART_WALK1_R}, // S_KART_WALK2_R I + {SPR_PLAY, 0, 1, {NULL}, 0, 0, S_KART_RUN2}, // S_KART_RUN1 A + {SPR_PLAY, 9, 1, {NULL}, 0, 0, S_KART_RUN1}, // S_KART_RUN2 J + {SPR_PLAY, 2, 1, {NULL}, 0, 0, S_KART_RUN2_L}, // S_KART_RUN1_L C + {SPR_PLAY, 10, 1, {NULL}, 0, 0, S_KART_RUN1_L}, // S_KART_RUN2_L K + {SPR_PLAY, 4, 1, {NULL}, 0, 0, S_KART_RUN2_R}, // S_KART_RUN1_R E + {SPR_PLAY, 11, 1, {NULL}, 0, 0, S_KART_RUN1_R}, // S_KART_RUN2_R L + {SPR_PLAY, 12, 1, {NULL}, 0, 0, S_KART_DRIFT2_L}, // S_KART_DRIFT1_L M + {SPR_PLAY, 13, 1, {NULL}, 0, 0, S_KART_DRIFT1_L}, // S_KART_DRIFT2_L N + {SPR_PLAY, 14, 1, {NULL}, 0, 0, S_KART_DRIFT2_R}, // S_KART_DRIFT1_R O + {SPR_PLAY, 15, 1, {NULL}, 0, 0, S_KART_DRIFT1_R}, // S_KART_DRIFT2_R P + {SPR_PLAY, 16, -1, {NULL}, 0, 0, S_KART_SPIN}, // S_KART_SPIN Q + {SPR_PLAY, 16, 350, {NULL}, 0, 0, S_KART_STND1}, // S_KART_PAIN Q + {SPR_PLAY, 17, 350, {NULL}, 0, 0, S_KART_STND1}, // S_KART_SQUISH R /* {SPR_PLAY, 0, 105, {NULL}, 0, 0, S_PLAY_TAP1}, // S_PLAY_STND {SPR_PLAY, 1, 16, {NULL}, 0, 0, S_PLAY_TAP2}, // S_PLAY_TAP1 From 119c9f34ae525a867b6b6e9b5037e89a9667b53d Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 27 Oct 2018 21:30:20 +0100 Subject: [PATCH 18/80] Minor correction - Jeck initially got it wrong, but informed me after lots of testin's. --- src/info.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/info.c b/src/info.c index ea2240f4..48db114a 100644 --- a/src/info.c +++ b/src/info.c @@ -97,11 +97,11 @@ state_t states[NUMSTATES] = {SPR_PLAY, 3, 1, {NULL}, 0, 0, S_KART_STND1_L}, // S_KART_STND2_L D {SPR_PLAY, 4, 1, {NULL}, 0, 0, S_KART_STND2_R}, // S_KART_STND1_R E {SPR_PLAY, 5, 1, {NULL}, 0, 0, S_KART_STND1_R}, // S_KART_STND2_R F - {SPR_PLAY, 0, 1, {NULL}, 0, 0, S_KART_WALK2}, // S_KART_WALK1 A + {SPR_PLAY, 9, 1, {NULL}, 0, 0, S_KART_WALK2}, // S_KART_WALK1 J {SPR_PLAY, 6, 1, {NULL}, 0, 0, S_KART_WALK1}, // S_KART_WALK2 G - {SPR_PLAY, 2, 1, {NULL}, 0, 0, S_KART_WALK2_L}, // S_KART_WALK1_L C + {SPR_PLAY, 10, 1, {NULL}, 0, 0, S_KART_WALK2_L}, // S_KART_WALK1_L K {SPR_PLAY, 7, 1, {NULL}, 0, 0, S_KART_WALK1_L}, // S_KART_WALK2_L H - {SPR_PLAY, 4, 1, {NULL}, 0, 0, S_KART_WALK2_R}, // S_KART_WALK1_R E + {SPR_PLAY, 11, 1, {NULL}, 0, 0, S_KART_WALK2_R}, // S_KART_WALK1_R L {SPR_PLAY, 8, 1, {NULL}, 0, 0, S_KART_WALK1_R}, // S_KART_WALK2_R I {SPR_PLAY, 0, 1, {NULL}, 0, 0, S_KART_RUN2}, // S_KART_RUN1 A {SPR_PLAY, 9, 1, {NULL}, 0, 0, S_KART_RUN1}, // S_KART_RUN2 J From 4c7f083d1340353f37ae22028eec568f007e58b1 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 27 Oct 2018 22:23:44 +0100 Subject: [PATCH 19/80] toaster: not good at stuff (signpost z offset fix) --- src/info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index 48db114a..b8ed6550 100644 --- a/src/info.c +++ b/src/info.c @@ -185,7 +185,7 @@ state_t states[NUMSTATES] = {SPR_PLAY, 18, 18, {NULL}, 0, 4, S_NULL}, // S_PLAY_ICON3 // Level end sign (uses player sprite) - {SPR_PLAY, 18, 1, {NULL}, 0, 18, S_PLAY_SIGN}, // S_PLAY_SIGN S + {SPR_PLAY, 18, 1, {NULL}, 0, 24, S_PLAY_SIGN}, // S_PLAY_SIGN S // Blue Crawla {SPR_POSS, 0, 5, {A_Look}, 0, 0, S_POSS_STND}, // S_POSS_STND From a9b4a56d236b6939f1235f972d9c8785712aa54a Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 28 Oct 2018 16:27:55 +0000 Subject: [PATCH 20/80] Stupidbad-big commit, but PLEASE don't ask me to re-do this on another branch, I swear to god. I know it makes things more difficult on you, and I'm sorry for that, but I'm definitely feeling the goddamn crunch right now and I wanna take a step back from this spaghetti nightmare and clear my head. * Do that thing where the character icons are ALWAYS 1x sized, through having two seperate lumps. * Revamp the S_SKIN parameters to be `facerank` (rankings - equivalent of half-scale old face), `facewant` (WANTED - equivalent of old face), and `facemmap` (equivalent of old iconprefix). * Do that thing Oni wanted where it shows two postions above and two positions below your current ranking (and you) to the left of the screen, instead of always the top 4, with some limits to avoid drawing outside of everything. * Replace the last few shitty Mario numbers (for the left rankings) with cool, new Oni numbers. * Change a bunch of offsets and things so the tab rankings and the intermission work nicer with 9+ players. --- src/hu_stuff.c | 39 +++++++-------- src/hu_stuff.h | 1 - src/k_kart.c | 125 +++++++++++++++++++--------------------------- src/k_kart.h | 2 - src/lua_skinlib.c | 30 +++++------ src/m_menu.c | 97 +++++++++++++++++------------------ src/p_setup.c | 1 - src/r_things.c | 46 ++++++----------- src/r_things.h | 5 +- src/st_stuff.c | 31 +++++------- src/st_stuff.h | 7 +-- src/y_inter.c | 39 +++++++-------- 12 files changed, 182 insertions(+), 241 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 4210b70e..c7315137 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -87,7 +87,6 @@ patch_t *rmatcico; patch_t *bmatcico; patch_t *tagico; patch_t *tallminus; -patch_t *iconprefix[MAXSKINS]; // minimap icons //------------------------------------------- // coop hud @@ -2281,9 +2280,9 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I V_DrawFill(1, 26, 318, 1, 0); // Draw a horizontal line because it looks nice! if (scorelines > 8) { - V_DrawFill(160, 26, 1, 154, 0); // Draw a vertical line to separate the two sides. - V_DrawFill(1, 180, 318, 1, 0); // And a horizontal line near the bottom. - rightoffset = 156; + V_DrawFill(160, 26, 1, 147, 0); // Draw a vertical line to separate the two sides. + V_DrawFill(1, 173, 318, 1, 0); // And a horizontal line near the bottom. + rightoffset = (BASEVIDWIDTH/2) - 4 - x; } for (i = 0; i < scorelines; i++) @@ -2318,8 +2317,8 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I else colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo->color, GTC_CACHE); - V_DrawSmallMappedPatch(x, y-4, 0, faceprefix[players[tab[i].num].skin], colormap); - if (G_BattleGametype() && players[tab[i].num].kartstuff[k_bumper] > 0) + V_DrawMappedPatch(x, y-4, 0, facerankprefix[players[tab[i].num].skin], colormap); + /*if (G_BattleGametype() && players[tab[i].num].kartstuff[k_bumper] > 0) -- doesn't physically fit... { INT32 bumperx = x-5; for (j = 0; j < players[tab[i].num].kartstuff[k_bumper]; j++) @@ -2327,7 +2326,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I bumperx -= 3; V_DrawSmallMappedPatch(bumperx, y+6, 0, W_CachePatchName("K_BLNICO", PU_CACHE), colormap); } - } + }*/ } if (G_BattleGametype() && players[tab[i].num].kartstuff[k_bumper] <= 0) @@ -2347,11 +2346,11 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I else V_DrawRightAlignedString(x+rightoffset, y, 0, va("%u", tab[i].count)); - y += 16; + y += 18; if (i == 7) { - y = 32; - x += BASEVIDWIDTH/2; + y = 33; + x = (BASEVIDWIDTH/2) + 4; } } } @@ -2416,15 +2415,15 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (players[tab[i].num].powers[pw_super]) { colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE); - V_DrawSmallMappedPatch (x, y-4, 0, superprefix[players[tab[i].num].skin], colormap); + V_DrawSmallMappedPatch (x, y-4, 0, facewantprefix[players[tab[i].num].skin], colormap); } else { colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE); if (players[tab[i].num].health <= 0) - V_DrawSmallTranslucentMappedPatch (x, y-4, 0, faceprefix[players[tab[i].num].skin], colormap); + V_DrawSmallTranslucentMappedPatch (x, y-4, 0, facerankprefix[players[tab[i].num].skin], colormap); else - V_DrawSmallMappedPatch (x, y-4, 0, faceprefix[players[tab[i].num].skin], colormap); + V_DrawSmallMappedPatch (x, y-4, 0, facerankprefix[players[tab[i].num].skin], colormap); } V_DrawRightAlignedThinString(x+120, y-1, ((players[tab[i].num].health > 0) ? 0 : V_TRANSLUCENT), va("%u", tab[i].count)); if (!splitscreen) @@ -2478,13 +2477,13 @@ void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scoreline { colormap = colormaps; if (players[tab[i].num].powers[pw_super]) - V_DrawSmallScaledPatch (x, y-4, 0, superprefix[players[tab[i].num].skin]); + V_DrawSmallScaledPatch (x, y-4, 0, facewantprefix[players[tab[i].num].skin]); else { if (players[tab[i].num].health <= 0) - V_DrawSmallTranslucentPatch (x, y-4, 0, faceprefix[players[tab[i].num].skin]); + V_DrawSmallTranslucentPatch (x, y-4, 0, facerankprefix[players[tab[i].num].skin]); else - V_DrawSmallScaledPatch (x, y-4, 0, faceprefix[players[tab[i].num].skin]); + V_DrawSmallScaledPatch (x, y-4, 0, facerankprefix[players[tab[i].num].skin]); } } else @@ -2492,15 +2491,15 @@ void HU_DrawDualTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scoreline if (players[tab[i].num].powers[pw_super]) { colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE); - V_DrawSmallMappedPatch (x, y-4, 0, superprefix[players[tab[i].num].skin], colormap); + V_DrawSmallMappedPatch (x, y-4, 0, facewantprefix[players[tab[i].num].skin], colormap); } else { colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo ? players[tab[i].num].mo->color : tab[i].color, GTC_CACHE); if (players[tab[i].num].health <= 0) - V_DrawSmallTranslucentMappedPatch (x, y-4, 0, faceprefix[players[tab[i].num].skin], colormap); + V_DrawSmallTranslucentMappedPatch (x, y-4, 0, facerankprefix[players[tab[i].num].skin], colormap); else - V_DrawSmallMappedPatch (x, y-4, 0, faceprefix[players[tab[i].num].skin], colormap); + V_DrawSmallMappedPatch (x, y-4, 0, facerankprefix[players[tab[i].num].skin], colormap); } } @@ -2778,7 +2777,7 @@ static void HU_DrawRankings(void) /*if (G_GametypeHasTeams()) HU_DrawTeamTabRankings(tab, whiteplayer); //separate function for Spazzo's silly request -- gotta fix this up later else if (scorelines > 10)*/ - HU_DrawTabRankings(((scorelines > 8) ? 32 : 40), 32, tab, scorelines, whiteplayer, hilicol); + HU_DrawTabRankings(((scorelines > 8) ? 32 : 40), 33, tab, scorelines, whiteplayer, hilicol); /*else HU_DrawDualTabRankings(32, 32, tab, scorelines, whiteplayer);*/ diff --git a/src/hu_stuff.h b/src/hu_stuff.h index f21af8bf..a9194975 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -76,7 +76,6 @@ extern patch_t *rmatcico; extern patch_t *bmatcico; extern patch_t *tagico; extern patch_t *tallminus; -extern patch_t *iconprefix[MAXSKINS]; #define CHAT_BUFSIZE 64 // that's enough messages, right? We'll delete the older ones when that gets out of hand. diff --git a/src/k_kart.c b/src/k_kart.c index 76670f17..26fa600b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5507,11 +5507,7 @@ static patch_t *kp_racefinish[2]; static patch_t *kp_positionnum[NUMPOSNUMS][NUMPOSFRAMES]; static patch_t *kp_winnernum[NUMPOSFRAMES]; -static patch_t *kp_facenull; -static patch_t *kp_facefirst; -static patch_t *kp_facesecond; -static patch_t *kp_facethird; -static patch_t *kp_facefourth; +static patch_t *kp_facenum[MAXPLAYERS+1]; static patch_t *kp_rankbumper; static patch_t *kp_ranknobumpers; @@ -5613,11 +5609,13 @@ void K_LoadKartHUDGraphics(void) kp_winnernum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); } - kp_facenull = W_CachePatchName("K_PFACE0", PU_HUDGFX); - kp_facefirst = W_CachePatchName("K_PFACE1", PU_HUDGFX); - kp_facesecond = W_CachePatchName("K_PFACE2", PU_HUDGFX); - kp_facethird = W_CachePatchName("K_PFACE3", PU_HUDGFX); - kp_facefourth = W_CachePatchName("K_PFACE4", PU_HUDGFX); + sprintf(buffer, "OPPRNKxx"); + for (i = 0; i <= MAXPLAYERS; i++) + { + buffer[6] = '0'+(i/10); + buffer[7] = '0'+(i%10); + kp_facenum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + } // Extra ranking icons kp_rankbumper = W_CachePatchName("K_BLNICO", PU_HUDGFX); @@ -6374,12 +6372,11 @@ static boolean K_drawKartPositionFaces(void) // FACE_Y = 72; // 72 INT32 Y = FACE_Y+9; // +9 to offset where it's being drawn if there are more than one - INT32 i, j, ranklines; + INT32 i, j, ranklines, strank = 0; boolean completed[MAXPLAYERS]; INT32 rankplayer[MAXPLAYERS]; INT32 bumperx, numplayersingame = 0; UINT8 *colormap; - patch_t *localpatch = kp_facenull; ranklines = 0; memset(completed, 0, sizeof (completed)); @@ -6402,7 +6399,7 @@ static boolean K_drawKartPositionFaces(void) { for (i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i] && completed[i] == false && players[i].mo && !players[i].spectator + if (playeringame[i] && !completed[i] && players[i].mo && !players[i].spectator && (rankplayer[ranklines] < 0 || players[i].kartstuff[k_position] < players[rankplayer[ranklines]].kartstuff[k_position])) { rankplayer[ranklines] = i; @@ -6412,15 +6409,35 @@ static boolean K_drawKartPositionFaces(void) completed[i] = true; - if (ranklines == 4) - break; // Only draw the top 4 players + if (players+i == stplyr) + strank = ranklines; + + //if (ranklines == 5) + //break; // Only draw the top 5 players -- we do this a different way now... ranklines++; } - Y -= (9*ranklines); + if (ranklines < 5) + Y -= (9*ranklines); + else + Y -= (9*5); - for (i = 0; i < ranklines; i++) + if (strank <= 2) // too close to the top? + { + i = 0; + if (ranklines > 5) // could be both... + ranklines = 5; + } + else if (strank+3 > ranklines) // too close to the bottom? + i = ranklines - 5; + else + { + i = strank-2; + ranklines = strank+3; + } + + for (; i < ranklines; i++) { if (players[rankplayer[i]].spectator) continue; // Spectators are ignored if (!players[rankplayer[i]].mo) continue; @@ -6435,7 +6452,7 @@ static boolean K_drawKartPositionFaces(void) else colormap = R_GetTranslationColormap(players[rankplayer[i]].skin, players[rankplayer[i]].mo->color, GTC_CACHE); - V_DrawSmallMappedPatch(FACE_X, Y, V_HUDTRANS|V_SNAPTOLEFT, faceprefix[players[rankplayer[i]].skin], colormap); + V_DrawMappedPatch(FACE_X, Y, V_HUDTRANS|V_SNAPTOLEFT, facerankprefix[players[rankplayer[i]].skin], colormap); if (G_BattleGametype() && players[rankplayer[i]].kartstuff[k_bumper] > 0) { for (j = 0; j < players[rankplayer[i]].kartstuff[k_bumper]; j++) @@ -6446,20 +6463,16 @@ static boolean K_drawKartPositionFaces(void) } } - // Draws the little number over the face - switch (players[rankplayer[i]].kartstuff[k_position]) - { - case 1: localpatch = kp_facefirst; break; - case 2: localpatch = kp_facesecond; break; - case 3: localpatch = kp_facethird; break; - case 4: localpatch = kp_facefourth; break; - default: break; - } - if (G_BattleGametype() && players[rankplayer[i]].kartstuff[k_bumper] <= 0) V_DrawSmallScaledPatch(FACE_X-2, Y, V_HUDTRANS|V_SNAPTOLEFT, kp_ranknobumpers); else - V_DrawSmallScaledPatch(FACE_X, Y, V_HUDTRANS|V_SNAPTOLEFT, localpatch); + { + INT32 pos = players[rankplayer[i]].kartstuff[k_position]; + if (pos < 0 || pos > MAXPLAYERS) + pos = 0; + // Draws the little number over the face + V_DrawScaledPatch(FACE_X-5, Y+10, V_HUDTRANS|V_SNAPTOLEFT, kp_facenum[pos]); + } Y += 18; } @@ -6605,7 +6618,7 @@ static void K_drawKartWanted(void) for (i = 0; i < numwanted; i++) { - INT32 x = WANT_X+7, y = WANT_Y+20; + INT32 x = WANT_X+8, y = WANT_Y+21; fixed_t scale = FRACUNIT/2; player_t *p = &players[battlewanted[i]]; @@ -6613,24 +6626,19 @@ static void K_drawKartWanted(void) break; if (numwanted == 1) - { - x++; //y++; scale = FRACUNIT; - } else { if (i & 1) - x += 18; + x += 16; if (i > 1) - y += 17; + y += 16; } - if (players[battlewanted[i]].skincolor == 0) - V_DrawFixedPatch(x<skin], NULL); - else + if (players[battlewanted[i]].skincolor) { colormap = R_GetTranslationColormap(TC_RAINBOW, p->skincolor, GTC_CACHE); - V_DrawFixedPatch(x<skin], colormap); + V_DrawFixedPatch(x<skin] : facerankprefix[p->skin]), colormap); } } } @@ -6685,35 +6693,6 @@ static void K_drawKartPlayerCheck(void) } } -void K_LoadIconGraphics(char *facestr, INT32 skinnum) -{ - char namelump[9]; - - // hack: make sure base face name is no more than 8 chars - if (strlen(facestr) > 8) - facestr[8] = '\0'; - strcpy(namelump, facestr); // copy base name - - iconprefix[skinnum] = W_CachePatchName(namelump, PU_HUDGFX); - iconfreed[skinnum] = false; -} - -#if 0 //unused -static void K_UnLoadIconGraphics(INT32 skinnum) -{ - Z_Free(iconprefix[skinnum]); - iconfreed[skinnum] = true; -} -#endif - -void K_ReloadSkinIconGraphics(void) -{ - INT32 i; - - for (i = 0; i < numskins; i++) - K_LoadIconGraphics(skins[i].iconprefix, i); -} - static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, patch_t *AutomapPic) { // amnum xpos & ypos are the icon's speed around the HUD. @@ -6780,18 +6759,18 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, pat if (encoremode) amnumxpos = -amnumxpos; - amxpos = amnumxpos + ((x + AutomapPic->width/2 - (iconprefix[skin]->width/2))<height/2 - (iconprefix[skin]->height/2))<width/2 - (facemmapprefix[skin]->width/2))<height/2 - (facemmapprefix[skin]->height/2))<width/2 + (iconprefix[skin]->width/2))<width/2 + (facemmapprefix[skin]->width/2))<color) // 'default' color - V_DrawSciencePatch(amxpos, amypos, flags, iconprefix[skin], FRACUNIT); + V_DrawSciencePatch(amxpos, amypos, flags, facemmapprefix[skin], FRACUNIT); else { UINT8 *colormap; @@ -6799,7 +6778,7 @@ static void K_drawKartMinimapHead(mobj_t *mo, INT32 x, INT32 y, INT32 flags, pat colormap = R_GetTranslationColormap(TC_RAINBOW, mo->color, 0); else colormap = R_GetTranslationColormap(skin, mo->color, 0); - V_DrawFixedPatch(amxpos, amypos, FRACUNIT, flags, iconprefix[skin], colormap); + V_DrawFixedPatch(amxpos, amypos, FRACUNIT, flags, facemmapprefix[skin], colormap); } } diff --git a/src/k_kart.h b/src/k_kart.h index 671efb89..6b470632 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -67,8 +67,6 @@ fixed_t K_FindCheckX(fixed_t px, fixed_t py, angle_t ang, fixed_t mx, fixed_t my void K_drawKartHUD(void); void K_drawKartFreePlay(UINT32 flashtime); void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, boolean playing); -void K_LoadIconGraphics(char *facestr, INT32 skinnum); -void K_ReloadSkinIconGraphics(void); // ========================================================================= #endif // __K_KART__ diff --git a/src/lua_skinlib.c b/src/lua_skinlib.c index a267d998..7223e8db 100644 --- a/src/lua_skinlib.c +++ b/src/lua_skinlib.c @@ -27,9 +27,9 @@ enum skin { skin_flags, skin_realname, skin_hudname, - skin_charsel, - skin_face, - skin_superface, + skin_facerank, + skin_facewant, + skin_facemmap, skin_ability, skin_ability2, skin_thokitem, @@ -61,9 +61,9 @@ static const char *const skin_opt[] = { "flags", "realname", "hudname", - "charsel", - "face", - "superface", + "facerank", + "facewant", + "facemmap", "ability", "ability2", "thokitem", @@ -121,23 +121,23 @@ static int skin_get(lua_State *L) case skin_hudname: lua_pushstring(L, skin->hudname); break; - case skin_charsel: + case skin_facerank: for (i = 0; i < 8; i++) - if (!skin->charsel[i]) + if (!skin->facerank[i]) break; - lua_pushlstring(L, skin->charsel, i); + lua_pushlstring(L, skin->facerank, i); break; - case skin_face: + case skin_facewant: for (i = 0; i < 8; i++) - if (!skin->face[i]) + if (!skin->facewant[i]) break; - lua_pushlstring(L, skin->face, i); + lua_pushlstring(L, skin->facewant, i); break; - case skin_superface: + case skin_facemmap: for (i = 0; i < 8; i++) - if (!skin->superface[i]) + if (!skin->facemmap[i]) break; - lua_pushlstring(L, skin->superface, i); + lua_pushlstring(L, skin->facemmap, i); break; case skin_ability: lua_pushinteger(L, skin->ability); diff --git a/src/m_menu.c b/src/m_menu.c index 1827bf7b..ed430cdb 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -151,8 +151,8 @@ description_t description[32] = {"???", "", ""}, {"???", "", ""} }; -static char *char_notes = NULL; -static fixed_t char_scroll = 0; +//static char *char_notes = NULL; +//static fixed_t char_scroll = 0; boolean menuactive = false; boolean fromlevelselect = false; @@ -173,7 +173,7 @@ static char joystickInfo[8][25]; static UINT32 serverlistpage; #endif -static saveinfo_t savegameinfo[MAXSAVEGAMES]; // Extra info about the save games. +//static saveinfo_t savegameinfo[MAXSAVEGAMES]; // Extra info about the save games. INT16 startmap; // Mario, NiGHTS, or just a plain old normal game? @@ -219,10 +219,10 @@ menu_t SPauseDef; //static void M_CustomLevelSelect(INT32 choice); //static void M_CustomWarp(INT32 choice); FUNCNORETURN static ATTRNORETURN void M_UltimateCheat(INT32 choice); -static void M_LoadGameLevelSelect(INT32 choice); +//static void M_LoadGameLevelSelect(INT32 choice); static void M_GetAllEmeralds(INT32 choice); static void M_DestroyRobots(INT32 choice); -static void M_LevelSelectWarp(INT32 choice); +//static void M_LevelSelectWarp(INT32 choice); static void M_Credits(INT32 choice); static void M_PandorasBox(INT32 choice); static void M_EmblemHints(INT32 choice); @@ -244,7 +244,7 @@ static void M_ConfirmTeamScramble(INT32 choice); static void M_ConfirmTeamChange(INT32 choice); static void M_ConfirmSpectateChange(INT32 choice); //static void M_SecretsMenu(INT32 choice); -static void M_SetupChoosePlayer(INT32 choice); +//static void M_SetupChoosePlayer(INT32 choice); static void M_QuitSRB2(INT32 choice); menu_t SP_MainDef, MP_MainDef, OP_MainDef; menu_t MISC_ScrambleTeamDef, MISC_ChangeTeamDef, MISC_ChangeSpectateDef; @@ -262,7 +262,7 @@ static void M_ChooseTimeAttack(INT32 choice); static void M_ModeAttackRetry(INT32 choice); static void M_ModeAttackEndGame(INT32 choice); static void M_SetGuestReplay(INT32 choice); -static void M_ChoosePlayer(INT32 choice); +//static void M_ChoosePlayer(INT32 choice); menu_t SP_LevelStatsDef; static menu_t SP_TimeAttackDef, SP_ReplayDef, SP_GuestReplayDef, SP_GhostDef; //static menu_t SP_NightsAttackDef, SP_NightsReplayDef, SP_NightsGuestReplayDef, SP_NightsGhostDef; @@ -342,11 +342,11 @@ static void M_DrawPauseMenu(void); static void M_DrawLevelSelectOnly(boolean leftfade, boolean rightfade); static void M_DrawServerMenu(void); static void M_DrawImageDef(void); -static void M_DrawLoad(void); +//static void M_DrawLoad(void); static void M_DrawLevelStats(void); static void M_DrawTimeAttackMenu(void); //static void M_DrawNightsAttackMenu(void); -static void M_DrawSetupChoosePlayerMenu(void); +//static void M_DrawSetupChoosePlayerMenu(void); static void M_DrawControl(void); static void M_DrawVideoMenu(void); static void M_DrawHUDOptions(void); @@ -373,7 +373,7 @@ static boolean M_QuitMultiPlayerMenu(void); static void M_HandleAddons(INT32 choice); static void M_HandleSoundTest(INT32 choice); static void M_HandleImageDef(INT32 choice); -static void M_HandleLoadSave(INT32 choice); +//static void M_HandleLoadSave(INT32 choice); static void M_HandleLevelStats(INT32 choice); #ifndef NONET static void M_HandleConnectIP(INT32 choice); @@ -594,7 +594,7 @@ static menuitem_t SPauseMenu[] = // Pandora's Box will be shifted up if both options are available {IT_CALL | IT_STRING, NULL, "Pandora's Box...", M_PandorasBox, 16}, {IT_CALL | IT_STRING, NULL, "Emblem Hints...", M_EmblemHints, 24}, - {IT_CALL | IT_STRING, NULL, "Level Select...", M_LoadGameLevelSelect, 32}, + //{IT_CALL | IT_STRING, NULL, "Level Select...", M_LoadGameLevelSelect, 32}, {IT_CALL | IT_STRING, NULL, "Continue", M_SelectableClearMenus,48}, {IT_CALL | IT_STRING, NULL, "Retry", M_Retry, 56}, @@ -608,7 +608,7 @@ typedef enum { spause_pandora = 0, spause_hints, - spause_levelselect, + //spause_levelselect, spause_continue, spause_retry, @@ -726,11 +726,11 @@ static menuitem_t SR_MainMenu[] = }; -static menuitem_t SR_LevelSelectMenu[] = +/*static menuitem_t SR_LevelSelectMenu[] = { {IT_STRING|IT_CVAR, NULL, "Level", &cv_nextmap, 78}, {IT_WHITESTRING|IT_CALL, NULL, "Start", M_LevelSelectWarp, 130}, -}; +};*/ static menuitem_t SR_UnlockChecklistMenu[] = { @@ -766,7 +766,7 @@ enum }; // Single Player Load Game -static menuitem_t SP_LoadGameMenu[] = +/*static menuitem_t SP_LoadGameMenu[] = { {IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLoadSave, '\0'}, // dummy menuitem for the control func }; @@ -776,7 +776,7 @@ static menuitem_t SP_LevelSelectMenu[] = { {IT_STRING|IT_CVAR, NULL, "Level", &cv_nextmap, 78}, {IT_WHITESTRING|IT_CALL, NULL, "Start", M_LevelSelectWarp, 130}, -}; +};*/ // Single Player Time Attack static menuitem_t SP_TimeAttackMenu[] = @@ -906,6 +906,7 @@ static menuitem_t SP_LevelStatsMenu[] = // A rare case. // External files modify this menu, so we can't call it static. // And I'm too lazy to go through and rename it everywhere. ARRGH! +#define M_ChoosePlayer NULL menuitem_t PlayerMenu[32] = { {IT_CALL, NULL, NULL, M_ChoosePlayer, 0}, @@ -1677,7 +1678,7 @@ menu_t SR_MainDef = NULL }; -menu_t SR_LevelSelectDef = MAPICONMENUSTYLE(NULL, SR_LevelSelectMenu, &SR_MainDef); +//menu_t SR_LevelSelectDef = MAPICONMENUSTYLE(NULL, SR_LevelSelectMenu, &SR_MainDef); menu_t SR_UnlockChecklistDef = { @@ -1704,7 +1705,7 @@ menu_t SR_EmblemHintDef = // Single Player menu_t SP_MainDef = CENTERMENUSTYLE(NULL, SP_MainMenu, &MainDef, 72); -menu_t SP_LoadDef = +/*menu_t SP_LoadDef = { "M_PICKG", 1, @@ -1715,7 +1716,7 @@ menu_t SP_LoadDef = 0, NULL }; -menu_t SP_LevelSelectDef = MAPICONMENUSTYLE(NULL, SP_LevelSelectMenu, &SP_LoadDef); +menu_t SP_LevelSelectDef = MAPICONMENUSTYLE(NULL, SP_LevelSelectMenu, &SP_LoadDef);*/ menu_t SP_LevelStatsDef = { @@ -1820,7 +1821,7 @@ static menu_t SP_NightsGhostDef = };*/ -menu_t SP_PlayerDef = +/*menu_t SP_PlayerDef = { "M_PICKP", sizeof (PlayerMenu)/sizeof (menuitem_t),//player_end, @@ -1830,7 +1831,7 @@ menu_t SP_PlayerDef = 24, 32, 0, NULL -}; +};*/ #ifndef NONET // Multiplayer @@ -2629,21 +2630,21 @@ boolean M_Responder(event_t *ev) case KEY_DOWNARROW: M_NextOpt(); S_StartSound(NULL, sfx_menu1); - if (currentMenu == &SP_PlayerDef) + /*if (currentMenu == &SP_PlayerDef) { Z_Free(char_notes); char_notes = NULL; - } + }*/ return true; case KEY_UPARROW: M_PrevOpt(); S_StartSound(NULL, sfx_menu1); - if (currentMenu == &SP_PlayerDef) + /*if (currentMenu == &SP_PlayerDef) { Z_Free(char_notes); char_notes = NULL; - } + }*/ return true; case KEY_LEFTARROW: @@ -2885,7 +2886,7 @@ void M_StartControlPanel(void) } // We can always use level select though. :33 - SPauseMenu[spause_levelselect].status = (gamecomplete) ? (IT_STRING | IT_CALL) : (IT_DISABLED); + //SPauseMenu[spause_levelselect].status = (gamecomplete) ? (IT_STRING | IT_CALL) : (IT_DISABLED); // And emblem hints. SPauseMenu[spause_hints].status = (M_SecretUnlocked(SECRET_EMBLEMHINTS)) ? (IT_STRING | IT_CALL) : (IT_DISABLED); @@ -5055,7 +5056,7 @@ static void M_DestroyRobots(INT32 choice) M_StartMessage(M_GetText("Do you want to destroy all\nrobots in the current level?\n\n(Press 'Y' to confirm)\n"),M_DestroyRobotsResponse,MM_YESNO); } -static void M_LevelSelectWarp(INT32 choice) +/*static void M_LevelSelectWarp(INT32 choice) { boolean fromloadgame = (currentMenu == &SP_LevelSelectDef); @@ -5078,7 +5079,7 @@ static void M_LevelSelectWarp(INT32 choice) cursaveslot = -1; M_SetupChoosePlayer(0); } -} +}*/ // ======== // SKY ROOM @@ -5423,7 +5424,7 @@ static void M_HandleSoundTest(INT32 choice) // NEW GAME FUNCTIONS // ================== -INT32 ultimate_selectable = false; +/*INT32 ultimate_selectable = false; static void M_NewGame(void) { @@ -5433,7 +5434,7 @@ static void M_NewGame(void) CV_SetValue(&cv_newgametype, GT_RACE); // SRB2kart M_SetupChoosePlayer(0); -} +}*/ /*static void M_CustomWarp(INT32 choice) { @@ -5484,7 +5485,7 @@ static void M_SinglePlayerMenu(INT32 choice) M_SetupNextMenu(&SP_MainDef); } -static void M_LoadGameLevelSelect(INT32 choice) +/*static void M_LoadGameLevelSelect(INT32 choice) { (void)choice; levellistmode = LLM_LEVELSELECT; @@ -5499,13 +5500,13 @@ static void M_LoadGameLevelSelect(INT32 choice) M_PrepareLevelSelect(); M_SetupNextMenu(&SP_LevelSelectDef); -} +}*/ // ============== // LOAD GAME MENU // ============== -static INT32 saveSlotSelected = 0; +/*static INT32 saveSlotSelected = 0; static short menumovedir = 0; static void M_DrawLoadGameData(void) @@ -5904,13 +5905,13 @@ static void M_HandleLoadSave(INT32 choice) // // Selected from SRB2 menu // -/*static void M_LoadGame(INT32 choice) +static void M_LoadGame(INT32 choice) { (void)choice; M_ReadSaveStrings(); M_SetupNextMenu(&SP_LoadDef); -}*/ +} // // Used by cheats to force the save menu to a specific spot. @@ -6127,11 +6128,7 @@ static void M_ChoosePlayer(INT32 choice) G_DeferedInitNew(false, G_BuildMapName(startmap), (UINT8)skinnum, 0, fromlevelselect); COM_BufAddText("dummyconsvar 1\n"); // G_DeferedInitNew doesn't do this -} - -// =============== -// STATISTICS MENU -// =============== +}*/ // =============== // STATISTICS MENU @@ -6368,7 +6365,6 @@ void M_DrawTimeAttackMenu(void) { INT32 i, x, y, cursory = 0; UINT16 dispstatus; - patch_t *PictureOfUrFace; //S_ChangeMusicInternal("racent", true); // Eww, but needed for when user hits escape during demo playback @@ -6384,11 +6380,10 @@ void M_DrawTimeAttackMenu(void) y = currentMenu->y; // Character face! - if (W_CheckNumForName(skins[cv_chooseskin.value-1].face) != LUMPERROR) + if (W_CheckNumForName(skins[cv_chooseskin.value-1].facewant) != LUMPERROR) { UINT8 *colormap = R_GetTranslationColormap(cv_chooseskin.value-1, cv_playercolor.value, 0); - PictureOfUrFace = W_CachePatchName(skins[cv_chooseskin.value-1].face, PU_CACHE); - V_DrawMappedPatch(BASEVIDWIDTH-x - SHORT(PictureOfUrFace->width), y, 0, PictureOfUrFace, colormap); + V_DrawMappedPatch(BASEVIDWIDTH-x - SHORT(facewantprefix[cv_chooseskin.value-1]->width), y, 0, facewantprefix[cv_chooseskin.value-1], colormap); } for (i = 0; i < currentMenu->numitems; ++i) @@ -7676,7 +7671,6 @@ Update the maxplayers label... // player arrangement width, but there's also a chance i'm a furry, shhhhhh const INT32 paw = iconwidth + 3*incrwidth; INT32 trans = 0; - patch_t *face; UINT8 *colmap; x = BASEVIDWIDTH/2 - paw/2; y = currentMenu->y + 32; @@ -7711,15 +7705,13 @@ Update the maxplayers label... colmap = R_GetTranslationColormap(pskin, pcol, 0); - face = W_CachePatchName(skins[pskin].face, PU_CACHE); - V_DrawFixedPatch(x<= numskins) col -= numskins; x += FixedMul(iconwidth<realname, "Someone"); strcpy(skin->hudname, "???"); - strncpy(skin->charsel, "CHRSONIC", 9); - strncpy(skin->face, "MISSING", 9); - strncpy(skin->superface, "MISSING", 9); + strncpy(skin->facerank, "PLAYRANK", 9); + strncpy(skin->facewant, "PLAYWANT", 9); + strncpy(skin->facemmap, "PLAYICON", 9); skin->starttranscolor = 160; skin->prefcolor = SKINCOLOR_GREEN; @@ -2551,7 +2551,6 @@ static void Sk_SetDefaultValue(skin_t *skin) for (i = 0; i < sfx_skinsoundslot0; i++) if (S_sfx[i].skinsound != -1) skin->soundsid[S_sfx[i].skinsound] = i; - strncpy(skin->iconprefix, "SONICICN", 9); } // @@ -2584,9 +2583,9 @@ void R_InitSkins(void) strcpy(skin->realname, "Sonic"); strcpy(skin->hudname, "SONIC"); - strncpy(skin->charsel, "CHRSONIC", 9); - strncpy(skin->face, "LIVSONIC", 9); - strncpy(skin->superface, "LIVSUPER", 9); + strncpy(skin->facerank, "PLAYRANK", 9); + strncpy(skin->facewant, "PLAYWANT", 9); + strncpy(skin->facemmap, "PLAYICON", 9); skin->prefcolor = SKINCOLOR_BLUE; skin->ability = CA_THOK; @@ -2605,9 +2604,7 @@ void R_InitSkins(void) skin->spritedef.numframes = sprites[SPR_PLAY].numframes; skin->spritedef.spriteframes = sprites[SPR_PLAY].spriteframes; - ST_LoadFaceGraphics(skin->face, skin->superface, 0); - strncpy(skin->iconprefix, "SONICICN", 9); - K_LoadIconGraphics(skin->iconprefix, 0); + ST_LoadFaceGraphics(skin->facerank, skin->facewant, skin->facemmap, 0); //MD2 for sonic doesn't want to load in Linux. #ifdef HWRENDER @@ -2763,7 +2760,7 @@ void R_AddSkins(UINT16 wadnum) char *value; size_t size; skin_t *skin; - boolean hudname, realname, superface; + boolean hudname, realname; // // search for all skin markers in pwad @@ -2793,7 +2790,7 @@ void R_AddSkins(UINT16 wadnum) skin = &skins[numskins]; Sk_SetDefaultValue(skin); skin->wadnum = wadnum; - hudname = realname = superface = false; + hudname = realname = false; // parse stoken = strtok (buf2, "\r\n= "); while (stoken) @@ -2878,23 +2875,20 @@ void R_AddSkins(UINT16 wadnum) strupr(value); strncpy(skin->sprite, value, sizeof skin->sprite); } - else if (!stricmp(stoken, "charsel")) + else if (!stricmp(stoken, "facerank")) { strupr(value); - strncpy(skin->charsel, value, sizeof skin->charsel); + strncpy(skin->facerank, value, sizeof skin->facerank); } - else if (!stricmp(stoken, "face")) + else if (!stricmp(stoken, "facewant")) { strupr(value); - strncpy(skin->face, value, sizeof skin->face); - if (!superface) - strncpy(skin->superface, value, sizeof skin->superface); + strncpy(skin->facewant, value, sizeof skin->facewant); } - else if (!stricmp(stoken, "superface")) + else if (!stricmp(stoken, "facemmap")) { - superface = true; strupr(value); - strncpy(skin->superface, value, sizeof skin->superface); + strncpy(skin->facemmap, value, sizeof skin->facemmap); } #define FULLPROCESS(field) else if (!stricmp(stoken, #field)) skin->field = get_number(value); @@ -2936,11 +2930,6 @@ void R_AddSkins(UINT16 wadnum) skin->jumpfactor = FLOAT_TO_FIXED(atof(value)); else if (!stricmp(stoken, "highresscale")) skin->highresscale = FLOAT_TO_FIXED(atof(value)); - else if (!stricmp(stoken, "faceicon")) - { - strupr(value); - strncpy(skin->iconprefix, value, sizeof skin->iconprefix); - } else { INT32 found = false; @@ -3041,10 +3030,7 @@ next_token: #endif // add face graphics - ST_LoadFaceGraphics(skin->face, skin->superface, numskins); - - // load minimap icons - K_LoadIconGraphics(skin->iconprefix, numskins); + ST_LoadFaceGraphics(skin->facerank, skin->facewant, skin->facemmap, numskins); #ifdef HWRENDER if (rendermode == render_opengl) diff --git a/src/r_things.h b/src/r_things.h index a037b873..a7542e2f 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -81,7 +81,7 @@ typedef struct char realname[SKINNAMESIZE+1]; // Display name for level completion. char hudname[SKINNAMESIZE+1]; // HUD name to display (officially exactly 5 characters long) - char charsel[9], face[9], superface[9]; // Arbitrarily named patch lumps + char facerank[9], facewant[9], facemmap[9]; // Arbitrarily named patch lumps UINT8 ability; // ability definition UINT8 ability2; // secondary ability definition @@ -113,9 +113,6 @@ typedef struct // specific sounds per skin sfxenum_t soundsid[NUMSKINSOUNDS]; // sound # in S_sfx table - - // minimap icons - char iconprefix[9]; } skin_t; // ----------- diff --git a/src/st_stuff.c b/src/st_stuff.c index 5ba00015..f17c66ce 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -50,8 +50,9 @@ UINT16 objectsdrawn = 0; // STATUS BAR DATA // -patch_t *faceprefix[MAXSKINS]; // face status patches -patch_t *superprefix[MAXSKINS]; // super face status patches +patch_t *facerankprefix[MAXSKINS]; // ranking +patch_t *facewantprefix[MAXSKINS]; // wanted +patch_t *facemmapprefix[MAXSKINS]; // minimap // ------------------------------------------ // status bar overlay @@ -356,28 +357,20 @@ void ST_LoadGraphics(void) } // made separate so that skins code can reload custom face graphics -void ST_LoadFaceGraphics(char *facestr, char *superstr, INT32 skinnum) +void ST_LoadFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 skinnum) { - faceprefix[skinnum] = W_CachePatchName(facestr, PU_HUDGFX); - superprefix[skinnum] = W_CachePatchName(superstr, PU_HUDGFX); + facerankprefix[skinnum] = W_CachePatchName(rankstr, PU_HUDGFX); + facewantprefix[skinnum] = W_CachePatchName(wantstr, PU_HUDGFX); + facemmapprefix[skinnum] = W_CachePatchName(mmapstr, PU_HUDGFX); facefreed[skinnum] = false; } -#ifdef DELFILE -void ST_UnLoadFaceGraphics(INT32 skinnum) -{ - Z_Free(faceprefix[skinnum]); - Z_Free(superprefix[skinnum]); - facefreed[skinnum] = true; -} -#endif - void ST_ReloadSkinFaceGraphics(void) { INT32 i; for (i = 0; i < numskins; i++) - ST_LoadFaceGraphics(skins[i].face, skins[i].superface, i); + ST_LoadFaceGraphics(skins[i].facerank, skins[i].facewant, skins[i].facemmap, i); } static inline void ST_InitData(void) @@ -726,9 +719,9 @@ static void ST_drawLives(void) // SRB2kart - unused. { // skincolor face/super UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, stplyr->mo->color, GTC_CACHE); - patch_t *face = faceprefix[stplyr->skin]; + patch_t *face = facerankprefix[stplyr->skin]; if (stplyr->powers[pw_super] || stplyr->pflags & PF_NIGHTSMODE) - face = superprefix[stplyr->skin]; + face = facewantprefix[stplyr->skin]; V_DrawSmallMappedPatch(hudinfo[HUD_LIVESPIC].x, hudinfo[HUD_LIVESPIC].y + (v_splitflag ? -12 : 0), V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_HUDTRANS|v_splitflag,face, colormap); } @@ -737,7 +730,7 @@ static void ST_drawLives(void) // SRB2kart - unused. // skincolor face UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, stplyr->skincolor, GTC_CACHE); V_DrawSmallMappedPatch(hudinfo[HUD_LIVESPIC].x, hudinfo[HUD_LIVESPIC].y + (v_splitflag ? -12 : 0), - V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_HUDTRANS|v_splitflag,faceprefix[stplyr->skin], colormap); + V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_HUDTRANS|v_splitflag,facerankprefix[stplyr->skin], colormap); } // name @@ -1965,7 +1958,7 @@ static void ST_overlayDrawer(void) INT32 splitflags = K_calcSplitFlags(0); V_DrawThinString(2, (BASEVIDHEIGHT/2)-20, V_YELLOWMAP|V_HUDTRANSHALF|splitflags, M_GetText("- SPECTATING -")); if (stplyr->powers[pw_flashing]) - V_DrawString(2, (BASEVIDHEIGHT/2)-10, V_HUDTRANSHALF|splitflags, M_GetText("Item - . . .")); + V_DrawThinString(2, (BASEVIDHEIGHT/2)-10, V_HUDTRANSHALF|splitflags, M_GetText("Item - . . .")); else if (stplyr->pflags & PF_WANTSTOJOIN) V_DrawThinString(2, (BASEVIDHEIGHT/2)-10, V_HUDTRANSHALF|splitflags, M_GetText("Item - Cancel Join")); /*else if (G_GametypeHasTeams()) diff --git a/src/st_stuff.h b/src/st_stuff.h index d0528e0a..b054460b 100644 --- a/src/st_stuff.h +++ b/src/st_stuff.h @@ -42,7 +42,7 @@ void ST_UnloadGraphics(void); void ST_LoadGraphics(void); // face load graphics, called when skin changes -void ST_LoadFaceGraphics(char *facestr, char *superstr, INT32 playernum); +void ST_LoadFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 playernum); void ST_ReloadSkinFaceGraphics(void); #ifdef DELFILE void ST_UnLoadFaceGraphics(INT32 skinnum); @@ -66,8 +66,9 @@ extern patch_t *sboscore; extern patch_t *sbotime; extern patch_t *sbocolon; extern patch_t *sboperiod; -extern patch_t *faceprefix[MAXSKINS]; // face status patches -extern patch_t *superprefix[MAXSKINS]; // super face status patches +extern patch_t *facerankprefix[MAXSKINS]; // ranking +extern patch_t *facewantprefix[MAXSKINS]; // wanted +extern patch_t *facemmapprefix[MAXSKINS]; // minimap extern patch_t *livesback; extern patch_t *ngradeletters[7]; extern boolean iconfreed[MAXPLAYERS]; diff --git a/src/y_inter.c b/src/y_inter.c index 9361dbe3..01d6b039 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -416,7 +416,7 @@ void Y_IntermissionDrawer(void) else*/ if (intertype == int_race || intertype == int_match) { #define NUMFORNEWCOLUMN 8 - INT32 y = 48, gutter = ((data.match.numplayers > NUMFORNEWCOLUMN) ? 0 : (BASEVIDWIDTH/2)); + INT32 y = 41, gutter = ((data.match.numplayers > NUMFORNEWCOLUMN) ? 0 : (BASEVIDWIDTH/2)); const char *timeheader; if (data.match.rankingsmode) @@ -425,26 +425,27 @@ void Y_IntermissionDrawer(void) timeheader = (intertype == int_race ? "TIME" : "SCORE"); // draw the level name - V_DrawCenteredString(-4 + x + BASEVIDWIDTH/2, 20, 0, data.match.levelstring); - V_DrawFill(x, 42, 312, 1, 0); + V_DrawCenteredString(-4 + x + BASEVIDWIDTH/2, 12, 0, data.match.levelstring); + V_DrawFill(x, 34, 312, 1, 0); if (data.match.encore) - V_DrawCenteredString(-4 + x + BASEVIDWIDTH/2, 20-8, hilicol, "ENCORE MODE"); + V_DrawCenteredString(-4 + x + BASEVIDWIDTH/2, 12-8, hilicol, "ENCORE MODE"); if (!gutter) { - V_DrawFill(x+156, 32, 1, 152, 0); + V_DrawFill(x+156, 24, 1, 158, 0); + V_DrawFill(x, 182, 312, 1, 0); - V_DrawCenteredString(x+6+(BASEVIDWIDTH/2), 32, hilicol, "#"); - V_DrawString(x+36+(BASEVIDWIDTH/2), 32, hilicol, "NAME"); + V_DrawCenteredString(x+6+(BASEVIDWIDTH/2), 24, hilicol, "#"); + V_DrawString(x+36+(BASEVIDWIDTH/2), 24, hilicol, "NAME"); - V_DrawRightAlignedString(x+152, 32, hilicol, timeheader); + V_DrawRightAlignedString(x+152, 24, hilicol, timeheader); } - V_DrawCenteredString(x+6, 32, hilicol, "#"); - V_DrawString(x+36, 32, hilicol, "NAME"); + V_DrawCenteredString(x+6, 24, hilicol, "#"); + V_DrawString(x+36, 24, hilicol, "NAME"); - V_DrawRightAlignedString(x+(BASEVIDWIDTH/2)+152, 32, hilicol, timeheader); + V_DrawRightAlignedString(x+(BASEVIDWIDTH/2)+152, 24, hilicol, timeheader); for (i = 0; i < data.match.numplayers; i++) { @@ -460,12 +461,10 @@ void Y_IntermissionDrawer(void) V_DrawCenteredString(x+6, y, 0, va("%d", data.match.pos[i])); - if (data.match.color[i] == 0) - V_DrawSmallScaledPatch(x+16, y-4, 0,faceprefix[*data.match.character[i]]); - else + if (data.match.color[i]) { UINT8 *colormap = R_GetTranslationColormap(*data.match.character[i], *data.match.color[i], GTC_CACHE); - V_DrawSmallMappedPatch(x+16, y-4, 0,faceprefix[*data.match.character[i]], colormap); + V_DrawMappedPatch(x+16, y-4, 0,facerankprefix[*data.match.character[i]], colormap); } if (!gutter) @@ -520,11 +519,11 @@ void Y_IntermissionDrawer(void) else data.match.num[i] = MAXPLAYERS; // this should be the only field setting in this function - y += 16; + y += 18; if (i == NUMFORNEWCOLUMN-1) { - y = 48; + y = 41; x += BASEVIDWIDTH/2; } #undef NUMFORNEWCOLUMN @@ -1148,12 +1147,10 @@ void Y_VoteDrawer(void) V_DrawDiag(x, y, 6, V_SNAPTOLEFT|levelinfo[votes[i]].gtc); } - if (players[i].skincolor == 0) - V_DrawSmallScaledPatch(x+24, y+9, V_SNAPTOLEFT, faceprefix[players[i].skin]); - else + if (players[i].skincolor) { UINT8 *colormap = R_GetTranslationColormap(players[i].skin, players[i].skincolor, GTC_CACHE); - V_DrawSmallMappedPatch(x+24, y+9, V_SNAPTOLEFT, faceprefix[players[i].skin], colormap); + V_DrawMappedPatch(x+24, y+9, V_SNAPTOLEFT, facerankprefix[players[i].skin], colormap); } } From fe00f3456234e0d02e7a9e662daeac6a2cf96b38 Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 28 Oct 2018 16:29:56 +0000 Subject: [PATCH 21/80] unused variable [screams] --- 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 c7315137..043eadf4 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2271,7 +2271,7 @@ void HU_drawPing(INT32 x, INT32 y, INT32 ping, boolean notext) // void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol) { - INT32 i, j, rightoffset = 240; + INT32 i, rightoffset = 240; const UINT8 *colormap; //this function is designed for 9 or less score lines only From 49e25abb601badf2f141f9b949f8dc1fe773ff2a Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 28 Oct 2018 16:34:02 +0000 Subject: [PATCH 22/80] fix ping drawing offset (this won't be in the exe I uploaded before I disappear for a bit) --- 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 043eadf4..a16d1d46 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2295,7 +2295,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (!splitscreen) // don't draw it on splitscreen, { if (!(tab[i].num == serverplayer)) - HU_drawPing(x+ 253, y+2, playerpingtable[tab[i].num], false); + HU_drawPing(x + rightoffset + 13, y+2, playerpingtable[tab[i].num], false); } if (scorelines > 8) From 75efd3e2c5d8720b6ff5ab9c14a873452bb09c62 Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 28 Oct 2018 18:06:21 +0000 Subject: [PATCH 23/80] Ping offset fixed even more --- 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 a16d1d46..c910782d 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2295,7 +2295,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (!splitscreen) // don't draw it on splitscreen, { if (!(tab[i].num == serverplayer)) - HU_drawPing(x + rightoffset + 13, y+2, playerpingtable[tab[i].num], false); + HU_drawPing(x + rightoffset + ((scorelines > 8) ? 13 : -27), y+2, playerpingtable[tab[i].num], false); } if (scorelines > 8) From 9d6563fcf79fe7b46b86acdaea722de3700a76cc Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 28 Oct 2018 14:43:58 -0400 Subject: [PATCH 24/80] Fix kartspeed/kartweight writes --- src/d_clisrv.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 3d5b90a2..f27fc3af 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -576,8 +576,8 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) // Just in case Lua does something like // modify these at runtime // SRB2kart - rsp->kartspeed = (UINT8)LONG(players[i].kartspeed); - rsp->kartweight = (UINT8)LONG(players[i].kartweight); + rsp->kartspeed = (UINT8)players[i].kartspeed; + rsp->kartweight = (UINT8)players[i].kartweight; // rsp->normalspeed = (fixed_t)LONG(players[i].normalspeed); rsp->runspeed = (fixed_t)LONG(players[i].runspeed); @@ -708,8 +708,8 @@ static void resynch_read_player(resynch_pak *rsp) players[i].skin = LONG(rsp->skin); // Just in case Lua does something like // modify these at runtime - players[i].kartspeed = (UINT8)LONG(rsp->kartspeed); - players[i].kartweight = (UINT8)LONG(rsp->kartweight); + players[i].kartspeed = (UINT8)rsp->kartspeed; + players[i].kartweight = (UINT8)rsp->kartweight; players[i].normalspeed = (fixed_t)LONG(rsp->normalspeed); players[i].runspeed = (fixed_t)LONG(rsp->runspeed); From b83286b532cde6e38a1f4c858b8674c92943550a Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 28 Oct 2018 14:45:01 -0400 Subject: [PATCH 25/80] Use k_itemtype as the additional check instead of pw_shield --- src/d_clisrv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index f27fc3af..f811334a 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -4344,7 +4344,7 @@ static INT16 Consistancy(void) { ret += players[i].mo->x; ret -= players[i].mo->y; - ret += players[i].powers[pw_shield]; + ret += players[i].kartstuff[k_itemtype]; // powers[pw_shield] ret *= i+1; } } From 9630e0161655ee044e34e17d215a0e1114c4b7c7 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 28 Oct 2018 17:31:59 -0400 Subject: [PATCH 26/80] Camera crash fixes UNRELATED, but they made this branch a pain in the ass to test so I needed to fix this here :V --- src/g_game.c | 2 ++ src/p_mobj.c | 5 +++++ src/p_user.c | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/src/g_game.c b/src/g_game.c index baf89d06..c795c1d6 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4033,6 +4033,7 @@ static void M_ForceLoadGameResponse(INT32 ch) displayplayer = consoleplayer; multiplayer = false; splitscreen = 0; + SplitScreen_OnChange(); // not needed? if (setsizeneeded) R_ExecuteSetViewSize(); @@ -4122,6 +4123,7 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) displayplayer = consoleplayer; multiplayer = false; splitscreen = 0; + SplitScreen_OnChange(); // not needed? // G_DeferedInitNew(sk_medium, G_BuildMapName(1), 0, 0, 1); if (setsizeneeded) diff --git a/src/p_mobj.c b/src/p_mobj.c index 5de7e246..959aa741 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3654,6 +3654,11 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled { boolean itsatwodlevel = false; postimg_t postimg = postimg_none; + + // This can happen when joining + if (thiscam->subsector == NULL || thiscam->subsector->sector == NULL) + return true; + if (twodlevel || (thiscam == &camera && players[displayplayer].mo && (players[displayplayer].mo->flags2 & MF2_TWOD)) || (thiscam == &camera2 && players[secondarydisplayplayer].mo && (players[secondarydisplayplayer].mo->flags2 & MF2_TWOD)) diff --git a/src/p_user.c b/src/p_user.c index 0f89f826..0a933c94 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8083,6 +8083,10 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (!player || !player->mo) return true; + // This can happen when joining + if (thiscam->subsector == NULL || thiscam->subsector->sector == NULL) + return true; + mo = player->mo; #ifndef NOCLIPCAM From 9f18164ad48d557738b3e3e964787edb26c664b9 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 29 Oct 2018 05:00:08 -0400 Subject: [PATCH 27/80] The motherload: all of my Lua is hardcoded This took like 6 straight hours of work, never ask me for anything ever again --- src/dehacked.c | 150 ++++++-- src/doomstat.h | 1 + src/g_game.c | 1 + src/info.c | 953 ++++++++++++++++++++++++++++++++++++++++++++++--- src/info.h | 183 ++++++++-- src/k_kart.c | 12 +- src/p_inter.c | 133 ++++--- src/p_map.c | 135 ++++++- src/p_mobj.c | 716 ++++++++++++++++++++++++++++++++++--- src/p_saveg.c | 2 + src/p_setup.c | 1 + src/p_spec.c | 2 + src/p_user.c | 2 +- 13 files changed, 2067 insertions(+), 224 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 77663ccd..b8885be4 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6327,31 +6327,31 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_ROCKETSNEAKER_RVIBRATE", //{ Eggman Monitor - "S_FAKEITEM1", - "S_FAKEITEM2", - "S_FAKEITEM3", - "S_FAKEITEM4", - "S_FAKEITEM5", - "S_FAKEITEM6", - "S_FAKEITEM7", - "S_FAKEITEM8", - "S_FAKEITEM9", - "S_FAKEITEM10", - "S_FAKEITEM11", - "S_FAKEITEM12", - "S_FAKEITEM13", - "S_FAKEITEM14", - "S_FAKEITEM15", - "S_FAKEITEM16", - "S_FAKEITEM17", - "S_FAKEITEM18", - "S_FAKEITEM19", - "S_FAKEITEM20", - "S_FAKEITEM21", - "S_FAKEITEM22", - "S_FAKEITEM23", - "S_FAKEITEM24", - "S_DEADFAKEITEM", + "S_EGGMANITEM1", + "S_EGGMANITEM2", + "S_EGGMANITEM3", + "S_EGGMANITEM4", + "S_EGGMANITEM5", + "S_EGGMANITEM6", + "S_EGGMANITEM7", + "S_EGGMANITEM8", + "S_EGGMANITEM9", + "S_EGGMANITEM10", + "S_EGGMANITEM11", + "S_EGGMANITEM12", + "S_EGGMANITEM13", + "S_EGGMANITEM14", + "S_EGGMANITEM15", + "S_EGGMANITEM16", + "S_EGGMANITEM17", + "S_EGGMANITEM18", + "S_EGGMANITEM19", + "S_EGGMANITEM20", + "S_EGGMANITEM21", + "S_EGGMANITEM22", + "S_EGGMANITEM23", + "S_EGGMANITEM24", + "S_EGGMANITEM_DEAD", //} // Banana @@ -6863,6 +6863,59 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_CDTREEASP", "S_CDTREEBSP", + // Daytona Speedway + "S_PINETREE", + "S_PINETREE_SIDE", + + // Egg Zeppelin + "S_EZZPROPELLER", + "S_EZZPROPELLER_BLADE", + + // Desert Palace + "S_DP_PALMTREE", + + // Aurora Atoll + "S_AAZTREE_SEG", + "S_AAZTREE_COCONUT", + "S_AAZTREE_LEAF", + + // Barren Badlands + "S_BBZDUST1", // Dust + "S_BBZDUST2", + "S_BBZDUST3", + "S_BBZDUST4", + "S_FROGGER", // Frog badniks + "S_FROGGER_ATTACK", + "S_FROGGER_JUMP", + "S_FROGTONGUE", + "S_FROGTONGUE_JOINT", + "S_ROBRA", // Black cobra badniks + "S_ROBRA_HEAD", + "S_ROBRA_JOINT", + "S_ROBRASHELL_INSIDE", + "S_ROBRASHELL_OUTSIDE", + "S_BLUEROBRA", // Blue cobra badniks + "S_BLUEROBRA_HEAD", + "S_BLUEROBRA_JOINT", + + // Eerie Grove + "S_EERIEFOG1", + "S_EERIEFOG2", + "S_EERIEFOG3", + "S_EERIEFOG4", + "S_EERIEFOG5", + + // SMK ports + "S_SMK_PIPE1", // Generic pipes + "S_SMK_PIPE2", + "S_SMK_MOLE", // Donut Plains Monty Moles + "S_SMK_THWOMP", // Bowser Castle Thwomps + "S_SMK_SNOWBALL", // Vanilla Lake snowballs + "S_SMK_ICEBLOCK", // Vanilla Lake breakable ice blocks + "S_SMK_ICEBLOCK2", + "S_SMK_ICEBLOCK_DEBRIS", + "S_SMK_ICEBLOCK_DEBRIS2", + #ifdef SEENAMES "S_NAMECHECK", #endif @@ -7397,8 +7450,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_ROCKETSNEAKER", // Rocket sneakers - "MT_FAKESHIELD", - "MT_FAKEITEM", + "MT_EGGMANITEM", // Eggman items + "MT_EGGMANITEM_SHIELD", "MT_BANANA", // Banana Stuff "MT_BANANA_SHIELD", @@ -7537,6 +7590,49 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_CDTREEA", "MT_CDTREEB", + // Daytona Speedway + "MT_PINETREE", + "MT_PINETREE_SIDE", + + // Egg Zeppelin + "MT_EZZPROPELLER", + "MT_EZZPROPELLER_BLADE", + + // Desert Palace + "MT_DP_PALMTREE", + + // Aurora Atoll + "MT_AAZTREE_HELPER", + "MT_AAZTREE_SEG", + "MT_AAZTREE_COCONUT", + "MT_AAZTREE_LEAF", + + // Barren Badlands + "MT_BBZDUST", + "MT_FROGGER", + "MT_FROGTONGUE", + "MT_FROGTONGUE_JOINT", + "MT_ROBRA", + "MT_ROBRA_HEAD", + "MT_ROBRA_JOINT", + "MT_BLUEROBRA", + "MT_BLUEROBRA_HEAD", + "MT_BLUEROBRA_JOINT", + + // Eerie Grove + "MT_EERIEFOG", + "MT_EERIEFOGGEN", + + // SMK ports + "MT_SMK_PIPE", + "MT_SMK_MOLESPAWNER", + "MT_SMK_MOLE", + "MT_SMK_THWOMP", + "MT_SMK_SNOWBALL", + "MT_SMK_ICEBLOCK", + "MT_SMK_ICEBLOCK_SIDE", + "MT_SMK_ICEBLOCK_DEBRIS", + #ifdef SEENAMES "MT_NAMECHECK", #endif diff --git a/src/doomstat.h b/src/doomstat.h index 4b0c6f60..f45651d1 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -460,6 +460,7 @@ extern tic_t wantedcalcdelay; extern tic_t indirectitemcooldown; extern tic_t mapreset; extern UINT8 nospectategrief; +extern boolean thwompsactive; extern boolean legitimateexit; extern boolean comebackshowninfo; diff --git a/src/g_game.c b/src/g_game.c index baf89d06..bbf6ebac 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -266,6 +266,7 @@ tic_t wantedcalcdelay; // Time before it recalculates WANTED tic_t indirectitemcooldown; // Cooldown before any more Shrink, SPB, or any other item that works indirectly is awarded tic_t mapreset; // Map reset delay when enough players have joined an empty game UINT8 nospectategrief; // How many players need to be in-game to eliminate last; for preventing spectate griefing +boolean thwompsactive; // Thwomps activate on lap 2 // Client-sided, unsynched variables (NEVER use in anything that needs to be synced with other players) boolean legitimateexit; // Did this client actually finish the match? diff --git a/src/info.c b/src/info.c index cde74cee..81fd5469 100644 --- a/src/info.c +++ b/src/info.c @@ -62,7 +62,8 @@ char sprnames[NUMSPRITES + 1][5] = "CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB","ARRO", "ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK","LZI1", "LZI2","KLIT","FZSM","FZBM","FPRT","SPTL","ENM1","GARU","MARR","REAP", - "JITB","CDMO","CDBU","VIEW" + "JITB","CDMO","CDBU","PINE","PPLR","DPPT","AATR","COCO","BDST","FROG", + "CBRA","HOLE","BBRA","EGFG","SMKP","MTYM","THWP","SNOB","ICEB","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -2629,31 +2630,31 @@ state_t states[NUMSTATES] = {SPR_RSHE, 2, -1, {NULL}, 0, 0, S_NULL}, // S_ROCKETSNEAKER_LVIBRATE {SPR_RSHE, 3, -1, {NULL}, 0, 0, S_NULL}, // S_ROCKETSNEAKER_RVIBRATE - {SPR_FITM, FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM2}, // S_FAKEITEM1 - {SPR_FITM, 1|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM3}, // S_FAKEITEM2 - {SPR_FITM, 2|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM4}, // S_FAKEITEM3 - {SPR_FITM, 3|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM5}, // S_FAKEITEM4 - {SPR_FITM, 4|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM6}, // S_FAKEITEM5 - {SPR_FITM, 5|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM7}, // S_FAKEITEM6 - {SPR_FITM, 6|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM8}, // S_FAKEITEM7 - {SPR_FITM, 7|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM9}, // S_FAKEITEM8 - {SPR_FITM, 8|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM10}, // S_FAKEITEM9 - {SPR_FITM, 9|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM11}, // S_FAKEITEM10 - {SPR_FITM, 10|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM12}, // S_FAKEITEM11 - {SPR_FITM, 11|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM13}, // S_FAKEITEM12 - {SPR_FITM, 12|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM14}, // S_FAKEITEM13 - {SPR_FITM, 13|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM15}, // S_FAKEITEM14 - {SPR_FITM, 14|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM16}, // S_FAKEITEM15 - {SPR_FITM, 15|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM17}, // S_FAKEITEM16 - {SPR_FITM, 16|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM18}, // S_FAKEITEM17 - {SPR_FITM, 17|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM19}, // S_FAKEITEM18 - {SPR_FITM, 18|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM20}, // S_FAKEITEM19 - {SPR_FITM, 19|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM21}, // S_FAKEITEM20 - {SPR_FITM, 20|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM22}, // S_FAKEITEM21 - {SPR_FITM, 21|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM23}, // S_FAKEITEM22 // ***** - {SPR_FITM, 22|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM24}, // S_FAKEITEM23 // ***** - {SPR_FITM, 23|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FAKEITEM1}, // S_FAKEITEM24 // ***** - {SPR_FITM, FF_FULLBRIGHT, 175, {NULL}, 0, 0, S_FAKEITEM1}, // S_DEADFAKEITEM + {SPR_FITM, FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM2}, // S_EGGMANITEM1 + {SPR_FITM, 1|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM3}, // S_EGGMANITEM2 + {SPR_FITM, 2|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM4}, // S_EGGMANITEM3 + {SPR_FITM, 3|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM5}, // S_EGGMANITEM4 + {SPR_FITM, 4|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM6}, // S_EGGMANITEM5 + {SPR_FITM, 5|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM7}, // S_EGGMANITEM6 + {SPR_FITM, 6|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM8}, // S_EGGMANITEM7 + {SPR_FITM, 7|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM9}, // S_EGGMANITEM8 + {SPR_FITM, 8|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM10}, // S_EGGMANITEM9 + {SPR_FITM, 9|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM11}, // S_EGGMANITEM10 + {SPR_FITM, 10|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM12}, // S_EGGMANITEM11 + {SPR_FITM, 11|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM13}, // S_EGGMANITEM12 + {SPR_FITM, 12|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM14}, // S_EGGMANITEM13 + {SPR_FITM, 13|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM15}, // S_EGGMANITEM14 + {SPR_FITM, 14|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM16}, // S_EGGMANITEM15 + {SPR_FITM, 15|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM17}, // S_EGGMANITEM16 + {SPR_FITM, 16|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM18}, // S_EGGMANITEM17 + {SPR_FITM, 17|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM19}, // S_EGGMANITEM18 + {SPR_FITM, 18|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM20}, // S_EGGMANITEM19 + {SPR_FITM, 19|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM21}, // S_EGGMANITEM20 + {SPR_FITM, 20|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM22}, // S_EGGMANITEM21 + {SPR_FITM, 21|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM23}, // S_EGGMANITEM22 // ***** + {SPR_FITM, 22|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM24}, // S_EGGMANITEM23 // ***** + {SPR_FITM, 23|FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_EGGMANITEM1}, // S_EGGMANITEM24 // ***** + {SPR_FITM, FF_FULLBRIGHT, 175, {NULL}, 0, 0, S_EGGMANITEM1}, // S_EGGMANITEM_DEAD {SPR_BANA, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BANANA {SPR_BANA, 0, 175, {NULL}, 0, 0, S_NULL}, // S_BANANA_DEAD @@ -3158,6 +3159,63 @@ state_t states[NUMSTATES] = {SPR_CDBU, 1, -1, {NULL}, 0, 0, S_CDTREEASP}, // S_CDTREEASP {SPR_CDBU, 2, -1, {NULL}, 0, 0, S_CDTREEBSP}, // S_CDTREEBSP + // Daytona Speedway + {SPR_PINE, 1, -1, {NULL}, 0, 0, S_NULL}, // S_PINETREE + {SPR_PINE, FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_PINETREE_SIDE + + // Egg Zeppelin + {SPR_PPLR, 0, -1, {NULL}, 0, 0, S_EZZPROPELLER}, // S_EZZPROPELLER + {SPR_PPLR, FF_PAPERSPRITE|1, -1, {NULL}, 0, 0, S_EZZPROPELLER_BLADE}, // S_EZZPROPELLER_BLADE + + // Desert Palace + {SPR_DPPT, 0, -1, {NULL}, 0, 0, S_NULL}, // S_DP_PALMTREE + + // Aurora Atoll + {SPR_AATR, 0, -1, {NULL}, 0, 0, S_AAZTREE_SEG}, // S_AAZTREE_SEG + {SPR_COCO, 0, -1, {NULL}, 0, 0, S_AAZTREE_COCONUT}, // S_AAZTREE_COCONUT + {SPR_AATR, FF_PAPERSPRITE|1, -1, {NULL}, 0, 0, S_AAZTREE_LEAF}, // S_AAZTREE_LEAF + + // Barren Badlands + {SPR_BDST, FF_TRANS80, 35, {NULL}, 0, 0, S_BBZDUST2}, // S_BBZDUST1 + {SPR_BDST, FF_TRANS80|1, 12, {NULL}, 0, 0, S_BBZDUST3}, // S_BBZDUST2 + {SPR_BDST, FF_TRANS80|2, 11, {NULL}, 0, 0, S_BBZDUST4}, // S_BBZDUST3 + {SPR_BDST, FF_TRANS80|3, 10, {NULL}, 0, 0, S_NULL}, // S_BBZDUST4 + + {SPR_FROG, 0, -1, {NULL}, 0, 0, S_FROGGER}, // S_FROGGER + {SPR_FROG, 1, -1, {NULL}, 0, 0, S_FROGGER_ATTACK}, // S_FROGGER_ATTACK + {SPR_FROG, 2, -1, {NULL}, 0, 0, S_FROGGER_JUMP}, // S_FROGGER_JUMP + + {SPR_FROG, 3, 7*TICRATE/2, {NULL}, 0, 0, S_NULL}, // S_FROGTONGUE + {SPR_FROG, 4, 7*TICRATE/2, {NULL}, 0, 0, S_NULL}, // S_FROGTONGUE_JOINT + + {SPR_HOLE, 0, 1, {NULL}, 0, 0, S_ROBRA}, // S_ROBRA + {SPR_CBRA, 0, 1, {NULL}, 0, 0, S_ROBRA_HEAD}, // S_ROBRA_HEAD + {SPR_CBRA, 1, -1, {NULL}, 0, 0, S_ROBRA_JOINT}, // S_ROBRA_JOINT + {SPR_CBRA, 2, -1, {NULL}, 1, 0, S_ROBRASHELL_INSIDE}, // S_ROBRASHELL_INSIDE + {SPR_CBRA, 3, -1, {NULL}, 0, 0, S_ROBRASHELL_OUTSIDE}, // S_ROBRASHELL_OUTSIDE + + {SPR_HOLE, 0, 1, {NULL}, 0, 0, S_BLUEROBRA}, // S_BLUEROBRA + {SPR_BBRA, 0, 1, {NULL}, 0, 0, S_BLUEROBRA_HEAD}, // S_BLUEROBRA_HEAD + {SPR_BBRA, 1, -1, {NULL}, 0, 0, S_BLUEROBRA_JOINT}, // S_BLUEROBRA_JOINT + + // Eerie Grove + {SPR_EGFG, FF_TRANS90|FF_FULLBRIGHT, 7, {A_SetRandomTics}, 5, 9, S_EERIEFOG2}, // S_EERIEFOG1 + {SPR_EGFG, FF_TRANS90|FF_FULLBRIGHT|1, 7, {A_SetRandomTics}, 5, 9, S_EERIEFOG3}, // S_EERIEFOG2 + {SPR_EGFG, FF_TRANS90|FF_FULLBRIGHT|2, 7, {A_SetRandomTics}, 5, 9, S_EERIEFOG4}, // S_EERIEFOG3 + {SPR_EGFG, FF_TRANS90|FF_FULLBRIGHT|3, 7, {A_SetRandomTics}, 5, 9, S_EERIEFOG5}, // S_EERIEFOG4 + {SPR_EGFG, FF_TRANS90|FF_FULLBRIGHT|4, 7, {A_SetRandomTics}, 5, 9, S_EERIEFOG1}, // S_EERIEFOG5 + + // SMK ports + {SPR_SMKP, 0, -1, {NULL}, 0, 0, S_SMK_PIPE1}, // S_SMK_PIPE1 + {SPR_SMKP, 1, -1, {NULL}, 0, 0, S_SMK_PIPE2}, // S_SMK_PIPE2 + {SPR_MTYM, 0, -1, {NULL}, 0, 0, S_SMK_MOLE}, // S_SMK_MOLE + {SPR_THWP, 0, -1, {NULL}, 0, 0, S_SMK_THWOMP}, // S_SMK_THWOMP + {SPR_SNOB, 0, -1, {NULL}, 0, 0, S_SMK_SNOWBALL}, // S_SMK_SNOWBALL + {SPR_ICEB, FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_SMK_ICEBLOCK + {SPR_ICEB, FF_PAPERSPRITE|1, -1, {NULL}, 0, 0, S_NULL}, // S_SMK_ICEBLOCK2 + {SPR_ICEB, 2, 10, {NULL}, 0, 0, S_SMK_ICEBLOCK_DEBRIS2}, // S_SMK_ICEBLOCK_DEBRIS + {SPR_ICEB, 3, 10, {NULL}, 0, 0, S_NULL}, // S_SMK_ICEBLOCK_DEBRIS2 + #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK #endif @@ -14927,36 +14985,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - { // MT_FAKESHIELD + { // MT_EGGMANITEM -1, // doomednum - S_FAKEITEM1, // 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_DEADFAKEITEM, // deathstate - S_NULL, // xdeathstate - sfx_kc2e, // deathsound - 8, // speed - 16*FRACUNIT, // radius - 32*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound - MF_SPECIAL|MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP, // flags - S_NULL // raisestate - }, - - { // MT_FAKEITEM - -1, // doomednum - S_FAKEITEM1, // spawnstate + S_EGGMANITEM1, // spawnstate 2, // spawnhealth S_NULL, // seestate sfx_tossed, // seesound @@ -14967,7 +14998,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = sfx_None, // painsound S_NULL, // meleestate S_NULL, // missilestate - S_DEADFAKEITEM, // deathstate + S_EGGMANITEM_DEAD, // deathstate S_NULL, // xdeathstate sfx_kc2e, // deathsound 0, // speed @@ -14981,6 +15012,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_EGGMANITEM_SHIELD + -1, // doomednum + S_EGGMANITEM1, // 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_EGGMANITEM_DEAD, // deathstate + S_NULL, // xdeathstate + sfx_kc2e, // deathsound + 8, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SPECIAL|MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + { // MT_BANANA -1, // doomednum S_BANANA, // spawnstate @@ -17656,6 +17714,789 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_PINETREE + 3204, // doomednum + S_PINETREE, // 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 + 0, // speed + 32<mo->hnext; @@ -4659,7 +4659,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else { - newitem = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_FAKEITEM); + newitem = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_EGGMANITEM); if (player->kartstuff[k_eggmanblame] >= 0 && player->kartstuff[k_eggmanblame] < MAXPLAYERS && playeringame[player->kartstuff[k_eggmanblame]] @@ -4685,7 +4685,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) // Eggman Monitor throwing else if (ATTACK_IS_DOWN && player->kartstuff[k_eggmanheld]) { - K_ThrowKartItem(player, false, MT_FAKEITEM, -1, 0); + K_ThrowKartItem(player, false, MT_EGGMANITEM, -1, 0); K_PlayAttackTaunt(player->mo); player->kartstuff[k_eggmanheld] = 0; K_UpdateHnextList(player, true); @@ -4811,7 +4811,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->kartstuff[k_itemamount]--; player->kartstuff[k_eggmanheld] = 1; S_StartSound(player->mo, sfx_s254); - mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_FAKESHIELD); + mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_EGGMANITEM_SHIELD); if (mo) { mo->flags |= MF_NOCLIPTHING; diff --git a/src/p_inter.c b/src/p_inter.c index af5dc5b1..f9c57432 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -324,48 +324,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) return; } - else if ((special->flags & MF_ENEMY) && !(special->flags & MF_MISSILE)) + else if ((special->flags & MF_ENEMY) && !(special->flags & MF_MISSILE) + && (special->type != MT_SPRINGSHELL)) // Kart: prevent random hits from these things { - //////////////////////////////////////////////////////// - /////ENEMIES!!////////////////////////////////////////// - //////////////////////////////////////////////////////// - /*if (special->type == MT_GSNAPPER && !(((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING)) - || player->powers[pw_invulnerability] || player->powers[pw_super]) - && toucher->z < special->z + special->height && toucher->z + toucher->height > special->z) - { - // Can only hit snapper from above - P_DamageMobj(toucher, special, special, 1); - } - else if (special->type == MT_SHARP - && ((special->state == &states[special->info->xdeathstate]) || (toucher->z > special->z + special->height/2))) - { - // Cannot hit sharp from above or when red and angry - P_DamageMobj(toucher, special, special, 1); - } - else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING)) - || (player->pflags & (PF_JUMPED|PF_SPINNING|PF_GLIDING)) - || player->powers[pw_invulnerability] || player->powers[pw_super]) // Do you possess the ability to subdue the object? - { - if (P_MobjFlip(toucher)*toucher->momz < 0) - toucher->momz = -toucher->momz; - - P_DamageMobj(special, toucher, toucher, 1); - } - else if (((toucher->z < special->z && !(toucher->eflags & MFE_VERTICALFLIP)) - || (toucher->z + toucher->height > special->z + special->height && (toucher->eflags & MFE_VERTICALFLIP))) // Flame is bad at logic - JTE - && player->charability == CA_FLY - && (player->powers[pw_tailsfly] - || (toucher->state >= &states[S_PLAY_SPC1] && toucher->state <= &states[S_PLAY_SPC4]))) // Tails can shred stuff with his propeller. - { - if (P_MobjFlip(toucher)*toucher->momz < 0) - toucher->momz = -toucher->momz/2; - - P_DamageMobj(special, toucher, toucher, 1); - } - // SRB2kart - Removed: No more fly states - else*/ - P_DamageMobj(toucher, special, special, 1); - + P_DamageMobj(toucher, special, special, 1); return; } else if (special->flags & MF_FIRE) @@ -424,8 +386,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) P_SetTarget(&special->target, toucher); P_KillMobj(special, toucher, toucher); break; - case MT_FAKESHIELD: // SRB2kart - case MT_FAKEITEM: + case MT_EGGMANITEM_SHIELD: // SRB2kart + case MT_EGGMANITEM: if ((special->target == toucher || special->target == toucher->target) && (special->threshold > 0)) return; @@ -618,7 +580,36 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) } else K_SpinPlayer(player, special, 0, false); + return; + /*case MT_EERIEFOG: + special->frame &= ~FF_TRANS80; + special->frame |= FF_TRANS90; + return;*/ + case MT_SMK_MOLE: + if (special->target && !P_MobjWasRemoved(special->target)) + return; + if (special->health <= 0 || toucher->health <= 0) + return; + + if (!player->mo || player->spectator) + return; + + // kill + if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0) + { + P_KillMobj(special, toucher, toucher); + return; + } + + // no interaction + if (player->powers[pw_flashing] > 0 || player->kartstuff[k_hyudorotimer] > 0 + || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_spinouttimer] > 0) + return; + + // attach to player! + P_SetTarget(&special->target, toucher); + S_StartSound(special, sfx_s1a2); return; // ***************************************** // @@ -2044,7 +2035,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) && !(target->type == MT_ORBINAUT || target->type == MT_ORBINAUT_SHIELD || target->type == MT_JAWZ || target->type == MT_JAWZ_DUD || target->type == MT_JAWZ_SHIELD || target->type == MT_BANANA || target->type == MT_BANANA_SHIELD - || target->type == MT_FAKEITEM || target->type == MT_FAKESHIELD + || target->type == MT_EGGMANITEM || target->type == MT_EGGMANITEM_SHIELD || target->type == MT_BALLHOG || target->type == MT_SPB)) // kart dead items target->flags |= MF_NOGRAVITY; // Don't drop Tails 03-08-2000 else @@ -2068,7 +2059,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) // I wish I knew a better way to do this if (target->target && target->target->player && target->target->player->mo) { - if (target->target->player->kartstuff[k_eggmanheld] && target->type == MT_FAKESHIELD) + if (target->target->player->kartstuff[k_eggmanheld] && target->type == MT_EGGMANITEM_SHIELD) target->target->player->kartstuff[k_eggmanheld] = 0; if (target->target->player->kartstuff[k_itemheld]) @@ -2414,6 +2405,21 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) else P_PlayDeathSound(target); break; + + // SRB2Kart: + case MT_SMK_ICEBLOCK: + { + mobj_t *cur = target->hnext; + while (cur && !P_MobjWasRemoved(cur)) + { + P_SetMobjState(cur, S_SMK_ICEBLOCK2); + cur = cur->hnext; + } + target->fuse = 10; + S_StartSound(target, sfx_s3k80); + } + break; + default: break; } @@ -2474,6 +2480,41 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) target->z += P_MobjFlip(target)*20*target->scale; } + // kill tracer + if (target->type == MT_FROGGER) + { + if (target->tracer && !P_MobjWasRemoved(target->tracer)) + P_KillMobj(target->tracer, inflictor, source); + } + + + if (target->type == MT_FROGGER || target->type == MT_ROBRA_HEAD || target->type == MT_BLUEROBRA_HEAD) // clean hnext list + { + mobj_t *cur = target->hnext; + while (cur && !P_MobjWasRemoved(cur)) + { + P_KillMobj(cur, inflictor, source); + cur = cur->hnext; + } + } + + // Bounce up on death + if (target->type == MT_SMK_PIPE || target->type == MT_SMK_MOLE || target->type == MT_SMK_THWOMP) + { + target->flags &= (~MF_NOGRAVITY); + + if (target->eflags & MFE_VERTICALFLIP) + target->z -= target->height; + else + target->z += target->height; + + S_StartSound(target, target->info->deathsound); + + P_SetObjectMomZ(target, 8<x, inflictor->y, target->x, target->y)+ANGLE_90, 16<type == MT_SPIKE && inflictor && target->info->deathstate != S_NULL) { const fixed_t x=target->x,y=target->y,z=target->z; @@ -3250,7 +3291,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { if (inflictor && (inflictor->type == MT_ORBINAUT || inflictor->type == MT_ORBINAUT_SHIELD || inflictor->type == MT_JAWZ || inflictor->type == MT_JAWZ_SHIELD || inflictor->type == MT_JAWZ_DUD - || inflictor->player)) + || inflictor->type == MT_SMK_THWOMP || inflictor->player)) { player->kartstuff[k_sneakertimer] = 0; K_SpinPlayer(player, source, 1, false); diff --git a/src/p_map.c b/src/p_map.c index 1d8a2daa..eba6ad8d 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -663,7 +663,38 @@ static boolean PIT_CheckThing(mobj_t *thing) } } - // SRB2kart 011617 - Colission code for kart items //{ + // SRB2kart 011617 - Colission[sic] code for kart items //{ + + if (thing->type == MT_SMK_ICEBLOCK) + { + // see if it went over / under + if (tmthing->z > thing->z + thing->height) + return true; // overhead + if (tmthing->z + tmthing->height < thing->z) + return true; // underneath + + if (!(tmthing->flags & MF_SOLID || tmthing->flags & MF_SHOOTABLE || tmthing->flags & MF_BOUNCE)) + return true; + + if (!(tmthing->health)) + return true; + + if (tmthing->type == MT_BANANA || tmthing->type == MT_BANANA_SHIELD + || tmthing->type == MT_EGGMANITEM || tmthing->type == MT_EGGMANITEM_SHIELD + || tmthing->type == MT_SSMINE || tmthing->type == MT_SSMINE_SHIELD + || tmthing->type == MT_ORBINAUT_SHIELD || tmthing->type == MT_JAWZ_SHIELD) + return false; + + if (thing->health) + P_KillMobj(thing, tmthing, tmthing); + + /*if (tmthing->player && (tmthing->player->kartstuff[k_invincibilitytimer] > 0 + || tmthing->player->kartstuff[k_growshrinktimer] > 0)) + return true;*/ + + K_KartBouncing(tmthing, thing, false, true); + return false; + } if (tmthing->type == MT_RANDOMITEM) return true; @@ -1539,6 +1570,106 @@ static boolean PIT_CheckThing(mobj_t *thing) return true; } + else if (thing->type == MT_BLUEROBRA_HEAD || thing->type == MT_BLUEROBRA_JOINT) + { + // see if it went over / under + if (tmthing->z > thing->z + thing->height) + return true; // overhead + if (tmthing->z + tmthing->height < thing->z) + return true; // underneath + + if (!thing->health) + return true; // dead + + if (tmthing->player->kartstuff[k_invincibilitytimer] > 0 + || tmthing->player->kartstuff[k_growshrinktimer] > 0) + { + if (thing->type == MT_BLUEROBRA_JOINT) + P_KillMobj(thing->target, tmthing, tmthing); + else + P_KillMobj(thing, tmthing, tmthing); + return true; + } + else + { + K_KartBouncing(tmthing, thing, false, true); + return false; + } + } + else if (thing->type == MT_SMK_PIPE) + { + // see if it went over / under + if (tmthing->z > thing->z + thing->height) + return true; // overhead + if (tmthing->z + tmthing->height < thing->z) + return true; // underneath + + if (!thing->health) + return true; // dead + + if (tmthing->player->kartstuff[k_invincibilitytimer] > 0 + || tmthing->player->kartstuff[k_growshrinktimer] > 0) + { + P_KillMobj(thing, tmthing, tmthing); + return true; // kill + } + + K_KartBouncing(tmthing, thing, false, true); + return false; + } + else if (thing->type == MT_SMK_THWOMP) + { + if (!thing->health) + return true; // dead + + if (!thwompsactive) + return true; // not active yet + + if ((tmthing->z < thing->z) && (thing->z >= thing->movefactor-(256<extravalue1 = 1; // purposely try to stomp on players early + //S_StartSound(thing, sfx_s1bb); + } + + // see if it went over / under + if (tmthing->z > thing->z + thing->height) + return true; // overhead + if (tmthing->z + tmthing->height < thing->z) + return true; // underneath + + // kill + if (tmthing->player->kartstuff[k_invincibilitytimer] > 0 + || tmthing->player->kartstuff[k_growshrinktimer] > 0) + { + P_KillMobj(thing, tmthing, tmthing); + return true; + } + + // continue to squish + if (tmthing->player->kartstuff[k_squishedtimer]) + { + tmthing->player->kartstuff[k_squishedtimer] = 2*TICRATE; + tmthing->player->powers[pw_flashing] = K_GetKartFlashing(tmthing->player); + return true; + } + + // no interaction + if (tmthing->player->powers[pw_flashing] > 0 || tmthing->player->kartstuff[k_hyudorotimer] > 0 + || tmthing->player->kartstuff[k_spinouttimer] > 0) //|| tmthing->player->kartstuff[k_squishedtimer] > 0 + return true; + + // collide + if (tmthing->z < thing->z && thing->momz < 0) + K_SquishPlayer(tmthing->player, thing); + else + { + if (thing->flags2 & MF2_AMBUSH) + P_DamageMobj(tmthing, thing, thing, 1); + K_KartBouncing(tmthing, thing, false, true); + } + + return false; + } else if (thing->flags & MF_SOLID) { // see if it went over / under @@ -1552,7 +1683,7 @@ static boolean PIT_CheckThing(mobj_t *thing) else K_KartBouncing(tmthing, thing, false, true); - return true; + return false; } // Are you touching the side of the object you're interacting with? else if (thing->z - FixedMul(FRACUNIT, thing->scale) <= tmthing->z + tmthing->height diff --git a/src/p_mobj.c b/src/p_mobj.c index 5de7e246..91ba959a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1403,7 +1403,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) gravityadd >>= 1; break; case MT_BANANA: - case MT_FAKEITEM: + case MT_EGGMANITEM: case MT_SSMINE: gravityadd = FixedMul(gravityadd, 5*FRACUNIT/2); break; @@ -2345,7 +2345,7 @@ static boolean P_ZMovement(mobj_t *mo) case MT_SHELL: // SRB2kart stuff that should die in pits // Shouldn't stop moving along the Z if there's no speed though! - case MT_FAKEITEM: + case MT_EGGMANITEM: case MT_BANANA: case MT_ORBINAUT: case MT_JAWZ: @@ -6641,7 +6641,7 @@ void P_MobjThinker(mobj_t *mobj) case MT_JAWZ_SHIELD: case MT_BANANA_SHIELD: case MT_SSMINE_SHIELD: - case MT_FAKESHIELD: + case MT_EGGMANITEM_SHIELD: case MT_SINK_SHIELD: if ((mobj->health > 0 && (!mobj->target || !mobj->target->player || mobj->target->player->health <= 0 || mobj->target->player->spectator)) @@ -6838,7 +6838,8 @@ void P_MobjThinker(mobj_t *mobj) if (!mobj->tracer) { - mobj->tracer = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_OVERLAY); + mobj_t *overlay = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_OVERLAY); + P_SetTarget(&mobj->tracer, overlay); P_SetTarget(&mobj->tracer->target, mobj); P_SetMobjState(mobj->tracer, S_PLAYERARROW_ITEM); P_SetMobjState(mobj->tracer, S_ITEMICON); // null sprite and frame to be overwritten later @@ -7402,7 +7403,7 @@ void P_MobjThinker(mobj_t *mobj) //{ SRB2kart Items - Death States case MT_ORBINAUT: case MT_BANANA: - case MT_FAKEITEM: + case MT_EGGMANITEM: case MT_SPB: if (mobj->z <= mobj->floorz) { @@ -7412,7 +7413,7 @@ void P_MobjThinker(mobj_t *mobj) // fallthru case MT_ORBINAUT_SHIELD: case MT_BANANA_SHIELD: - case MT_FAKESHIELD: + case MT_EGGMANITEM_SHIELD: mobj->flags2 ^= MF2_DONTDRAW; break; case MT_JAWZ: @@ -7439,6 +7440,41 @@ void P_MobjThinker(mobj_t *mobj) case MT_MINEEXPLOSIONSOUND: P_RemoveMobj(mobj); return; + case MT_SMK_PIPE: + if (mobj->flags2 & MF2_AMBUSH) + P_SetMobjStateNF(mobj, mobj->info->seestate); + else + P_SetMobjStateNF(mobj, mobj->info->spawnstate); + /* FALLTHRU */ + case MT_SMK_MOLE: + mobj->flags2 ^= MF2_DONTDRAW; + if (mobj->z <= mobj->floorz) + { + P_RemoveMobj(mobj); + return; + } + break; + case MT_SMK_THWOMP: + if (mobj->flags2 & MF2_AMBUSH) + { + mobj->colorized = true; + mobj->color = (1 + (leveltime % (MAXSKINCOLORS-1))); + mobj->frame |= FF_FULLBRIGHT; + } + else + { + mobj->colorized = false; + mobj->color = SKINCOLOR_NONE; + mobj->frame &= (~FF_FULLBRIGHT); + } + + mobj->flags2 ^= MF2_DONTDRAW; + if (mobj->z <= mobj->floorz) + { + P_RemoveMobj(mobj); + return; + } + break; //} default: break; @@ -7881,50 +7917,6 @@ void P_MobjThinker(mobj_t *mobj) } break; //{ SRB2kart Items - case MT_POKEY: - if (mobj->threshold) - { - if (mobj->state == &states[S_POKEY1]) - mobj->health = 1; - else if (mobj->state == &states[S_POKEY2]) - mobj->health = 2; - else if (mobj->state == &states[S_POKEY3]) - mobj->health = 3; - else if (mobj->state == &states[S_POKEY4]) - mobj->health = 4; - else if (mobj->state == &states[S_POKEY5]) - mobj->health = 5; - else if (mobj->state == &states[S_POKEY6]) - mobj->health = 6; - else if (mobj->state == &states[S_POKEY7]) - mobj->health = 7; - else if (mobj->state == &states[S_POKEY8]) - mobj->health = 8; - - mobj->threshold++; - P_SetMobjState(mobj, S_POKEYIDLE); - } - if (mobj->state == &states[S_POKEYIDLE] && mobj->threshold >= 105) - { - if (mobj->health == 1) - P_SetMobjState(mobj, S_POKEY1); - else if (mobj->health == 2) - P_SetMobjState(mobj, S_POKEY2); - else if (mobj->health == 3) - P_SetMobjState(mobj, S_POKEY3); - else if (mobj->health == 4) - P_SetMobjState(mobj, S_POKEY4); - else if (mobj->health == 5) - P_SetMobjState(mobj, S_POKEY5); - else if (mobj->health == 6) - P_SetMobjState(mobj, S_POKEY6); - else if (mobj->health == 7) - P_SetMobjState(mobj, S_POKEY7); - else if (mobj->health == 8) - P_SetMobjState(mobj, S_POKEY8); - mobj->threshold = 0; - } - break; case MT_FLOATINGITEM: { if (mobj->flags & MF_NOCLIPTHING) @@ -8147,7 +8139,7 @@ void P_MobjThinker(mobj_t *mobj) break; } case MT_BANANA: - case MT_FAKEITEM: + case MT_EGGMANITEM: if (mobj->momx || mobj->momy) P_SpawnGhostMobj(mobj); if (mobj->z <= mobj->floorz && mobj->health > 1) @@ -8561,6 +8553,449 @@ void P_MobjThinker(mobj_t *mobj) } } break; + case MT_EZZPROPELLER: + if (mobj->hnext) + { + mobj_t *cur = mobj->hnext; + + while (cur && !P_MobjWasRemoved(cur)) + { + cur->angle += FixedAngle(mobj->info->speed); + P_TeleportMove(cur, mobj->x + FINECOSINE((cur->angle*8)>>ANGLETOFINESHIFT), + mobj->y + FINESINE((cur->angle*8)>>ANGLETOFINESHIFT), mobj->z); + //P_SpawnGhostMobj(cur)->tics = 2; + + cur = cur->hnext; + } + } + if (!S_SoundPlaying(mobj, mobj->info->seesound)) + S_StartSound(mobj, mobj->info->seesound); + break; + case MT_FROGGER: + { + statenum_t frogstate = (mobj->state-states); + + // FROG ATTACK VALUES: + // threshold: distance + // movecount: time + // lastlook: direction + // extravalue1: x step + // extravalue2: y step + // cusval: z step + + if (frogstate == S_FROGGER) + { + mobj->threshold = mobj->movecount = mobj->lastlook = 0; // clear tongue attack + mobj->extravalue1 = mobj->extravalue2 = mobj->cusval = 0; + if (mobj->hnext) // Clean hnext list + { + mobj_t *cur = mobj->hnext; + while (cur && !P_MobjWasRemoved(cur)) + { + mobj_t *next = cur->hnext; + P_RemoveMobj(cur); + cur = next; + } + } + + if (mobj->reactiontime) + mobj->reactiontime--; + else + { + if (mobj->flags2 & MF2_AMBUSH) + { + mobj->momz = P_RandomRange(12, 16)<x, mobj->y, mobj->z + (mobj->height/2), MT_FROGTONGUE); + P_SetTarget(&mobj->tracer, tongue); + P_SetMobjState(mobj, S_FROGGER_ATTACK); + } + } + } + else if (frogstate == S_FROGGER_ATTACK) + { + if (!mobj->tracer || P_MobjWasRemoved(mobj->tracer)) + { + mobj->reactiontime = mobj->info->reactiontime; + P_SetMobjState(mobj, S_FROGGER); + break; + } + + if (mobj->threshold == 0) + { + fixed_t targetz = mobj->tracer->z; //mobj->z + (mobj->height/2) + + mobj->threshold = 256; + mobj->movecount = 1; + mobj->lastlook = 1; + + mobj->tracer->angle = mobj->angle; + + mobj->extravalue1 = FixedMul(FixedMul((mobj->threshold/16)<>ANGLETOFINESHIFT)), + FINECOSINE(mobj->angle>>ANGLETOFINESHIFT)) >> FRACBITS; + + mobj->extravalue2 = FixedMul(FixedMul((mobj->threshold/16)<>ANGLETOFINESHIFT)), + FINESINE(mobj->angle>>ANGLETOFINESHIFT)) >> FRACBITS; + + mobj->cusval = FixedMul((mobj->threshold/16)<>ANGLETOFINESHIFT)) >> FRACBITS; + + S_StartSound(mobj, sfx_s3k8c); // Play that tongue-y sound. + } + + mobj->movecount += mobj->lastlook; + + if (!(P_TryMove(mobj->tracer, mobj->x + ((mobj->extravalue1<movecount), mobj->y + ((mobj->extravalue2<movecount), true)) + || (mobj->movecount >= 16) // maximum travel time + || (mobj->tracer->z <= mobj->tracer->floorz) // Through the floor + || ((mobj->tracer->z + mobj->tracer->height) >= mobj->tracer->ceilingz)) // Through the ceiling + { + mobj->lastlook = -1; // Reverse direction. + } + + if (mobj->movecount == 0) // It's back to its source, time to reset. + { + mobj->threshold = mobj->lastlook = 0; + + P_RemoveMobj(mobj->tracer); + + if (mobj->hnext) // Clean hnext list + { + mobj_t *cur = mobj->hnext; + while (cur && !P_MobjWasRemoved(cur)) + { + mobj_t *next = cur->hnext; + P_RemoveMobj(cur); + cur = next; + } + } + + mobj->reactiontime = mobj->info->reactiontime; + P_SetMobjState(mobj, S_FROGGER); + } + else + { + const UINT8 numjoints = 11; + UINT8 joint = numjoints; + mobj_t *cur = mobj->hnext, *prev = mobj; + + mobj->angle = R_PointToAngle2(mobj->x, mobj->y, mobj->tracer->x, mobj->tracer->y); + + for (; joint > 0; joint--) + { + fixed_t wx = mobj->tracer->x + (joint * (mobj->x - mobj->tracer->x) / (numjoints+1)); + fixed_t wy = mobj->tracer->y + (joint * (mobj->y - mobj->tracer->y) / (numjoints+1)); + fixed_t wz = mobj->tracer->z + (joint * ((mobj->z + (mobj->height/2)) - mobj->tracer->z) / (numjoints+1)); + + if (cur && !P_MobjWasRemoved(cur)) + P_TeleportMove(cur, wx, wy, wz); + else + cur = P_SpawnMobj(wx, wy, wz, MT_FROGTONGUE_JOINT); + + P_SetTarget(&cur->target, mobj); + + P_SetTarget(&prev->hnext, cur); + P_SetTarget(&cur->hprev, prev); + + prev = cur; + cur = cur->hnext; + } + } + } + else if (frogstate == S_FROGGER_JUMP) + { + if (P_IsObjectOnGround(mobj)) + { + mobj->reactiontime = mobj->info->reactiontime; + P_SetMobjState(mobj, S_FROGGER); + } + } + } + break; + case MT_ROBRA: + case MT_BLUEROBRA: + if (mobj->health) + { + boolean blue = (mobj->type == MT_BLUEROBRA); + + if (blue) + { + if (mobj->spawnpoint) + mobj->extravalue2 = mobj->spawnpoint->angle; + else + mobj->extravalue2 = 128; + } + else + { + if (!mobj->extravalue2) + mobj->extravalue2 = P_RandomRange(64, 192); + } + + if (mobj->reactiontime) + mobj->reactiontime--; + else + { + if (!mobj->extravalue1) + { + mobj_t *head = P_SpawnMobj(mobj->x, mobj->y, mobj->z, (blue ? MT_BLUEROBRA_HEAD : MT_ROBRA_HEAD)); + P_SetTarget(&mobj->tracer, head); + + mobj->destscale = mapheaderinfo[gamemap-1]->mobj_scale; + P_SetTarget(&mobj->tracer->target, mobj->target); + P_SetTarget(&mobj->tracer->tracer, mobj); + mobj->tracer->extravalue2 = mobj->extravalue2; + + if (!blue) + mobj->tracer->angle = mobj->angle; + + mobj->extravalue1 = 1; + } + } + + if ((mobj->extravalue1) && !(mobj->tracer && !P_MobjWasRemoved(mobj->tracer))) + { + mobj->reactiontime = 20*mobj->info->reactiontime; + P_SetTarget(&mobj->target, NULL); + mobj->extravalue1 = 0; + } + + if ((mobj->tracer && !P_MobjWasRemoved(mobj->tracer)) && !(leveltime % 10)) + { + mobj_t *dust = P_SpawnMobj(mobj->x + (P_RandomRange(-4, 4)<y + (P_RandomRange(-4, 4)<z + (P_RandomRange(0, 2)<scale/2); + P_InstaThrust(dust, FixedAngle(P_RandomRange(0,359)<tracer->momz)/2); + + if (abs(mobj->tracer->momz) >= 2<health) + { + boolean blue = (mobj->type == MT_BLUEROBRA_HEAD); + UINT8 numsegs = abs(mobj->z - mobj->floorz) / (32 * mobj->scale); + UINT8 i; + mobj_t *cur = mobj->hnext, *prev = mobj; + + if (blue) + mobj->angle = (angle_t)mobj->extravalue1; + mobj->extravalue1 += (FixedAngle(2*mobj->momz) * (blue ? -1 : 1)); + + for (i = 0; i < numsegs*2; i++) // *2 to check for any extra segs still present + { + fixed_t segz = mobj->z - ((i+1) * (32 * mobj->scale)); + + if (cur && !P_MobjWasRemoved(cur)) + { + if (i >= numsegs) // Remove extras + { + mobj_t *next = cur->hnext; + P_RemoveMobj(cur); + cur = next; + continue; + } + else // Move into place + P_TeleportMove(cur, mobj->x, mobj->y, segz); + } + else + { + if (i >= numsegs) // We're done with this list + continue; //break; + else // Need another here! + cur = P_SpawnMobj(mobj->x, mobj->y, segz, (blue ? MT_BLUEROBRA_JOINT : MT_ROBRA_JOINT)); + } + + P_SetTarget(&cur->target, mobj); + P_SetScale(cur, (7*mobj->scale)/8); + + cur->angle = mobj->extravalue1; + mobj->extravalue1 += (FixedAngle(2*mobj->momz) * (blue ? -1 : 1)); + + P_SetTarget(&prev->hnext, cur); + P_SetTarget(&cur->hprev, prev); + + prev = cur; + cur = cur->hnext; + } + + { + //fixed_t ceilingheight = mobj->ceilingz - (72<floorz + (72<floorz + (mobj->extravalue2<z < targetheight) + { + mobj->momz += mobj->info->speed; + if ((mobj->z < floorheight) && (mobj->momz < 0)) + mobj->momz /= 2; + } + else + { + mobj->momz -= mobj->info->speed; + if ((mobj->z > (targetheight + (64<momz > 0)) + mobj->momz /= 2; + } + } + } + break; + case MT_ROBRA_JOINT: + case MT_BLUEROBRA_JOINT: + if (!mobj->target || P_MobjWasRemoved(mobj->target)) + { + P_RemoveMobj(mobj); + return; + } + break; + case MT_SMK_PIPE: + if (mobj->flags2 & MF2_AMBUSH) + P_SetMobjStateNF(mobj, mobj->info->seestate); + else + P_SetMobjStateNF(mobj, mobj->info->spawnstate); + break; + case MT_SMK_MOLESPAWNER: + if (!mobj->target || P_MobjWasRemoved(mobj->target)) + { + mobj_t *newmole = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_SMK_MOLE); + P_SetTarget(&mobj->target, newmole); + return; + } + break; + case MT_SMK_MOLE: + if (mobj->target && !P_MobjWasRemoved(mobj->target) && mobj->target->player) + { + player_t *player = mobj->target->player; + + mobj->extravalue1 = 1; + player->kartstuff[k_offroad] += 2<mo->x + P_ReturnThrustX(NULL, player->mo->angle, player->mo->radius) + + P_ReturnThrustX(NULL, player->mo->angle+ANGLE_90, (mobj->threshold)<mo->y + P_ReturnThrustY(NULL, player->mo->angle, player->mo->radius) + + P_ReturnThrustY(NULL, player->mo->angle+ANGLE_90, (mobj->threshold)<mo->z + (player->mo->height/2 * P_MobjFlip(player->mo)) + + (P_RandomRange(-abs(mobj->threshold), abs(mobj->threshold))<threshold /= 2; + mobj->momz = 0; + + if (mobj->movecount > 8*TICRATE) + { + P_KillMobj(mobj, mobj->target, mobj->target); + break; + } + + if (abs(player->cmd.driftturn) > 100) + { + INT32 lastsign = 0; + if (mobj->lastlook > 0) + lastsign = 1; + else if (mobj->lastlook < 0) + lastsign = -1; + + if ((player->cmd.driftturn > 0 && lastsign < 0) + || (player->cmd.driftturn < 0 && lastsign > 0)) + { + mobj->movecount += (TICRATE/2); + mobj->threshold = 16*lastsign; + S_StartSound(mobj, sfx_s1ab); + } + + mobj->lastlook = player->cmd.driftturn; + } + + mobj->movecount++; + } + else if (mobj->extravalue1) // lost your player somehow, DIE + { + P_KillMobj(mobj, NULL, NULL); + break; + } + else + { + if (P_IsObjectOnGround(mobj)) + { + if (mobj->reactiontime) + mobj->reactiontime--; + else + { + mobj->momz = (mobj->info->speed * P_MobjFlip(mobj)); + mobj->reactiontime = mobj->info->reactiontime; + } + } + } + break; + case MT_SMK_THWOMP: + if (mobj->flags2 & MF2_AMBUSH) + { + mobj->colorized = true; + mobj->color = (1 + (leveltime % (MAXSKINCOLORS-1))); + mobj->frame |= FF_FULLBRIGHT; + } + else + { + mobj->colorized = false; + mobj->color = SKINCOLOR_NONE; + mobj->frame &= (~FF_FULLBRIGHT); + } + + if (!thwompsactive) + break; + + if (mobj->reactiontime) + mobj->reactiontime--; + else + { + if (mobj->extravalue1) + { + P_SpawnGhostMobj(mobj)->tics = 3; + + if (mobj->z == mobj->floorz) + { + UINT8 i; + + mobj->extravalue1 = 0; + mobj->reactiontime = mobj->info->reactiontime; + S_StartSound(mobj, sfx_s1bd); + + for (i = 0; i < 8; i++) + { + mobj_t *dust = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_DRIFTDUST); + P_InstaThrust(dust, FixedAngle(((360*FRACUNIT)/8) * i), mobj->info->speed/8); + dust->momz = P_MobjFlip(mobj) * (P_RandomRange(1,4)<scale = mobj->scale/2; + dust->destscale = mobj->scale*3; + } + } + else + mobj->momz = (-mobj->info->speed) * P_MobjFlip(mobj); + } + else + { + if (mobj->z > mobj->movefactor) + mobj->z = mobj->movefactor; + + if (mobj->z == mobj->movefactor) + { + mobj->extravalue1 = 1; + //S_StartSound(mobj, sfx_s1bb); + } + else + mobj->momz = (mobj->info->speed/16) * P_MobjFlip(mobj); + } + } + break; //} case MT_TURRET: P_MobjCheckWater(mobj); @@ -8855,6 +9290,31 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s return; case MT_PLAYER: break; // don't remove + case MT_SMK_ICEBLOCK: + { + mobj_t *cur = mobj->hnext, *next; + UINT8 i; + + for (i = 0; i < 5; i++) + { + mobj_t *debris = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_SMK_ICEBLOCK_DEBRIS); + debris->angle = FixedAngle(P_RandomRange(0,360)<angle, P_RandomRange(3,18)*(FRACUNIT/4)); + debris->momz = P_RandomRange(4,8)<hnext; + P_RemoveMobj(cur); + cur = next; + } + + P_RemoveMobj(mobj); + return; + } default: P_SetMobjState(mobj, mobj->info->xdeathstate); // will remove the mobj if S_NULL. break; @@ -8862,7 +9322,7 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s if (P_MobjWasRemoved(mobj)) return; } - else if (((mobj->type == MT_RANDOMITEM && mobj->threshold == 69) || mobj->type == MT_FAKEITEM || mobj->type == MT_FALLINGROCK) && mobj->fuse <= TICRATE) + else if (((mobj->type == MT_RANDOMITEM && mobj->threshold == 69) || mobj->type == MT_EGGMANITEM || mobj->type == MT_FALLINGROCK) && mobj->fuse <= TICRATE) mobj->flags2 ^= MF2_DONTDRAW; } @@ -9363,7 +9823,8 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) case MT_BLUEBALL: nummaprings++; break; - case MT_KARMAHITBOX: // SRB2Kart + // SRB2Kart + case MT_KARMAHITBOX: { const fixed_t rad = FixedMul(mobjinfo[MT_PLAYER].radius, mobj->scale); mobj_t *cur, *prev = mobj; @@ -9430,6 +9891,103 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) mobj->color = SKINCOLOR_AQUA; break; } + case MT_PINETREE: + { + angle_t diff = FixedAngle((360/mobj->info->mass)*FRACUNIT); + UINT8 i; + + for (i = 0; i < mobj->info->mass; i++) + { + angle_t ang = i * diff; + mobj_t *side = P_SpawnMobj(mobj->x + FINECOSINE((ang>>ANGLETOFINESHIFT) & FINEMASK), + mobj->y + FINESINE((ang>>ANGLETOFINESHIFT) & FINEMASK), mobj->z, MT_PINETREE_SIDE); + side->angle = ang; + side->target = mobj; + side->threshold = i; + } + break; + } + case MT_EZZPROPELLER: + { + mobj_t *cur, *prev = mobj; + UINT8 i; + + for (i = 0; i < mobj->info->mass; i++) + { + mobj->angle = FixedAngle((i * (360/mobj->info->mass))<x + FINECOSINE(((mobj->angle*8)>>ANGLETOFINESHIFT) & FINEMASK), + mobj->y + FINESINE(((mobj->angle*8)>>ANGLETOFINESHIFT) & FINEMASK), mobj->z, MT_EZZPROPELLER_BLADE); + cur->angle = mobj->angle; + + P_SetTarget(&cur->hprev, prev); + P_SetTarget(&prev->hnext, cur); + + prev = cur; + } + break; + } + case MT_ROBRA: + case MT_BLUEROBRA: + P_SetScale(mobj, (mobj->destscale = 1)); + break; + case MT_ROBRA_HEAD: + { + mobj_t *shell; + + shell = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_OVERLAY); + P_SetTarget(&shell->target, mobj); + P_SetMobjState(shell, S_ROBRASHELL_INSIDE); + + shell = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_OVERLAY); + P_SetTarget(&shell->target, mobj); + P_SetMobjState(shell, S_ROBRASHELL_OUTSIDE); + } + break; + case MT_EERIEFOGGEN: + { + UINT16 i; + for (i = 0; i < mobj->info->mass; i++) + { + fixed_t newx = mobj->x + (P_RandomRange(-mobj->info->mass, mobj->info->mass)<y + (P_RandomRange(-mobj->info->mass, mobj->info->mass)<z, 8<z) + P_SpawnMobj(newx, newy, mobj->z, MT_EERIEFOG); + } + } + break; + case MT_SMK_MOLE: + mobj->reactiontime = P_RandomRange(0, 3*mobj->info->reactiontime/2); // Random delay on start of level + break; + case MT_SMK_THWOMP: + mobj->reactiontime = P_RandomRange(0, 3*mobj->info->reactiontime); // Random delay on start of level + if (mobj->z == mobj->floorz) + mobj->z += (256<movefactor = mobj->z + (256<flags2 |= MF2_STANDONME; + { + mobj_t *cur, *prev = mobj; + UINT8 i; + + for (i = 0; i < 4; i++) + { + cur = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_SMK_ICEBLOCK_SIDE); + P_SetTarget(&cur->target, mobj); + cur->threshold = i; + P_TeleportMove(cur, cur->x + ((cur->radius>>FRACBITS) * FINECOSINE((FixedAngle((90*cur->threshold)<>ANGLETOFINESHIFT) & FINEMASK)), + cur->y + ((cur->radius>>FRACBITS) * FINESINE((FixedAngle((90*cur->threshold)<>ANGLETOFINESHIFT) & FINEMASK)), cur->z); + cur->angle = ANGLE_90*(cur->threshold+1); + + P_SetTarget(&cur->hprev, prev); + P_SetTarget(&prev->hnext, cur); + + prev = cur; + } + } + break; default: break; } @@ -9437,17 +9995,19 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) switch (mobj->type) { case MT_PLAYER: - case MT_BIGMACE: case MT_SMALLMACE: + case MT_SMALLMACE: case MT_BIGMACE: + case MT_PUMA: case MT_BIGPUMA: case MT_FALLINGROCK: + case MT_SMK_MOLE: case MT_SMK_THWOMP: //case MT_RANDOMITEM: case MT_FLOATINGITEM: case MT_BATTLEBUMPER: case MT_BANANA: case MT_BANANA_SHIELD: - //case MT_FAKEITEM: case MT_FAKESHIELD: + //case MT_EGGMANITEM: case MT_EGGMANSHIELD: case MT_ORBINAUT: case MT_ORBINAUT_SHIELD: - case MT_JAWZ: case MT_JAWZ_DUD: case MT_JAWZ_SHIELD: - case MT_SSMINE: case MT_SSMINE_SHIELD: - case MT_BALLHOG: case MT_SINK: + case MT_JAWZ: case MT_JAWZ_DUD: case MT_JAWZ_SHIELD: + case MT_SSMINE: case MT_SSMINE_SHIELD: + case MT_BALLHOG: case MT_SINK: case MT_THUNDERSHIELD: case MT_ROCKETSNEAKER: case MT_SPB: P_SpawnShadowMobj(mobj); @@ -11090,6 +11650,46 @@ ML_NOCLIMB : Direction not controllable case MT_TRAPGOYLELONG: if (mthing->angle >= 360) mobj->tics += 7*(mthing->angle / 360) + 1; // starting delay + break; + // SRB2Kart + case MT_AAZTREE_HELPER: + { + fixed_t top = mobj->z; + UINT8 numsegs = (mthing->extrainfo)+2; + UINT8 numleaves = max(3, (abs(mthing->angle+1) % 6) + 3); + UINT8 i; + mobj_t *coconut; + + // Spawn tree segments + for (i = 0; i < numsegs; i++) + { + P_SpawnMobj(mobj->x, mobj->y, top, MT_AAZTREE_SEG); + top += FixedMul(mobjinfo[MT_AAZTREE_SEG].height, mobj->scale); + } + + // Big coconut topper + coconut = P_SpawnMobj(mobj->x, mobj->y, top - (8<destscale = (2*mobj->scale))); + + // Spawn all of the papersprite leaves + for (i = 0; i < numleaves; i++) + { + mobj_t *leaf; + + mobj->angle = FixedAngle((i * (360/numleaves))<x + FINECOSINE((mobj->angle>>ANGLETOFINESHIFT) & FINEMASK), + mobj->y + FINESINE((mobj->angle>>ANGLETOFINESHIFT) & FINEMASK), top, MT_AAZTREE_LEAF); + leaf->angle = mobj->angle; + + // Small coconut for each leaf + P_SpawnMobj(mobj->x + (32 * FINECOSINE((mobj->angle>>ANGLETOFINESHIFT) & FINEMASK)), + mobj->y + (32 * FINESINE((mobj->angle>>ANGLETOFINESHIFT) & FINEMASK)), top - (24<starpostnum) { diff --git a/src/p_user.c b/src/p_user.c index 0f89f826..a286202a 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7695,7 +7695,7 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius) if (mo->type == MT_ORBINAUT || mo->type == MT_JAWZ || mo->type == MT_JAWZ_DUD || mo->type == MT_ORBINAUT_SHIELD || mo->type == MT_JAWZ_SHIELD || mo->type == MT_BANANA || mo->type == MT_BANANA_SHIELD - || mo->type == MT_FAKEITEM || mo->type == MT_FAKESHIELD + || mo->type == MT_EGGMANITEM || mo->type == MT_EGGMANITEM_SHIELD || mo->type == MT_BALLHOG || mo->type == MT_SPB) { if (mo->eflags & MFE_VERTICALFLIP) From 14fcda0eca159820a6ba440d863aad9183bdbff3 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 29 Oct 2018 05:21:47 -0400 Subject: [PATCH 28/80] Make shadows more consistent on slopes for non-players --- src/p_mobj.c | 47 ++++++++++++++--------------------------------- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 91ba959a..5ced9300 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6293,6 +6293,8 @@ void P_RunShadows(void) for (mobj = shadowcap; mobj; mobj = next) { + fixed_t floorz; + next = mobj->hnext; P_SetTarget(&mobj->hnext, NULL); @@ -6302,37 +6304,16 @@ void P_RunShadows(void) continue; // shouldn't you already be dead? } - if ((mobj->target->flags2 & MF2_DONTDRAW) - || (((mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z+mobj->target->height > mobj->target->ceilingz) - || (!(mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z < mobj->target->floorz))) + if (mobj->target->player) + floorz = mobj->target->floorz; + else // FOR SOME REASON, plain floorz is not reliable for normal objects, only players?! + floorz = P_FloorzAtPos(mobj->target->x, mobj->target->y, mobj->target->z, mobj->target->height); + + K_MatchGenericExtraFlags(mobj, mobj->target); + + if (((mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z+mobj->target->height > mobj->target->ceilingz) + || (!(mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z < floorz)) mobj->flags2 |= MF2_DONTDRAW; - else - mobj->flags2 &= ~MF2_DONTDRAW; - - if (mobj->target->eflags & MFE_VERTICALFLIP) - mobj->eflags |= MFE_VERTICALFLIP; - else - mobj->eflags &= ~MFE_VERTICALFLIP; - - if (mobj->target->eflags & MFE_DRAWONLYFORP1) // groooooaann... - mobj->eflags |= MFE_DRAWONLYFORP1; - else - mobj->eflags &= ~MFE_DRAWONLYFORP1; - - if (mobj->target->eflags & MFE_DRAWONLYFORP2) - mobj->eflags |= MFE_DRAWONLYFORP2; - else - mobj->eflags &= ~MFE_DRAWONLYFORP2; - - if (mobj->target->eflags & MFE_DRAWONLYFORP3) - mobj->eflags |= MFE_DRAWONLYFORP3; - else - mobj->eflags &= ~MFE_DRAWONLYFORP3; - - if (mobj->target->eflags & MFE_DRAWONLYFORP4) - mobj->eflags |= MFE_DRAWONLYFORP4; - else - mobj->eflags &= ~MFE_DRAWONLYFORP4; // First scale to the same radius P_SetScale(mobj, FixedDiv(mobj->target->radius, mobj->info->radius)); @@ -6345,12 +6326,12 @@ void P_RunShadows(void) P_TeleportMove(mobj, dest->x, dest->y, mobj->target->z); if (((mobj->eflags & MFE_VERTICALFLIP) && (mobj->ceilingz > mobj->z+mobj->height)) - || (!(mobj->eflags & MFE_VERTICALFLIP) && (mobj->floorz < mobj->z))) + || (!(mobj->eflags & MFE_VERTICALFLIP) && (floorz < mobj->z))) { INT32 i; fixed_t prevz; - mobj->z = (mobj->eflags & MFE_VERTICALFLIP ? mobj->ceilingz : mobj->floorz); + mobj->z = (mobj->eflags & MFE_VERTICALFLIP ? mobj->ceilingz : floorz); for (i = 0; i < MAXFFLOORS; i++) { @@ -6362,7 +6343,7 @@ void P_RunShadows(void) // Check new position to see if you should still be on that ledge P_TeleportMove(mobj, dest->x, dest->y, mobj->z); - mobj->z = (mobj->eflags & MFE_VERTICALFLIP ? mobj->ceilingz : mobj->floorz); + mobj->z = (mobj->eflags & MFE_VERTICALFLIP ? mobj->ceilingz : floorz); if (mobj->z == prevz) break; From e2399c1638816caafc8d0faf6d2e604a59c1e5ff Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 29 Oct 2018 06:57:45 -0400 Subject: [PATCH 29/80] Fix Sonic's minimap icon not being properly initialised. (Experimenting with the online editor, since I'm low on time, but this is 100% correct and I'll make a new exe later.) --- src/r_things.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/r_things.c b/src/r_things.c index bd5b8b16..70451f65 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2519,7 +2519,7 @@ static void Sk_SetDefaultValue(skin_t *skin) strcpy(skin->hudname, "???"); strncpy(skin->facerank, "PLAYRANK", 9); strncpy(skin->facewant, "PLAYWANT", 9); - strncpy(skin->facemmap, "PLAYICON", 9); + strncpy(skin->facemmap, "PLAYMMAP", 9); skin->starttranscolor = 160; skin->prefcolor = SKINCOLOR_GREEN; @@ -2585,7 +2585,7 @@ void R_InitSkins(void) strncpy(skin->facerank, "PLAYRANK", 9); strncpy(skin->facewant, "PLAYWANT", 9); - strncpy(skin->facemmap, "PLAYICON", 9); + strncpy(skin->facemmap, "PLAYMMAP", 9); skin->prefcolor = SKINCOLOR_BLUE; skin->ability = CA_THOK; From 08144b96f1cdc85b9a7e5e9bab7811ccaec3bdf7 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 29 Oct 2018 17:45:59 -0400 Subject: [PATCH 30/80] Fix SMK RR thwomps casuing bounce-up --- src/p_user.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index a286202a..8b8abfe1 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -846,7 +846,8 @@ void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor) fixed_t fallbackspeed; if (inflictor && (inflictor->type != MT_PLAYER && inflictor->type != MT_ORBINAUT && inflictor->type != MT_ORBINAUT_SHIELD - && inflictor->type != MT_JAWZ && inflictor->type != MT_JAWZ_DUD && inflictor->type != MT_JAWZ_SHIELD)) + && inflictor->type != MT_JAWZ && inflictor->type != MT_JAWZ_DUD && inflictor->type != MT_JAWZ_SHIELD + && inflictor->type != MT_SMK_THWOMP)) { if (player->mo->eflags & MFE_VERTICALFLIP) player->mo->z--; From 48a400c34774876141075d6a1b58c7fa3924fe18 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 30 Oct 2018 01:23:21 -0400 Subject: [PATCH 31/80] Clean up resync pak --- src/d_clisrv.c | 108 ++++--------------------------------------------- src/d_clisrv.h | 52 ++---------------------- 2 files changed, 11 insertions(+), 149 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index f811334a..e294145c 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -555,21 +555,17 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->panim = (UINT8)players[i].panim; //panim_t rsp->aiming = (angle_t)LONG(players[i].aiming); - rsp->currentweapon = LONG(players[i].currentweapon); - rsp->ringweapons = LONG(players[i].ringweapons); for (j = 0; j < NUMPOWERS; ++j) rsp->powers[j] = (UINT16)SHORT(players[i].powers[j]); for (j = 0; j < NUMKARTSTUFF; ++j) rsp->kartstuff[j] = LONG(players[i].kartstuff[j]); // SRB2kart + rsp->frameangle = (angle_t)LONG(players[i].frameangle); // SRB2kart + // Score is resynched in the rspfirm resync packet rsp->health = 0; // resynched with mo health rsp->lives = players[i].lives; - rsp->continues = players[i].continues; - rsp->scoreadd = players[i].scoreadd; - rsp->xtralife = players[i].xtralife; - rsp->pity = players[i].pity; rsp->skincolor = players[i].skincolor; rsp->skin = LONG(players[i].skin); @@ -578,41 +574,16 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) // SRB2kart rsp->kartspeed = (UINT8)players[i].kartspeed; rsp->kartweight = (UINT8)players[i].kartweight; - // - rsp->normalspeed = (fixed_t)LONG(players[i].normalspeed); - rsp->runspeed = (fixed_t)LONG(players[i].runspeed); - rsp->thrustfactor = players[i].thrustfactor; - rsp->accelstart = players[i].accelstart; - rsp->acceleration = players[i].acceleration; - rsp->charability = players[i].charability; - rsp->charability2 = players[i].charability2; - rsp->charflags = (UINT32)LONG(players[i].charflags); - rsp->thokitem = (UINT32)LONG(players[i].thokitem); //mobjtype_t - rsp->spinitem = (UINT32)LONG(players[i].spinitem); //mobjtype_t - rsp->revitem = (UINT32)LONG(players[i].revitem); //mobjtype_t - rsp->actionspd = (fixed_t)LONG(players[i].actionspd); - rsp->mindash = (fixed_t)LONG(players[i].mindash); - rsp->maxdash = (fixed_t)LONG(players[i].maxdash); - rsp->jumpfactor = (fixed_t)LONG(players[i].jumpfactor); rsp->speed = (fixed_t)LONG(players[i].speed); - rsp->jumping = players[i].jumping; - rsp->secondjump = players[i].secondjump; - rsp->fly1 = players[i].fly1; - rsp->glidetime = (tic_t)LONG(players[i].glidetime); - rsp->climbing = players[i].climbing; rsp->deadtimer = players[i].deadtimer; rsp->exiting = (tic_t)LONG(players[i].exiting); - rsp->homing = players[i].homing; rsp->skidtime = (tic_t)LONG(players[i].skidtime); rsp->cmomx = (fixed_t)LONG(players[i].cmomx); rsp->cmomy = (fixed_t)LONG(players[i].cmomy); rsp->rmomx = (fixed_t)LONG(players[i].rmomx); rsp->rmomy = (fixed_t)LONG(players[i].rmomy); - rsp->weapondelay = LONG(players[i].weapondelay); - rsp->tossdelay = LONG(players[i].tossdelay); - rsp->starpostx = SHORT(players[i].starpostx); rsp->starposty = SHORT(players[i].starposty); rsp->starpostz = SHORT(players[i].starpostz); @@ -621,29 +592,12 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->starposttime = (tic_t)LONG(players[i].starposttime); rsp->starpostangle = (angle_t)LONG(players[i].starpostangle); - rsp->maxlink = LONG(players[i].maxlink); - rsp->dashspeed = (fixed_t)LONG(players[i].dashspeed); - rsp->dashtime = LONG(players[i].dashtime); - rsp->angle_pos = (angle_t)LONG(players[i].angle_pos); - rsp->old_angle_pos = (angle_t)LONG(players[i].old_angle_pos); - rsp->bumpertime = (tic_t)LONG(players[i].bumpertime); - rsp->flyangle = LONG(players[i].flyangle); - rsp->drilltimer = (tic_t)LONG(players[i].drilltimer); - rsp->linkcount = LONG(players[i].linkcount); - rsp->linktimer = (tic_t)LONG(players[i].linktimer); - rsp->anotherflyangle = LONG(players[i].anotherflyangle); - rsp->nightstime = (tic_t)LONG(players[i].nightstime); - rsp->drillmeter = LONG(players[i].drillmeter); - rsp->drilldelay = players[i].drilldelay; - rsp->bonustime = players[i].bonustime; - rsp->mare = players[i].mare; - rsp->lastsidehit = SHORT(players[i].lastsidehit); - rsp->lastlinehit = SHORT(players[i].lastlinehit); - rsp->losstime = (tic_t)LONG(players[i].losstime); rsp->timeshit = players[i].timeshit; rsp->onconveyor = LONG(players[i].onconveyor); + rsp->jointime = (tic_t)LONG(players[i].jointime); + rsp->hasmo = false; //Transfer important mo information if the player has a body. //This lets us resync players even if they are dead. @@ -688,21 +642,17 @@ static void resynch_read_player(resynch_pak *rsp) players[i].panim = (UINT8)rsp->panim; //panim_t players[i].aiming = (angle_t)LONG(rsp->aiming); - players[i].currentweapon = LONG(rsp->currentweapon); - players[i].ringweapons = LONG(rsp->ringweapons); for (j = 0; j < NUMPOWERS; ++j) players[i].powers[j] = (UINT16)SHORT(rsp->powers[j]); for (j = 0; j < NUMKARTSTUFF; ++j) players[i].kartstuff[j] = LONG(rsp->kartstuff[j]); // SRB2kart + players[i].frameangle = (angle_t)LONG(rsp->frameangle); // SRB2kart + // Score is resynched in the rspfirm resync packet players[i].health = rsp->health; players[i].lives = rsp->lives; - players[i].continues = rsp->continues; - players[i].scoreadd = rsp->scoreadd; - players[i].xtralife = rsp->xtralife; - players[i].pity = rsp->pity; players[i].skincolor = rsp->skincolor; players[i].skin = LONG(rsp->skin); @@ -711,40 +661,15 @@ static void resynch_read_player(resynch_pak *rsp) players[i].kartspeed = (UINT8)rsp->kartspeed; players[i].kartweight = (UINT8)rsp->kartweight; - players[i].normalspeed = (fixed_t)LONG(rsp->normalspeed); - players[i].runspeed = (fixed_t)LONG(rsp->runspeed); - players[i].thrustfactor = rsp->thrustfactor; - players[i].accelstart = rsp->accelstart; - players[i].acceleration = rsp->acceleration; - players[i].charability = rsp->charability; - players[i].charability2 = rsp->charability2; - players[i].charflags = (UINT32)LONG(rsp->charflags); - players[i].thokitem = (UINT32)LONG(rsp->thokitem); //mobjtype_t - players[i].spinitem = (UINT32)LONG(rsp->spinitem); //mobjtype_t - players[i].revitem = (UINT32)LONG(rsp->revitem); //mobjtype_t - players[i].actionspd = (fixed_t)LONG(rsp->actionspd); - players[i].mindash = (fixed_t)LONG(rsp->mindash); - players[i].maxdash = (fixed_t)LONG(rsp->maxdash); - players[i].jumpfactor = (fixed_t)LONG(rsp->jumpfactor); - players[i].speed = (fixed_t)LONG(rsp->speed); - players[i].jumping = rsp->jumping; - players[i].secondjump = rsp->secondjump; - players[i].fly1 = rsp->fly1; - players[i].glidetime = (tic_t)LONG(rsp->glidetime); - players[i].climbing = rsp->climbing; players[i].deadtimer = rsp->deadtimer; players[i].exiting = (tic_t)LONG(rsp->exiting); - players[i].homing = rsp->homing; players[i].skidtime = (tic_t)LONG(rsp->skidtime); players[i].cmomx = (fixed_t)LONG(rsp->cmomx); players[i].cmomy = (fixed_t)LONG(rsp->cmomy); players[i].rmomx = (fixed_t)LONG(rsp->rmomx); players[i].rmomy = (fixed_t)LONG(rsp->rmomy); - players[i].weapondelay = LONG(rsp->weapondelay); - players[i].tossdelay = LONG(rsp->tossdelay); - players[i].starpostx = SHORT(rsp->starpostx); players[i].starposty = SHORT(rsp->starposty); players[i].starpostz = SHORT(rsp->starpostz); @@ -753,29 +678,12 @@ static void resynch_read_player(resynch_pak *rsp) players[i].starposttime = (tic_t)LONG(rsp->starposttime); players[i].starpostangle = (angle_t)LONG(rsp->starpostangle); - players[i].maxlink = LONG(rsp->maxlink); - players[i].dashspeed = (fixed_t)LONG(rsp->dashspeed); - players[i].dashtime = LONG(rsp->dashtime); - players[i].angle_pos = (angle_t)LONG(rsp->angle_pos); - players[i].old_angle_pos = (angle_t)LONG(rsp->old_angle_pos); - players[i].bumpertime = (tic_t)LONG(rsp->bumpertime); - players[i].flyangle = LONG(rsp->flyangle); - players[i].drilltimer = (tic_t)LONG(rsp->drilltimer); - players[i].linkcount = LONG(rsp->linkcount); - players[i].linktimer = (tic_t)LONG(rsp->linktimer); - players[i].anotherflyangle = LONG(rsp->anotherflyangle); - players[i].nightstime = (tic_t)LONG(rsp->nightstime); - players[i].drillmeter = LONG(rsp->drillmeter); - players[i].drilldelay = rsp->drilldelay; - players[i].bonustime = rsp->bonustime; - players[i].mare = rsp->mare; - players[i].lastsidehit = SHORT(rsp->lastsidehit); - players[i].lastlinehit = SHORT(rsp->lastlinehit); - players[i].losstime = (tic_t)LONG(rsp->losstime); players[i].timeshit = rsp->timeshit; players[i].onconveyor = LONG(rsp->onconveyor); + players[i].jointime = (tic_t)LONG(rsp->jointime); + //We get a packet for each player in game. if (!playeringame[i]) return; diff --git a/src/d_clisrv.h b/src/d_clisrv.h index e2a6ed7c..d1bdbec9 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -184,8 +184,7 @@ typedef struct UINT8 panim; // panim_t angle_t aiming; - INT32 currentweapon; - INT32 ringweapons; + UINT16 powers[NUMPOWERS]; INT32 kartstuff[NUMKARTSTUFF]; // SRB2kart @@ -194,10 +193,6 @@ typedef struct // Score is resynched in the confirm resync packet INT32 health; SINT8 lives; - SINT8 continues; - UINT8 scoreadd; - SINT8 xtralife; - SINT8 pity; UINT8 skincolor; INT32 skin; @@ -206,41 +201,16 @@ typedef struct // SRB2kart UINT8 kartspeed; UINT8 kartweight; - // - fixed_t normalspeed; - fixed_t runspeed; - UINT8 thrustfactor; - UINT8 accelstart; - UINT8 acceleration; - UINT8 charability; - UINT8 charability2; - UINT32 charflags; - UINT32 thokitem; // mobjtype_t - UINT32 spinitem; // mobjtype_t - UINT32 revitem; // mobjtype_t - fixed_t actionspd; - fixed_t mindash; - fixed_t maxdash; - fixed_t jumpfactor; fixed_t speed; - UINT8 jumping; - UINT8 secondjump; - UINT8 fly1; - tic_t glidetime; - UINT8 climbing; INT32 deadtimer; tic_t exiting; - UINT8 homing; tic_t skidtime; fixed_t cmomx; fixed_t cmomy; fixed_t rmomx; fixed_t rmomy; - INT32 weapondelay; - INT32 tossdelay; - INT16 starpostx; INT16 starposty; INT16 starpostz; @@ -249,28 +219,12 @@ typedef struct tic_t starposttime; angle_t starpostangle; - INT32 maxlink; - fixed_t dashspeed; - INT32 dashtime; - angle_t angle_pos; - angle_t old_angle_pos; - tic_t bumpertime; - INT32 flyangle; - tic_t drilltimer; - INT32 linkcount; - tic_t linktimer; - INT32 anotherflyangle; - tic_t nightstime; - INT32 drillmeter; - UINT8 drilldelay; - UINT8 bonustime; - UINT8 mare; - INT16 lastsidehit, lastlinehit; - tic_t losstime; UINT8 timeshit; INT32 onconveyor; + tic_t jointime; + //player->mo stuff UINT8 hasmo; // Boolean From 98f9d73ca85acea8f14b749ec72dd47609346d85 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 30 Oct 2018 11:08:53 +0000 Subject: [PATCH 32/80] No fucking wonder these weren't showing up, I set their duration to 1 tic instead of -1 tic (The Volcanic Valley issue is because the most recent Volcanic Valley update in maps.kart lost all the Objectspecial flags from mapthing 2018) --- src/info.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/info.c b/src/info.c index bdf9851b..8b05ae45 100644 --- a/src/info.c +++ b/src/info.c @@ -3176,15 +3176,15 @@ state_t states[NUMSTATES] = {SPR_HTZB, 0, -1, {A_SetScale}, 2*FRACUNIT, 0, S_NULL}, // S_HTZBUSH // Ports of gardens - {SPR_SGVA, 0, 1, {NULL}, 0, 0, S_NULL}, // S_SGVINE1 - {SPR_SGVB, 0, 1, {NULL}, 0, 0, S_NULL}, // S_SGVINE2 - {SPR_SGVC, 0, 1, {NULL}, 0, 0, S_NULL}, // S_SGVINE3 - {SPR_PGTR, 0, 1, {NULL}, 0, 0, S_NULL}, // S_PGTREE - {SPR_PGF1, 0, 1, {NULL}, 0, 0, S_NULL}, // S_PGFLOWER1 - {SPR_PGF2, 0, 1, {NULL}, 0, 0, S_NULL}, // S_PGFLOWER2 - {SPR_PGF3, 0, 1, {NULL}, 0, 0, S_NULL}, // S_PGFLOWER3 - {SPR_PGBH, 0, 1, {NULL}, 0, 0, S_NULL}, // S_PGBUSH - {SPR_DPLR, 0, 1, {NULL}, 0, 0, S_NULL}, // S_DHPILLAR + {SPR_SGVA, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SGVINE1 + {SPR_SGVB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SGVINE2 + {SPR_SGVC, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SGVINE3 + {SPR_PGTR, 0, -1, {NULL}, 0, 0, S_NULL}, // S_PGTREE + {SPR_PGF1, 0, -1, {NULL}, 0, 0, S_NULL}, // S_PGFLOWER1 + {SPR_PGF2, 0, -1, {NULL}, 0, 0, S_NULL}, // S_PGFLOWER2 + {SPR_PGF3, 0, -1, {NULL}, 0, 0, S_NULL}, // S_PGFLOWER3 + {SPR_PGBH, 0, -1, {NULL}, 0, 0, S_NULL}, // S_PGBUSH + {SPR_DPLR, 0, -1, {NULL}, 0, 0, S_NULL}, // S_DHPILLAR // Midnight Channel stuff, yay more boring states! {SPR_SPTL, 0, -1, {NULL}, 0, 0, S_SPOTLIGHT}, // S_SPOTLIGHT From 7fbfed535bdf4f8a3ada339dde646b118f4963ff Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 30 Oct 2018 16:24:27 -0400 Subject: [PATCH 33/80] Add hnext/hprev to consistancy, add marescore to resynchend --- src/d_clisrv.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------ src/d_clisrv.h | 3 +-- 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index e294145c..edc0bf3d 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -847,8 +847,7 @@ static inline void resynch_write_others(resynchend_pak *rst) { rst->ctfteam[i] = 0; rst->score[i] = 0; - rst->numboxes[i] = 0; - rst->totalring[i] = 0; + rst->marescore[i] = 0; rst->realtime[i] = 0; rst->laps[i] = 0; continue; @@ -858,8 +857,7 @@ static inline void resynch_write_others(resynchend_pak *rst) rst->ingame |= (1<ctfteam[i] = (INT32)LONG(players[i].ctfteam); rst->score[i] = (UINT32)LONG(players[i].score); - rst->numboxes[i] = SHORT(players[i].numboxes); - rst->totalring[i] = SHORT(players[i].totalring); + rst->marescore[i] = (UINT32)LONG(players[i].marescore); rst->realtime[i] = (tic_t)LONG(players[i].realtime); rst->laps[i] = players[i].laps; } @@ -879,8 +877,7 @@ static inline void resynch_read_others(resynchend_pak *p) players[i].spectator = !(loc_ingame & (1<ctfteam[i]); // no, 0 does not mean spectator, at least not in Match players[i].score = (UINT32)LONG(p->score[i]); - players[i].numboxes = SHORT(p->numboxes[i]); - players[i].totalring = SHORT(p->totalring[i]); + players[i].marescore = (UINT32)LONG(p->marescore[i]); players[i].realtime = (tic_t)LONG(p->realtime[i]); players[i].laps = p->laps[i]; } @@ -4327,6 +4324,47 @@ static INT16 Consistancy(void) ret -= mo->tracer->sprite; ret += mo->tracer->frame; } + else + ret ^= 0xAAAA; + // SRB2Kart: We use hnext & hprev very extensively + if (mo->hnext) + { + ret += mo->hnext->type; + ret -= mo->hnext->x; + ret += mo->hnext->y; + ret -= mo->hnext->z; + ret += mo->hnext->momx; + ret -= mo->hnext->momy; + ret += mo->hnext->momz; + ret -= mo->hnext->angle; + ret += mo->hnext->flags; + ret -= mo->hnext->flags2; + ret += mo->hnext->eflags; + ret -= mo->hnext->state - states; + ret += mo->hnext->tics; + ret -= mo->hnext->sprite; + ret += mo->hnext->frame; + } + else + ret ^= 0x3333; + if (mo->hprev) + { + ret += mo->hprev->type; + ret -= mo->hprev->x; + ret += mo->hprev->y; + ret -= mo->hprev->z; + ret += mo->hprev->momx; + ret -= mo->hprev->momy; + ret += mo->hprev->momz; + ret -= mo->hprev->angle; + ret += mo->hprev->flags; + ret -= mo->hprev->flags2; + ret += mo->hprev->eflags; + ret -= mo->hprev->state - states; + ret += mo->hprev->tics; + ret -= mo->hprev->sprite; + ret += mo->hprev->frame; + } else ret ^= 0xAAAA; ret -= mo->state - states; diff --git a/src/d_clisrv.h b/src/d_clisrv.h index d1bdbec9..3e0bcb72 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -166,8 +166,7 @@ typedef struct // Resynch game scores and the like all at once UINT32 score[MAXPLAYERS]; // Everyone's score - INT16 numboxes[MAXPLAYERS]; - INT16 totalring[MAXPLAYERS]; + UINT32 marescore[MAXPLAYERS]; // SRB2kart: Battle score tic_t realtime[MAXPLAYERS]; UINT8 laps[MAXPLAYERS]; } ATTRPACK resynchend_pak; From f9d559b03c83c2426ef8178185f9dad7309b48df Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 30 Oct 2018 17:03:11 -0400 Subject: [PATCH 34/80] Fuck it, add back in the old vars If we want a smaller resync packet, let's actually remove these FOR REAL --- src/d_clisrv.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++ src/d_clisrv.h | 49 ++++++++++++++++++++++++ 2 files changed, 149 insertions(+) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index edc0bf3d..bba1e7b2 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -555,6 +555,8 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->panim = (UINT8)players[i].panim; //panim_t rsp->aiming = (angle_t)LONG(players[i].aiming); + rsp->currentweapon = LONG(players[i].currentweapon); + rsp->ringweapons = LONG(players[i].ringweapons); for (j = 0; j < NUMPOWERS; ++j) rsp->powers[j] = (UINT16)SHORT(players[i].powers[j]); @@ -566,6 +568,10 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) // Score is resynched in the rspfirm resync packet rsp->health = 0; // resynched with mo health rsp->lives = players[i].lives; + rsp->continues = players[i].continues; + rsp->scoreadd = players[i].scoreadd; + rsp->xtralife = players[i].xtralife; + rsp->pity = players[i].pity; rsp->skincolor = players[i].skincolor; rsp->skin = LONG(players[i].skin); @@ -574,16 +580,41 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) // SRB2kart rsp->kartspeed = (UINT8)players[i].kartspeed; rsp->kartweight = (UINT8)players[i].kartweight; + // + rsp->normalspeed = (fixed_t)LONG(players[i].normalspeed); + rsp->runspeed = (fixed_t)LONG(players[i].runspeed); + rsp->thrustfactor = players[i].thrustfactor; + rsp->accelstart = players[i].accelstart; + rsp->acceleration = players[i].acceleration; + rsp->charability = players[i].charability; + rsp->charability2 = players[i].charability2; + rsp->charflags = (UINT32)LONG(players[i].charflags); + rsp->thokitem = (UINT32)LONG(players[i].thokitem); //mobjtype_t + rsp->spinitem = (UINT32)LONG(players[i].spinitem); //mobjtype_t + rsp->revitem = (UINT32)LONG(players[i].revitem); //mobjtype_t + rsp->actionspd = (fixed_t)LONG(players[i].actionspd); + rsp->mindash = (fixed_t)LONG(players[i].mindash); + rsp->maxdash = (fixed_t)LONG(players[i].maxdash); + rsp->jumpfactor = (fixed_t)LONG(players[i].jumpfactor); rsp->speed = (fixed_t)LONG(players[i].speed); + rsp->jumping = players[i].jumping; + rsp->secondjump = players[i].secondjump; + rsp->fly1 = players[i].fly1; + rsp->glidetime = (tic_t)LONG(players[i].glidetime); + rsp->climbing = players[i].climbing; rsp->deadtimer = players[i].deadtimer; rsp->exiting = (tic_t)LONG(players[i].exiting); + rsp->homing = players[i].homing; rsp->skidtime = (tic_t)LONG(players[i].skidtime); rsp->cmomx = (fixed_t)LONG(players[i].cmomx); rsp->cmomy = (fixed_t)LONG(players[i].cmomy); rsp->rmomx = (fixed_t)LONG(players[i].rmomx); rsp->rmomy = (fixed_t)LONG(players[i].rmomy); + rsp->weapondelay = LONG(players[i].weapondelay); + rsp->tossdelay = LONG(players[i].tossdelay); + rsp->starpostx = SHORT(players[i].starpostx); rsp->starposty = SHORT(players[i].starposty); rsp->starpostz = SHORT(players[i].starpostz); @@ -592,6 +623,25 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->starposttime = (tic_t)LONG(players[i].starposttime); rsp->starpostangle = (angle_t)LONG(players[i].starpostangle); + rsp->maxlink = LONG(players[i].maxlink); + rsp->dashspeed = (fixed_t)LONG(players[i].dashspeed); + rsp->dashtime = LONG(players[i].dashtime); + rsp->angle_pos = (angle_t)LONG(players[i].angle_pos); + rsp->old_angle_pos = (angle_t)LONG(players[i].old_angle_pos); + rsp->bumpertime = (tic_t)LONG(players[i].bumpertime); + rsp->flyangle = LONG(players[i].flyangle); + rsp->drilltimer = (tic_t)LONG(players[i].drilltimer); + rsp->linkcount = LONG(players[i].linkcount); + rsp->linktimer = (tic_t)LONG(players[i].linktimer); + rsp->anotherflyangle = LONG(players[i].anotherflyangle); + rsp->nightstime = (tic_t)LONG(players[i].nightstime); + rsp->drillmeter = LONG(players[i].drillmeter); + rsp->drilldelay = players[i].drilldelay; + rsp->bonustime = players[i].bonustime; + rsp->mare = players[i].mare; + rsp->lastsidehit = SHORT(players[i].lastsidehit); + rsp->lastlinehit = SHORT(players[i].lastlinehit); + rsp->losstime = (tic_t)LONG(players[i].losstime); rsp->timeshit = players[i].timeshit; rsp->onconveyor = LONG(players[i].onconveyor); @@ -642,6 +692,8 @@ static void resynch_read_player(resynch_pak *rsp) players[i].panim = (UINT8)rsp->panim; //panim_t players[i].aiming = (angle_t)LONG(rsp->aiming); + players[i].currentweapon = LONG(rsp->currentweapon); + players[i].ringweapons = LONG(rsp->ringweapons); for (j = 0; j < NUMPOWERS; ++j) players[i].powers[j] = (UINT16)SHORT(rsp->powers[j]); @@ -653,6 +705,10 @@ static void resynch_read_player(resynch_pak *rsp) // Score is resynched in the rspfirm resync packet players[i].health = rsp->health; players[i].lives = rsp->lives; + players[i].continues = rsp->continues; + players[i].scoreadd = rsp->scoreadd; + players[i].xtralife = rsp->xtralife; + players[i].pity = rsp->pity; players[i].skincolor = rsp->skincolor; players[i].skin = LONG(rsp->skin); @@ -661,15 +717,40 @@ static void resynch_read_player(resynch_pak *rsp) players[i].kartspeed = (UINT8)rsp->kartspeed; players[i].kartweight = (UINT8)rsp->kartweight; + players[i].normalspeed = (fixed_t)LONG(rsp->normalspeed); + players[i].runspeed = (fixed_t)LONG(rsp->runspeed); + players[i].thrustfactor = rsp->thrustfactor; + players[i].accelstart = rsp->accelstart; + players[i].acceleration = rsp->acceleration; + players[i].charability = rsp->charability; + players[i].charability2 = rsp->charability2; + players[i].charflags = (UINT32)LONG(rsp->charflags); + players[i].thokitem = (UINT32)LONG(rsp->thokitem); //mobjtype_t + players[i].spinitem = (UINT32)LONG(rsp->spinitem); //mobjtype_t + players[i].revitem = (UINT32)LONG(rsp->revitem); //mobjtype_t + players[i].actionspd = (fixed_t)LONG(rsp->actionspd); + players[i].mindash = (fixed_t)LONG(rsp->mindash); + players[i].maxdash = (fixed_t)LONG(rsp->maxdash); + players[i].jumpfactor = (fixed_t)LONG(rsp->jumpfactor); + players[i].speed = (fixed_t)LONG(rsp->speed); + players[i].jumping = rsp->jumping; + players[i].secondjump = rsp->secondjump; + players[i].fly1 = rsp->fly1; + players[i].glidetime = (tic_t)LONG(rsp->glidetime); + players[i].climbing = rsp->climbing; players[i].deadtimer = rsp->deadtimer; players[i].exiting = (tic_t)LONG(rsp->exiting); + players[i].homing = rsp->homing; players[i].skidtime = (tic_t)LONG(rsp->skidtime); players[i].cmomx = (fixed_t)LONG(rsp->cmomx); players[i].cmomy = (fixed_t)LONG(rsp->cmomy); players[i].rmomx = (fixed_t)LONG(rsp->rmomx); players[i].rmomy = (fixed_t)LONG(rsp->rmomy); + players[i].weapondelay = LONG(rsp->weapondelay); + players[i].tossdelay = LONG(rsp->tossdelay); + players[i].starpostx = SHORT(rsp->starpostx); players[i].starposty = SHORT(rsp->starposty); players[i].starpostz = SHORT(rsp->starpostz); @@ -678,6 +759,25 @@ static void resynch_read_player(resynch_pak *rsp) players[i].starposttime = (tic_t)LONG(rsp->starposttime); players[i].starpostangle = (angle_t)LONG(rsp->starpostangle); + players[i].maxlink = LONG(rsp->maxlink); + players[i].dashspeed = (fixed_t)LONG(rsp->dashspeed); + players[i].dashtime = LONG(rsp->dashtime); + players[i].angle_pos = (angle_t)LONG(rsp->angle_pos); + players[i].old_angle_pos = (angle_t)LONG(rsp->old_angle_pos); + players[i].bumpertime = (tic_t)LONG(rsp->bumpertime); + players[i].flyangle = LONG(rsp->flyangle); + players[i].drilltimer = (tic_t)LONG(rsp->drilltimer); + players[i].linkcount = LONG(rsp->linkcount); + players[i].linktimer = (tic_t)LONG(rsp->linktimer); + players[i].anotherflyangle = LONG(rsp->anotherflyangle); + players[i].nightstime = (tic_t)LONG(rsp->nightstime); + players[i].drillmeter = LONG(rsp->drillmeter); + players[i].drilldelay = rsp->drilldelay; + players[i].bonustime = rsp->bonustime; + players[i].mare = rsp->mare; + players[i].lastsidehit = SHORT(rsp->lastsidehit); + players[i].lastlinehit = SHORT(rsp->lastlinehit); + players[i].losstime = (tic_t)LONG(rsp->losstime); players[i].timeshit = rsp->timeshit; players[i].onconveyor = LONG(rsp->onconveyor); diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 3e0bcb72..4d738632 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -183,6 +183,8 @@ typedef struct UINT8 panim; // panim_t angle_t aiming; + INT32 currentweapon; + INT32 ringweapons; UINT16 powers[NUMPOWERS]; @@ -192,6 +194,10 @@ typedef struct // Score is resynched in the confirm resync packet INT32 health; SINT8 lives; + SINT8 continues; + UINT8 scoreadd; + SINT8 xtralife; + SINT8 pity; UINT8 skincolor; INT32 skin; @@ -200,16 +206,41 @@ typedef struct // SRB2kart UINT8 kartspeed; UINT8 kartweight; + // + fixed_t normalspeed; + fixed_t runspeed; + UINT8 thrustfactor; + UINT8 accelstart; + UINT8 acceleration; + UINT8 charability; + UINT8 charability2; + UINT32 charflags; + UINT32 thokitem; // mobjtype_t + UINT32 spinitem; // mobjtype_t + UINT32 revitem; // mobjtype_t + fixed_t actionspd; + fixed_t mindash; + fixed_t maxdash; + fixed_t jumpfactor; fixed_t speed; + UINT8 jumping; + UINT8 secondjump; + UINT8 fly1; + tic_t glidetime; + UINT8 climbing; INT32 deadtimer; tic_t exiting; + UINT8 homing; tic_t skidtime; fixed_t cmomx; fixed_t cmomy; fixed_t rmomx; fixed_t rmomy; + INT32 weapondelay; + INT32 tossdelay; + INT16 starpostx; INT16 starposty; INT16 starpostz; @@ -218,6 +249,24 @@ typedef struct tic_t starposttime; angle_t starpostangle; + INT32 maxlink; + fixed_t dashspeed; + INT32 dashtime; + angle_t angle_pos; + angle_t old_angle_pos; + tic_t bumpertime; + INT32 flyangle; + tic_t drilltimer; + INT32 linkcount; + tic_t linktimer; + INT32 anotherflyangle; + tic_t nightstime; + INT32 drillmeter; + UINT8 drilldelay; + UINT8 bonustime; + UINT8 mare; + INT16 lastsidehit, lastlinehit; + tic_t losstime; UINT8 timeshit; INT32 onconveyor; From 6c020aab2e95f138fc655dc75486536d92563f63 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 30 Oct 2018 22:07:35 +0000 Subject: [PATCH 35/80] Some adjustments to the position faces. (Currently untested, but I need to merge master in and accidentially did this before that and I still have to compile from scratch for this branch, so...) --- src/k_kart.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index dc7a5bd3..7baa2058 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6435,8 +6435,10 @@ static boolean K_drawKartPositionFaces(void) { for (i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i] && !completed[i] && players[i].mo && !players[i].spectator - && (rankplayer[ranklines] < 0 || players[i].kartstuff[k_position] < players[rankplayer[ranklines]].kartstuff[k_position])) + if (completed[i] || !playeringame[i] || players[i].spectator || !players[i].mo) + continue; + + if (rankplayer[ranklines] < 0 || players[i].kartstuff[k_position] < players[rankplayer[ranklines]].kartstuff[k_position]) { rankplayer[ranklines] = i; } @@ -6459,7 +6461,7 @@ static boolean K_drawKartPositionFaces(void) else Y -= (9*5); - if (strank <= 2) // too close to the top? + if (G_BattleGametype() || strank <= 2) // too close to the top, or playing battle? { i = 0; if (ranklines > 5) // could be both... @@ -6475,7 +6477,8 @@ static boolean K_drawKartPositionFaces(void) for (; i < ranklines; i++) { - if (players[rankplayer[i]].spectator) continue; // Spectators are ignored + if (!playeringame[rankplayer[i]]) continue; + if (players[rankplayer[i]].spectator) continue; if (!players[rankplayer[i]].mo) continue; bumperx = FACE_X+18; From ad78c754304d6476975174dcadde88e4bb247988 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 30 Oct 2018 22:09:04 +0000 Subject: [PATCH 36/80] Make the horizontal line at the bottom of the tab rankings use the duptweaks. --- 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 b0fb8875..603c4e40 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2283,7 +2283,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (scorelines > 8) { V_DrawFill(160, 26, 1, 147, 0); // Draw a vertical line to separate the two sides. - V_DrawFill(1, 173, 318, 1, 0); // And a horizontal line near the bottom. + V_DrawFill(1-duptweak, 173, dupadjust-2, 1, 0); // And a horizontal line near the bottom. rightoffset = (BASEVIDWIDTH/2) - 4 - x; } From f1ea725319369fcd3fcd2847011685ba2843520f Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 30 Oct 2018 18:20:56 -0400 Subject: [PATCH 37/80] Clean up for player->mo resyncing Make most of the order match the struct, make sure proper type conversions are used when needed --- src/d_clisrv.c | 69 ++++++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index bba1e7b2..b6f424cc 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -658,26 +658,26 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->health = LONG(players[i].mo->health); rsp->angle = (angle_t)LONG(players[i].mo->angle); - rsp->x = LONG(players[i].mo->x); - rsp->y = LONG(players[i].mo->y); - rsp->z = LONG(players[i].mo->z); - rsp->momx = LONG(players[i].mo->momx); - rsp->momy = LONG(players[i].mo->momy); - rsp->momz = LONG(players[i].mo->momz); - rsp->friction = LONG(players[i].mo->friction); - rsp->movefactor = LONG(players[i].mo->movefactor); + rsp->x = (fixed_t)LONG(players[i].mo->x); + rsp->y = (fixed_t)LONG(players[i].mo->y); + rsp->z = (fixed_t)LONG(players[i].mo->z); + rsp->momx = (fixed_t)LONG(players[i].mo->momx); + rsp->momy = (fixed_t)LONG(players[i].mo->momy); + rsp->momz = (fixed_t)LONG(players[i].mo->momz); + rsp->friction = (fixed_t)LONG(players[i].mo->friction); + rsp->movefactor = (fixed_t)LONG(players[i].mo->movefactor); rsp->tics = LONG(players[i].mo->tics); rsp->statenum = (statenum_t)LONG(players[i].mo->state-states); // :( + rsp->flags = (UINT32)LONG(players[i].mo->flags); + rsp->flags2 = (UINT32)LONG(players[i].mo->flags2); rsp->eflags = (UINT16)SHORT(players[i].mo->eflags); - rsp->flags = LONG(players[i].mo->flags); - rsp->flags2 = LONG(players[i].mo->flags2); - rsp->radius = LONG(players[i].mo->radius); - rsp->height = LONG(players[i].mo->height); - rsp->scale = LONG(players[i].mo->scale); - rsp->destscale = LONG(players[i].mo->destscale); - rsp->scalespeed = LONG(players[i].mo->scalespeed); + rsp->radius = (fixed_t)LONG(players[i].mo->radius); + rsp->height = (fixed_t)LONG(players[i].mo->height); + rsp->scale = (fixed_t)LONG(players[i].mo->scale); + rsp->destscale = (fixed_t)LONG(players[i].mo->destscale); + rsp->scalespeed = (fixed_t)LONG(players[i].mo->scalespeed); } static void resynch_read_player(resynch_pak *rsp) @@ -802,27 +802,30 @@ static void resynch_read_player(resynch_pak *rsp) //At this point, the player should have a body, whether they were respawned or not. P_UnsetThingPosition(players[i].mo); - players[i].mo->angle = (angle_t)LONG(rsp->angle); - players[i].mo->eflags = (UINT16)SHORT(rsp->eflags); - players[i].mo->flags = LONG(rsp->flags); - players[i].mo->flags2 = LONG(rsp->flags2); - players[i].mo->friction = LONG(rsp->friction); players[i].mo->health = LONG(rsp->health); - players[i].mo->momx = LONG(rsp->momx); - players[i].mo->momy = LONG(rsp->momy); - players[i].mo->momz = LONG(rsp->momz); - players[i].mo->movefactor = LONG(rsp->movefactor); + + players[i].mo->angle = (angle_t)LONG(rsp->angle); + players[i].mo->x = (fixed_t)LONG(rsp->x); + players[i].mo->y = (fixed_t)LONG(rsp->y); + players[i].mo->z = (fixed_t)LONG(rsp->z); + players[i].mo->momx = (fixed_t)LONG(rsp->momx); + players[i].mo->momy = (fixed_t)LONG(rsp->momy); + players[i].mo->momz = (fixed_t)LONG(rsp->momz); + players[i].mo->friction = (fixed_t)LONG(rsp->friction); + players[i].mo->movefactor = (fixed_t)LONG(rsp->movefactor); + players[i].mo->tics = LONG(rsp->tics); - P_SetMobjStateNF(players[i].mo, LONG(rsp->statenum)); - players[i].mo->x = LONG(rsp->x); - players[i].mo->y = LONG(rsp->y); - players[i].mo->z = LONG(rsp->z); - players[i].mo->radius = LONG(rsp->radius); - players[i].mo->height = LONG(rsp->height); + P_SetMobjStateNF(players[i].mo, (statenum_t)LONG(rsp->statenum)); + players[i].mo->flags = (UINT32)LONG(rsp->flags); + players[i].mo->flags2 = (UINT32)LONG(rsp->flags2); + players[i].mo->eflags = (UINT16)SHORT(rsp->eflags); + + players[i].mo->radius = (fixed_t)LONG(rsp->radius); + players[i].mo->height = (fixed_t)LONG(rsp->height); // P_SetScale is redundant for this, as all related variables are already restored properly. - players[i].mo->scale = LONG(rsp->scale); - players[i].mo->destscale = LONG(rsp->destscale); - players[i].mo->scalespeed = LONG(rsp->scalespeed); + players[i].mo->scale = (fixed_t)LONG(rsp->scale); + players[i].mo->destscale = (fixed_t)LONG(rsp->destscale); + players[i].mo->scalespeed = (fixed_t)LONG(rsp->scalespeed); // And finally, SET THE MOBJ SKIN damn it. players[i].mo->skin = &skins[players[i].skin]; From fe177975ca259aff3b8cca803a1b69e527a5312f Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 30 Oct 2018 22:44:05 +0000 Subject: [PATCH 38/80] Fix ping alignment. --- 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 603c4e40..16f68802 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2296,7 +2296,7 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (netgame // don't draw it offline && tab[i].num != serverplayer) - HU_drawPing(x + rightoffset + ((scorelines > 8) ? 13 : -27), y+2, playerpingtable[tab[i].num], false); + HU_drawPing(x + ((i < 8) ? -19 : rightoffset + 13), y+2, playerpingtable[tab[i].num], false); if (scorelines > 8) strlcpy(strtime, tab[i].name, 6); From 26241d32ce8c1c9f6bc0825d85634b854214c891 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 30 Oct 2018 23:01:17 +0000 Subject: [PATCH 39/80] Have HU_DrawRankings and K_drawKartPositionFaces learn a thing or two from each other, considering the latter was originally copypasted code from the former but then diverged a bit. Hopefully this solves our disconnect woes. --- src/hu_stuff.c | 4 ++-- src/k_kart.c | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 16f68802..5118fb75 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2733,7 +2733,7 @@ static void HU_DrawRankings(void) tab[i].name = NULL; tab[i].count = INT32_MAX; - if (!playeringame[i] || players[i].spectator) + if (!playeringame[i] || players[i].spectator || !players[i].mo) continue; numplayersingame++; @@ -2744,7 +2744,7 @@ static void HU_DrawRankings(void) UINT8 lowestposition = MAXPLAYERS; for (i = 0; i < MAXPLAYERS; i++) { - if (!playeringame[i] || players[i].spectator || completed[i]) + if (completed[i] || !playeringame[i] || players[i].spectator || !players[i].mo) continue; if (players[i].kartstuff[k_position] >= lowestposition) diff --git a/src/k_kart.c b/src/k_kart.c index f6ad0354..52d8f0ec 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6431,16 +6431,19 @@ static boolean K_drawKartPositionFaces(void) for (j = 0; j < numplayersingame; j++) { + UINT8 lowestposition = MAXPLAYERS; for (i = 0; i < MAXPLAYERS; i++) { if (completed[i] || !playeringame[i] || players[i].spectator || !players[i].mo) continue; - if (rankplayer[ranklines] < 0 || players[i].kartstuff[k_position] < players[rankplayer[ranklines]].kartstuff[k_position]) - { - rankplayer[ranklines] = i; - } + if (players[i].kartstuff[k_position] >= lowestposition) + continue; + + rankplayer[ranklines] = i; + lowestposition = players[i].kartstuff[k_position]; } + i = rankplayer[ranklines]; completed[i] = true; From aea453f6f28ae0f734f2c27c4227e309f90a470e Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 30 Oct 2018 20:11:15 -0400 Subject: [PATCH 40/80] Set stats to what we want them to be for R2 anyway (Eggman's will need updating in the wad) --- src/r_things.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/r_things.c b/src/r_things.c index 70451f65..54b20e17 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2592,8 +2592,8 @@ void R_InitSkins(void) skin->actionspd = 60<kartspeed = 7; - skin->kartweight = 3; + skin->kartspeed = 8; + skin->kartweight = 2; // skin->normalspeed = 36< Date: Tue, 30 Oct 2018 20:35:33 -0500 Subject: [PATCH 41/80] SOC_CHAO hardcode TODO: fix comment alignment --- src/dehacked.c | 116 ++++++ src/info.c | 967 ++++++++++++++++++++++++++++++++++++++++++++++++- src/info.h | 148 ++++++++ src/sounds.c | 15 + src/sounds.h | 15 + 5 files changed, 1260 insertions(+), 1 deletion(-) diff --git a/src/dehacked.c b/src/dehacked.c index bf2a5ca1..94a3a32f 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6924,6 +6924,88 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_CDTREEASP", "S_CDTREEBSP", + // SOC_CHAO hardcode + "S_BLUEFIRE1", + "S_BLUEFIRE2", + "S_BLUEFIRE3", + "S_BLUEFIRE4", + "S_GREENFIRE1", + "S_GREENFIRE2", + "S_GREENFIRE3", + "S_GREENFIRE4", + "S_REGALCHEST", + "S_CHIMERASTATUE", + "S_DRAGONSTATUE", + "S_LIZARDMANSTATUE", + "S_PEGASUSSTATUE", + "S_ZELDAFIRE1", + "S_ZELDAFIRE2", + "S_ZELDAFIRE3", + "S_ZELDAFIRE4", + "S_GANBARETHING", + "S_GANBAREDUCK", + "S_GANBARETREE", + "S_MONOIDLE", + "S_MONOCHASE1", + "S_MONOCHASE2", + "S_MONOCHASE3", + "S_MONOCHASE4", + "S_MONOPAIN", + "S_REDZELDAFIRE1", + "S_REDZELDAFIRE2", + "S_REDZELDAFIRE3", + "S_REDZELDAFIRE4", + "S_BOWLINGPIN", + "S_BOWLINGHIT1", + "S_BOWLINGHIT2", + "S_BOWLINGHIT3", + "S_BOWLINGHIT4", + "S_ARIDTOAD", + "S_TOADHIT1", + "S_TOADHIT2", + "S_TOADHIT3", + "S_TOADHIT4", + "S_EBARRELIDLE", + "S_EBARREL1", + "S_EBARREL2", + "S_EBARREL3", + "S_EBARREL4", + "S_EBARREL5", + "S_EBARREL6", + "S_EBARREL7", + "S_EBARREL8", + "S_EBARREL9", + "S_EBARREL10", + "S_EBARREL11", + "S_EBARREL12", + "S_EBARREL13", + "S_EBARREL14", + "S_EBARREL15", + "S_EBARREL16", + "S_EBARREL17", + "S_EBARREL18", + "S_MERRYHORSE", + "S_BLUEFRUIT", + "S_ORANGEFRUIT", + "S_REDFRUIT", + "S_PINKFRUIT", + "S_ADVENTURESPIKEA1", + "S_ADVENTURESPIKEA2", + "S_ADVENTURESPIKEB1", + "S_ADVENTURESPIKEB2", + "S_ADVENTURESPIKEC1", + "S_ADVENTURESPIKEC2", + "S_BOOSTPROMPT1", + "S_BOOSTPROMPT2", + "S_BOOSTOFF1", + "S_BOOSTOFF2", + "S_BOOSTON1", + "S_BOOSTON2", + "S_LIZARDMAN", + "S_LIONMAN", + "S_MOUSEMAN1", + "S_MOUSEMAN2", + #ifdef SEENAMES "S_NAMECHECK", #endif @@ -7644,6 +7726,40 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_CDTREEA", "MT_CDTREEB", + // SOC_CHAO hardcode + "MT_BLUEFIRE", + "MT_GREENFIRE", + "MT_REGALCHEST", + "MT_CHIMERASTATUE", + "MT_DRAGONSTATUE", + "MT_LIZARDMANSTATUE", + "MT_PEGASUSSTATUE", + "MT_ZELDAFIRE", + "MT_GANBARETHING", + "MT_GANBAREDUCK", + "MT_GANBARETREE", + "MT_MONOKUMA", + "MT_REDZELDAFIRE", + "MT_BOWLINGPIN", + "MT_MERRYAMBIENCE", + "MT_TWINKLECARTAMBIENCE", + "MT_EXPLODINGBARREL", + "MT_MERRYHORSE", + "MT_ARIDTOAD", + "MT_BLUEFRUIT", + "MT_ORANGEFRUIT", + "MT_REDFRUIT", + "MT_PINKFRUIT", + "MT_ADVENTURESPIKEA", + "MT_ADVENTURESPIKEB", + "MT_ADVENTURESPIKEC", + "MT_BOOSTPROMPT", + "MT_BOOSTOFF", + "MT_BOOSTON", + "MT_LIZARDMAN", + "MT_LIONMAN", + "MT_MOUSEMAN", + #ifdef SEENAMES "MT_NAMECHECK", #endif diff --git a/src/info.c b/src/info.c index 4e4ea8f6..037d6b58 100644 --- a/src/info.c +++ b/src/info.c @@ -64,7 +64,10 @@ char sprnames[NUMSPRITES + 1][5] = "LZI2","KLIT","FZSM","FZBM","FPRT","SBUS","SHRB","TWEE","MARB","FUFO", "RUST","BLON","VAPE","HTZA","HTZB","SGVA","SGVB","SGVC","PGTR","PGF1", "PGF2","PGF3","PGBH","DPLR","SPTL","ENM1","GARU","MARR","REAP","JITB", - "CDMO","CDBU", + "CDMO","CDBU","CNDL","DOCH","DUCK","GTRE","CHES","CHIM","DRGN","LZMN", + "PGSS","ZTCH","MKMA","MKMP","RTCH","BOWL","BOWH","BRRL","BRRR","HRSE", + "TOAH","BFRT","OFRT","RFRT","PFRT","ASPK","HBST","HBSO","HBSF","WBLZ", + "WBLN","MSMF", "XMS4","XMS5","VIEW" }; @@ -3221,6 +3224,104 @@ state_t states[NUMSTATES] = {SPR_CDBU, 1, -1, {NULL}, 0, 0, S_CDTREEASP}, // S_CDTREEASP {SPR_CDBU, 2, -1, {NULL}, 0, 0, S_CDTREEBSP}, // S_CDTREEBSP + // SOC_CHAO hardcode + {SPR_CNDL, FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_BLUEFIRE2}, // S_BLUEFIRE1 + {SPR_CNDL, 1|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_BLUEFIRE3}, // S_BLUEFIRE2 + {SPR_CNDL, 2|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_BLUEFIRE4}, // S_BLUEFIRE3 + {SPR_CNDL, 3|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_BLUEFIRE1}, // S_BLUEFIRE4 + + {SPR_CNDL, 4|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_GREENFIRE2}, // S_GREENFIRE1 + {SPR_CNDL, 5|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_GREENFIRE3}, // S_GREENFIRE2 + {SPR_CNDL, 6|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_GREENFIRE4}, // S_GREENFIRE3 + {SPR_CNDL, 7|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_GREENFIRE1}, // S_GREENFIRE4 + + {SPR_CHES, 0, -1, {NULL}, 0, 0, S_NULL}, // S_REGALCHEST + {SPR_CHIM, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_CHIMERASTATUE + {SPR_DRGN, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_DRAGONSTATUE + {SPR_LZMN, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LIZARDMANSTATUE + {SPR_PGSS, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_PEGASUSSTATUE + + {SPR_ZTCH, FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_ZELDAFIRE2}, // S_ZELDAFIRE1 + {SPR_ZTCH, 1|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_ZELDAFIRE3}, // S_ZELDAFIRE2 + {SPR_ZTCH, 2|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_ZELDAFIRE4}, // S_ZELDAFIRE3 + {SPR_ZTCH, 3|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_ZELDAFIRE1}, // S_ZELDAFIRE4 + + {SPR_DOCH, 0, -1, {NULL}, 0, 0, S_NULL}, // S_GANBARETHING + {SPR_DUCK, 0, -1, {NULL}, 0, 0, S_NULL}, // S_GANBAREDUCK + {SPR_GTRE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_GANBARETREE + + {SPR_MKMA, 1, 2, {A_Look}, (256<<16)|1, 0, S_MONOIDLE}, // S_MONOIDLE + {SPR_MKMA, 0, 3, {A_Chase}, 3, 0, S_MONOCHASE2}, // S_MONOCHASE1 + {SPR_MKMA, 1, 3, {A_Chase}, 3, 0, S_MONOCHASE3}, // S_MONOCHASE2 + {SPR_MKMA, 2, 3, {A_Chase}, 3, 0, S_MONOCHASE4}, // S_MONOCHASE3 + {SPR_MKMA, 3, 3, {A_Chase}, 3, 0, S_MONOCHASE1}, // S_MONOCHASE4 + {SPR_MKMP, 0, 24, {A_Pain}, 3, 0, S_MONOIDLE}, // S_MONOPAIN + + {SPR_RTCH, FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_REDZELDAFIRE2}, // S_REDZELDAFIRE1 + {SPR_RTCH, 1|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_REDZELDAFIRE3}, // S_REDZELDAFIRE2 + {SPR_RTCH, 2|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_REDZELDAFIRE4}, // S_REDZELDAFIRE3 + {SPR_RTCH, 3|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_REDZELDAFIRE1}, // S_REDZELDAFIRE4 + + {SPR_BOWL, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BOWLINGPIN + {SPR_BOWH, 0, 4, {A_BunnyHop}, 5, 20, S_BOWLINGHIT2}, // S_BOWLINGHIT1 + {SPR_BOWH, 1, 2, {NULL}, 0, 0, S_BOWLINGHIT3}, // S_BOWLINGHIT2 + {SPR_BOWH, 2, 2, {NULL}, 0, 0, S_BOWLINGHIT4}, // S_BOWLINGHIT3 + {SPR_BOWH, 3, 2, {NULL}, 0, 0, S_NULL}, // S_BOWLINGHIT4 + + {SPR_BRRL, 0, 1, {A_Look}, (96<<16)|1, 0, S_EBARRELIDLE}, // S_EBARRELIDLE + {SPR_BRRR, 0, 4, {NULL}, 0, 0, S_EBARREL2}, // S_EBARREL1 + {SPR_BRRR, 1, 4, {NULL}, 0, 0, S_EBARREL3}, // S_EBARREL2 + {SPR_BRRR, 2, 4, {NULL}, 0, 0, S_EBARREL4}, // S_EBARREL3 + {SPR_BRRR, 3, 4, {NULL}, 0, 0, S_EBARREL5}, // S_EBARREL4 + {SPR_BRRR, 4, 4, {NULL}, 0, 0, S_EBARREL6}, // S_EBARREL5 + {SPR_BRRR, 5, 4, {NULL}, 0, 0, S_EBARREL7}, // S_EBARREL6 + {SPR_BRRR, 6, 4, {NULL}, 0, 0, S_EBARREL8}, // S_EBARREL7 + {SPR_BRRR, 7, 4, {NULL}, 0, 0, S_EBARREL9}, // S_EBARREL8 + {SPR_BRRR, 8, 4, {NULL}, 0, 0, S_EBARREL10}, // S_EBARREL9 + {SPR_BRRR, 9, 4, {NULL}, 0, 0, S_EBARREL11}, // S_EBARREL10 + {SPR_BRRR, 10, 4, {NULL}, 0, 0, S_EBARREL12}, // S_EBARREL11 + {SPR_BRRR, 11, 4, {NULL}, 0, 0, S_EBARREL13}, // S_EBARREL12 + {SPR_BRRR, 12, 4, {NULL}, 0, 0, S_EBARREL14}, // S_EBARREL13 + {SPR_BRRR, 13, 4, {NULL}, 0, 0, S_EBARREL15}, // S_EBARREL14 + {SPR_BRRR, 14, 4, {NULL}, 0, 0, S_EBARREL16}, // S_EBARREL15 + {SPR_BRRR, 15, 4, {NULL}, 0, 0, S_EBARREL17}, // S_EBARREL16 + {SPR_BRRR, 16, 4, {NULL}, 0, 0, S_EBARREL18}, // S_EBARREL17 + {SPR_BRRR, 16, 0, {A_MineExplode}, MT_MINEEXPLOSION, 0, S_NULL}, // S_EBARREL18 + + {SPR_HRSE, 0, 230, {A_PlaySeeSound}, 0, 0, S_MERRYHORSE}, // S_MERRYHORSE + + {SPR_BFRT, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BLUEFRUIT + {SPR_OFRT, 0, -1, {NULL}, 0, 0, S_NULL}, // S_ORANGEFRUIT + {SPR_RFRT, 0, -1, {NULL}, 0, 0, S_NULL}, // S_REDFRUIT + {SPR_PFRT, 0, -1, {NULL}, 0, 0, S_NULL}, // S_PINKFRUIT + + {SPR_ASPK, 0, 50, {A_PlayAttackSound}, 0, 0, S_ADVENTURESPIKEA2}, // S_ADVENTURESPIKEA1 + {SPR_ASPK, 0, 50, {A_BunnyHop}, 20, 0, S_ADVENTURESPIKEA1}, // S_ADVENTURESPIKEA2 + {SPR_ASPK, 0, 50, {A_PlayAttackSound}, 0, 0, S_ADVENTURESPIKEB2}, // S_ADVENTURESPIKEB1 + {SPR_ASPK, 0, 35, {A_BunnyHop}, 15, 0, S_ADVENTURESPIKEB1}, // S_ADVENTURESPIKEB2 + {SPR_ASPK, 0, 50, {A_PlayAttackSound}, 0, 0, S_ADVENTURESPIKEC2}, // S_ADVENTURESPIKEC1 + {SPR_ASPK, 0, 65, {A_BunnyHop}, 25, 0, S_ADVENTURESPIKEC1}, // S_ADVENTURESPIKEC1 + + {SPR_HBST, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTPROMPT2}, // S_BOOSTPROMPT1 + {SPR_HBST, 1|FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTPROMPT1}, // S_BOOSTPROMPT2 + + {SPR_HBSF, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTOFF2}, // S_BOOSTOFF1 + {SPR_HBSF, 1|FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTOFF1}, // S_BOOSTOFF2 + + {SPR_HBSO, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTON2}, // S_BOOSTON1 + {SPR_HBSO, 1|FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTON1}, // S_BOOSTON2 + + {SPR_TOAD, 0, -1, {NULL}, 0, 0, S_NULL}, // S_ARIDTOAD + {SPR_TOAH, 0, 4, {A_BunnyHop}, 10, 60, S_TOADHIT2}, // S_TOADHIT1 + {SPR_TOAH, 1, 3, {NULL}, 0, 0, S_TOADHIT3}, // S_TOADHIT2 + {SPR_TOAH, 2, 3, {NULL}, 0, 0, S_TOADHIT4}, // S_TOADHIT3 + {SPR_TOAH, 3, 3, {NULL}, 0, 0, S_EBARREL18}, // S_TOADHIT4 + + {SPR_WBLZ, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LIZARDMAN + {SPR_WBLN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LIONMAN + {SPR_MSMF, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_MOUSEMAN2}, // S_MOUSEMAN1 + {SPR_MSMF, 1|FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_MOUSEMAN1}, // S_MOUSEMAN2 + #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK #endif @@ -18529,6 +18630,870 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BLUEFIRE + 749, // doomednum + S_BLUEFIRE1, // 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 + 0, // speed + 8*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 20, // damage + sfx_None, // activesound + MF_SPECIAL|MF_FIRE, // flags + S_NULL // raisestate + }, + + { // MT_GREENFIRE + 748, // doomednum + S_GREENFIRE1, // 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 + 0, // speed + 8< Date: Wed, 31 Oct 2018 02:46:16 -0400 Subject: [PATCH 42/80] "Joined with" kicks display in the chat instead of console --- src/d_clisrv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 3d5b90a2..97b352da 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2922,7 +2922,7 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum) if (otherp >= 0) \ { \ if (otherp != pnum) \ - CONS_Printf("\x82%s\x80 left the game (Joined with \x82%s\x80)\n", player_names[otherp], player_names[pnum]); \ + HU_AddChatText(va("\x82*%s left the game (Joined with %s)", player_names[otherp], player_names[pnum]), false); \ buf[0] = (UINT8)otherp; \ SendNetXCmd(XD_REMOVEPLAYER, &buf, 1); \ otherp = -1; \ From db731209e521daa39c1308fb8a8ec76a95a7ead3 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 03:06:36 -0400 Subject: [PATCH 43/80] Fix ENTER GAME option not working --- src/d_netcmd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index a2dd550f..df9fb54a 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -3234,6 +3234,8 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum) players[playernum].playerstate = PST_REBORN; } + players[playernum].pflags &= ~PF_WANTSTOJOIN; + //Now that we've done our error checking and killed the player //if necessary, put the player on the correct team/status. if (G_TagGametype()) @@ -3315,8 +3317,6 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum) else CONS_Printf(M_GetText("%s switched to the %c%s%c.\n"), player_names[playernum], '\x84', M_GetText("Blue Team"), '\x80'); } - else if (players[playernum].pflags & PF_WANTSTOJOIN) - players[playernum].pflags &= ~PF_WANTSTOJOIN; else HU_AddChatText(va("\x82*%s became a spectator.", player_names[playernum]), false); From 20d86f01c7ab2a45455dcb0641b05f6fbc372bfe Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 03:07:33 -0400 Subject: [PATCH 44/80] Cancel pogo spring when bumping a wall Prevents instances where you can use it to stick in one spot in Battle --- src/p_map.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_map.c b/src/p_map.c index 1d8a2daa..0078a969 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3784,6 +3784,7 @@ void P_BouncePlayerMove(mobj_t *mo) S_StartSound(mo, sfx_s3k49); } + mo->player->kartstuff[k_pogospring] = 0; // Cancel pogo spring effect so you aren't shoved forward back into the wall you just bounced off P_PlayerHitBounceLine(bestslideline); mo->eflags |= MFE_JUSTBOUNCEDWALL; From cc5d248c9095d30a3aa6fdd0dc41483a95391c2e Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 03:13:56 -0400 Subject: [PATCH 45/80] Time over cam & signposts support mobjscale --- src/p_mobj.c | 4 ++-- src/p_spec.c | 6 +++--- src/p_user.c | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index f4fd40c9..9802c88e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8509,8 +8509,8 @@ void P_MobjThinker(mobj_t *mobj) case MT_FZEROBOOM: // F-Zero explosion if (!mobj->extravalue1) { - fixed_t mx = P_ReturnThrustX(NULL, mobj->angle, 32<angle, 32<angle, 32*mobj->scale); + fixed_t my = P_ReturnThrustY(NULL, mobj->angle, 32*mobj->scale); mobj_t *explosion = P_SpawnMobj(mobj->x + (2*mx), mobj->y + (2*my), mobj->z+(mobj->height/2), MT_THOK); P_SetMobjState(explosion, S_FZEROBOOM1); diff --git a/src/p_spec.c b/src/p_spec.c index 76ed73aa..b7006c87 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3219,7 +3219,7 @@ void P_SetupSignExit(player_t *player) // SRB2Kart: Set sign spinning variables thing->movefactor = thing->z; - thing->z += (768<z += (768*thing->scale) * P_MobjFlip(thing); thing->movecount = 1; ++numfound; @@ -3247,7 +3247,7 @@ void P_SetupSignExit(player_t *player) // SRB2Kart: Set sign spinning variables thing->movefactor = thing->z; - thing->z += (768<z += (768*thing->scale) * P_MobjFlip(thing); thing->movecount = 1; ++numfound; @@ -3259,7 +3259,7 @@ void P_SetupSignExit(player_t *player) // SRB2Kart: FINALLY, add in an alternative if no place is found if (player->mo) { - mobj_t *sign = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + (768<mo->x, player->mo->y, player->mo->z + (768*mapheaderinfo[gamemap-1]->mobj_scale), MT_SIGN); P_SetTarget(&sign->target, player->mo); P_SetMobjState(sign, S_SIGN1); diff --git a/src/p_user.c b/src/p_user.c index 8cd31f72..b5d9397d 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8606,8 +8606,8 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (timeover == 1) { - thiscam->momx = P_ReturnThrustX(NULL, mo->angle, 32<momy = P_ReturnThrustY(NULL, mo->angle, 32<momx = P_ReturnThrustX(NULL, mo->angle, 32*mo->scale); // Push forward + thiscam->momy = P_ReturnThrustY(NULL, mo->angle, 32*mo->scale); thiscam->momz = 0; } else if (player->exiting || timeover == 2) From 66a7adfc34e1b82d45ec62f66eed194ff5805570 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 04:46:24 -0400 Subject: [PATCH 46/80] Push fakes away from other items Prevents stupid item stacking in Battle (you can still do it with bananas, but THOSE are removable, and don't have a similar sprite) --- src/p_map.c | 25 +++++++++++++++++++++++++ src/p_mobj.c | 1 + 2 files changed, 26 insertions(+) diff --git a/src/p_map.c b/src/p_map.c index 0078a969..2bcfd73a 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -665,8 +665,33 @@ static boolean PIT_CheckThing(mobj_t *thing) // SRB2kart 011617 - Colission code for kart items //{ + // Push fakes out of other items + if (tmthing->type == MT_FAKEITEM && (thing->type == MT_RANDOMITEM || thing->type == MT_FAKEITEM)) + { + // see if it went over / under + if (tmthing->z > thing->z + thing->height) + return true; // overhead + if (tmthing->z + tmthing->height < thing->z) + return true; // underneath + + P_InstaThrust(tmthing, R_PointToAngle2(thing->x, thing->y, tmthing->x, tmthing->y), thing->radius/4); + return true; + } + else if (thing->type == MT_FAKEITEM && (tmthing->type == MT_RANDOMITEM || tmthing->type == MT_FAKEITEM)) + { + // see if it went over / under + if (tmthing->z > thing->z + thing->height) + return true; // overhead + if (tmthing->z + tmthing->height < thing->z) + return true; // underneath + + P_InstaThrust(thing, R_PointToAngle2(tmthing->x, tmthing->y, thing->x, thing->y), tmthing->radius/4); + return true; + } + if (tmthing->type == MT_RANDOMITEM) return true; + if (tmthing->type == MT_ORBINAUT || tmthing->type == MT_JAWZ || tmthing->type == MT_JAWZ_DUD || tmthing->type == MT_ORBINAUT_SHIELD || tmthing->type == MT_JAWZ_SHIELD) { diff --git a/src/p_mobj.c b/src/p_mobj.c index 9802c88e..407ddc39 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8151,6 +8151,7 @@ void P_MobjThinker(mobj_t *mobj) } case MT_BANANA: case MT_FAKEITEM: + mobj->friction = ORIG_FRICTION/4; if (mobj->momx || mobj->momy) P_SpawnGhostMobj(mobj); if (mobj->z <= mobj->floorz && mobj->health > 1) From 6da700629fd5ae63a191a724157343c715f5e6a3 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 04:55:00 -0400 Subject: [PATCH 47/80] Fix incorrect scale of player arrows in non-splitscreen whoops --- src/p_mobj.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 407ddc39..611562a9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6829,10 +6829,10 @@ void P_MobjThinker(mobj_t *mobj) if (!splitscreen) { - scale += FixedMul(FixedDiv(abs(P_AproxDistance(players[displayplayer].mo->x-mobj->target->x, + scale = mobj->target->scale + FixedMul(FixedDiv(abs(P_AproxDistance(players[displayplayer].mo->x-mobj->target->x, players[displayplayer].mo->y-mobj->target->y)), RING_DIST), mobj->target->scale); - if (scale > 16*FRACUNIT) - scale = 16*FRACUNIT; + if (scale > 16*mobj->target->scale) + scale = 16*mobj->target->scale; } mobj->destscale = scale; @@ -7025,10 +7025,10 @@ void P_MobjThinker(mobj_t *mobj) if (!splitscreen) { - scale += FixedMul(FixedDiv(abs(P_AproxDistance(players[displayplayer].mo->x-mobj->target->x, + scale = mobj->target->scale + FixedMul(FixedDiv(abs(P_AproxDistance(players[displayplayer].mo->x-mobj->target->x, players[displayplayer].mo->y-mobj->target->y)), RING_DIST), mobj->target->scale); - if (scale > 16*FRACUNIT) - scale = 16*FRACUNIT; + if (scale > 16*mobj->target->scale) + scale = 16*mobj->target->scale; } mobj->destscale = scale; } From 54f71d3dbf0ab2443bd8e01b51148c9f74e250f8 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 05:28:39 -0400 Subject: [PATCH 48/80] Use frameangle for rocket sneakers so they rotate around you when you spinout --- 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 ee59566f..be902e97 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3630,7 +3630,7 @@ static void K_MoveHeldObjects(player_t *player) #if 1 { - angle_t input = player->mo->angle - cur->angle; + angle_t input = player->frameangle - cur->angle; boolean invert = (input > ANGLE_180); if (invert) input = InvAngle(input); @@ -3642,7 +3642,7 @@ static void K_MoveHeldObjects(player_t *player) cur->angle = cur->angle + input; } #else - cur->angle = player->mo->angle; + cur->angle = player->frameangle; #endif angoffset = ANGLE_90 + (ANGLE_180 * num); From e76da7d5caa6da4b6991ef8896406674ce88d9f2 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 05:32:59 -0400 Subject: [PATCH 49/80] No item usage while squished or respawning --- src/k_kart.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index be902e97..fc90de2b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4662,7 +4662,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else if (cmd->buttons & BT_ATTACK) player->pflags |= PF_ATTACKDOWN; - if (player && player->mo && player->mo->health > 0 && !player->spectator && !(player->exiting || mapreset) && player->kartstuff[k_spinouttimer] == 0) + if (player && player->mo && player->mo->health > 0 && !player->spectator && !(player->exiting || mapreset) + && player->kartstuff[k_spinouttimer] == 0 && player->kartstuff[k_squishedtimer] == 0 && player->kartstuff[k_respawn] == 0) { // First, the really specific, finicky items that function without the item being directly in your item slot. // Karma item dropping From 80b8aefdb2bc0d055314276c995ab5b992ed1537 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 05:35:06 -0400 Subject: [PATCH 50/80] Nerfed squishing After fixing flashing tics not being set properly, 2 seconds of being fully stopped and then another 1.5 seconds minimum of being unable to be hit just feels like an eternity :V --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index fc90de2b..4e576ea3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1940,7 +1940,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source) K_CheckBumpers(); } - player->kartstuff[k_squishedtimer] = 2*TICRATE; + player->kartstuff[k_squishedtimer] = TICRATE; player->powers[pw_flashing] = K_GetKartFlashing(player); From 668acad8a78e585ddc1de235d22b71fb8152a474 Mon Sep 17 00:00:00 2001 From: toaster Date: Wed, 31 Oct 2018 16:18:44 +0000 Subject: [PATCH 51/80] Order of state enums was different to that of info table, so corrected. --- src/info.c | 13 +++++++------ src/info.h | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/info.c b/src/info.c index 57c243fd..da3ba55a 100644 --- a/src/info.c +++ b/src/info.c @@ -3325,6 +3325,12 @@ state_t states[NUMSTATES] = {SPR_BOWH, 1, 2, {NULL}, 0, 0, S_BOWLINGHIT3}, // S_BOWLINGHIT2 {SPR_BOWH, 2, 2, {NULL}, 0, 0, S_BOWLINGHIT4}, // S_BOWLINGHIT3 {SPR_BOWH, 3, 2, {NULL}, 0, 0, S_NULL}, // S_BOWLINGHIT4 + + {SPR_TOAD, 0, -1, {NULL}, 0, 0, S_NULL}, // S_ARIDTOAD + {SPR_TOAH, 0, 4, {A_BunnyHop}, 10, 60, S_TOADHIT2}, // S_TOADHIT1 + {SPR_TOAH, 1, 3, {NULL}, 0, 0, S_TOADHIT3}, // S_TOADHIT2 + {SPR_TOAH, 2, 3, {NULL}, 0, 0, S_TOADHIT4}, // S_TOADHIT3 + {SPR_TOAH, 3, 3, {NULL}, 0, 0, S_EBARREL18}, // S_TOADHIT4 {SPR_BRRL, 0, 1, {A_Look}, (96<<16)|1, 0, S_EBARRELIDLE}, // S_EBARRELIDLE {SPR_BRRR, 0, 4, {NULL}, 0, 0, S_EBARREL2}, // S_EBARREL1 @@ -3369,12 +3375,6 @@ state_t states[NUMSTATES] = {SPR_HBSO, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTON2}, // S_BOOSTON1 {SPR_HBSO, 1|FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTON1}, // S_BOOSTON2 - {SPR_TOAD, 0, -1, {NULL}, 0, 0, S_NULL}, // S_ARIDTOAD - {SPR_TOAH, 0, 4, {A_BunnyHop}, 10, 60, S_TOADHIT2}, // S_TOADHIT1 - {SPR_TOAH, 1, 3, {NULL}, 0, 0, S_TOADHIT3}, // S_TOADHIT2 - {SPR_TOAH, 2, 3, {NULL}, 0, 0, S_TOADHIT4}, // S_TOADHIT3 - {SPR_TOAH, 3, 3, {NULL}, 0, 0, S_EBARREL18}, // S_TOADHIT4 - {SPR_WBLZ, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LIZARDMAN {SPR_WBLN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LIONMAN {SPR_MSMF, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_MOUSEMAN2}, // S_MOUSEMAN1 @@ -19469,6 +19469,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = sfx_None, // activesound MF_SCENERY|MF_NOCLIP|MF_NOCLIPHEIGHT, // flags S_NULL // raisestate + }, { // MT_BLUEFIRE 749, // doomednum diff --git a/src/info.h b/src/info.h index b5373ba1..2ed349cb 100644 --- a/src/info.h +++ b/src/info.h @@ -3940,42 +3940,51 @@ typedef enum state S_BLUEFIRE2, S_BLUEFIRE3, S_BLUEFIRE4, + S_GREENFIRE1, S_GREENFIRE2, S_GREENFIRE3, S_GREENFIRE4, + S_REGALCHEST, S_CHIMERASTATUE, S_DRAGONSTATUE, S_LIZARDMANSTATUE, S_PEGASUSSTATUE, + S_ZELDAFIRE1, S_ZELDAFIRE2, S_ZELDAFIRE3, S_ZELDAFIRE4, + S_GANBARETHING, S_GANBAREDUCK, S_GANBARETREE, + S_MONOIDLE, S_MONOCHASE1, S_MONOCHASE2, S_MONOCHASE3, S_MONOCHASE4, S_MONOPAIN, + S_REDZELDAFIRE1, S_REDZELDAFIRE2, S_REDZELDAFIRE3, S_REDZELDAFIRE4, + S_BOWLINGPIN, S_BOWLINGHIT1, S_BOWLINGHIT2, S_BOWLINGHIT3, S_BOWLINGHIT4, + S_ARIDTOAD, S_TOADHIT1, S_TOADHIT2, S_TOADHIT3, S_TOADHIT4, + S_EBARRELIDLE, S_EBARREL1, S_EBARREL2, @@ -3995,23 +4004,30 @@ typedef enum state S_EBARREL16, S_EBARREL17, S_EBARREL18, + S_MERRYHORSE, + S_BLUEFRUIT, S_ORANGEFRUIT, S_REDFRUIT, S_PINKFRUIT, + S_ADVENTURESPIKEA1, S_ADVENTURESPIKEA2, S_ADVENTURESPIKEB1, S_ADVENTURESPIKEB2, S_ADVENTURESPIKEC1, S_ADVENTURESPIKEC2, + S_BOOSTPROMPT1, S_BOOSTPROMPT2, + S_BOOSTOFF1, S_BOOSTOFF2, + S_BOOSTON1, S_BOOSTON2, + S_LIZARDMAN, S_LIONMAN, S_MOUSEMAN1, From 2999c45d05550c3f184420496acad5ae9d2309a7 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 15:14:53 -0400 Subject: [PATCH 52/80] Item distribution experiments based on my experience in netgames Needs tested tonight. - Grow & Rocket Sneakers are slightly more in the back - Sneaker x3 gets handed out more in the back-middle - Removed 5% from Ballhog towards the front - Removed 5% from Shrink in the forward-most column it was in --- src/k_kart.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 4e576ea3..23b84ff1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -487,22 +487,22 @@ static INT32 K_KartItemOddsRace[NUMKARTRESULTS][9] = { //P-Odds 0 1 2 3 4 5 6 7 8 /*Sneaker*/ {20, 0, 0, 4, 6, 6, 0, 0, 0 }, // Sneaker - /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 2, 5, 5, 0 }, // Rocket Sneaker - /*Invincibility*/ { 0, 0, 0, 0, 0, 1, 4, 6,16 }, // Invincibility + /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 1, 3, 5, 3 }, // Rocket Sneaker + /*Invincibility*/ { 0, 0, 0, 0, 0, 1, 4, 6,14 }, // Invincibility /*Banana*/ { 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana /*Eggman Monitor*/ { 0, 4, 3, 2, 0, 0, 0, 0, 0 }, // Eggman Monitor /*Orbinaut*/ { 0, 6, 5, 3, 2, 0, 0, 0, 0 }, // Orbinaut /*Jawz*/ { 0, 0, 3, 2, 1, 1, 0, 0, 0 }, // Jawz - /*Mine*/ { 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Mine - /*Ballhog*/ { 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Ballhog + /*Mine*/ { 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Mine + /*Ballhog*/ { 0, 0, 0, 2, 1, 0, 0, 0, 0 }, // Ballhog /*Self-Propelled Bomb*/ { 0, 0, 1, 2, 3, 4, 2, 2, 0 }, // Self-Propelled Bomb - /*Grow*/ { 0, 0, 0, 0, 0, 1, 3, 5, 4 }, // Grow - /*Shrink*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0 }, // Shrink + /*Grow*/ { 0, 0, 0, 0, 0, 1, 3, 5, 3 }, // Grow + /*Shrink*/ { 0, 0, 0, 0, 0, 0, 0, 2, 0 }, // Shrink /*Thunder Shield*/ { 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Thunder Shield /*Hyudoro*/ { 0, 0, 0, 0, 1, 2, 1, 0, 0 }, // Hyudoro /*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring /*Kitchen Sink*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Kitchen Sink - /*Sneaker x3*/ { 0, 0, 0, 0, 3, 6, 6, 2, 0 }, // Sneaker x3 + /*Sneaker x3*/ { 0, 0, 0, 0, 3, 7, 9, 2, 0 }, // Sneaker x3 /*Banana x3*/ { 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Banana x3 /*Banana x10*/ { 0, 0, 0, 0, 1, 0, 0, 0, 0 }, // Banana x10 /*Orbinaut x3*/ { 0, 0, 0, 1, 0, 0, 0, 0, 0 }, // Orbinaut x3 From 659e6fa617017d7b5fe71b5327a0c2dc457068b4 Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 1 Nov 2018 00:10:34 +0000 Subject: [PATCH 53/80] That's it for me. No new features, no major sprite replacements. Maybe bugfixing stuff like this I did while half-asleep just in case it turns out I missed a test case. * Oni's new 1x Bumpers and Out-Of-Bumpers competition-style 'X'! * Modify alignment for `GOTITx` emblem drawing to match new Chaos Coin sprites. * Adjust m_cond.c list to use new Chaos Coin Emblem sprite slots. --- src/hu_stuff.c | 86 +----------------------------------- src/k_kart.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++--- src/m_cond.c | 104 ++++++++++++++++++++++---------------------- src/m_menu.c | 12 +++--- 4 files changed, 167 insertions(+), 150 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 5118fb75..614ca49a 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2268,92 +2268,8 @@ void HU_drawPing(INT32 x, INT32 y, INT32 ping, boolean notext) } // -// HU_DrawTabRankings +// HU_DrawTabRankings -- moved to k_kart.c // -void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol) -{ - INT32 i, rightoffset = 240; - const UINT8 *colormap; - INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; - - //this function is designed for 9 or less score lines only - //I_Assert(scorelines <= 9); -- not today bitch, kart fixed it up - - V_DrawFill(1-duptweak, 26, dupadjust-2, 1, 0); // Draw a horizontal line because it looks nice! - if (scorelines > 8) - { - V_DrawFill(160, 26, 1, 147, 0); // Draw a vertical line to separate the two sides. - V_DrawFill(1-duptweak, 173, dupadjust-2, 1, 0); // And a horizontal line near the bottom. - rightoffset = (BASEVIDWIDTH/2) - 4 - x; - } - - for (i = 0; i < scorelines; i++) - { - char strtime[MAXPLAYERNAME+1]; - - if (players[tab[i].num].spectator || !players[tab[i].num].mo) - continue; //ignore them. - - if (netgame // don't draw it offline - && tab[i].num != serverplayer) - HU_drawPing(x + ((i < 8) ? -19 : rightoffset + 13), y+2, playerpingtable[tab[i].num], false); - - if (scorelines > 8) - strlcpy(strtime, tab[i].name, 6); - else - STRBUFCPY(strtime, tab[i].name); - - V_DrawString(x + 20, y, - ((tab[i].num == whiteplayer) - ? hilicol|V_ALLOWLOWERCASE - : V_ALLOWLOWERCASE), - strtime); - - if (players[tab[i].num].mo->color) - { - colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo->color, GTC_CACHE); - if (players[tab[i].num].mo->colorized) - colormap = R_GetTranslationColormap(TC_RAINBOW, players[tab[i].num].mo->color, GTC_CACHE); - else - colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo->color, GTC_CACHE); - - V_DrawMappedPatch(x, y-4, 0, facerankprefix[players[tab[i].num].skin], colormap); - /*if (G_BattleGametype() && players[tab[i].num].kartstuff[k_bumper] > 0) -- doesn't physically fit... - { - INT32 bumperx = x-5; - for (j = 0; j < players[tab[i].num].kartstuff[k_bumper]; j++) - { - bumperx -= 3; - V_DrawSmallMappedPatch(bumperx, y+6, 0, W_CachePatchName("K_BLNICO", PU_CACHE), colormap); - } - }*/ - } - - if (G_BattleGametype() && players[tab[i].num].kartstuff[k_bumper] <= 0) - V_DrawSmallScaledPatch(x-2, y-4, 0, W_CachePatchName("K_NOBLNS", PU_CACHE)); - - if (G_RaceGametype()) - { -#define timestring(time) va("%i'%02i\"%02i", G_TicsToMinutes(time, true), G_TicsToSeconds(time), G_TicsToCentiseconds(time)) - if (players[tab[i].num].exiting) - V_DrawRightAlignedString(x+rightoffset, y, hilicol, timestring(players[tab[i].num].realtime)); - else if (players[tab[i].num].pflags & PF_TIMEOVER) - V_DrawRightAlignedThinString(x+rightoffset, y-1, 0, "NO CONTEST."); - else if (circuitmap) - V_DrawRightAlignedString(x+rightoffset, y, 0, va("Lap %d", tab[i].count)); -#undef timestring - } - else - V_DrawRightAlignedString(x+rightoffset, y, 0, va("%u", tab[i].count)); - - y += 18; - if (i == 7) - { - y = 33; - x = (BASEVIDWIDTH/2) + 4; - } - } -} // // HU_DrawTeamTabRankings diff --git a/src/k_kart.c b/src/k_kart.c index 52d8f0ec..8fc4c2a8 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5528,6 +5528,7 @@ static patch_t *kp_winnernum[NUMPOSFRAMES]; static patch_t *kp_facenum[MAXPLAYERS+1]; static patch_t *kp_rankbumper; +static patch_t *kp_tinybumpera, *kp_tinybumperb; static patch_t *kp_ranknobumpers; static patch_t *kp_battlewin; @@ -5653,6 +5654,8 @@ void K_LoadKartHUDGraphics(void) // Extra ranking icons kp_rankbumper = W_CachePatchName("K_BLNICO", PU_HUDGFX); + kp_tinybumpera = W_CachePatchName("K_BLNA", PU_HUDGFX); + kp_tinybumperb = W_CachePatchName("K_BLNB", PU_HUDGFX); kp_ranknobumpers = W_CachePatchName("K_NOBLNS", PU_HUDGFX); // Battle graphics @@ -6311,7 +6314,7 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, bo } V_DrawRightAlignedString(workx, worky, splitflags, targettext); - workx -= 72; //69; -- good night sweet prince + workx -= 67; V_DrawSmallScaledPatch(workx + 4, worky, splitflags, W_CachePatchName("NEEDIT", PU_CACHE)); break; @@ -6324,7 +6327,7 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, bo splitflags = (splitflags &~ V_HUDTRANSHALF)|V_HUDTRANS; while (curemb--) { - workx -= 16; + workx -= 12; V_DrawSmallMappedPatch(workx + 4, worky, splitflags, emblempic[curemb], emblemcol[curemb]); } } @@ -6482,7 +6485,7 @@ static boolean K_drawKartPositionFaces(void) if (players[rankplayer[i]].spectator) continue; if (!players[rankplayer[i]].mo) continue; - bumperx = FACE_X+18; + bumperx = FACE_X+19; if (players[rankplayer[i]].mo->color) { @@ -6495,16 +6498,17 @@ static boolean K_drawKartPositionFaces(void) V_DrawMappedPatch(FACE_X, Y, V_HUDTRANS|V_SNAPTOLEFT, facerankprefix[players[rankplayer[i]].skin], colormap); if (G_BattleGametype() && players[rankplayer[i]].kartstuff[k_bumper] > 0) { - for (j = 0; j < players[rankplayer[i]].kartstuff[k_bumper]; j++) + V_DrawMappedPatch(bumperx-2, Y, V_HUDTRANS|V_SNAPTOLEFT, kp_tinybumpera, colormap); + for (j = 1; j < players[rankplayer[i]].kartstuff[k_bumper]; j++) { - V_DrawSmallMappedPatch(bumperx, Y+10, V_HUDTRANS|V_SNAPTOLEFT, kp_rankbumper, colormap); - bumperx += 3; + bumperx += 5; + V_DrawMappedPatch(bumperx, Y, V_HUDTRANS|V_SNAPTOLEFT, kp_tinybumperb, colormap); } } } if (G_BattleGametype() && players[rankplayer[i]].kartstuff[k_bumper] <= 0) - V_DrawSmallScaledPatch(FACE_X-2, Y, V_HUDTRANS|V_SNAPTOLEFT, kp_ranknobumpers); + V_DrawScaledPatch(FACE_X-4, Y-3, V_HUDTRANS|V_SNAPTOLEFT, kp_ranknobumpers); else { INT32 pos = players[rankplayer[i]].kartstuff[k_position]; @@ -6520,6 +6524,103 @@ static boolean K_drawKartPositionFaces(void) return false; } +// +// HU_DrawTabRankings -- moved here to take advantage of kart stuff! +// +void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 whiteplayer, INT32 hilicol) +{ + INT32 i, rightoffset = 240; + const UINT8 *colormap; + INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; + + //this function is designed for 9 or less score lines only + //I_Assert(scorelines <= 9); -- not today bitch, kart fixed it up + + V_DrawFill(1-duptweak, 26, dupadjust-2, 1, 0); // Draw a horizontal line because it looks nice! + if (scorelines > 8) + { + V_DrawFill(160, 26, 1, 147, 0); // Draw a vertical line to separate the two sides. + V_DrawFill(1-duptweak, 173, dupadjust-2, 1, 0); // And a horizontal line near the bottom. + rightoffset = (BASEVIDWIDTH/2) - 4 - x; + } + + for (i = 0; i < scorelines; i++) + { + char strtime[MAXPLAYERNAME+1]; + + if (players[tab[i].num].spectator || !players[tab[i].num].mo) + continue; //ignore them. + + if (netgame // don't draw it offline + && tab[i].num != serverplayer) + HU_drawPing(x + ((i < 8) ? -19 : rightoffset + 13), y+2, playerpingtable[tab[i].num], false); + + if (scorelines > 8) + strlcpy(strtime, tab[i].name, 6); + else + STRBUFCPY(strtime, tab[i].name); + + V_DrawString(x + 20, y, + ((tab[i].num == whiteplayer) + ? hilicol|V_ALLOWLOWERCASE + : V_ALLOWLOWERCASE), + strtime); + + if (players[tab[i].num].mo->color) + { + colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo->color, GTC_CACHE); + if (players[tab[i].num].mo->colorized) + colormap = R_GetTranslationColormap(TC_RAINBOW, players[tab[i].num].mo->color, GTC_CACHE); + else + colormap = R_GetTranslationColormap(players[tab[i].num].skin, players[tab[i].num].mo->color, GTC_CACHE); + + V_DrawMappedPatch(x, y-4, 0, facerankprefix[players[tab[i].num].skin], colormap); + /*if (G_BattleGametype() && players[tab[i].num].kartstuff[k_bumper] > 0) -- not enough space for this + { + INT32 bumperx = x+19; + V_DrawMappedPatch(bumperx-2, y-4, 0, kp_tinybumpera, colormap); + for (j = 1; j < players[tab[i].num].kartstuff[k_bumper]; j++) + { + bumperx += 5; + V_DrawMappedPatch(bumperx, y-4, 0, kp_tinybumperb, colormap); + } + }*/ + } + + if (G_BattleGametype() && players[tab[i].num].kartstuff[k_bumper] <= 0) + V_DrawScaledPatch(x-4, y-7, 0, kp_ranknobumpers); + else + { + INT32 pos = players[tab[i].num].kartstuff[k_position]; + if (pos < 0 || pos > MAXPLAYERS) + pos = 0; + // Draws the little number over the face + V_DrawScaledPatch(x-5, y+6, 0, kp_facenum[pos]); + } + + if (G_RaceGametype()) + { +#define timestring(time) va("%i'%02i\"%02i", G_TicsToMinutes(time, true), G_TicsToSeconds(time), G_TicsToCentiseconds(time)) + if (players[tab[i].num].exiting) + V_DrawRightAlignedString(x+rightoffset, y, hilicol, timestring(players[tab[i].num].realtime)); + else if (players[tab[i].num].pflags & PF_TIMEOVER) + V_DrawRightAlignedThinString(x+rightoffset, y-1, 0, "NO CONTEST."); + else if (circuitmap) + V_DrawRightAlignedString(x+rightoffset, y, 0, va("Lap %d", tab[i].count)); +#undef timestring + } + else + V_DrawRightAlignedString(x+rightoffset, y, 0, va("%u", tab[i].count)); + + y += 18; + if (i == 7) + { + y = 33; + x = (BASEVIDWIDTH/2) + 4; + } + } +} + static void K_drawKartLaps(void) { INT32 splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTOLEFT); diff --git a/src/m_cond.c b/src/m_cond.c index 7387a804..3e2baa1f 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -33,64 +33,64 @@ conditionset_t conditionSets[MAXCONDITIONSETS]; emblem_t emblemlocations[MAXEMBLEMS] = { // SILVER TIME TROPHIES - {ET_TIME, 0,0,0, 1, 'T', SKINCOLOR_GREY, 90*TICRATE, "", 0}, // Green Hills Zone - Time: 1:30 - {ET_TIME, 0,0,0, 2, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Pipe Speedway Zone - Time: 1:50 - {ET_TIME, 0,0,0, 3, 'T', SKINCOLOR_GREY, 135*TICRATE, "", 0}, // Dark Race - 2:15 - {ET_TIME, 0,0,0, 4, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Darkvile Garden Zone - 1:45 - {ET_TIME, 0,0,0, 5, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Northern District Zone - 2:20 - {ET_TIME, 0,0,0, 6, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Sonic Speedway Zone - 2:00 - {ET_TIME, 0,0,0, 7, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Egg Zeppelin Zone - 2:00 - {ET_TIME, 0,0,0, 8, 'T', SKINCOLOR_GREY, 95*TICRATE, "", 0}, // Hill Top Zone - 1:35 - {ET_TIME, 0,0,0, 9, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Sunbeam Paradise Zone - 1:50 - {ET_TIME, 0,0,0, 10, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Diamond Square Zone - 1:50 - {ET_TIME, 0,0,0, 11, 'T', SKINCOLOR_GREY, 150*TICRATE, "", 0}, // Misty Maze Zone - 2:30 - {ET_TIME, 0,0,0, 12, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Midnight Meadow Zone - 2:00 - {ET_TIME, 0,0,0, 13, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Megablock Castle Zone - 2:10 - {ET_TIME, 0,0,0, 14, 'T', SKINCOLOR_GREY, 150*TICRATE, "", 0}, // Sub-Zero Peak Zone - 2:30 - {ET_TIME, 0,0,0, 15, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Sapphire Coast Zone - 1:50 - {ET_TIME, 0,0,0, 16, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Silvercloud Island Zone - 2:20 - {ET_TIME, 0,0,0, 17, 'T', SKINCOLOR_GREY, 135*TICRATE, "", 0}, // Petroleum Refinery Zone - 2:15 - {ET_TIME, 0,0,0, 18, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Canyon Rush Zone - 2:10 - {ET_TIME, 0,0,0, 19, 'T', SKINCOLOR_GREY, 160*TICRATE, "", 0}, // Blue Mountain Zone - 2:40 - {ET_TIME, 0,0,0, 20, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Casino Resort Zone - 1:50 - {ET_TIME, 0,0,0, 21, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Desert Palace Zone - 1:45 - {ET_TIME, 0,0,0, 22, 'T', SKINCOLOR_GREY, 165*TICRATE, "", 0}, // Red Barrage Area - 2:45 - {ET_TIME, 0,0,0, 23, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Vanilla Hotel Zone - 1:45 - {ET_TIME, 0,0,0, 24, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Twinkle Cart - 1:50 - {ET_TIME, 0,0,0, 25, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Pleasure Castle - 1:50 - {ET_TIME, 0,0,0, 26, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Aurora Atoll Zone - 2:20 - {ET_TIME, 0,0,0, 27, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Barren Badlands Zone - 2:10 - {ET_TIME, 0,0,0, 28, 'T', SKINCOLOR_GREY, 155*TICRATE, "", 0}, // Toxic Palace Zone - 2:35 - {ET_TIME, 0,0,0, 29, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Ancient Tomb Zone - 2:10 - {ET_TIME, 0,0,0, 30, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Cloud Cradle Zone K - 2:00 - {ET_TIME, 0,0,0, 31, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Kodachrome Void Zone - 1:50 - {ET_TIME, 0,0,0, 32, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Egg Quarters - 2:20 - {ET_TIME, 0,0,0, 33, 'T', SKINCOLOR_GREY, 115*TICRATE, "", 0}, // Boiling Bedrock Zone - 1:55 - {ET_TIME, 0,0,0, 34, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Virtual Highway Zone - 2:20 - {ET_TIME, 0,0,0, 35, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Eggman's Nightclub Zone - 2:00 - {ET_TIME, 0,0,0, 36, 'T', SKINCOLOR_GREY, 90*TICRATE, "", 0}, // KKR Ganbare Dochu 2 - 1:30 - {ET_TIME, 0,0,0, 37, 'T', SKINCOLOR_GREY, 80*TICRATE, "", 0}, // CK Chao Circuit 1 - 1:20 - {ET_TIME, 0,0,0, 38, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // CK Chao Circuit 2 - 2:10 - {ET_TIME, 0,0,0, 39, 'T', SKINCOLOR_GREY, 100*TICRATE, "", 0}, // CK Cloud Tops 2 - 1:40 - {ET_TIME, 0,0,0, 40, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // CK Regal Raceway - 2:10 - {ET_TIME, 0,0,0, 41, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // SM Dimension Heist - 2:10 - {ET_TIME, 0,0,0, 42, 'T', SKINCOLOR_GREY, 100*TICRATE, "", 0}, // SRB2 Frozen Night - 1:40 - {ET_TIME, 0,0,0, 43, 'T', SKINCOLOR_GREY, 100*TICRATE, "", 0}, // MKSC Sky Garden - 1:40 - {ET_TIME, 0,0,0, 44, 'T', SKINCOLOR_GREY, 95*TICRATE, "", 0}, // MKDS Peach Gardens - 1:35 - {ET_TIME, 0,0,0, 45, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // MKSC Rainbow Road - 1:45 - {ET_TIME, 0,0,0, 46, 'T', SKINCOLOR_GREY, 70*TICRATE, "", 0}, // SMK Mario Circuit 1 - 1:10 - {ET_TIME, 0,0,0, 47, 'T', SKINCOLOR_GREY, 90*TICRATE, "", 0}, // SMK Donut Plains 1 - 1:30 - {ET_TIME, 0,0,0, 48, 'T', SKINCOLOR_GREY, 75*TICRATE, "", 0}, // SMK Ghost Valley 2 - 1:15 - {ET_TIME, 0,0,0, 49, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // SMK Mario Circuit 3 - 1:45 - {ET_TIME, 0,0,0, 50, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0} // SMK Rainbow Road - 2:10 + {ET_TIME, 0,0,0, 1, 'B', SKINCOLOR_GREY, 90*TICRATE, "", 0}, // Green Hills Zone - Time: 1:30 + {ET_TIME, 0,0,0, 2, 'B', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Pipe Speedway Zone - Time: 1:50 + {ET_TIME, 0,0,0, 3, 'B', SKINCOLOR_GREY, 135*TICRATE, "", 0}, // Dark Race - 2:15 + {ET_TIME, 0,0,0, 4, 'B', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Darkvile Garden Zone - 1:45 + {ET_TIME, 0,0,0, 5, 'B', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Northern District Zone - 2:20 + {ET_TIME, 0,0,0, 6, 'B', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Sonic Speedway Zone - 2:00 + {ET_TIME, 0,0,0, 7, 'B', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Egg Zeppelin Zone - 2:00 + {ET_TIME, 0,0,0, 8, 'B', SKINCOLOR_GREY, 95*TICRATE, "", 0}, // Hill Top Zone - 1:35 + {ET_TIME, 0,0,0, 9, 'B', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Sunbeam Paradise Zone - 1:50 + {ET_TIME, 0,0,0, 10, 'B', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Diamond Square Zone - 1:50 + {ET_TIME, 0,0,0, 11, 'B', SKINCOLOR_GREY, 150*TICRATE, "", 0}, // Misty Maze Zone - 2:30 + {ET_TIME, 0,0,0, 12, 'B', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Midnight Meadow Zone - 2:00 + {ET_TIME, 0,0,0, 13, 'B', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Megablock Castle Zone - 2:10 + {ET_TIME, 0,0,0, 14, 'B', SKINCOLOR_GREY, 150*TICRATE, "", 0}, // Sub-Zero Peak Zone - 2:30 + {ET_TIME, 0,0,0, 15, 'B', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Sapphire Coast Zone - 1:50 + {ET_TIME, 0,0,0, 16, 'B', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Silvercloud Island Zone - 2:20 + {ET_TIME, 0,0,0, 17, 'B', SKINCOLOR_GREY, 135*TICRATE, "", 0}, // Petroleum Refinery Zone - 2:15 + {ET_TIME, 0,0,0, 18, 'B', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Canyon Rush Zone - 2:10 + {ET_TIME, 0,0,0, 19, 'B', SKINCOLOR_GREY, 160*TICRATE, "", 0}, // Blue Mountain Zone - 2:40 + {ET_TIME, 0,0,0, 20, 'B', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Casino Resort Zone - 1:50 + {ET_TIME, 0,0,0, 21, 'B', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Desert Palace Zone - 1:45 + {ET_TIME, 0,0,0, 22, 'B', SKINCOLOR_GREY, 165*TICRATE, "", 0}, // Red Barrage Area - 2:45 + {ET_TIME, 0,0,0, 23, 'B', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Vanilla Hotel Zone - 1:45 + {ET_TIME, 0,0,0, 24, 'B', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Twinkle Cart - 1:50 + {ET_TIME, 0,0,0, 25, 'B', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Pleasure Castle - 1:50 + {ET_TIME, 0,0,0, 26, 'B', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Aurora Atoll Zone - 2:20 + {ET_TIME, 0,0,0, 27, 'B', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Barren Badlands Zone - 2:10 + {ET_TIME, 0,0,0, 28, 'B', SKINCOLOR_GREY, 155*TICRATE, "", 0}, // Toxic Palace Zone - 2:35 + {ET_TIME, 0,0,0, 29, 'B', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Ancient Tomb Zone - 2:10 + {ET_TIME, 0,0,0, 30, 'B', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Cloud Cradle Zone K - 2:00 + {ET_TIME, 0,0,0, 31, 'B', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Kodachrome Void Zone - 1:50 + {ET_TIME, 0,0,0, 32, 'B', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Egg Quarters - 2:20 + {ET_TIME, 0,0,0, 33, 'B', SKINCOLOR_GREY, 115*TICRATE, "", 0}, // Boiling Bedrock Zone - 1:55 + {ET_TIME, 0,0,0, 34, 'B', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Virtual Highway Zone - 2:20 + {ET_TIME, 0,0,0, 35, 'B', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Eggman's Nightclub Zone - 2:00 + {ET_TIME, 0,0,0, 36, 'B', SKINCOLOR_GREY, 90*TICRATE, "", 0}, // KKR Ganbare Dochu 2 - 1:30 + {ET_TIME, 0,0,0, 37, 'B', SKINCOLOR_GREY, 80*TICRATE, "", 0}, // CK Chao Circuit 1 - 1:20 + {ET_TIME, 0,0,0, 38, 'B', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // CK Chao Circuit 2 - 2:10 + {ET_TIME, 0,0,0, 39, 'B', SKINCOLOR_GREY, 100*TICRATE, "", 0}, // CK Cloud Tops 2 - 1:40 + {ET_TIME, 0,0,0, 40, 'B', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // CK Regal Raceway - 2:10 + {ET_TIME, 0,0,0, 41, 'B', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // SM Dimension Heist - 2:10 + {ET_TIME, 0,0,0, 42, 'B', SKINCOLOR_GREY, 100*TICRATE, "", 0}, // SRB2 Frozen Night - 1:40 + {ET_TIME, 0,0,0, 43, 'B', SKINCOLOR_GREY, 100*TICRATE, "", 0}, // MKSC Sky Garden - 1:40 + {ET_TIME, 0,0,0, 44, 'B', SKINCOLOR_GREY, 95*TICRATE, "", 0}, // MKDS Peach Gardens - 1:35 + {ET_TIME, 0,0,0, 45, 'B', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // MKSC Rainbow Road - 1:45 + {ET_TIME, 0,0,0, 46, 'B', SKINCOLOR_GREY, 70*TICRATE, "", 0}, // SMK Mario Circuit 1 - 1:10 + {ET_TIME, 0,0,0, 47, 'B', SKINCOLOR_GREY, 90*TICRATE, "", 0}, // SMK Donut Plains 1 - 1:30 + {ET_TIME, 0,0,0, 48, 'B', SKINCOLOR_GREY, 75*TICRATE, "", 0}, // SMK Ghost Valley 2 - 1:15 + {ET_TIME, 0,0,0, 49, 'B', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // SMK Mario Circuit 3 - 1:45 + {ET_TIME, 0,0,0, 50, 'B', SKINCOLOR_GREY, 130*TICRATE, "", 0} // SMK Rainbow Road - 2:10 // GOLD DEV TIME TROPHIES - // ...none yet! + // ...none yet! uses 'A' }; // Default Extra Emblems extraemblem_t extraemblems[MAXEXTRAEMBLEMS] = { - {"Experienced Driver", "Play 100 Matches", 10, 'X', SKINCOLOR_BLUE, 0}, + {"Experienced Driver", "Play 100 Matches", 10, 'C', SKINCOLOR_RED, 0}, }; // Default Unlockables diff --git a/src/m_menu.c b/src/m_menu.c index 43a8ff3c..9c6635e1 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3380,7 +3380,7 @@ static void M_DrawMapEmblems(INT32 mapnum, INT32 x, INT32 y) V_DrawSmallScaledPatch(x, y, 0, W_CachePatchName("NEEDIT", PU_CACHE)); emblem = M_GetLevelEmblems(-1); - x -= 12; + x -= 8; } } @@ -6199,7 +6199,7 @@ static void M_DrawStatsMaps(int location) } mnum = statsMapList[i]; - M_DrawMapEmblems(mnum+1, 292, y); + M_DrawMapEmblems(mnum+1, 295, y); if (mapheaderinfo[mnum]->levelflags & LF_NOZONE) V_DrawString(20, y, 0, va("%s %s", @@ -6248,10 +6248,10 @@ static void M_DrawStatsMaps(int location) exemblem = &extraemblems[i]; if (exemblem->collected) - V_DrawSmallMappedPatch(292, y, 0, W_CachePatchName(M_GetExtraEmblemPatch(exemblem), PU_CACHE), + V_DrawSmallMappedPatch(295, y, 0, W_CachePatchName(M_GetExtraEmblemPatch(exemblem), PU_CACHE), R_GetTranslationColormap(TC_DEFAULT, M_GetExtraEmblemColor(exemblem), GTC_CACHE)); else - V_DrawSmallScaledPatch(292, y, 0, W_CachePatchName("NEEDIT", PU_CACHE)); + V_DrawSmallScaledPatch(295, y, 0, W_CachePatchName("NEEDIT", PU_CACHE)); V_DrawString(20, y, 0, va("%s", exemblem->description)); } @@ -6310,8 +6310,8 @@ static void M_DrawLevelStats(void) else V_DrawRightAlignedString(BASEVIDWIDTH-16, 70, recommendedflags, "(complete)"); - V_DrawString(36, 70, 0, va("x %d/%d", M_CountEmblems(), numemblems+numextraemblems)); - V_DrawSmallScaledPatch(20, 70, 0, W_CachePatchName("EMBLICON", PU_STATIC)); + V_DrawString(32, 70, 0, va("x %d/%d", M_CountEmblems(), numemblems+numextraemblems)); + V_DrawSmallScaledPatch(20, 70, 0, W_CachePatchName("GOTITA", PU_STATIC)); M_DrawStatsMaps(statsLocation); } From ea4ca2eb1f3c9f3383974f6f7034628cc5276e47 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 21:35:17 -0400 Subject: [PATCH 54/80] Brake drfit effect --- src/d_player.h | 1 + src/dehacked.c | 5 +++++ src/info.c | 43 ++++++++++++++++++++++++++++++++++++------- src/info.h | 5 +++++ src/k_kart.c | 33 ++++++++++++++++++++++++++++++++- src/p_enemy.c | 1 + src/p_mobj.c | 42 ++++++++++++++++++++++++++++++++++++++---- 7 files changed, 118 insertions(+), 12 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 866589df..91d09df6 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -308,6 +308,7 @@ typedef enum k_destboostcam, // Ditto k_timeovercam, // Camera timer for leaving behind or not k_aizdriftstrat, // Let go of your drift while boosting? Helper for the SICK STRATZ you have just unlocked + k_brakedrift, // Helper for brake-drift spark spawning k_itemroulette, // Used for the roulette when deciding what item to give you (was "pw_kartitem") k_roulettetype, // Used for the roulette, for deciding type (currently only used for Battle, to give you better items from Karma items) diff --git a/src/dehacked.c b/src/dehacked.c index 77663ccd..3dcc9212 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6247,6 +6247,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_DRIFTSPARK_C1", "S_DRIFTSPARK_C2", + // Brake drift sparks + "S_BRAKEDRIFT", + // Drift Smoke "S_DRIFTDUST1", "S_DRIFTDUST2", @@ -7393,6 +7396,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_INVULNFLASH", "MT_WIPEOUTTRAIL", "MT_DRIFTSPARK", + "MT_BRAKEDRIFT", "MT_DRIFTDUST", "MT_ROCKETSNEAKER", // Rocket sneakers @@ -7895,6 +7899,7 @@ static const char *const KARTSTUFF_LIST[] = { "DESTBOOSTCAM", "TIMEOVERCAM", "AIZDRIFTSTRAT", + "BRAKEDRIFT", "ITEMROULETTE", "ROULETTETYPE", diff --git a/src/info.c b/src/info.c index cde74cee..18b818c9 100644 --- a/src/info.c +++ b/src/info.c @@ -56,13 +56,13 @@ char sprnames[NUMSPRITES + 1][5] = "SRBJ","SRBK","SRBL","SRBM","SRBN","SRBO", //SRB2kart Sprites "SPRG","BSPR","RNDM","RPOP","SGNS","FAST","DSHR","BOST","BOSM","KFRE", - "KINV","KINF","WIPD","DRIF","DUST","RSHE","FITM","BANA","ORBN","JAWZ", - "SSMN","KRBM","BHOG","BHBM","SPBM","THNS","SINK","SITR","KBLN","DEZL", - "POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO", - "CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB","ARRO", - "ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK","LZI1", - "LZI2","KLIT","FZSM","FZBM","FPRT","SPTL","ENM1","GARU","MARR","REAP", - "JITB","CDMO","CDBU","VIEW" + "KINV","KINF","WIPD","DRIF","BDRF","DUST","RSHE","FITM","BANA","ORBN", + "JAWZ","SSMN","KRBM","BHOG","BHBM","SPBM","THNS","SINK","SITR","KBLN", + "DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM", + "SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB", + "ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK", + "LZI1","LZI2","KLIT","FZSM","FZBM","FPRT","SPTL","ENM1","GARU","MARR", + "REAP","JITB","CDMO","CDBU","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -2561,6 +2561,8 @@ state_t states[NUMSTATES] = {SPR_DRIF, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_DRIFTSPARK_C2}, // S_DRIFTSPARK_C1 {SPR_DRIF, FF_FULLBRIGHT|FF_TRANS20, 1, {NULL}, 0, 0, S_DRIFTSPARK_A3}, // S_DRIFTSPARK_C2 (Loop back to A3) + {SPR_BDRF, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, -1, {NULL}, 5, 2, S_BRAKEDRIFT}, // S_BRAKEDRIFT + {SPR_DUST, 0, 3, {NULL}, 0, 0, S_DRIFTDUST2}, // S_DRIFTDUST1 {SPR_DUST, 1, 3, {NULL}, 0, 0, S_DRIFTDUST3}, // S_DRIFTDUST2 {SPR_DUST, FF_TRANS20|2, 3, {NULL}, 0, 0, S_DRIFTDUST4}, // S_DRIFTDUST3 @@ -14873,6 +14875,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BRAKEDRIFT + -1, // doomednum + S_BRAKEDRIFT, // 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 + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + { // MT_DRIFTDUST -1, // doomednum S_DRIFTDUST1, // spawnstate diff --git a/src/info.h b/src/info.h index 78f0edae..61e0e1db 100644 --- a/src/info.h +++ b/src/info.h @@ -601,6 +601,7 @@ typedef enum sprite SPR_KINF, // Invincibility flash SPR_WIPD, // Wipeout dust trail SPR_DRIF, // Drift Sparks + SPR_BDRF, // Brake drift sparks SPR_DUST, // Drift Dust // Kart Items @@ -3109,6 +3110,9 @@ typedef enum state S_DRIFTSPARK_C1, S_DRIFTSPARK_C2, + // Brake drift sparks + S_BRAKEDRIFT, + // Drift Smoke S_DRIFTDUST1, S_DRIFTDUST2, @@ -4272,6 +4276,7 @@ typedef enum mobj_type MT_INVULNFLASH, MT_WIPEOUTTRAIL, MT_DRIFTSPARK, + MT_BRAKEDRIFT, MT_DRIFTDUST, MT_ROCKETSNEAKER, diff --git a/src/k_kart.c b/src/k_kart.c index ee59566f..126ba184 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1330,6 +1330,23 @@ static void K_SpawnDashDustRelease(player_t *player) } } +static void K_SpawnBrakeDriftSparks(player_t *player) // Be sure to update the mobj thinker case too! +{ + mobj_t *sparks; + + I_Assert(player != NULL); + I_Assert(player->mo != NULL); + I_Assert(!P_MobjWasRemoved(player->mo)); + + // Position & etc are handled in its thinker, and its spawned invisible. + // This avoids needing to dupe code if we don't need it. + sparks = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BRAKEDRIFT); + P_SetTarget(&sparks->target, player->mo); + P_SetScale(sparks, (sparks->destscale = player->mo->scale)); + K_MatchGenericExtraFlags(sparks, player->mo); + sparks->flags2 |= MF2_DONTDRAW; +} + /** \brief Calculates the respawn timer and drop-boosting \param player player object passed from K_KartPlayerThink @@ -3879,6 +3896,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) fast->momx = 3*player->mo->momx/4; fast->momy = 3*player->mo->momy/4; fast->momz = 3*player->mo->momz/4; + K_MatchGenericExtraFlags(fast, player->mo); } if (player->playerstate == PST_DEAD || player->kartstuff[k_respawn] > 1) // Ensure these are set correctly here @@ -4454,7 +4472,8 @@ static void K_KartDrift(player_t *player, boolean onground) if (player->kartstuff[k_spinouttimer] > 0 // banana peel || player->speed < FixedMul(10<<16, player->mo->scale)) // you're too slow! { - player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = player->kartstuff[k_aizdriftstrat] = 0; + player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = 0; + player->kartstuff[k_aizdriftstrat] = player->kartstuff[k_brakedrift] = 0; } if ((!player->kartstuff[k_sneakertimer]) @@ -4468,6 +4487,18 @@ static void K_KartDrift(player_t *player, boolean onground) } else if (player->kartstuff[k_aizdriftstrat] && !player->kartstuff[k_drift]) K_SpawnAIZDust(player); + + if (player->kartstuff[k_drift] + && ((player->cmd.buttons & BT_BRAKE) + || !(player->cmd.buttons & BT_ACCELERATE)) + && P_IsObjectOnGround(player->mo)) + { + if (!player->kartstuff[k_brakedrift]) + K_SpawnBrakeDriftSparks(player); + player->kartstuff[k_brakedrift] = 1; + } + else + player->kartstuff[k_brakedrift] = 0; } // // K_KartUpdatePosition diff --git a/src/p_enemy.c b/src/p_enemy.c index f0671839..b44bb874 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8435,6 +8435,7 @@ void A_SPBChase(mobj_t *actor) //fast->momz = 3*actor->momz/4; fast->color = SKINCOLOR_RED; fast->colorized = true; + K_MatchGenericExtraFlags(fast, actor); } return; diff --git a/src/p_mobj.c b/src/p_mobj.c index f4fd40c9..089f6faf 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8301,6 +8301,43 @@ void P_MobjThinker(mobj_t *mobj) } P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z); break; + case MT_BRAKEDRIFT: + if ((!mobj->target || !mobj->target->health || !mobj->target->player || !P_IsObjectOnGround(mobj->target)) + || !mobj->target->player->kartstuff[k_drift] || !mobj->target->player->kartstuff[k_brakedrift] + || !((mobj->target->player->cmd.buttons & BT_BRAKE) + || !(mobj->target->player->cmd.buttons & BT_ACCELERATE))) // Letting go of accel functions about the same as brake-drifting + { + P_RemoveMobj(mobj); + return; + } + else + { + fixed_t newx, newy; + angle_t travelangle; + + travelangle = mobj->target->angle - ((ANGLE_45/5)*mobj->target->player->kartstuff[k_drift]); + + newx = mobj->target->x + P_ReturnThrustX(mobj->target, travelangle+ANGLE_180, 24*mobj->target->scale); + newy = mobj->target->y + P_ReturnThrustY(mobj->target, travelangle+ANGLE_180, 24*mobj->target->scale); + P_TeleportMove(mobj, newx, newy, mobj->target->z); + + mobj->angle = travelangle - ((ANGLE_90/5)*mobj->target->player->kartstuff[k_drift]); + P_SetScale(mobj, (mobj->destscale = mobj->target->scale)); + + if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)*4) + mobj->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); + else if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)*2) + mobj->color = SKINCOLOR_KETCHUP; + else if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)) + mobj->color = SKINCOLOR_SAPPHIRE; + else + mobj->color = SKINCOLOR_YELLOW; + + K_MatchGenericExtraFlags(mobj, mobj->target); + if (leveltime & 1) + mobj->flags2 |= MF2_DONTDRAW; + } + break; case MT_PLAYERRETICULE: if (!mobj->target || !mobj->target->health) { @@ -8310,10 +8347,7 @@ void P_MobjThinker(mobj_t *mobj) P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z); break; case MT_INSTASHIELDB: - if (leveltime & 1) - mobj->flags2 |= MF2_DONTDRAW; - else - mobj->flags2 &= ~MF2_DONTDRAW; + mobj->flags2 ^= MF2_DONTDRAW; /* FALLTHRU */ case MT_INSTASHIELDA: if (!mobj->target || !mobj->target->health || (mobj->target->player && !mobj->target->player->kartstuff[k_instashield])) From 4369917912463f3d6191afa2360bae951515fdb5 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 22:38:43 -0400 Subject: [PATCH 55/80] Fix offsets, add colormapping --- src/k_kart.c | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index ee59566f..453b0be8 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7376,41 +7376,48 @@ static void K_drawLapStartAnim(void) { // This is an EVEN MORE insanely complicated animation. const UINT8 progress = 80-stplyr->kartstuff[k_lapanimation]; + UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, stplyr->skincolor, 0); - V_DrawScaledPatch(BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)), - 56 - (32*max(0, progress-76)), - 0, kp_lapanim_emblem); + V_DrawFixedPatch((BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)))*FRACUNIT, + (48 - (32*max(0, progress-76)))*FRACUNIT, + FRACUNIT, V_HUDTRANS, + kp_lapanim_emblem, colormap); if (stplyr->laps == (UINT8)(cv_numlaps.value - 1)) { - V_DrawScaledPatch(27 - (32*max(0, progress-76)), - 32, - 0, kp_lapanim_final[min(progress/2, 10)]); + V_DrawFixedPatch((62 - (32*max(0, progress-76)))*FRACUNIT, // 27 + (-6)*FRACUNIT, // 24 + FRACUNIT, V_HUDTRANS, + kp_lapanim_final[min(progress/2, 10)], NULL); if (progress/2-12 >= 0) { - V_DrawScaledPatch(194 + (32*max(0, progress-76)), - 32, - 0, kp_lapanim_lap[min(progress/2-12, 6)]); + V_DrawFixedPatch((188 + (32*max(0, progress-76)))*FRACUNIT, // 194 + (-6)*FRACUNIT, // 24 + FRACUNIT, V_HUDTRANS, + kp_lapanim_lap[min(progress/2-12, 6)], NULL); } } else { - V_DrawScaledPatch(61 - (32*max(0, progress-76)), - 32, - 0, kp_lapanim_lap[min(progress/2, 6)]); + V_DrawFixedPatch((82 - (32*max(0, progress-76)))*FRACUNIT, // 61 + (-6)*FRACUNIT, // 24 + FRACUNIT, V_HUDTRANS, + kp_lapanim_lap[min(progress/2, 6)], NULL); if (progress/2-8 >= 0) { - V_DrawScaledPatch(194 + (32*max(0, progress-76)), - 32, - 0, kp_lapanim_number[(((UINT32)stplyr->laps+1) / 10)][min(progress/2-8, 2)]); + V_DrawFixedPatch((188 + (32*max(0, progress-76)))*FRACUNIT, // 194 + (-6)*FRACUNIT, // 24 + FRACUNIT, V_HUDTRANS, + kp_lapanim_number[(((UINT32)stplyr->laps+1) / 10)][min(progress/2-8, 2)], NULL); if (progress/2-10 >= 0) { - V_DrawScaledPatch(221 + (32*max(0, progress-76)), - 32, - 0, kp_lapanim_number[(((UINT32)stplyr->laps+1) % 10)][min(progress/2-10, 2)]); + V_DrawFixedPatch((208 + (32*max(0, progress-76)))*FRACUNIT, // 221 + (-6)*FRACUNIT, // 24 + FRACUNIT, V_HUDTRANS, + kp_lapanim_number[(((UINT32)stplyr->laps+1) % 10)][min(progress/2-10, 2)], NULL); } } } From 6c557407d51493dea993354689ef4857d3877a99 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 23:10:38 -0400 Subject: [PATCH 56/80] Added judging hands (if'd out) --- src/k_kart.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 453b0be8..78b92a9f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5577,6 +5577,9 @@ static patch_t *kp_lapanim_lap[7]; static patch_t *kp_lapanim_final[11]; static patch_t *kp_lapanim_number[10][3]; static patch_t *kp_lapanim_emblem; +#if 0 +static patch_t *kp_lapanim_hand[3]; +#endif void K_LoadKartHUDGraphics(void) { @@ -5796,6 +5799,15 @@ void K_LoadKartHUDGraphics(void) } kp_lapanim_emblem = (patch_t *) W_CachePatchName("K_LAPE00", PU_HUDGFX); + +#if 0 + 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); + } +#endif } // For the item toggle menu @@ -7377,12 +7389,28 @@ static void K_drawLapStartAnim(void) // This is an EVEN MORE insanely complicated animation. const UINT8 progress = 80-stplyr->kartstuff[k_lapanimation]; UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, stplyr->skincolor, 0); +#if 0 + UINT8 h = 1; + + if (stplyr->kartstuff[k_position] == 1) + h = 0; + else if (K_IsPlayerLosing(stplyr)) + h = 2; +#endif V_DrawFixedPatch((BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)))*FRACUNIT, (48 - (32*max(0, progress-76)))*FRACUNIT, FRACUNIT, V_HUDTRANS, kp_lapanim_emblem, colormap); +#if 0 + V_DrawFixedPatch((BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)))*FRACUNIT, + (48 - (32*max(0, progress-76)) + + 4 - abs((leveltime % 8) - 4))*FRACUNIT, + FRACUNIT, V_HUDTRANS, + kp_lapanim_hand[h], NULL); +#endif + if (stplyr->laps == (UINT8)(cv_numlaps.value - 1)) { V_DrawFixedPatch((62 - (32*max(0, progress-76)))*FRACUNIT, // 27 From a193a4adf23304b0c064a7ba3404a8ddf6f089ce Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 23:34:13 -0400 Subject: [PATCH 57/80] YOU GOT EM Flashes on screen whenever you get more than 1 karma point at a time, getting you back into the game. --- src/d_player.h | 1 + src/dehacked.c | 1 + src/k_kart.c | 10 ++++++++++ src/p_inter.c | 21 +++++++++++++++++---- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 866589df..18099967 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -344,6 +344,7 @@ typedef enum k_comebackpoints, // Number of times you've bombed or gave an item to someone; once it's 3 it gets set back to 0 and you're given a bumper k_comebackmode, // 0 = bomb, 1 = item k_wanted, // Timer for determining WANTED status, lowers when hitting people, prevents the game turning into Camp Lazlo + k_yougotem, // "You Got Em" gfx when hitting someone as a karma player via a method that gets you back in the game instantly NUMKARTSTUFF } kartstufftype_t; diff --git a/src/dehacked.c b/src/dehacked.c index 77663ccd..7222b6ff 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7927,6 +7927,7 @@ static const char *const KARTSTUFF_LIST[] = { "COMEBACKPOINTS", "COMEBACKMODE", "WANTED", + "YOUGOTEM", }; static const char *const HUDITEMS_LIST[] = { diff --git a/src/k_kart.c b/src/k_kart.c index ee59566f..14978c67 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4067,6 +4067,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_lapanimation]) player->kartstuff[k_lapanimation]--; + if (player->kartstuff[k_yougotem]) + player->kartstuff[k_yougotem]--; + if (G_BattleGametype() && (player->exiting || player->kartstuff[k_comebacktimer])) { if (player->exiting) @@ -5578,6 +5581,8 @@ static patch_t *kp_lapanim_final[11]; static patch_t *kp_lapanim_number[10][3]; static patch_t *kp_lapanim_emblem; +static patch_t *kp_yougotem; + void K_LoadKartHUDGraphics(void) { INT32 i, j; @@ -5796,6 +5801,8 @@ void K_LoadKartHUDGraphics(void) } kp_lapanim_emblem = (patch_t *) W_CachePatchName("K_LAPE00", PU_HUDGFX); + + kp_yougotem = (patch_t *) W_CachePatchName("YOUGOTEM", PU_HUDGFX); } // For the item toggle menu @@ -7652,6 +7659,9 @@ void K_drawKartHUD(void) K_drawLapStartAnim(); } + if (G_BattleGametype() && !splitscreen && (stplyr->kartstuff[k_yougotem] % 2)) // * YOU GOT EM * + V_DrawScaledPatch(BASEVIDWIDTH/2 - SHORT(kp_yougotem->width), 32, V_HUDTRANS, kp_yougotem); + // Draw FREE PLAY. if (isfreeplay && !stplyr->spectator && timeinmap > 113) K_drawKartFreePlay(leveltime); diff --git a/src/p_inter.c b/src/p_inter.c index af5dc5b1..8b49494b 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -494,6 +494,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) else { mobj_t *boom = P_SpawnMobj(special->target->x, special->target->y, special->target->z, MT_BOOMEXPLODE); + UINT8 ptadd = (K_IsPlayerWanted(player) ? 2 : 1); + boom->scale = special->target->scale; boom->destscale = special->target->scale; boom->momz = 5*FRACUNIT; @@ -516,12 +518,17 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) } if (numingame <= 2) // If so, then an extra karma point so they are 100% certain to switch places; it's annoying to end matches with a bomb kill - special->target->player->kartstuff[k_comebackpoints]++; + ptadd++; } - special->target->player->kartstuff[k_comebackpoints] += (K_IsPlayerWanted(player) ? 2 : 1); + special->target->player->kartstuff[k_comebackpoints] += ptadd; + + if (ptadd > 1) + special->target->player->kartstuff[k_yougotem] = TICRATE; + if (special->target->player->kartstuff[k_comebackpoints] >= 2) K_StealBumper(special->target->player, player, true); + special->target->player->kartstuff[k_comebacktimer] = comebacktime; K_ExplodePlayer(player, special->target, special); @@ -545,6 +552,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) else if (special->target->player->kartstuff[k_comebackmode] == 2 && P_CanPickupItem(player, 2)) { mobj_t *poof = P_SpawnMobj(special->x, special->y, special->z, MT_EXPLODE); + UINT8 ptadd = 1; // No WANTED bonus for tricking + S_StartSound(poof, special->info->seesound); if (player->kartstuff[k_bumper] == 1) // If you have only one bumper left, and see if it's a 1v1 @@ -560,14 +569,18 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) } if (numingame <= 2) // If so, then an extra karma point so they are 100% certain to switch places; it's annoying to end matches with a fake kill - special->target->player->kartstuff[k_comebackpoints]++; + ptadd++; } special->target->player->kartstuff[k_comebackmode] = 0; - special->target->player->kartstuff[k_comebackpoints]++; + special->target->player->kartstuff[k_comebackpoints] += ptadd; + + if (ptadd > 1) + special->target->player->kartstuff[k_yougotem] = TICRATE; if (special->target->player->kartstuff[k_comebackpoints] >= 2) K_StealBumper(special->target->player, player, true); + special->target->player->kartstuff[k_comebacktimer] = comebacktime; K_DropItems(player); //K_StripItems(player); From 7891a11fba4d830f2889e805d1d41ad9db5f3411 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 00:57:38 -0400 Subject: [PATCH 58/80] Battle points are visible --- src/dehacked.c | 32 ++++++++++++++++++++++++ src/info.c | 63 ++++++++++++++++++++++++++++++++++++++++++++--- src/info.h | 39 ++++++++++++++++++++++++++++- src/k_kart.c | 29 ++++++++++++++++++++++ src/k_kart.h | 1 + src/lua_baselib.c | 15 +++++++++++ src/p_mobj.c | 22 +++++++++++++++++ 7 files changed, 197 insertions(+), 4 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 7222b6ff..8877cee6 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6758,6 +6758,36 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_KARMAWHEEL", // Karma player wheels + "S_BATTLEPOINT1A", // Battle point indicators + "S_BATTLEPOINT1B", + "S_BATTLEPOINT1C", + "S_BATTLEPOINT1D", + "S_BATTLEPOINT1E", + "S_BATTLEPOINT1F", + "S_BATTLEPOINT1G", + "S_BATTLEPOINT1H", + "S_BATTLEPOINT1I", + + "S_BATTLEPOINT2A", + "S_BATTLEPOINT2B", + "S_BATTLEPOINT2C", + "S_BATTLEPOINT2D", + "S_BATTLEPOINT2E", + "S_BATTLEPOINT2F", + "S_BATTLEPOINT2G", + "S_BATTLEPOINT2H", + "S_BATTLEPOINT2I", + + "S_BATTLEPOINT3A", + "S_BATTLEPOINT3B", + "S_BATTLEPOINT3C", + "S_BATTLEPOINT3D", + "S_BATTLEPOINT3E", + "S_BATTLEPOINT3F", + "S_BATTLEPOINT3G", + "S_BATTLEPOINT3H", + "S_BATTLEPOINT3I", + // Thunder shield use stuff; "S_KSPARK1", // Sparkling Radius "S_KSPARK2", @@ -7515,6 +7545,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_KARMAHITBOX", "MT_KARMAWHEEL", + "MT_BATTLEPOINT", + "MT_FZEROBOOM", // Midnight Channel stuff: diff --git a/src/info.c b/src/info.c index cde74cee..928e2cb1 100644 --- a/src/info.c +++ b/src/info.c @@ -60,9 +60,9 @@ char sprnames[NUMSPRITES + 1][5] = "SSMN","KRBM","BHOG","BHBM","SPBM","THNS","SINK","SITR","KBLN","DEZL", "POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO", "CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB","ARRO", - "ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK","LZI1", - "LZI2","KLIT","FZSM","FZBM","FPRT","SPTL","ENM1","GARU","MARR","REAP", - "JITB","CDMO","CDBU","VIEW" + "ITEM","ITMO","ITMI","ITMN","WANT","PBOM","HIT1","HIT2","HIT3","RETI", + "AIDU","KSPK","LZI1","LZI2","KLIT","FZSM","FZBM","FPRT","SPTL","ENM1", + "GARU","MARR","REAP","JITB","CDMO","CDBU","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -3046,6 +3046,36 @@ state_t states[NUMSTATES] = {SPR_PBOM, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KARMAWHEEL + {SPR_HIT1, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT1B}, // S_BATTLEPOINT1A + {SPR_HIT1, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT1C}, // S_BATTLEPOINT1B + {SPR_HIT1, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT1D}, // S_BATTLEPOINT1C + {SPR_HIT1, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT1E}, // S_BATTLEPOINT1D + {SPR_HIT1, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT1F}, // S_BATTLEPOINT1E + {SPR_HIT1, 1, 1, {NULL}, 0, 0, S_BATTLEPOINT1G}, // S_BATTLEPOINT1F + {SPR_HIT1, 2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT1H}, // S_BATTLEPOINT1G + {SPR_HIT1, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT1I}, // S_BATTLEPOINT1H + {SPR_HIT1, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT1I + + {SPR_HIT2, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT2B}, // S_BATTLEPOINT2A + {SPR_HIT2, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT2C}, // S_BATTLEPOINT2B + {SPR_HIT2, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT2D}, // S_BATTLEPOINT2C + {SPR_HIT2, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT2E}, // S_BATTLEPOINT2D + {SPR_HIT2, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT2F}, // S_BATTLEPOINT2E + {SPR_HIT2, 1, 1, {NULL}, 0, 0, S_BATTLEPOINT2G}, // S_BATTLEPOINT2F + {SPR_HIT2, 2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT2H}, // S_BATTLEPOINT2G + {SPR_HIT2, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT2I}, // S_BATTLEPOINT2H + {SPR_HIT2, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT2I + + {SPR_HIT3, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT3B}, // S_BATTLEPOINT3A + {SPR_HIT3, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT3C}, // S_BATTLEPOINT3B + {SPR_HIT3, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT3D}, // S_BATTLEPOINT3C + {SPR_HIT3, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT3E}, // S_BATTLEPOINT3D + {SPR_HIT3, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT3F}, // S_BATTLEPOINT3E + {SPR_HIT3, 1, 1, {NULL}, 0, 0, S_BATTLEPOINT3G}, // S_BATTLEPOINT3F + {SPR_HIT3, 2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT3H}, // S_BATTLEPOINT3G + {SPR_HIT3, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT3I}, // S_BATTLEPOINT3H + {SPR_HIT3, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT3I + // Oh no it's annoying lightning states....... // Lightning Sparks (it's the ones we'll use for the radius) {SPR_KSPK, FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_KSPARK2}, // S_KSPARK1 @@ -17276,6 +17306,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BATTLEPOINT + -1, // doomednum + S_INVISIBLE, // 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 + -1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + { // MT_FZEROBOOM -1, // doomednum S_INVISIBLE, // spawnstate diff --git a/src/info.h b/src/info.h index 78f0edae..d125aa96 100644 --- a/src/info.h +++ b/src/info.h @@ -651,6 +651,11 @@ typedef enum sprite SPR_WANT, SPR_PBOM, // player bomb + + SPR_HIT1, // battle points + SPR_HIT2, // battle points + SPR_HIT3, // battle points + SPR_RETI, // player reticule SPR_AIDU, @@ -3619,7 +3624,37 @@ typedef enum state S_PLAYERFAKE, S_KARMAWHEEL, - + + S_BATTLEPOINT1A, // Battle point indicators + S_BATTLEPOINT1B, + S_BATTLEPOINT1C, + S_BATTLEPOINT1D, + S_BATTLEPOINT1E, + S_BATTLEPOINT1F, + S_BATTLEPOINT1G, + S_BATTLEPOINT1H, + S_BATTLEPOINT1I, + + S_BATTLEPOINT2A, + S_BATTLEPOINT2B, + S_BATTLEPOINT2C, + S_BATTLEPOINT2D, + S_BATTLEPOINT2E, + S_BATTLEPOINT2F, + S_BATTLEPOINT2G, + S_BATTLEPOINT2H, + S_BATTLEPOINT2I, + + S_BATTLEPOINT3A, + S_BATTLEPOINT3B, + S_BATTLEPOINT3C, + S_BATTLEPOINT3D, + S_BATTLEPOINT3E, + S_BATTLEPOINT3F, + S_BATTLEPOINT3G, + S_BATTLEPOINT3H, + S_BATTLEPOINT3I, + // Thunder shield use stuff; S_KSPARK1, // Sparkling Radius S_KSPARK2, @@ -4394,6 +4429,8 @@ typedef enum mobj_type MT_KARMAHITBOX, MT_KARMAWHEEL, + MT_BATTLEPOINT, + MT_FZEROBOOM, // Midnight Channel stuff: diff --git a/src/k_kart.c b/src/k_kart.c index 14978c67..68478db2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1784,6 +1784,32 @@ void K_DoInstashield(player_t *player) P_SetTarget(&layerb->target, player->mo); } +void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount) +{ + statenum_t st; + mobj_t *pt; + + if (!source || !source->mo) + return; + + if (amount == 1) + st = S_BATTLEPOINT1A; + else if (amount == 2) + st = S_BATTLEPOINT2A; + else if (amount == 3) + st = S_BATTLEPOINT3A; + else + return; // NO STATE! + + pt = P_SpawnMobj(source->mo->x, source->mo->y, source->mo->z, MT_BATTLEPOINT); + P_SetTarget(&pt->target, source->mo); + P_SetMobjState(pt, st); + if (victim && victim->skincolor) + pt->color = victim->skincolor; + else + pt->color = source->skincolor; +} + void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem) { UINT8 scoremultiply = 1; @@ -1817,6 +1843,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem if (source && source->player && player != source->player) { P_AddPlayerScore(source->player, scoremultiply); + K_SpawnBattlePoints(source->player, player, scoremultiply); if (!trapitem) { source->player->kartstuff[k_wanted] -= wantedreduce; @@ -1907,6 +1934,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source) if (source && source->player && player != source->player) { P_AddPlayerScore(source->player, scoremultiply); + K_SpawnBattlePoints(source->player, player, scoremultiply); source->player->kartstuff[k_wanted] -= wantedreduce; player->kartstuff[k_wanted] -= (wantedreduce/2); } @@ -1996,6 +2024,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b if (source && source->player && player != source->player) { P_AddPlayerScore(source->player, scoremultiply); + K_SpawnBattlePoints(source->player, player, scoremultiply); source->player->kartstuff[k_wanted] -= wantedreduce; player->kartstuff[k_wanted] -= (wantedreduce/2); } diff --git a/src/k_kart.h b/src/k_kart.h index 671efb89..1a96d6bb 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -27,6 +27,7 @@ void K_KartMoveAnimation(player_t *player); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_KartPlayerAfterThink(player_t *player); void K_DoInstashield(player_t *player); +void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount); void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem); void K_SquishPlayer(player_t *player, mobj_t *source); void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 8b9a0131..05facf18 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -2109,6 +2109,20 @@ static int lib_kDoInstashield(lua_State *L) return 0; } +static int lib_kSpawnBattlePoints(lua_State *L) +{ + player_t *source = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + player_t *victim = *((player_t **)luaL_checkudata(L, 2, META_PLAYER)); + UINT8 amount = (UINT8)luaL_checkinteger(L, 3); + NOHUD + if (!source) + return LUA_ErrInvalid(L, "player_t"); + if (!victim) + return LUA_ErrInvalid(L, "player_t"); + K_SpawnBattlePoints(source, victim, amount); + return 0; +} + static int lib_kSpinPlayer(lua_State *L) { player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); @@ -2500,6 +2514,7 @@ static luaL_Reg lib[] = { {"K_KartBouncing",lib_kKartBouncing}, {"K_MatchGenericExtraFlags",lib_kMatchGenericExtraFlags}, {"K_DoInstashield",lib_kDoInstashield}, + {"K_SpawnBattlePoints",lib_kSpawnBattlePoints}, {"K_SpinPlayer",lib_kSpinPlayer}, {"K_SquishPlayer",lib_kSquishPlayer}, {"K_ExplodePlayer",lib_kExplodePlayer}, diff --git a/src/p_mobj.c b/src/p_mobj.c index f4fd40c9..78c7fe5c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8323,6 +8323,28 @@ void P_MobjThinker(mobj_t *mobj) } P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z); break; + case MT_BATTLEPOINT: + if (!mobj->target || P_MobjWasRemoved(mobj->target)) + { + P_RemoveMobj(mobj); + return; + } + + if (mobj->movefactor < 48*mobj->target->scale) + { + mobj->movefactor += (48*mobj->target->scale)/6; + if (mobj->movefactor > mobj->target->height) + mobj->movefactor = mobj->target->height; + } + else if (mobj->movefactor > 48*mobj->target->scale) + { + mobj->movefactor -= (48*mobj->target->scale)/6; + if (mobj->movefactor < mobj->target->height) + mobj->movefactor = mobj->target->height; + } + + P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z + (mobj->target->height/2) + mobj->movefactor); + break; case MT_THUNDERSHIELD: { fixed_t destx, desty; From 4cf94765107f0d4037210e2854336809f3a069fe Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 13:44:09 -0400 Subject: [PATCH 59/80] First frame lasts longer --- src/info.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/info.c b/src/info.c index 928e2cb1..5aa5dcc2 100644 --- a/src/info.c +++ b/src/info.c @@ -3046,7 +3046,7 @@ state_t states[NUMSTATES] = {SPR_PBOM, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KARMAWHEEL - {SPR_HIT1, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT1B}, // S_BATTLEPOINT1A + {SPR_HIT1, 0, 7, {NULL}, 0, 0, S_BATTLEPOINT1B}, // S_BATTLEPOINT1A {SPR_HIT1, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT1C}, // S_BATTLEPOINT1B {SPR_HIT1, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT1D}, // S_BATTLEPOINT1C {SPR_HIT1, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT1E}, // S_BATTLEPOINT1D @@ -3056,7 +3056,7 @@ state_t states[NUMSTATES] = {SPR_HIT1, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT1I}, // S_BATTLEPOINT1H {SPR_HIT1, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT1I - {SPR_HIT2, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT2B}, // S_BATTLEPOINT2A + {SPR_HIT2, 0, 7, {NULL}, 0, 0, S_BATTLEPOINT2B}, // S_BATTLEPOINT2A {SPR_HIT2, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT2C}, // S_BATTLEPOINT2B {SPR_HIT2, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT2D}, // S_BATTLEPOINT2C {SPR_HIT2, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT2E}, // S_BATTLEPOINT2D @@ -3066,7 +3066,7 @@ state_t states[NUMSTATES] = {SPR_HIT2, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT2I}, // S_BATTLEPOINT2H {SPR_HIT2, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT2I - {SPR_HIT3, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT3B}, // S_BATTLEPOINT3A + {SPR_HIT3, 0, 7, {NULL}, 0, 0, S_BATTLEPOINT3B}, // S_BATTLEPOINT3A {SPR_HIT3, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT3C}, // S_BATTLEPOINT3B {SPR_HIT3, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT3D}, // S_BATTLEPOINT3C {SPR_HIT3, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT3E}, // S_BATTLEPOINT3D From 7e9300c4201cd7aeaf37790e40e964bf2d2908a3 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 16:15:25 -0400 Subject: [PATCH 60/80] Lap hands touch-up --- src/d_player.h | 1 + src/dehacked.c | 1 + src/k_kart.c | 27 ++++++++------------------- src/p_spec.c | 37 ++++++++++++++++++++++++++++--------- 4 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 866589df..f06a7313 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -280,6 +280,7 @@ typedef enum k_throwdir, // Held dir of controls; 1 = forward, 0 = none, -1 = backward (was "player->heldDir") k_lapanimation, // Used to show the lap start wing logo animation + k_laphand, // Lap hand gfx to use; 0 = none, 1 = :ok_hand:, 2 = :thumbs_up:, 3 = :thumps_down: k_cardanimation, // Used to determine the position of some full-screen Battle Mode graphics k_voices, // Used to stop the player saying more voices than it should k_tauntvoices, // Used to specifically stop taunt voice spam diff --git a/src/dehacked.c b/src/dehacked.c index 77663ccd..3545e055 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7867,6 +7867,7 @@ static const char *const KARTSTUFF_LIST[] = { "THROWDIR", "LAPANIMATION", + "LAPHAND", "CARDANIMATION", "VOICES", "TAUNTVOICES", diff --git a/src/k_kart.c b/src/k_kart.c index 78b92a9f..9af07ec8 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5577,9 +5577,7 @@ static patch_t *kp_lapanim_lap[7]; static patch_t *kp_lapanim_final[11]; static patch_t *kp_lapanim_number[10][3]; static patch_t *kp_lapanim_emblem; -#if 0 static patch_t *kp_lapanim_hand[3]; -#endif void K_LoadKartHUDGraphics(void) { @@ -5800,14 +5798,12 @@ void K_LoadKartHUDGraphics(void) kp_lapanim_emblem = (patch_t *) W_CachePatchName("K_LAPE00", PU_HUDGFX); -#if 0 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); } -#endif } // For the item toggle menu @@ -7389,27 +7385,20 @@ static void K_drawLapStartAnim(void) // This is an EVEN MORE insanely complicated animation. const UINT8 progress = 80-stplyr->kartstuff[k_lapanimation]; UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, stplyr->skincolor, 0); -#if 0 - UINT8 h = 1; - - if (stplyr->kartstuff[k_position] == 1) - h = 0; - else if (K_IsPlayerLosing(stplyr)) - h = 2; -#endif V_DrawFixedPatch((BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)))*FRACUNIT, (48 - (32*max(0, progress-76)))*FRACUNIT, FRACUNIT, V_HUDTRANS, kp_lapanim_emblem, colormap); -#if 0 - V_DrawFixedPatch((BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)))*FRACUNIT, - (48 - (32*max(0, progress-76)) - + 4 - abs((leveltime % 8) - 4))*FRACUNIT, - FRACUNIT, V_HUDTRANS, - kp_lapanim_hand[h], NULL); -#endif + if (stplyr->kartstuff[k_laphand] >= 1 && stplyr->kartstuff[k_laphand] <= 3) + { + V_DrawFixedPatch((BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)))*FRACUNIT, + (48 - (32*max(0, progress-76)) + + 4 - abs((leveltime % 8) - 4))*FRACUNIT, + FRACUNIT, V_HUDTRANS, + kp_lapanim_hand[stplyr->kartstuff[k_laphand]-1], NULL); + } if (stplyr->laps == (UINT8)(cv_numlaps.value - 1)) { diff --git a/src/p_spec.c b/src/p_spec.c index 76ed73aa..9f18fdc7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4196,7 +4196,34 @@ DoneSection2: { if (player->starpostcount >= numstarposts/2) // srb2kart: must have touched *enough* starposts (was originally "(player->starpostnum == numstarposts)") { + UINT8 i; + UINT8 nump = 0; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || players[i].spectator) + continue; + nump++; + } + player->laps++; + + // Set up lap animation vars + if (nump > 1) + { + if (K_IsPlayerLosing(player)) + player->kartstuff[k_laphand] = 3; + else + { + if (nump > 2 && player->kartstuff[k_position] == 1) // 1st place in 1v1 uses thumbs up + player->kartstuff[k_laphand] = 1; + else + player->kartstuff[k_laphand] = 2; + } + } + else + player->kartstuff[k_laphand] = 0; // No hands in FREE PLAY + player->kartstuff[k_lapanimation] = 80; if (player->pflags & PF_NIGHTSMODE) @@ -4237,15 +4264,7 @@ DoneSection2: // Figure out how many are playing on the last lap, to prevent spectate griefing if (!nospectategrief && player->laps >= (UINT8)(cv_numlaps.value - 1)) - { - UINT8 i; - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i] || players[i].spectator) - continue; - nospectategrief++; - } - } + nospectategrief = nump; } else if (player->starpostnum) { From 43d72d72f9b009788e04dc3ceaa96a8466188002 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 17:06:10 -0400 Subject: [PATCH 61/80] Properly center this --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 68478db2..cef28029 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7689,7 +7689,7 @@ void K_drawKartHUD(void) } if (G_BattleGametype() && !splitscreen && (stplyr->kartstuff[k_yougotem] % 2)) // * YOU GOT EM * - V_DrawScaledPatch(BASEVIDWIDTH/2 - SHORT(kp_yougotem->width), 32, V_HUDTRANS, kp_yougotem); + V_DrawScaledPatch(BASEVIDWIDTH/2 - (SHORT(kp_yougotem->width)/2), 32, V_HUDTRANS, kp_yougotem); // Draw FREE PLAY. if (isfreeplay && !stplyr->spectator && timeinmap > 113) From a2da81243ed5182a521418ca614219ec369ef007 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 17:08:30 -0400 Subject: [PATCH 62/80] Double length of msg --- src/p_inter.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 8b49494b..73eb9f98 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -524,7 +524,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) special->target->player->kartstuff[k_comebackpoints] += ptadd; if (ptadd > 1) - special->target->player->kartstuff[k_yougotem] = TICRATE; + special->target->player->kartstuff[k_yougotem] = 2*TICRATE; if (special->target->player->kartstuff[k_comebackpoints] >= 2) K_StealBumper(special->target->player, player, true); @@ -576,7 +576,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) special->target->player->kartstuff[k_comebackpoints] += ptadd; if (ptadd > 1) - special->target->player->kartstuff[k_yougotem] = TICRATE; + special->target->player->kartstuff[k_yougotem] = 2*TICRATE; if (special->target->player->kartstuff[k_comebackpoints] >= 2) K_StealBumper(special->target->player, player, true); From 7e103be39303467f6518b30f4cdcc8d74d44ccc9 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 17:37:59 -0400 Subject: [PATCH 63/80] Change default brake color from Yellow to White --- src/p_mobj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index f6548e94..12e61dff 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8331,7 +8331,7 @@ void P_MobjThinker(mobj_t *mobj) else if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)) mobj->color = SKINCOLOR_SAPPHIRE; else - mobj->color = SKINCOLOR_YELLOW; + mobj->color = SKINCOLOR_WHITE; K_MatchGenericExtraFlags(mobj, mobj->target); if (leveltime & 1) From 5c7de7559292fb462303ba96edcc830dda9f2d38 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 19:50:31 -0400 Subject: [PATCH 64/80] Fix random crash on squishing Why does this cause a crash? I dunno, beats me, but this seemed to fix it. --- src/p_map.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 2bcfd73a..5784b3ff 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1411,19 +1411,17 @@ static boolean PIT_CheckThing(mobj_t *thing) // Make sure they aren't able to damage you ANYWHERE along the Z axis, you have to be TOUCHING the person. && !(thing->z + thing->height < tmthing->z || thing->z > tmthing->z + tmthing->height)) { - // SRB2kart - Squish! - if (tmthing->scale > thing->scale + (FRACUNIT/8)) + + if (tmthing->scale > thing->scale + (FRACUNIT/8)) // SRB2kart - Handle squishes first! K_SquishPlayer(thing->player, tmthing); else if (thing->scale > tmthing->scale + (FRACUNIT/8)) K_SquishPlayer(tmthing->player, thing); - - // SRB2kart - Invincibility! - if (tmthing->player->kartstuff[k_invincibilitytimer] && !thing->player->kartstuff[k_invincibilitytimer]) + else if (tmthing->player->kartstuff[k_invincibilitytimer] && !thing->player->kartstuff[k_invincibilitytimer]) // SRB2kart - Then invincibility! P_DamageMobj(thing, tmthing, tmthing, 1); else if (thing->player->kartstuff[k_invincibilitytimer] && !tmthing->player->kartstuff[k_invincibilitytimer]) P_DamageMobj(tmthing, thing, thing, 1); - if (G_BattleGametype() && (!G_GametypeHasTeams() || tmthing->player->ctfteam != thing->player->ctfteam)) + /*if (G_BattleGametype() && (!G_GametypeHasTeams() || tmthing->player->ctfteam != thing->player->ctfteam)) { if ((tmthing->player->powers[pw_invulnerability] || tmthing->player->powers[pw_super]) && !thing->player->powers[pw_super]) @@ -1441,7 +1439,7 @@ static boolean PIT_CheckThing(mobj_t *thing) P_DamageMobj(thing, tmthing, tmthing, 1); else if ((thing->player->pflags & PF_TAGIT) && !(tmthing->player->pflags & PF_TAGIT)) P_DamageMobj(tmthing, thing, tmthing, 1); - } + }*/ } // Force solid players in hide and seek to avoid corner stacking. From 67dd962fb97d6ffefae53c313f30bd1a431dc5ac Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 20:46:20 -0400 Subject: [PATCH 65/80] Change out the hex used for hnext/hprev consistancy --- src/d_clisrv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index e07b9021..3b66d760 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -4449,7 +4449,7 @@ static INT16 Consistancy(void) ret += mo->hnext->frame; } else - ret ^= 0x3333; + ret ^= 0x5555; if (mo->hprev) { ret += mo->hprev->type; @@ -4469,7 +4469,7 @@ static INT16 Consistancy(void) ret += mo->hprev->frame; } else - ret ^= 0xAAAA; + ret ^= 0xCCCC; ret -= mo->state - states; ret += mo->tics; ret -= mo->sprite; From 78299c5feef1f82289e7a6238c653671e780d422 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 20:50:19 -0400 Subject: [PATCH 66/80] 0xFFFF to 0xFFFFFFFF I'll implement proper bit-setting later, just gotta see if it works first --- src/d_clisrv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 3b66d760..2fb2c826 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1001,7 +1001,7 @@ static void SV_RequireResynch(INT32 node) resynch_delay[node] = 10; // Delay before you can fail sync again resynch_score[node] += 200; // Add score for initial desynch - resynch_status[node] = 0xFFFFFFFF; // No players assumed synched + resynch_status[node] = 0xFFFF; // No players assumed synched resynch_inprogress[node] = true; // so we know to send a PT_RESYNCHEND after sync // Initial setup From 950bca1217470018256e848a04f86b313b184c3c Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 21:05:52 -0400 Subject: [PATCH 67/80] Actually lets just do this now, like how its done below --- src/d_clisrv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 2fb2c826..5ceb47cd 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1001,7 +1001,8 @@ static void SV_RequireResynch(INT32 node) resynch_delay[node] = 10; // Delay before you can fail sync again resynch_score[node] += 200; // Add score for initial desynch - resynch_status[node] = 0xFFFF; // No players assumed synched + for (i = 0; i < MAXPLAYERS; ++i) + resynch_status[node] |= (1< Date: Fri, 2 Nov 2018 01:19:25 -0400 Subject: [PATCH 68/80] Fix ghost rankings issue --- src/k_kart.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index bf6751e8..0f7d46af 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6548,7 +6548,11 @@ static boolean K_drawKartPositionFaces(void) ranklines = 5; } else if (strank+3 > ranklines) // too close to the bottom? + { i = ranklines - 5; + if (ranklines < 0) + ranklines = 0; + } else { i = strank-2; From 667e6366313179bb5c77f07b0c851f268ef4324b Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 2 Nov 2018 01:22:52 -0400 Subject: [PATCH 69/80] Use chars.kart --- src/d_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_main.c b/src/d_main.c index 500f6116..e1bcce8c 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -954,7 +954,7 @@ static void IdentifyVersion(void) // SRB2kart - Add graphics (temp) // The command for md5 checks is "W_VerifyFileMD5" - looks for ASSET_HASH_SRB2_SRB in config.h.in D_AddFile(va(pandf,srb2waddir,"gfx.kart")); - D_AddFile(va(pandf,srb2waddir,"charscleanup.kart")); + D_AddFile(va(pandf,srb2waddir,"chars.kart")); D_AddFile(va(pandf,srb2waddir,"maps.kart")); //D_AddFile(va(pandf,srb2waddir,"sounds.kart")); MUSICTEST("sounds.kart") From 1bdaad3f06ff21aa818a4c52a1e2cb1f25e23d97 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 2 Nov 2018 02:28:34 -0400 Subject: [PATCH 70/80] quick merge fix --- src/p_map.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 0129701a..f9eb8bc2 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -697,7 +697,7 @@ static boolean PIT_CheckThing(mobj_t *thing) } // Push fakes out of other items - if (tmthing->type == MT_FAKEITEM && (thing->type == MT_RANDOMITEM || thing->type == MT_FAKEITEM)) + if (tmthing->type == MT_EGGMANITEM && (thing->type == MT_RANDOMITEM || thing->type == MT_EGGMANITEM)) { // see if it went over / under if (tmthing->z > thing->z + thing->height) @@ -708,7 +708,7 @@ static boolean PIT_CheckThing(mobj_t *thing) P_InstaThrust(tmthing, R_PointToAngle2(thing->x, thing->y, tmthing->x, tmthing->y), thing->radius/4); return true; } - else if (thing->type == MT_FAKEITEM && (tmthing->type == MT_RANDOMITEM || tmthing->type == MT_FAKEITEM)) + else if (thing->type == MT_EGGMANITEM && (tmthing->type == MT_RANDOMITEM || tmthing->type == MT_EGGMANITEM)) { // see if it went over / under if (tmthing->z > thing->z + thing->height) From 8d5fb13111a810e1dd11064369cb7c01845916e7 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 2 Nov 2018 14:01:29 -0400 Subject: [PATCH 71/80] wrong var fix --- 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 0f7d46af..e933a277 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6550,8 +6550,8 @@ static boolean K_drawKartPositionFaces(void) else if (strank+3 > ranklines) // too close to the bottom? { i = ranklines - 5; - if (ranklines < 0) - ranklines = 0; + if (i < 0) + i = 0; } else { From 399bccd2c799c2cea0d0918c1825ead4facdff4e Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 2 Nov 2018 14:52:08 -0400 Subject: [PATCH 72/80] use gfx.kart --- src/d_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_main.c b/src/d_main.c index b38cdb01..e1bcce8c 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -953,7 +953,7 @@ static void IdentifyVersion(void) } // SRB2kart - Add graphics (temp) // The command for md5 checks is "W_VerifyFileMD5" - looks for ASSET_HASH_SRB2_SRB in config.h.in - D_AddFile(va(pandf,srb2waddir,"gfxHC.kart")); // temporary, don't let this line get merged + D_AddFile(va(pandf,srb2waddir,"gfx.kart")); D_AddFile(va(pandf,srb2waddir,"chars.kart")); D_AddFile(va(pandf,srb2waddir,"maps.kart")); //D_AddFile(va(pandf,srb2waddir,"sounds.kart")); From ba67c7aa709df56964089b0140517c31c2a014c6 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 2 Nov 2018 14:59:26 -0400 Subject: [PATCH 73/80] Fix for "became a spectator" text repeating --- src/d_netcmd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index df9fb54a..6e598801 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -3317,8 +3317,8 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum) else CONS_Printf(M_GetText("%s switched to the %c%s%c.\n"), player_names[playernum], '\x84', M_GetText("Blue Team"), '\x80'); } - else - HU_AddChatText(va("\x82*%s became a spectator.", player_names[playernum]), false); + else if (NetPacket.packet.newteam == 0) + HU_AddChatText(va("\x82*%s became a spectator.", player_names[playernum]), false); // "entered the game" text was moved to P_SpectatorJoinGame //reset view if you are changed, or viewing someone who was changed. if (playernum == consoleplayer || displayplayer == playernum) From cb699c17709549650ba6733b5a65af929af5f3b6 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 2 Nov 2018 15:06:56 -0400 Subject: [PATCH 74/80] fullbright points --- src/info.c | 54 +++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/info.c b/src/info.c index 8d77b796..4028c187 100644 --- a/src/info.c +++ b/src/info.c @@ -3059,35 +3059,35 @@ state_t states[NUMSTATES] = {SPR_PBOM, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KARMAWHEEL - {SPR_HIT1, 0, 7, {NULL}, 0, 0, S_BATTLEPOINT1B}, // S_BATTLEPOINT1A - {SPR_HIT1, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT1C}, // S_BATTLEPOINT1B - {SPR_HIT1, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT1D}, // S_BATTLEPOINT1C - {SPR_HIT1, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT1E}, // S_BATTLEPOINT1D - {SPR_HIT1, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT1F}, // S_BATTLEPOINT1E - {SPR_HIT1, 1, 1, {NULL}, 0, 0, S_BATTLEPOINT1G}, // S_BATTLEPOINT1F - {SPR_HIT1, 2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT1H}, // S_BATTLEPOINT1G - {SPR_HIT1, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT1I}, // S_BATTLEPOINT1H - {SPR_HIT1, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT1I + {SPR_HIT1, FF_FULLBRIGHT, 7, {NULL}, 0, 0, S_BATTLEPOINT1B}, // S_BATTLEPOINT1A + {SPR_HIT1, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_BATTLEPOINT1C}, // S_BATTLEPOINT1B + {SPR_HIT1, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_BATTLEPOINT1D}, // S_BATTLEPOINT1C + {SPR_HIT1, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_BATTLEPOINT1E}, // S_BATTLEPOINT1D + {SPR_HIT1, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_BATTLEPOINT1F}, // S_BATTLEPOINT1E + {SPR_HIT1, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_BATTLEPOINT1G}, // S_BATTLEPOINT1F + {SPR_HIT1, FF_FULLBRIGHT|2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT1H}, // S_BATTLEPOINT1G + {SPR_HIT1, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_BATTLEPOINT1I}, // S_BATTLEPOINT1H + {SPR_HIT1, FF_FULLBRIGHT|6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT1I - {SPR_HIT2, 0, 7, {NULL}, 0, 0, S_BATTLEPOINT2B}, // S_BATTLEPOINT2A - {SPR_HIT2, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT2C}, // S_BATTLEPOINT2B - {SPR_HIT2, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT2D}, // S_BATTLEPOINT2C - {SPR_HIT2, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT2E}, // S_BATTLEPOINT2D - {SPR_HIT2, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT2F}, // S_BATTLEPOINT2E - {SPR_HIT2, 1, 1, {NULL}, 0, 0, S_BATTLEPOINT2G}, // S_BATTLEPOINT2F - {SPR_HIT2, 2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT2H}, // S_BATTLEPOINT2G - {SPR_HIT2, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT2I}, // S_BATTLEPOINT2H - {SPR_HIT2, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT2I + {SPR_HIT2, FF_FULLBRIGHT, 7, {NULL}, 0, 0, S_BATTLEPOINT2B}, // S_BATTLEPOINT2A + {SPR_HIT2, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_BATTLEPOINT2C}, // S_BATTLEPOINT2B + {SPR_HIT2, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_BATTLEPOINT2D}, // S_BATTLEPOINT2C + {SPR_HIT2, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_BATTLEPOINT2E}, // S_BATTLEPOINT2D + {SPR_HIT2, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_BATTLEPOINT2F}, // S_BATTLEPOINT2E + {SPR_HIT2, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_BATTLEPOINT2G}, // S_BATTLEPOINT2F + {SPR_HIT2, FF_FULLBRIGHT|2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT2H}, // S_BATTLEPOINT2G + {SPR_HIT2, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_BATTLEPOINT2I}, // S_BATTLEPOINT2H + {SPR_HIT2, FF_FULLBRIGHT|6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT2I - {SPR_HIT3, 0, 7, {NULL}, 0, 0, S_BATTLEPOINT3B}, // S_BATTLEPOINT3A - {SPR_HIT3, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT3C}, // S_BATTLEPOINT3B - {SPR_HIT3, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT3D}, // S_BATTLEPOINT3C - {SPR_HIT3, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT3E}, // S_BATTLEPOINT3D - {SPR_HIT3, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT3F}, // S_BATTLEPOINT3E - {SPR_HIT3, 1, 1, {NULL}, 0, 0, S_BATTLEPOINT3G}, // S_BATTLEPOINT3F - {SPR_HIT3, 2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT3H}, // S_BATTLEPOINT3G - {SPR_HIT3, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT3I}, // S_BATTLEPOINT3H - {SPR_HIT3, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT3I + {SPR_HIT3, FF_FULLBRIGHT, 7, {NULL}, 0, 0, S_BATTLEPOINT3B}, // S_BATTLEPOINT3A + {SPR_HIT3, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_BATTLEPOINT3C}, // S_BATTLEPOINT3B + {SPR_HIT3, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_BATTLEPOINT3D}, // S_BATTLEPOINT3C + {SPR_HIT3, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_BATTLEPOINT3E}, // S_BATTLEPOINT3D + {SPR_HIT3, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_BATTLEPOINT3F}, // S_BATTLEPOINT3E + {SPR_HIT3, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_BATTLEPOINT3G}, // S_BATTLEPOINT3F + {SPR_HIT3, FF_FULLBRIGHT|2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT3H}, // S_BATTLEPOINT3G + {SPR_HIT3, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_BATTLEPOINT3I}, // S_BATTLEPOINT3H + {SPR_HIT3, FF_FULLBRIGHT|6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT3I // Oh no it's annoying lightning states....... // Lightning Sparks (it's the ones we'll use for the radius) From 9ae9e7ec3ad5467d78d7d048c06548998b3ce027 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 2 Nov 2018 23:51:06 -0400 Subject: [PATCH 75/80] Check for valid source in A_JawzChase, change 1 target rule --- src/p_enemy.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index c4d1fe41..ea10b62b 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8261,6 +8261,9 @@ void A_JawzChase(mobj_t *actor) if (actor->tracer) { + if (G_RaceGametype()) // Stop looking after first target in race + actor->extravalue1 = 1; + if (actor->tracer->health) { mobj_t *ret; @@ -8280,13 +8283,13 @@ void A_JawzChase(mobj_t *actor) if (actor->extravalue1) // Disable looking by setting this return; + if (actor->target && !P_MobjWasRemoved(actor->target)) // No source! + return; + player = K_FindJawzTarget(actor, actor->target->player); if (player) P_SetTarget(&actor->tracer, player->mo); - if (G_RaceGametype()) // Stop looking after first tic in race - actor->extravalue1 = 1; - return; } From 9de7a9d5cc864cfd3cf93f473b64b09eed84fe1a Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 3 Nov 2018 03:17:20 -0400 Subject: [PATCH 76/80] Add textures.kart, re-define DEVELOP mode, Disabling DEVELOP can be another branch; this means this can get in master quicker --- assets/CMakeLists.txt | 2 ++ src/config.h.in | 38 ++++++++++++++++++++------------------ src/d_main.c | 3 +++ src/doomdef.h | 3 +-- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/assets/CMakeLists.txt b/assets/CMakeLists.txt index dae68cf7..1962685e 100644 --- a/assets/CMakeLists.txt +++ b/assets/CMakeLists.txt @@ -5,6 +5,7 @@ set(SRB2_ASSET_ALL ${CMAKE_CURRENT_SOURCE_DIR}/srb2.srb ${CMAKE_CURRENT_SOURCE_DIR}/patch.dta ${CMAKE_CURRENT_SOURCE_DIR}/gfx.kart + ${CMAKE_CURRENT_SOURCE_DIR}/textures.kart ${CMAKE_CURRENT_SOURCE_DIR}/chars.kart ${CMAKE_CURRENT_SOURCE_DIR}/maps.kart ${CMAKE_CURRENT_SOURCE_DIR}/sounds.kart @@ -16,6 +17,7 @@ set(SRB2_ASSET_HASHED srb2.srb patch.dta gfx.kart + textures.kart chars.kart maps.kart ) diff --git a/src/config.h.in b/src/config.h.in index 68c29782..e72970f3 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -12,45 +12,47 @@ #ifdef CMAKECONFIG // Base SRB2 hashes -#define ASSET_HASH_SRB2_SRB "${SRB2_ASSET_srb2.srb_HASH}" +#define ASSET_HASH_SRB2_SRB "${SRB2_ASSET_srb2.srb_HASH}" #ifdef USE_PATCH_DTA -#define ASSET_HASH_PATCH_DTA "${SRB2_ASSET_patch.dta_HASH}" +#define ASSET_HASH_PATCH_DTA "${SRB2_ASSET_patch.dta_HASH}" #endif // SRB2Kart-specific hashes -#define ASSET_HASH_GFX_KART "${SRB2_ASSET_gfx.kart_HASH}" -#define ASSET_HASH_CHARS_KART "${SRB2_ASSET_chars.kart_HASH}" -#define ASSET_HASH_MAPS_KART "${SRB2_ASSET_maps.kart_HASH}" +#define ASSET_HASH_GFX_KART "${SRB2_ASSET_gfx.kart_HASH}" +#define ASSET_HASH_TEXTURES_KART "${SRB2_ASSET_textures.kart_HASH}" +#define ASSET_HASH_CHARS_KART "${SRB2_ASSET_chars.kart_HASH}" +#define ASSET_HASH_MAPS_KART "${SRB2_ASSET_maps.kart_HASH}" #ifdef USE_PATCH_KART -#define ASSET_HASH_PATCH_KART "${SRB2_ASSET_patch.kart_HASH}" +#define ASSET_HASH_PATCH_KART "${SRB2_ASSET_patch.kart_HASH}" #endif -#define SRB2_COMP_REVISION "${SRB2_COMP_REVISION}" -#define SRB2_COMP_BRANCH "${SRB2_COMP_BRANCH}" -#define SRB2_GIT_DESCRIBE "${SRB2_GIT_DESCRIBE}" -#define SRB2_GIT_BRANCH "${SRB2_GIT_BRANCH}" +#define SRB2_COMP_REVISION "${SRB2_COMP_REVISION}" +#define SRB2_COMP_BRANCH "${SRB2_COMP_BRANCH}" +#define SRB2_GIT_DESCRIBE "${SRB2_GIT_DESCRIBE}" +#define SRB2_GIT_BRANCH "${SRB2_GIT_BRANCH}" -#define CMAKE_ASSETS_DIR "${CMAKE_SOURCE_DIR}/assets" +#define CMAKE_ASSETS_DIR "${CMAKE_SOURCE_DIR}/assets" #else -/* Manually defined asset hashes for non-CMake builds - Still used in SRB2kart. +/* Manually defined asset hashes for non-CMake builds * YYYY MM DD * Last updated 2017 / 02 / 20 */ // Base SRB2 hashes -#define ASSET_HASH_SRB2_SRB "c1b9577687f8a795104aef4600720ea7" +#define ASSET_HASH_SRB2_SRB "c1b9577687f8a795104aef4600720ea7" #ifdef USE_PATCH_DTA -#define ASSET_HASH_PATCH_DTA "dbbf8bc6121618ee3be2d5b14650429b" +#define ASSET_HASH_PATCH_DTA "dbbf8bc6121618ee3be2d5b14650429b" #endif // SRB2Kart-specific hashes -#define ASSET_HASH_GFX_KART "00000000000000000000000000000000" -#define ASSET_HASH_CHARS_KART "00000000000000000000000000000000" -#define ASSET_HASH_MAPS_KART "00000000000000000000000000000000" +#define ASSET_HASH_GFX_KART "00000000000000000000000000000000" +#define ASSET_HASH_TEXTURES_KART "00000000000000000000000000000000" +#define ASSET_HASH_CHARS_KART "00000000000000000000000000000000" +#define ASSET_HASH_MAPS_KART "00000000000000000000000000000000" #ifdef USE_PATCH_KART -#define ASSET_HASH_PATCH_KART "00000000000000000000000000000000" +#define ASSET_HASH_PATCH_KART "00000000000000000000000000000000" #endif #endif diff --git a/src/d_main.c b/src/d_main.c index 3eedb607..b3c5fb80 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -954,6 +954,7 @@ static void IdentifyVersion(void) // SRB2kart - Add graphics (temp) // The command for md5 checks is "W_VerifyFileMD5" - looks for ASSET_HASH_SRB2_SRB in config.h.in D_AddFile(va(pandf,srb2waddir,"gfx.kart")); + D_AddFile(va(pandf,srb2waddir,"textures.kart")); D_AddFile(va(pandf,srb2waddir,"chars.kart")); D_AddFile(va(pandf,srb2waddir,"maps.kart")); //D_AddFile(va(pandf,srb2waddir,"sounds.kart")); @@ -1234,6 +1235,7 @@ void D_SRB2Main(void) mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_PATCH_DTA); // patch.dta #endif mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_GFX_KART); // gfx.kart + mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_TEXTURES_KART); // textures.kart mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_CHARS_KART); // chars.kart mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_MAPS_KART); // maps.kart mainwads++; //W_VerifyFileMD5(5, ASSET_HASH_SOUNDS_KART); -- sounds.kart - doesn't trigger modifiedgame, doesn't need an MD5...? @@ -1249,6 +1251,7 @@ void D_SRB2Main(void) mainwads++; // patch.dta #endif mainwads++; // gfx.kart + mainwads++; // textures.kart mainwads++; // chars.kart mainwads++; // maps.kart mainwads++; // sounds.kart diff --git a/src/doomdef.h b/src/doomdef.h index 89cab4e5..9921f1c2 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -140,7 +140,7 @@ extern FILE *logstream; #endif -//#define DEVELOP // Disable this for release builds to remove excessive cheat commands and enable MD5 checking and stuff, all in one go. :3 +#define DEVELOP // Disable this for release builds to remove excessive cheat commands and enable MD5 checking and stuff, all in one go. :3 #ifdef DEVELOP #define VERSION 0 // Game version #define SUBVERSION 0 // more precise version number @@ -546,7 +546,6 @@ extern const char *compdate, *comptime, *comprevision, *compbranch; #define SECTORSPECIALSAFTERTHINK /// SRB2Kart: Camera always has noclip. -/// \note Kind of problematic. If we decide to keep this on, we'll need serious map changes. #define NOCLIPCAM #endif // __DOOMDEF__ From 69faf1cbc7fac5312f48688a131d310dabb727d9 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 3 Nov 2018 03:21:08 -0400 Subject: [PATCH 77/80] Remove NOFOURPLAYER from Makefile Seems that someone already removed it from the other code anyway...? --- src/Makefile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Makefile b/src/Makefile index 85ecb49a..c37e9827 100644 --- a/src/Makefile +++ b/src/Makefile @@ -389,11 +389,6 @@ ifdef NOPOSTPROCESSING OPTS+=-DNOPOSTPROCESSING endif -# srb2kart, remove before release -ifdef NOFOURPLAYER - OPTS+=-DNOFOURPLAYER -endif - OPTS:=-fno-exceptions $(OPTS) ifdef MOBJCONSISTANCY From cb1380ae51139b8ff3077ca1502fde3fbcf4de5a Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 3 Nov 2018 03:29:06 -0400 Subject: [PATCH 78/80] Changed this randomly changed instance back to vanilla, due to compile errors https://i.imgur.com/SEdmZpC.png --- src/m_menu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 9c6635e1..5ac72fbc 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2804,8 +2804,8 @@ void M_Drawer(void) else { #ifdef DEVELOP // Development -- show revision / branch info - V_DrawThinString(vid.dupx, vid.height - 20*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, "KART DEV EXE"); - V_DrawThinString(vid.dupx, vid.height - 10*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, va("%s", VERSIONSTRINGW)); + V_DrawThinString(vid.dupx, vid.height - 17*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, compbranch); + V_DrawThinString(vid.dupx, vid.height - 9*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, comprevision); #else // Regular build V_DrawThinString(vid.dupx, vid.height - 10*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, va("%s", VERSIONSTRING)); #endif From 0d79cbdd275f8fa9c12a0e11a36a6fb540df58ae Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 3 Nov 2018 03:38:41 -0400 Subject: [PATCH 79/80] Keep the old y offsets, though. --- src/m_menu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 5ac72fbc..5dc09a83 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2804,8 +2804,8 @@ void M_Drawer(void) else { #ifdef DEVELOP // Development -- show revision / branch info - V_DrawThinString(vid.dupx, vid.height - 17*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, compbranch); - V_DrawThinString(vid.dupx, vid.height - 9*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, comprevision); + V_DrawThinString(vid.dupx, vid.height - 20*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, compbranch); + V_DrawThinString(vid.dupx, vid.height - 10*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, comprevision); #else // Regular build V_DrawThinString(vid.dupx, vid.height - 10*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, va("%s", VERSIONSTRING)); #endif From f9ad07da5f002de98eb12b258fc1da859f81d9dc Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 3 Nov 2018 13:20:02 +0000 Subject: [PATCH 80/80] Fix 2p ("wide") splitscreen having an incorrect FINISH arrangement (drawn at wrong scale, moved across screen at wrong speed...) --- src/k_kart.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index af0021da..39ef34c0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7140,25 +7140,30 @@ static void K_drawKartFinish(void) if ((stplyr->kartstuff[k_cardanimation] % (2*5)) / 5) // blink pnum = 1; - if (splitscreen > 1) // small splitscreen - pnum += 2; - else if (splitscreen == 1) // wide splitscreen - pnum += 4; - - if (splitscreen > 1) // Stationary FIN - V_DrawScaledPatch(STCD_X - (SHORT(kp_racefinish[pnum]->width)/2), STCD_Y - (SHORT(kp_racefinish[pnum]->height)/2), splitflags, kp_racefinish[pnum]); - else // Scrolling FINISH + if (splitscreen > 1) // 3/4p, stationary FIN { - INT32 scaleshift = (FRACBITS - splitscreen); // FRACUNIT or FRACUNIT/2 - INT32 x = ((vid.width<width)<width)/2), STCD_Y - (SHORT(kp_racefinish[pnum]->height)/2), splitflags, kp_racefinish[pnum]); + return; + } + + //else -- 1/2p, scrolling FINISH + { + INT32 x, xval; + + if (splitscreen) // wide splitscreen + pnum += 4; + + x = ((vid.width<width)<kartstuff[k_cardanimation])*(xval > x ? xval : x))/TICRATE; if (splitscreen && stplyr == &players[secondarydisplayplayer]) x = -x; - V_DrawFixedPatch(x + (STCD_X<width)<<(scaleshift-1)), - (STCD_Y<height)<<(scaleshift-1)), - (1<>1), + (STCD_Y<height)<<(FRACBITS-1)), + FRACUNIT, splitflags, kp_racefinish[pnum], NULL); } }