From 2e4b5bd061657642cee3678ad8c0a4fa0ef4c9a2 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 29 Nov 2022 19:23:05 -0800 Subject: [PATCH 1/7] Clean up P_FuseThink flicker condition --- src/p_mobj.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 26b38d631..a1544b802 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9528,13 +9528,38 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s P_RemoveMobj(mobj); // make sure they disappear } +static boolean P_CanFlickerFuse(mobj_t *mobj) +{ + switch (mobj->type) + { + case MT_SNAPPER_HEAD: + case MT_SNAPPER_LEG: + case MT_MINECARTSEG: + return true; + + case MT_RANDOMITEM: + case MT_EGGMANITEM: + case MT_FALLINGROCK: + if (mobj->fuse <= TICRATE) + { + return true; + } + break; + + default: + break; + } + + return false; + +} + static boolean P_FuseThink(mobj_t *mobj) { - if (mobj->type == MT_SNAPPER_HEAD || mobj->type == MT_SNAPPER_LEG || mobj->type == MT_MINECARTSEG) - mobj->renderflags ^= RF_DONTDRAW; - - if (mobj->fuse <= TICRATE && (mobj->type == MT_RANDOMITEM || mobj->type == MT_EGGMANITEM || mobj->type == MT_FALLINGROCK)) + if (P_CanFlickerFuse(mobj)) + { mobj->renderflags ^= RF_DONTDRAW; + } mobj->fuse--; From 43aa162fcba052fe491e4f07514d0358d531cdff Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 10 Dec 2022 01:12:36 -0800 Subject: [PATCH 2/7] Add K_GetChaosEmeraldColor --- src/k_battle.c | 37 ++++++++++++++++++++++++------------- src/k_battle.h | 1 + 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/k_battle.c b/src/k_battle.c index 15b81f81c..7079bf3a4 100644 --- a/src/k_battle.c +++ b/src/k_battle.c @@ -221,6 +221,29 @@ void K_CheckEmeralds(player_t *player) K_CheckBumpers(); } +UINT16 K_GetChaosEmeraldColor(UINT32 emeraldType) +{ + switch (emeraldType) + { + case EMERALD_CHAOS1: + return SKINCOLOR_CHAOSEMERALD1; + case EMERALD_CHAOS2: + return SKINCOLOR_CHAOSEMERALD2; + case EMERALD_CHAOS3: + return SKINCOLOR_CHAOSEMERALD3; + case EMERALD_CHAOS4: + return SKINCOLOR_CHAOSEMERALD4; + case EMERALD_CHAOS5: + return SKINCOLOR_CHAOSEMERALD5; + case EMERALD_CHAOS6: + return SKINCOLOR_CHAOSEMERALD6; + case EMERALD_CHAOS7: + return SKINCOLOR_CHAOSEMERALD7; + default: + return SKINCOLOR_NONE; + } +} + mobj_t *K_SpawnChaosEmerald(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 flip, UINT32 emeraldType) { boolean validEmerald = true; @@ -240,25 +263,13 @@ mobj_t *K_SpawnChaosEmerald(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT switch (emeraldType) { case EMERALD_CHAOS1: - emerald->color = SKINCOLOR_CHAOSEMERALD1; - break; case EMERALD_CHAOS2: - emerald->color = SKINCOLOR_CHAOSEMERALD2; - break; case EMERALD_CHAOS3: - emerald->color = SKINCOLOR_CHAOSEMERALD3; - break; case EMERALD_CHAOS4: - emerald->color = SKINCOLOR_CHAOSEMERALD4; - break; case EMERALD_CHAOS5: - emerald->color = SKINCOLOR_CHAOSEMERALD5; - break; case EMERALD_CHAOS6: - emerald->color = SKINCOLOR_CHAOSEMERALD6; - break; case EMERALD_CHAOS7: - emerald->color = SKINCOLOR_CHAOSEMERALD7; + emerald->color = K_GetChaosEmeraldColor(emeraldType); break; default: CONS_Printf("Invalid emerald type %d\n", emeraldType); diff --git a/src/k_battle.h b/src/k_battle.h index 42d92cf33..12ad78004 100644 --- a/src/k_battle.h +++ b/src/k_battle.h @@ -25,6 +25,7 @@ boolean K_IsPlayerWanted(player_t *player); void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount); void K_CheckBumpers(void); void K_CheckEmeralds(player_t *player); +UINT16 K_GetChaosEmeraldColor(UINT32 emeraldType); mobj_t *K_SpawnChaosEmerald(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 flip, UINT32 emeraldType); mobj_t *K_SpawnSphereBox(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 flip, UINT8 amount); void K_DropEmeraldsFromPlayer(player_t *player, UINT32 emeraldType); From a94e18c277f324f8e6b2199d58ffa3e93927069e Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 27 Dec 2022 22:32:57 -0800 Subject: [PATCH 3/7] Add K_UpdateMobjItemOverlay --- src/k_kart.c | 23 +++++++++++++++++++++++ src/k_kart.h | 2 ++ src/p_mobj.c | 20 +------------------- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index f1c0b8be2..97f3361df 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -11164,4 +11164,27 @@ void K_HandleDirectionalInfluence(player_t *player) player->mo->momy = FixedMul(speed, finalY); } +void K_UpdateMobjItemOverlay(mobj_t *part, SINT8 itemType, UINT8 itemCount) +{ + switch (itemType) + { + case KITEM_ORBINAUT: + part->sprite = SPR_ITMO; + part->frame = FF_FULLBRIGHT|FF_PAPERSPRITE|K_GetOrbinautItemFrame(itemCount); + break; + case KITEM_INVINCIBILITY: + part->sprite = SPR_ITMI; + part->frame = FF_FULLBRIGHT|FF_PAPERSPRITE|K_GetInvincibilityItemFrame(); + break; + case KITEM_SAD: + part->sprite = SPR_ITEM; + part->frame = FF_FULLBRIGHT|FF_PAPERSPRITE; + break; + default: + part->sprite = SPR_ITEM; + part->frame = FF_FULLBRIGHT|FF_PAPERSPRITE|(itemType); + break; + } +} + //} diff --git a/src/k_kart.h b/src/k_kart.h index f74f14e12..b297b2a57 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -197,6 +197,8 @@ fixed_t K_ItemScaleForPlayer(player_t *player); void K_SetItemOut(player_t *player); void K_UnsetItemOut(player_t *player); +void K_UpdateMobjItemOverlay(mobj_t *part, SINT8 itemType, UINT8 itemCount); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/p_mobj.c b/src/p_mobj.c index a1544b802..8bdd50fd4 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -4346,25 +4346,7 @@ static void P_RefreshItemCapsuleParts(mobj_t *mobj) part->threshold = mobj->threshold; part->movecount = mobj->movecount; - switch (itemType) - { - case KITEM_ORBINAUT: - part->sprite = SPR_ITMO; - part->frame = FF_FULLBRIGHT|FF_PAPERSPRITE|K_GetOrbinautItemFrame(mobj->movecount); - break; - case KITEM_INVINCIBILITY: - part->sprite = SPR_ITMI; - part->frame = FF_FULLBRIGHT|FF_PAPERSPRITE|K_GetInvincibilityItemFrame(); - break; - case KITEM_SAD: - part->sprite = SPR_ITEM; - part->frame = FF_FULLBRIGHT|FF_PAPERSPRITE; - break; - default: - part->sprite = SPR_ITEM; - part->frame = FF_FULLBRIGHT|FF_PAPERSPRITE|(itemType); - break; - } + K_UpdateMobjItemOverlay(part, itemType, mobj->movecount); // update number frame if (K_GetShieldFromItem(itemType) != KSHIELD_NONE) // shields don't stack, so don't show a number From 6eb8da1a567e579d5984f486047cf59faf5bd6d2 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 27 Dec 2022 22:36:26 -0800 Subject: [PATCH 4/7] Add K_GetTotallyRandomResult, for battle item spawners --- src/k_kart.c | 100 +++++++++++++++++++++++++-------------------------- src/k_kart.h | 1 + 2 files changed, 51 insertions(+), 50 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 97f3361df..bb33f7493 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6183,17 +6183,48 @@ void K_DropHnextList(player_t *player, boolean keepshields) } } +SINT8 K_GetTotallyRandomResult(UINT8 useodds) +{ + itemroulette_t rouletteData = {0}; + INT32 spawnchance[NUMKARTRESULTS]; + INT32 totalspawnchance = 0; + INT32 i; + + memset(spawnchance, 0, sizeof (spawnchance)); + + K_FillItemRouletteData(NULL, &rouletteData); + + for (i = 1; i < NUMKARTRESULTS; i++) + { + spawnchance[i] = ( + totalspawnchance += K_KartGetItemOdds(NULL, &rouletteData, useodds, i) + ); + } + + if (totalspawnchance > 0) + { + totalspawnchance = P_RandomKey(PR_ITEM_ROULETTE, totalspawnchance); + for (i = 0; i < NUMKARTRESULTS && spawnchance[i] <= totalspawnchance; i++); + } + else + { + i = KITEM_SAD; + } + + return i; +} + mobj_t *K_CreatePaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 flip, UINT8 type, UINT8 amount) { mobj_t *drop = P_SpawnMobj(x, y, z, MT_FLOATINGITEM); mobj_t *backdrop = P_SpawnMobjFromMobj(drop, 0, 0, 0, MT_OVERLAY); - + P_SetTarget(&backdrop->target, drop); P_SetMobjState(backdrop, S_ITEMBACKDROP); P_SetScale(drop, drop->scale>>4); drop->destscale = (3*drop->destscale)/2; - + drop->angle = angle; P_Thrust(drop, FixedAngle(P_RandomFixed(PR_ITEM_ROULETTE) * 180) + angle, @@ -6205,62 +6236,31 @@ mobj_t *K_CreatePaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 if (type == 0) { - itemroulette_t rouletteData = {0}; - UINT8 useodds = 0; - INT32 spawnchance[NUMKARTRESULTS]; - INT32 totalspawnchance = 0; - INT32 i; + const SINT8 i = K_GetTotallyRandomResult(amount); - memset(spawnchance, 0, sizeof (spawnchance)); + // TODO: this is bad! + // K_KartGetItemResult requires a player + // but item roulette will need rewritten to change this - useodds = amount; + const SINT8 newType = K_ItemResultToType(i); + const UINT8 newAmount = K_ItemResultToAmount(i); - K_FillItemRouletteData(NULL, &rouletteData); - - for (i = 1; i < NUMKARTRESULTS; i++) + if (newAmount > 1) { - spawnchance[i] = ( - totalspawnchance += K_KartGetItemOdds(NULL, &rouletteData, useodds, i) - ); - } + UINT8 j; - if (totalspawnchance > 0) - { - UINT8 newType; - UINT8 newAmount; - - totalspawnchance = P_RandomKey(PR_ITEM_ROULETTE, totalspawnchance); - for (i = 0; i < NUMKARTRESULTS && spawnchance[i] <= totalspawnchance; i++); - - // TODO: this is bad! - // K_KartGetItemResult requires a player - // but item roulette will need rewritten to change this - - newType = K_ItemResultToType(i); - newAmount = K_ItemResultToAmount(i); - - if (newAmount > 1) + for (j = 0; j < newAmount-1; j++) { - UINT8 j; - - for (j = 0; j < newAmount-1; j++) - { - K_CreatePaperItem( - x, y, z, - angle, flip, - newType, 1 - ); - } + K_CreatePaperItem( + x, y, z, + angle, flip, + newType, 1 + ); } + } - drop->threshold = newType; - drop->movecount = 1; - } - else - { - drop->threshold = 1; - drop->movecount = 1; - } + drop->threshold = newType; + drop->movecount = 1; } else { diff --git a/src/k_kart.h b/src/k_kart.h index b297b2a57..76043919b 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -138,6 +138,7 @@ INT32 K_GetKartDriftSparkValueForStage(player_t *player, UINT8 stage); void K_SpawnDriftBoostExplosion(player_t *player, int stage); void K_SpawnDriftElectricSparks(player_t *player, int color, boolean shockwave); void K_KartUpdatePosition(player_t *player); +SINT8 K_GetTotallyRandomResult(UINT8 useodds); mobj_t *K_CreatePaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 flip, UINT8 type, UINT8 amount); void K_DropItems(player_t *player); void K_DropRocketSneaker(player_t *player); From 3965f7776300bde638cf99b519e285f5f75e9836 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 27 Dec 2022 22:40:29 -0800 Subject: [PATCH 5/7] Add BATTLE_SPAWN_INTERVAL --- src/k_battle.c | 2 +- src/k_battle.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/k_battle.c b/src/k_battle.c index 7079bf3a4..6612b9548 100644 --- a/src/k_battle.c +++ b/src/k_battle.c @@ -350,7 +350,7 @@ UINT8 K_NumEmeralds(player_t *player) void K_RunPaperItemSpawners(void) { const boolean overtime = (battleovertime.enabled >= 10*TICRATE); - tic_t interval = 8*TICRATE; + tic_t interval = BATTLE_SPAWN_INTERVAL; const boolean canmakeemeralds = true; //(!(battlecapsules || bossinfo.boss)); diff --git a/src/k_battle.h b/src/k_battle.h index 12ad78004..d42d0ee09 100644 --- a/src/k_battle.h +++ b/src/k_battle.h @@ -8,6 +8,8 @@ extern "C" { #endif +#define BATTLE_SPAWN_INTERVAL (8*TICRATE) + extern struct battleovertime { UINT16 enabled; ///< Has this been initalized yet? From 71004d4b46d5596b91c372495d77da438be8c637 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 27 Dec 2022 22:55:46 -0800 Subject: [PATCH 6/7] Halve spawn time for Battle items --- src/k_battle.c | 17 ++++++++--------- src/k_battle.h | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/k_battle.c b/src/k_battle.c index 6612b9548..d0bc69c97 100644 --- a/src/k_battle.c +++ b/src/k_battle.c @@ -347,10 +347,15 @@ UINT8 K_NumEmeralds(player_t *player) return num; } +static inline boolean IsOnInterval(tic_t interval) +{ + return ((leveltime - starttime) % interval) == 0; +} + void K_RunPaperItemSpawners(void) { const boolean overtime = (battleovertime.enabled >= 10*TICRATE); - tic_t interval = BATTLE_SPAWN_INTERVAL; + const tic_t interval = BATTLE_SPAWN_INTERVAL; const boolean canmakeemeralds = true; //(!(battlecapsules || bossinfo.boss)); @@ -375,13 +380,7 @@ void K_RunPaperItemSpawners(void) return; } - if (overtime == true) - { - // Double frequency of items - interval /= 2; - } - - if (((leveltime - starttime) % interval) != 0) + if (!IsOnInterval(interval)) { return; } @@ -557,7 +556,7 @@ void K_RunPaperItemSpawners(void) } else { - if (gametyperules & GTR_SPHERES) + if ((gametyperules & GTR_SPHERES) && IsOnInterval(2 * interval)) { drop = K_SpawnSphereBox( spotList[r]->x, spotList[r]->y, spotList[r]->z + (128 * mapobjectscale * flip), diff --git a/src/k_battle.h b/src/k_battle.h index d42d0ee09..68f3c1432 100644 --- a/src/k_battle.h +++ b/src/k_battle.h @@ -8,7 +8,7 @@ extern "C" { #endif -#define BATTLE_SPAWN_INTERVAL (8*TICRATE) +#define BATTLE_SPAWN_INTERVAL (4*TICRATE) extern struct battleovertime { From 8a92f03f7b969bef684acbff25ff37a99274c50e Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 27 Dec 2022 22:57:01 -0800 Subject: [PATCH 7/7] Set fuse for Battle items --- src/k_battle.h | 1 + src/k_kart.c | 5 +++++ src/p_mobj.c | 1 + 3 files changed, 7 insertions(+) diff --git a/src/k_battle.h b/src/k_battle.h index 68f3c1432..f64cfa967 100644 --- a/src/k_battle.h +++ b/src/k_battle.h @@ -9,6 +9,7 @@ extern "C" { #endif #define BATTLE_SPAWN_INTERVAL (4*TICRATE) +#define BATTLE_DESPAWN_TIME (15*TICRATE) extern struct battleovertime { diff --git a/src/k_kart.c b/src/k_kart.c index bb33f7493..660878d4c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6273,6 +6273,11 @@ mobj_t *K_CreatePaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 P_SetTarget(&backdrop->tracer, drop); backdrop->flags2 |= MF2_LINKDRAW; + if (gametyperules & GTR_BUMPERS) + { + drop->fuse = BATTLE_DESPAWN_TIME; + } + return drop; } diff --git a/src/p_mobj.c b/src/p_mobj.c index 8bdd50fd4..f965d32c8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9522,6 +9522,7 @@ static boolean P_CanFlickerFuse(mobj_t *mobj) case MT_RANDOMITEM: case MT_EGGMANITEM: case MT_FALLINGROCK: + case MT_FLOATINGITEM: if (mobj->fuse <= TICRATE) { return true;