- Color Record Attack-persistent capsules sapphire

- Make invincibility capsules glow rainbow
- Fix aerial capsules not scaling to full size
This commit is contained in:
lachablock 2021-06-15 13:41:53 +10:00
parent da37ba8238
commit e981de3c33
3 changed files with 56 additions and 31 deletions

View file

@ -14660,6 +14660,8 @@ void P_RefreshItemCapsuleParts(mobj_t *mobj)
INT32 itemType = mobj->threshold; INT32 itemType = mobj->threshold;
mobj_t *part = mobj->tracer; mobj_t *part = mobj->tracer;
skincolornum_t color; skincolornum_t color;
UINT32 newRenderFlags = 0;
boolean colorized;
part->threshold = mobj->threshold; part->threshold = mobj->threshold;
part->movecount = mobj->movecount; part->movecount = mobj->movecount;
@ -14667,6 +14669,40 @@ void P_RefreshItemCapsuleParts(mobj_t *mobj)
if (itemType < 1 || itemType >= NUMKARTITEMS) if (itemType < 1 || itemType >= NUMKARTITEMS)
itemType = KITEM_SAD; 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 // update number frame
if (K_GetShieldFromItem(itemType) != KSHIELD_NONE) // shields don't stack, so don't show a number 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); P_SetTarget(&part->tracer, NULL);
} }
// update color // update cap colors
color = (itemType == KITEM_SUPERRING ? SKINCOLOR_GOLD : SKINCOLOR_NONE); 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; part = mobj;
while (!P_MobjWasRemoved(part->hnext)) while (!P_MobjWasRemoved(part->hnext))
{ {
part = part->hnext; part = part->hnext;
part->color = color; part->color = color;
part->colorized = (color != SKINCOLOR_NONE); part->colorized = colorized;
if (part->colorized) part->renderflags = (part->renderflags & ~RF_SEMIBRIGHT) | newRenderFlags;
part->renderflags |= RF_SEMIBRIGHT;
else
part->renderflags &= ~RF_SEMIBRIGHT;
} }
} }

View file

@ -284,7 +284,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
if ((gametyperules & GTR_BUMPERS) && player->bumpers <= 0) if ((gametyperules & GTR_BUMPERS) && player->bumpers <= 0)
return; 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; return;
S_StartSound(toucher, special->info->deathsound); S_StartSound(toucher, special->info->deathsound);

View file

@ -6141,35 +6141,17 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
case MT_ITEMCAPSULE: case MT_ITEMCAPSULE:
if (!P_MobjWasRemoved(mobj->tracer)) if (!P_MobjWasRemoved(mobj->tracer))
{ {
INT32 itemType = mobj->threshold;
mobj_t *part = mobj->tracer; mobj_t *part = mobj->tracer;
if (mobj->threshold != part->threshold if (mobj->threshold != part->threshold
|| mobj->movecount != part->movecount) // allow scripters to easily change the capsule properties! || mobj->movecount != part->movecount) // allow scripters to easily change the capsule properties!
P_RefreshItemCapsuleParts(mobj); P_RefreshItemCapsuleParts(mobj);
if (itemType < 1 || itemType >= NUMKARTITEMS) // animate invincibility capsules
itemType = KITEM_SAD; if (mobj->threshold == KITEM_INVINCIBILITY)
// update inside item frame
switch (itemType)
{ {
case KITEM_ORBINAUT: mobj->color = K_RainbowColor(leveltime);
part->sprite = SPR_ITMO; part->frame = FF_FULLBRIGHT|FF_PAPERSPRITE|K_GetInvincibilityItemFrame();
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;
} }
} }
break; break;
@ -11723,7 +11705,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
// Ambush = double size (grounded) / half size (aerial) // Ambush = double size (grounded) / half size (aerial)
if (!(mthing->options & MTF_AMBUSH) == !P_IsObjectOnGround(mobj)) 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); P_RefreshItemCapsuleParts(mobj);
break; break;