diff --git a/src/p_enemy.c b/src/p_enemy.c index c7acf06dc..d40e449bc 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -14660,6 +14660,8 @@ void P_RefreshItemCapsuleParts(mobj_t *mobj) INT32 itemType = mobj->threshold; mobj_t *part = mobj->tracer; skincolornum_t color; + UINT32 newRenderFlags = 0; + boolean colorized; part->threshold = mobj->threshold; part->movecount = mobj->movecount; @@ -14667,6 +14669,40 @@ void P_RefreshItemCapsuleParts(mobj_t *mobj) if (itemType < 1 || itemType >= NUMKARTITEMS) itemType = KITEM_SAD; + // update invincibility properties + if (itemType == KITEM_INVINCIBILITY) + { + mobj->renderflags |= RF_FULLBRIGHT; + mobj->colorized = true; + } + else + { + mobj->renderflags &= ~RF_FULLBRIGHT; + mobj->color = SKINCOLOR_NONE; + mobj->colorized = false; + } + + // update inside item frame + 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; + } + // update number frame if (K_GetShieldFromItem(itemType) != KSHIELD_NONE) // shields don't stack, so don't show a number ; @@ -14714,18 +14750,25 @@ void P_RefreshItemCapsuleParts(mobj_t *mobj) P_SetTarget(&part->tracer, NULL); } - // update color - color = (itemType == KITEM_SUPERRING ? SKINCOLOR_GOLD : SKINCOLOR_NONE); + // update cap colors + if (itemType == KITEM_SUPERRING) + { + color = SKINCOLOR_GOLD; + newRenderFlags |= RF_SEMIBRIGHT; + } + else if (mobj->spawnpoint && (mobj->spawnpoint->options & MTF_EXTRA)) + color = SKINCOLOR_SAPPHIRE; + else + color = SKINCOLOR_NONE; + + colorized = (color != SKINCOLOR_NONE); part = mobj; while (!P_MobjWasRemoved(part->hnext)) { part = part->hnext; part->color = color; - part->colorized = (color != SKINCOLOR_NONE); - if (part->colorized) - part->renderflags |= RF_SEMIBRIGHT; - else - part->renderflags &= ~RF_SEMIBRIGHT; + part->colorized = colorized; + part->renderflags = (part->renderflags & ~RF_SEMIBRIGHT) | newRenderFlags; } } diff --git a/src/p_inter.c b/src/p_inter.c index 2f98dd178..f65562882 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -284,7 +284,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if ((gametyperules & GTR_BUMPERS) && player->bumpers <= 0) return; - if (special->scale != special->destscale) // don't break it while it's respawning + if (special->scale < special->destscale) // don't break it while it's respawning return; S_StartSound(toucher, special->info->deathsound); diff --git a/src/p_mobj.c b/src/p_mobj.c index cf262a78b..a21ed0f7b 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6141,35 +6141,17 @@ static boolean P_MobjRegularThink(mobj_t *mobj) case MT_ITEMCAPSULE: if (!P_MobjWasRemoved(mobj->tracer)) { - INT32 itemType = mobj->threshold; mobj_t *part = mobj->tracer; if (mobj->threshold != part->threshold || mobj->movecount != part->movecount) // allow scripters to easily change the capsule properties! P_RefreshItemCapsuleParts(mobj); - if (itemType < 1 || itemType >= NUMKARTITEMS) - itemType = KITEM_SAD; - - // update inside item frame - switch (itemType) + // animate invincibility capsules + if (mobj->threshold == KITEM_INVINCIBILITY) { - 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; + mobj->color = K_RainbowColor(leveltime); + part->frame = FF_FULLBRIGHT|FF_PAPERSPRITE|K_GetInvincibilityItemFrame(); } } break; @@ -11723,7 +11705,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean // Ambush = double size (grounded) / half size (aerial) if (!(mthing->options & MTF_AMBUSH) == !P_IsObjectOnGround(mobj)) - mobj->destscale = min(mobj->scale << 1, FixedDiv(64*FRACUNIT, mobj->info->radius)); // don't make them larger than the blockmap can handle + mobj->destscale = min(mobj->destscale << 1, FixedDiv(64*FRACUNIT, mobj->info->radius)); // don't make them larger than the blockmap can handle P_RefreshItemCapsuleParts(mobj); break;