mirror of
https://github.com/ZDoom/Raze.git
synced 2025-02-20 18:42:26 +00:00
- useObjResizer
This commit is contained in:
parent
63ae861765
commit
cd98e940aa
2 changed files with 55 additions and 42 deletions
|
@ -77,13 +77,12 @@ void CKillMgr::AddKill(spritetype* pSprite)
|
|||
void CKillMgr::CountTotalKills(void)
|
||||
{
|
||||
TotalKills = 0;
|
||||
int nSprite;
|
||||
StatIterator it(kStatDude);
|
||||
while ((nSprite = it.NextIndex()) >= 0)
|
||||
BloodStatIterator it(kStatDude);
|
||||
while (auto actor = it.Next())
|
||||
{
|
||||
spritetype* pSprite = &sprite[nSprite];
|
||||
spritetype* pSprite = &actor->s();
|
||||
if (pSprite->type < kDudeBase || pSprite->type >= kDudeMax)
|
||||
I_Error("Non-enemy sprite (%d) in the enemy sprite list.", nSprite);
|
||||
I_Error("Non-enemy sprite (%d) in the enemy sprite list.", actor->GetIndex());
|
||||
if (pSprite->statnum == kStatDude && pSprite->type != kDudeBat && pSprite->type != kDudeRat && pSprite->type != kDudeInnocent && pSprite->type != kDudeBurningInnocent)
|
||||
TotalKills++;
|
||||
}
|
||||
|
|
|
@ -2526,85 +2526,98 @@ void trPlayerCtrlUsePowerup(DBloodActor* sourceactor, PLAYER* pPlayer, int evCmd
|
|||
|
||||
}
|
||||
|
||||
void useObjResizer(XSPRITE* pXSource, short objType, int objIndex) {
|
||||
switch (objType) {
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void useObjResizer(DBloodActor* sourceactor, int targType, int targIndex, DBloodActor* targetactor)
|
||||
{
|
||||
auto pXSource = &sourceactor->x();
|
||||
switch (targType)
|
||||
{
|
||||
// for sectors
|
||||
case 6:
|
||||
case OBJ_SECTOR:
|
||||
if (valueIsBetween(pXSource->data1, -1, 32767))
|
||||
sector[objIndex].floorxpan_ = (float)ClipRange(pXSource->data1, 0, 255);
|
||||
sector[targIndex].floorxpan_ = (float)ClipRange(pXSource->data1, 0, 255);
|
||||
|
||||
if (valueIsBetween(pXSource->data2, -1, 32767))
|
||||
sector[objIndex].floorypan_ = (float)ClipRange(pXSource->data2, 0, 255);
|
||||
sector[targIndex].floorypan_ = (float)ClipRange(pXSource->data2, 0, 255);
|
||||
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767))
|
||||
sector[objIndex].ceilingxpan_ = (float)ClipRange(pXSource->data3, 0, 255);
|
||||
sector[targIndex].ceilingxpan_ = (float)ClipRange(pXSource->data3, 0, 255);
|
||||
|
||||
if (valueIsBetween(pXSource->data4, -1, 65535))
|
||||
sector[objIndex].ceilingypan_ = (float)ClipRange(pXSource->data4, 0, 255);
|
||||
sector[targIndex].ceilingypan_ = (float)ClipRange(pXSource->data4, 0, 255);
|
||||
break;
|
||||
// for sprites
|
||||
case OBJ_SPRITE: {
|
||||
|
||||
case OBJ_SPRITE:
|
||||
{
|
||||
bool fit = false;
|
||||
auto pTarget = &targetactor->s();
|
||||
// resize by seq scaling
|
||||
if (sprite[pXSource->reference].flags & kModernTypeFlag1) {
|
||||
|
||||
if (valueIsBetween(pXSource->data1, -255, 32767)) {
|
||||
if (sourceactor->s().flags & kModernTypeFlag1)
|
||||
{
|
||||
if (valueIsBetween(pXSource->data1, -255, 32767))
|
||||
{
|
||||
int mulDiv = (valueIsBetween(pXSource->data2, 0, 257)) ? pXSource->data2 : 256;
|
||||
if (pXSource->data1 > 0) xsprite[sprite[objIndex].extra].scale = mulDiv * ClipHigh(pXSource->data1, 25);
|
||||
else if (pXSource->data1 < 0) xsprite[sprite[objIndex].extra].scale = mulDiv / ClipHigh(abs(pXSource->data1), 25);
|
||||
else xsprite[sprite[objIndex].extra].scale = 0;
|
||||
if (pXSource->data1 > 0) targetactor->x().scale = mulDiv * ClipHigh(pXSource->data1, 25);
|
||||
else if (pXSource->data1 < 0) targetactor->x().scale = mulDiv / ClipHigh(abs(pXSource->data1), 25);
|
||||
else targetactor->x().scale = 0;
|
||||
fit = true;
|
||||
}
|
||||
|
||||
// resize by repeats
|
||||
} else {
|
||||
|
||||
if (valueIsBetween(pXSource->data1, -1, 32767)) {
|
||||
sprite[objIndex].xrepeat = ClipRange(pXSource->data1, 0, 255);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (valueIsBetween(pXSource->data1, -1, 32767))
|
||||
{
|
||||
pTarget->xrepeat = ClipRange(pXSource->data1, 0, 255);
|
||||
fit = true;
|
||||
}
|
||||
|
||||
if (valueIsBetween(pXSource->data2, -1, 32767)) {
|
||||
sprite[objIndex].yrepeat = ClipRange(pXSource->data2, 0, 255);
|
||||
if (valueIsBetween(pXSource->data2, -1, 32767))
|
||||
{
|
||||
pTarget->yrepeat = ClipRange(pXSource->data2, 0, 255);
|
||||
fit = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (fit && (sprite[objIndex].type == kDudeModernCustom || sprite[objIndex].type == kDudeModernCustomBurning)) {
|
||||
|
||||
if (fit && (pTarget->type == kDudeModernCustom || pTarget->type == kDudeModernCustomBurning))
|
||||
{
|
||||
// request properties update for custom dude
|
||||
gGenDudeExtra[objIndex].updReq[kGenDudePropertySpriteSize] = true;
|
||||
gGenDudeExtra[objIndex].updReq[kGenDudePropertyAttack] = true;
|
||||
gGenDudeExtra[objIndex].updReq[kGenDudePropertyMass] = true;
|
||||
gGenDudeExtra[objIndex].updReq[kGenDudePropertyDmgScale] = true;
|
||||
evPostActor(&bloodActors[objIndex], kGenDudeUpdTimeRate, kCallbackGenDudeUpdate);
|
||||
|
||||
targetactor->genDudeExtra().updReq[kGenDudePropertySpriteSize] = true;
|
||||
targetactor->genDudeExtra().updReq[kGenDudePropertyAttack] = true;
|
||||
targetactor->genDudeExtra().updReq[kGenDudePropertyMass] = true;
|
||||
targetactor->genDudeExtra().updReq[kGenDudePropertyDmgScale] = true;
|
||||
evPostActor(targetactor, kGenDudeUpdTimeRate, kCallbackGenDudeUpdate);
|
||||
|
||||
}
|
||||
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767))
|
||||
sprite[objIndex].xoffset = ClipRange(pXSource->data3, 0, 255);
|
||||
pTarget->xoffset = ClipRange(pXSource->data3, 0, 255);
|
||||
|
||||
if (valueIsBetween(pXSource->data4, -1, 65535))
|
||||
sprite[objIndex].yoffset = ClipRange(pXSource->data4, 0, 255);
|
||||
pTarget->yoffset = ClipRange(pXSource->data4, 0, 255);
|
||||
break;
|
||||
}
|
||||
case OBJ_WALL:
|
||||
if (valueIsBetween(pXSource->data1, -1, 32767))
|
||||
wall[objIndex].xrepeat = ClipRange(pXSource->data1, 0, 255);
|
||||
wall[targIndex].xrepeat = ClipRange(pXSource->data1, 0, 255);
|
||||
|
||||
if (valueIsBetween(pXSource->data2, -1, 32767))
|
||||
wall[objIndex].yrepeat = ClipRange(pXSource->data2, 0, 255);
|
||||
wall[targIndex].yrepeat = ClipRange(pXSource->data2, 0, 255);
|
||||
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767))
|
||||
wall[objIndex].xpan_ = (float)ClipRange(pXSource->data3, 0, 255);
|
||||
wall[targIndex].xpan_ = (float)ClipRange(pXSource->data3, 0, 255);
|
||||
|
||||
if (valueIsBetween(pXSource->data4, -1, 65535))
|
||||
wall[objIndex].ypan_ = (float)ClipRange(pXSource->data4, 0, 255);
|
||||
wall[targIndex].ypan_ = (float)ClipRange(pXSource->data4, 0, 255);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
@ -4617,6 +4630,7 @@ void modernTypeSendCommand(int nSprite, int destChannel, COMMAND_ID command) {
|
|||
void modernTypeTrigger(int destObjType, int destObjIndex, EVENT event) {
|
||||
|
||||
if (event.type != OBJ_SPRITE || !event.actor || !event.actor->hasX()) return;
|
||||
auto destactor = destObjType == OBJ_SPRITE? &bloodActors[destObjIndex] : nullptr;
|
||||
spritetype* pSource = &event.actor->s();
|
||||
XSPRITE* pXSource = &event.actor->x();
|
||||
|
||||
|
@ -4700,7 +4714,7 @@ void modernTypeTrigger(int destObjType, int destObjIndex, EVENT event) {
|
|||
break;
|
||||
// size and pan changer of sprite/wall/sector via TX ID
|
||||
case kModernObjSizeChanger:
|
||||
useObjResizer(pXSource, destObjType, destObjIndex);
|
||||
useObjResizer(event.actor, destObjType, destObjIndex, destactor);
|
||||
break;
|
||||
// iterate data filed value of destination object
|
||||
case kModernObjDataAccumulator:
|
||||
|
|
Loading…
Reference in a new issue