mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-24 10:40:46 +00:00
- Added names for statnums
- Added names for system RX/TX channels - Detect if map requires new features to work properly via special TX and command - Effect Gen update # Conflicts: # source/blood/src/actor.cpp # source/blood/src/eventq.h # source/blood/src/triggers.cpp # source/blood/src/triggers.h
This commit is contained in:
parent
ef0fd57367
commit
f5f012ccb9
29 changed files with 585 additions and 515 deletions
|
@ -2543,7 +2543,7 @@ short gPhysSpritesCount; // current count
|
|||
void actInit(bool bSaveLoad) {
|
||||
|
||||
// by NoOne: init code for all my stuff
|
||||
if (!VanillaMode()) {
|
||||
if (gModernMap) {
|
||||
|
||||
// reset counters
|
||||
gProxySpritesCount = gSightSpritesCount = gPhysSpritesCount = 0;
|
||||
|
@ -2561,12 +2561,12 @@ void actInit(bool bSaveLoad) {
|
|||
switch (pSprite->type) {
|
||||
// add statnum for faster dude searching
|
||||
case kGDXDudeTargetChanger:
|
||||
changespritestat(i, kStatGDXDudeTargetChanger);
|
||||
changespritestat(i, kStatModernDudeTargetChanger);
|
||||
break;
|
||||
// remove kStatItem status from random item generators
|
||||
case 40: // Random weapon
|
||||
case 80: // Random ammo
|
||||
changespritestat(i, 0);
|
||||
changespritestat(i, kStatDecoration);
|
||||
break;
|
||||
case kCustomDude:
|
||||
case kCustomDudeBurning:
|
||||
|
@ -2585,7 +2585,7 @@ void actInit(bool bSaveLoad) {
|
|||
|
||||
if (pXSprite->data3 != pXSprite->sysData1) {
|
||||
switch (pSprite->statnum) {
|
||||
case 6:
|
||||
case kStatDude:
|
||||
switch (pSprite->type) {
|
||||
case kCustomDude:
|
||||
case kCustomDudeBurning:
|
||||
|
@ -2601,21 +2601,21 @@ void actInit(bool bSaveLoad) {
|
|||
if (pXSprite->Proximity && gProxySpritesCount < kMaxSuperXSprites) {
|
||||
switch (pSprite->statnum) {
|
||||
// exceptions
|
||||
case 4: // things already treated in their functions
|
||||
case 6: // enemies already treated in their functions
|
||||
case kStatThing: // things already treated in their functions
|
||||
case kStatDude: // enemies already treated in their functions
|
||||
// senseless to have sight and proximity together
|
||||
if (pXSprite->Sight && pXSprite->DudeLockout) pXSprite->Proximity = false;
|
||||
break;
|
||||
case 1: // effects
|
||||
case 2: // explosions
|
||||
case 3: // items
|
||||
case 9: // purgeable sprites
|
||||
case 13: // ???
|
||||
case 14: // burning flares stuck
|
||||
case 7: // inactive enemies
|
||||
case kStatFX: // effects
|
||||
case kStatExplosion: // explosions
|
||||
case kStatItem: // items
|
||||
case kStatPurge: // purgeable sprites
|
||||
case kStatSpares: // ???
|
||||
case kStatFlare: // burning flares stuck
|
||||
case kStatInactive: // inactive enemies
|
||||
case kStatFree: // removed sprites
|
||||
case kStatMarker: // markers
|
||||
case 16: // path markers
|
||||
case kStatPathMarker: // path markers
|
||||
break;
|
||||
default:
|
||||
// senseless to have sight and proximity together
|
||||
|
@ -2633,16 +2633,16 @@ void actInit(bool bSaveLoad) {
|
|||
if (pXSprite->Sight && gSightSpritesCount < kMaxSuperXSprites) {
|
||||
switch (pSprite->statnum) {
|
||||
// exceptions
|
||||
case 1: // effects
|
||||
case 2: // explosions
|
||||
case 3: // items
|
||||
case 9: // purgeable sprites
|
||||
case 13: // ???
|
||||
case 14: // burning flares stuck
|
||||
case 7: // inactive enemies
|
||||
case kStatFX: // effects
|
||||
case kStatExplosion: // explosions
|
||||
case kStatItem: // items
|
||||
case kStatPurge: // purgeable sprites
|
||||
case kStatSpares: // ???
|
||||
case kStatFlare: // burning flares stuck
|
||||
case kStatInactive: // inactive enemies
|
||||
case kStatFree: // removed sprites
|
||||
case kStatMarker: // markers
|
||||
case 16: // path markers
|
||||
case kStatPathMarker: // path markers
|
||||
break;
|
||||
default:
|
||||
gSightSpritesList[gSightSpritesCount++] = pSprite->xvel;
|
||||
|
@ -2654,14 +2654,14 @@ void actInit(bool bSaveLoad) {
|
|||
}
|
||||
}
|
||||
|
||||
for (int nSprite = headspritestat[3]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (int nSprite = headspritestat[kStatItem]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->type == 44) // Voodoo doll (ammo)
|
||||
pSprite->type = 70; // Voodoo doll (weapon)
|
||||
|
||||
}
|
||||
for (int nSprite = headspritestat[11]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (int nSprite = headspritestat[kStatTraps]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
int nXSprite = pSprite->extra;
|
||||
|
@ -2676,7 +2676,7 @@ void actInit(bool bSaveLoad) {
|
|||
pSprite->cstat |= 32768;
|
||||
}
|
||||
}
|
||||
for (int nSprite = headspritestat[4]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (int nSprite = headspritestat[kStatThing]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
int nXSprite = pSprite->extra;
|
||||
|
@ -2717,16 +2717,16 @@ void actInit(bool bSaveLoad) {
|
|||
if (gGameOptions.nMonsterSettings == 0)
|
||||
{
|
||||
gKillMgr.SetCount(0);
|
||||
while (headspritestat[6] >= 0)
|
||||
while (headspritestat[kStatDude] >= 0)
|
||||
{
|
||||
spritetype *pSprite = &sprite[headspritestat[6]];
|
||||
spritetype *pSprite = &sprite[headspritestat[kStatDude]];
|
||||
int nXSprite = pSprite->extra;
|
||||
dassert(nXSprite > 0 && nXSprite < kMaxXSprites);
|
||||
XSPRITE *pXSprite = &xsprite[nXSprite];
|
||||
// Drop Key
|
||||
if (pXSprite->key > 0)
|
||||
actDropObject(pSprite, 99 + pXSprite->key);
|
||||
DeleteSprite(headspritestat[6]);
|
||||
DeleteSprite(headspritestat[kStatDude]);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -2735,7 +2735,7 @@ void actInit(bool bSaveLoad) {
|
|||
///////////////
|
||||
char unk[kDudeMax-kDudeBase];
|
||||
memset(unk, 0, sizeof(unk));
|
||||
for (int nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (int nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->type < kDudeBase || pSprite->type >= kDudeMax)
|
||||
|
@ -2750,7 +2750,7 @@ void actInit(bool bSaveLoad) {
|
|||
for (int j = 0; j < 7; j++)
|
||||
dudeInfo[i].at70[j] = mulscale8(DudeDifficulty[gGameOptions.nDifficulty], dudeInfo[i].startDamage[j]);
|
||||
|
||||
for (int nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
for (int nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
int nXSprite = pSprite->extra;
|
||||
dassert(nXSprite > 0 && nXSprite < kMaxXSprites);
|
||||
|
@ -2879,7 +2879,7 @@ void sub_2A620(int nSprite, int x, int y, int z, int nSector, int nDist, int a7,
|
|||
nDist <<= 4;
|
||||
if (a10 & 2)
|
||||
{
|
||||
for (int i = headspritestat[6]; i >= 0; i = nextspritestat[i])
|
||||
for (int i = headspritestat[kStatDude]; i >= 0; i = nextspritestat[i])
|
||||
{
|
||||
if (i != nSprite || (a10 & 1))
|
||||
{
|
||||
|
@ -2912,7 +2912,7 @@ void sub_2A620(int nSprite, int x, int y, int z, int nSector, int nDist, int a7,
|
|||
}
|
||||
if (a10 & 4)
|
||||
{
|
||||
for (int i = headspritestat[4]; i >= 0; i = nextspritestat[i])
|
||||
for (int i = headspritestat[kStatThing]; i >= 0; i = nextspritestat[i])
|
||||
{
|
||||
spritetype *pSprite2 = &sprite[i];
|
||||
if (pSprite2->flags&0x20)
|
||||
|
@ -2944,7 +2944,7 @@ void sub_2A620(int nSprite, int x, int y, int z, int nSector, int nDist, int a7,
|
|||
void sub_2AA94(spritetype *pSprite, XSPRITE *pXSprite)
|
||||
{
|
||||
int nSprite = actOwnerIdToSpriteId(pSprite->owner);
|
||||
actPostSprite(pSprite->index, 0);
|
||||
actPostSprite(pSprite->index, kStatDecoration);
|
||||
seqSpawn(9, 3, pSprite->extra);
|
||||
if (Chance(0x8000))
|
||||
pSprite->cstat |= 4;
|
||||
|
@ -3250,7 +3250,7 @@ void actKillDude(int nKillerSprite, spritetype *pSprite, DAMAGE_TYPE damageType,
|
|||
else
|
||||
{
|
||||
if (gGameOptions.nGameType == 1 && IsPlayerSprite(pKillerSprite)
|
||||
&& pSprite->statnum == 6 && pSprite->type != 219 && pSprite->type != 220 && pSprite->type != 245 && pSprite->type != 239)
|
||||
&& pSprite->statnum == kStatDude && pSprite->type != 219 && pSprite->type != 220 && pSprite->type != 245 && pSprite->type != 239)
|
||||
{
|
||||
PLAYER *pKillerPlayer = &gPlayer[pKillerSprite->type-kDudePlayer1];
|
||||
pKillerPlayer->at2c6++;
|
||||
|
@ -3344,7 +3344,7 @@ void actKillDude(int nKillerSprite, spritetype *pSprite, DAMAGE_TYPE damageType,
|
|||
{
|
||||
seqKill(3, nXSprite);
|
||||
gKillMgr.AddKill(pSprite);
|
||||
actPostSprite(pSprite->index, 1024);
|
||||
actPostSprite(pSprite->index, kStatFree);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3695,7 +3695,7 @@ void actKillDude(int nKillerSprite, spritetype *pSprite, DAMAGE_TYPE damageType,
|
|||
gKillMgr.AddKill(pSprite);
|
||||
actCheckRespawn(pSprite);
|
||||
pSprite->type = 426;
|
||||
actPostSprite(pSprite->index, 4);
|
||||
actPostSprite(pSprite->index, kStatThing);
|
||||
}
|
||||
|
||||
int actDamageSprite(int nSource, spritetype *pSprite, DAMAGE_TYPE damageType, int damage)
|
||||
|
@ -3709,7 +3709,7 @@ int actDamageSprite(int nSource, spritetype *pSprite, DAMAGE_TYPE damageType, in
|
|||
dassert(nXSprite > 0 && nXSprite < kMaxXSprites);
|
||||
XSPRITE *pXSprite = &xsprite[nXSprite];
|
||||
dassert(pXSprite->reference == pSprite->index);
|
||||
if ((pXSprite->health == 0 && pSprite->statnum != 6) || pXSprite->locked)
|
||||
if ((pXSprite->health == 0 && pSprite->statnum != kStatDude) || pXSprite->locked)
|
||||
return 0;
|
||||
if (nSource == -1)
|
||||
nSource = pSprite->index;
|
||||
|
@ -3720,7 +3720,7 @@ int actDamageSprite(int nSource, spritetype *pSprite, DAMAGE_TYPE damageType, in
|
|||
return 0;
|
||||
switch (pSprite->statnum)
|
||||
{
|
||||
case 6:
|
||||
case kStatDude:
|
||||
{
|
||||
if (pSprite->type < kDudeBase || pSprite->type >= kDudeMax)
|
||||
{
|
||||
|
@ -3754,7 +3754,7 @@ int actDamageSprite(int nSource, spritetype *pSprite, DAMAGE_TYPE damageType, in
|
|||
}
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
case kStatThing:
|
||||
dassert(pSprite->type >= kThingBase && pSprite->type < kThingMax);
|
||||
int nType = pSprite->type-kThingBase;
|
||||
int nDamageFactor = thingInfo[nType].at17[damageType];
|
||||
|
@ -3815,7 +3815,7 @@ int actDamageSprite(int nSource, spritetype *pSprite, DAMAGE_TYPE damageType, in
|
|||
case -1:
|
||||
GibSprite(pSprite, GIBTYPE_14, NULL, NULL);
|
||||
sfxPlay3DSound(pSprite->x, pSprite->y, pSprite->z, 312, pSprite->sectnum);
|
||||
actPostSprite(pSprite->index, 1024);
|
||||
actPostSprite(pSprite->index, kStatFree);
|
||||
break;
|
||||
case 0:
|
||||
seqSpawn(25, 3, pSprite->extra, nTreeToGibClient);
|
||||
|
@ -3917,12 +3917,12 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
DUDEINFO *pDudeInfo = NULL;
|
||||
if (a2 == 3 && pSpriteHit)
|
||||
{
|
||||
if (pSpriteHit->statnum == 4)
|
||||
if (pSpriteHit->statnum == kStatThing)
|
||||
{
|
||||
dassert(pXSpriteHit != NULL);
|
||||
pThingInfo = &thingInfo[pSpriteHit->type-kThingBase];
|
||||
}
|
||||
else if (pSpriteHit->statnum == 6)
|
||||
else if (pSpriteHit->statnum == kStatDude)
|
||||
{
|
||||
dassert(pXSpriteHit != NULL);
|
||||
pDudeInfo = &dudeInfo[pSpriteHit->type-kDudeBase];
|
||||
|
@ -3951,7 +3951,7 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
}
|
||||
if (pMissile->extra > 0)
|
||||
{
|
||||
actPostSprite(pMissile->index, 0);
|
||||
actPostSprite(pMissile->index, kStatDecoration);
|
||||
if (pMissile->ang == 1024)
|
||||
sfxPlay3DSound(pMissile, 307, -1, 0);
|
||||
pMissile->type = 0;
|
||||
|
@ -3959,7 +3959,7 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
}
|
||||
else
|
||||
{
|
||||
actPostSprite(pMissile->index, 1024);
|
||||
actPostSprite(pMissile->index, kStatFree);
|
||||
}
|
||||
break;
|
||||
case 302:
|
||||
|
@ -3971,7 +3971,7 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
pFX->ang = (GetWallAngle(nWallHit)+512)&2047;
|
||||
}
|
||||
GibSprite(pMissile, GIBTYPE_24, NULL, NULL);
|
||||
actPostSprite(pMissile->index, 1024);
|
||||
actPostSprite(pMissile->index, kStatFree);
|
||||
break;
|
||||
case 309:
|
||||
seqKill(3, nXMissile);
|
||||
|
@ -3981,7 +3981,7 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
int nDamage = (15+Random(7))<<4;
|
||||
actDamageSprite(nOwner, pSpriteHit, DAMAGE_TYPE_2, nDamage);
|
||||
}
|
||||
actPostSprite(pMissile->index, 1024);
|
||||
actPostSprite(pMissile->index, kStatFree);
|
||||
break;
|
||||
case 311:
|
||||
sfxKill3DSound(pMissile, -1, -1);
|
||||
|
@ -3993,7 +3993,7 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
int nDamage = (25+Random(20))<<4;
|
||||
actDamageSprite(nOwner, pSpriteHit, DAMAGE_TYPE_5, nDamage);
|
||||
}
|
||||
actPostSprite(pMissile->index, 1024);
|
||||
actPostSprite(pMissile->index, kStatFree);
|
||||
break;
|
||||
case 316:
|
||||
case 317:
|
||||
|
@ -4011,7 +4011,7 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
int nDamage = (nDmgMul+Random(nDmgMul))<<4;
|
||||
actDamageSprite(nOwner, pSpriteHit, DAMAGE_TYPE_5, nDamage);
|
||||
}
|
||||
actPostSprite(pMissile->index, 1024);
|
||||
actPostSprite(pMissile->index, kStatFree);
|
||||
break;
|
||||
case 305:
|
||||
case 312:
|
||||
|
@ -4061,14 +4061,14 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
pXMissile->targetZ = pMissile->z-pSpriteHit->z;
|
||||
pXMissile->goalAng = getangle(pMissile->x-pSpriteHit->x, pMissile->y-pSpriteHit->y)-pSpriteHit->ang;
|
||||
pXMissile->state = 1;
|
||||
actPostSprite(pMissile->index, 14);
|
||||
actPostSprite(pMissile->index, kStatFlare);
|
||||
pMissile->cstat &= ~257;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
GibSprite(pMissile, GIBTYPE_17, NULL, NULL);
|
||||
actPostSprite(pMissile->index, 1024);
|
||||
actPostSprite(pMissile->index, kStatFree);
|
||||
break;
|
||||
case 304:
|
||||
case 308:
|
||||
|
@ -4080,7 +4080,7 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
if (pObject->extra > 0)
|
||||
{
|
||||
XSPRITE *pXObject = &xsprite[pObject->extra];
|
||||
if ((pObject->statnum == 4 || pObject->statnum == 6) && pXObject->burnTime == 0)
|
||||
if ((pObject->statnum == kStatThing || pObject->statnum == kStatDude) && pXObject->burnTime == 0)
|
||||
evPost(nObject, 3, 0, CALLBACK_ID_0);
|
||||
int nOwner = actSpriteOwnerToSpriteId(pMissile);
|
||||
actBurnSprite(pMissile->owner, pXObject, (4+gGameOptions.nDifficulty)<<2);
|
||||
|
@ -4098,7 +4098,7 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
if (pObject->extra > 0)
|
||||
{
|
||||
XSPRITE *pXObject = &xsprite[pObject->extra];
|
||||
if ((pObject->statnum == 4 || pObject->statnum == 6) && pXObject->burnTime == 0)
|
||||
if ((pObject->statnum == kStatThing || pObject->statnum == kStatDude) && pXObject->burnTime == 0)
|
||||
evPost(nObject, 3, 0, CALLBACK_ID_0);
|
||||
int nOwner = actSpriteOwnerToSpriteId(pMissile);
|
||||
actBurnSprite(pMissile->owner, pXObject, (4+gGameOptions.nDifficulty)<<2);
|
||||
|
@ -4119,7 +4119,7 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
if (pObject->extra > 0)
|
||||
{
|
||||
XSPRITE *pXObject = &xsprite[pObject->extra];
|
||||
if ((pObject->statnum == 4 || pObject->statnum == 6) && pXObject->burnTime == 0)
|
||||
if ((pObject->statnum == kStatThing || pObject->statnum == kStatDude) && pXObject->burnTime == 0)
|
||||
evPost(nObject, 3, 0, CALLBACK_ID_0);
|
||||
int nOwner = actSpriteOwnerToSpriteId(pMissile);
|
||||
actBurnSprite(pMissile->owner, pXObject, 32);
|
||||
|
@ -4133,14 +4133,14 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
case 307:
|
||||
sfxKill3DSound(pMissile, -1, -1);
|
||||
sfxPlay3DSound(pMissile->x, pMissile->y, pMissile->z, 522, pMissile->sectnum);
|
||||
actPostSprite(pMissile->index, 15);
|
||||
actPostSprite(pMissile->index, kStatDebris);
|
||||
seqSpawn(20, 3, pMissile->extra, -1);
|
||||
if (a2 == 3)
|
||||
{
|
||||
int nObject = gHitInfo.hitsprite;
|
||||
dassert(nObject >= 0 && nObject < kMaxSprites);
|
||||
spritetype *pObject = &sprite[nObject];
|
||||
if (pObject->statnum == 6)
|
||||
if (pObject->statnum == kStatDude)
|
||||
{
|
||||
int nOwner = actSpriteOwnerToSpriteId(pMissile);
|
||||
int nDamage = (25+Random(10))<<4;
|
||||
|
@ -4149,7 +4149,7 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
}
|
||||
break;
|
||||
case 300:
|
||||
actPostSprite(pMissile->index, 15);
|
||||
actPostSprite(pMissile->index, kStatDebris);
|
||||
pMissile->cstat &= ~16;
|
||||
pMissile->type = 0;
|
||||
seqSpawn(20, 3, pMissile->extra, -1);
|
||||
|
@ -4158,7 +4158,7 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
int nObject = gHitInfo.hitsprite;
|
||||
dassert(nObject >= 0 && nObject < kMaxSprites);
|
||||
spritetype *pObject = &sprite[nObject];
|
||||
if (pObject->statnum == 6)
|
||||
if (pObject->statnum == kStatDude)
|
||||
{
|
||||
int nOwner = actSpriteOwnerToSpriteId(pMissile);
|
||||
int nDamage = (10+Random(10))<<4;
|
||||
|
@ -4177,7 +4177,7 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
GibSprite(pMissile, (a2 == 2) ? GIBTYPE_23 : GIBTYPE_22, NULL, NULL);
|
||||
evKill(pMissile->index, 3);
|
||||
seqKill(3, nXMissile);
|
||||
actPostSprite(pMissile->index, 1024);
|
||||
actPostSprite(pMissile->index, kStatFree);
|
||||
if (a2 == 3)
|
||||
{
|
||||
int nObject = gHitInfo.hitsprite;
|
||||
|
@ -4191,7 +4191,7 @@ void actImpactMissile(spritetype *pMissile, int a2)
|
|||
case 310:
|
||||
default:
|
||||
seqKill(3, nXMissile);
|
||||
actPostSprite(pMissile->index, 1024);
|
||||
actPostSprite(pMissile->index, kStatFree);
|
||||
if (a2 == 3)
|
||||
{
|
||||
int nObject = gHitInfo.hitsprite;
|
||||
|
@ -4265,9 +4265,9 @@ void ProcessTouchObjects(spritetype *pSprite, int nXSprite)
|
|||
{
|
||||
spritetype *pSprite2 = &sprite[nHitSprite];
|
||||
XSPRITE *pXSprite2 = &xsprite[pSprite2->extra];
|
||||
if ((pSprite2->statnum == 4 || pSprite2->statnum == 6) && (xvel[nSprite] != 0 || yvel[nSprite] != 0 || zvel[nSprite] != 0))
|
||||
if ((pSprite2->statnum == kStatThing || pSprite2->statnum == kStatDude) && (xvel[nSprite] != 0 || yvel[nSprite] != 0 || zvel[nSprite] != 0))
|
||||
{
|
||||
if (pSprite2->statnum == 4)
|
||||
if (pSprite2->statnum == kStatThing)
|
||||
{
|
||||
int nType = pSprite2->type-kThingBase;
|
||||
THINGINFO *pThingInfo = &thingInfo[nType];
|
||||
|
@ -4817,7 +4817,7 @@ void MoveDude(spritetype *pSprite)
|
|||
if (nSector == -1)
|
||||
{
|
||||
nSector = pSprite->sectnum;
|
||||
if (pSprite->statnum == 6 || pSprite->statnum == 4)
|
||||
if (pSprite->statnum == kStatDude || pSprite->statnum == kStatThing)
|
||||
actDamageSprite(pSprite->index, pSprite, DAMAGE_TYPE_0, 1000<<4);
|
||||
}
|
||||
if (sector[nSector].type >= 612 && sector[nSector].type <= 617)
|
||||
|
@ -4842,7 +4842,7 @@ void MoveDude(spritetype *pSprite)
|
|||
if (pSprite->extra > 0)
|
||||
pHitXSprite = &xsprite[pHitSprite->extra];
|
||||
int nOwner = actSpriteOwnerToSpriteId(pHitSprite);
|
||||
if (pHitSprite->statnum == 5 && !(pHitSprite->flags&32) && pSprite->index != nOwner)
|
||||
if (pHitSprite->statnum == kStatProjectile && !(pHitSprite->flags&32) && pSprite->index != nOwner)
|
||||
{
|
||||
HITINFO hitInfo = gHitInfo;
|
||||
gHitInfo.hitsprite = nSprite;
|
||||
|
@ -5338,7 +5338,7 @@ int MoveMissile(spritetype *pSprite)
|
|||
pXTarget = &xsprite[pTarget->extra];
|
||||
else
|
||||
pXTarget = NULL;
|
||||
if (pTarget->statnum == 6 && pXTarget && pXTarget->health > 0)
|
||||
if (pTarget->statnum == kStatDude && pXTarget && pXTarget->health > 0)
|
||||
{
|
||||
int nTargetAngle = getangle(-(pTarget->y-pSprite->y), pTarget->x-pSprite->x);
|
||||
int UNUSED(nAngle) = getangle(xvel[nSprite]>>12,yvel[nSprite]>>12);
|
||||
|
@ -5476,7 +5476,7 @@ void actExplodeSprite(spritetype *pSprite)
|
|||
int nXSprite = pSprite->extra;
|
||||
if (nXSprite <= 0 || nXSprite >= kMaxXSprites)
|
||||
return;
|
||||
if (pSprite->statnum == 2)
|
||||
if (pSprite->statnum == kStatExplosion)
|
||||
return;
|
||||
sfxKill3DSound(pSprite, -1, -1);
|
||||
evKill(pSprite->index, 3);
|
||||
|
@ -5544,7 +5544,7 @@ void actExplodeSprite(spritetype *pSprite)
|
|||
pXSprite->health = thingInfo[0].at0<<4;
|
||||
}
|
||||
else
|
||||
actPostSprite(pSprite->index, 1024);
|
||||
actPostSprite(pSprite->index, kStatFree);
|
||||
nType = 2;
|
||||
nXSprite = pSprite2->extra;
|
||||
seqSpawn(4, 3, nXSprite, -1);
|
||||
|
@ -5603,7 +5603,7 @@ void actExplodeSprite(spritetype *pSprite)
|
|||
}
|
||||
int nSprite = pSprite->index;
|
||||
xvel[nSprite] = yvel[nSprite] = zvel[nSprite] = 0;
|
||||
actPostSprite(nSprite, 2);
|
||||
actPostSprite(nSprite, kStatExplosion);
|
||||
pSprite->xrepeat = pSprite->yrepeat = explodeInfo[nType].at0;
|
||||
pSprite->flags &= ~3;
|
||||
pSprite->type = nType;
|
||||
|
@ -5632,7 +5632,7 @@ void actActivateGibObject(spritetype *pSprite, XSPRITE *pXSprite)
|
|||
if (v8 > 0)
|
||||
actDropObject(pSprite, v8);
|
||||
if (!(pSprite->cstat&32768) && !(pSprite->flags&16))
|
||||
actPostSprite(pSprite->index, 1024);
|
||||
actPostSprite(pSprite->index, kStatFree);
|
||||
}
|
||||
|
||||
bool IsUnderWater(spritetype *pSprite)
|
||||
|
@ -5669,7 +5669,7 @@ void actProcessSprites(void)
|
|||
|
||||
if (!pXProxSpr->DudeLockout) {
|
||||
|
||||
for (int nAffected = headspritestat[6]; nAffected >= 0; nAffected = nextspritestat[nAffected]) {
|
||||
for (int nAffected = headspritestat[kStatDude]; nAffected >= 0; nAffected = nextspritestat[nAffected]) {
|
||||
if ((sprite[nAffected].flags & 32) || xsprite[sprite[nAffected].extra].health <= 0) continue;
|
||||
else if (CheckProximity(&sprite[nAffected], x, y, z, sectnum, 96)) {
|
||||
trTriggerSprite(index, pXProxSpr, 35);
|
||||
|
@ -5775,7 +5775,7 @@ void actProcessSprites(void)
|
|||
}
|
||||
}
|
||||
|
||||
for (nSprite = headspritestat[4]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (nSprite = headspritestat[kStatThing]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->flags&32)
|
||||
|
@ -5795,7 +5795,7 @@ void actProcessSprites(void)
|
|||
// by NoOne: don't process locked or 1-shot things for proximity
|
||||
if (pXSprite->Proximity && (VanillaMode() || (pXSprite->locked != 1 && pXSprite->isTriggered != true))) {
|
||||
if (pSprite->type == 431) pXSprite->target = -1;
|
||||
for (int nSprite2 = headspritestat[6]; nSprite2 >= 0; nSprite2 = nNextSprite)
|
||||
for (int nSprite2 = headspritestat[kStatDude]; nSprite2 >= 0; nSprite2 = nNextSprite)
|
||||
{
|
||||
|
||||
nNextSprite = nextspritestat[nSprite2];
|
||||
|
@ -5851,7 +5851,7 @@ void actProcessSprites(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
for (nSprite = headspritestat[4]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (nSprite = headspritestat[kStatThing]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->flags & 32)
|
||||
|
@ -5977,7 +5977,7 @@ void actProcessSprites(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
for (nSprite = headspritestat[5]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (nSprite = headspritestat[kStatProjectile]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->flags & 32)
|
||||
|
@ -5987,7 +5987,7 @@ void actProcessSprites(void)
|
|||
if (hit >= 0)
|
||||
actImpactMissile(pSprite, hit);
|
||||
}
|
||||
for (nSprite = headspritestat[2]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (nSprite = headspritestat[kStatExplosion]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
char v24c[(kMaxSectors+7)>>3];
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
|
@ -6024,7 +6024,7 @@ void actProcessSprites(void)
|
|||
trTriggerWall(nWall, pXWall, 51);
|
||||
}
|
||||
|
||||
for (int nSprite2 = headspritestat[6]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
for (int nSprite2 = headspritestat[kStatDude]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
{
|
||||
spritetype *pDude = &sprite[nSprite2];
|
||||
if (pDude->flags & 32)
|
||||
|
@ -6052,7 +6052,7 @@ void actProcessSprites(void)
|
|||
}
|
||||
}
|
||||
|
||||
for (int nSprite2 = headspritestat[4]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
for (int nSprite2 = headspritestat[kStatThing]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
{
|
||||
spritetype *pThing = &sprite[nSprite2];
|
||||
if (pThing->flags & 32)
|
||||
|
@ -6112,10 +6112,10 @@ void actProcessSprites(void)
|
|||
}
|
||||
|
||||
if (pXSprite->data1 == 0 && pXSprite->data2 == 0 && pXSprite->data3 == 0 && seqGetStatus(3, nXSprite) < 0)
|
||||
actPostSprite(nSprite, 1024);
|
||||
actPostSprite(nSprite, kStatFree);
|
||||
}
|
||||
|
||||
for (nSprite = headspritestat[11]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
for (nSprite = headspritestat[kStatTraps]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->flags & 32)
|
||||
continue;
|
||||
|
@ -6156,7 +6156,7 @@ void actProcessSprites(void)
|
|||
break;
|
||||
}
|
||||
}
|
||||
for (nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->flags & 32)
|
||||
|
@ -6222,7 +6222,7 @@ void actProcessSprites(void)
|
|||
short oldData2 = pXSprite->data2; pXSprite->data2 = pXIncarnation->data2; // seq new seqId and save old one.
|
||||
|
||||
// if incarnation is active dude, it's sndStartId will be stored in sysData1, otherwise it will be data3
|
||||
if (pIncarnation->statnum == 6 && pIncarnation->type == kCustomDude) pXSprite->sysData1 = pXIncarnation->sysData1;
|
||||
if (pIncarnation->statnum == kStatDude && pIncarnation->type == kCustomDude) pXSprite->sysData1 = pXIncarnation->sysData1;
|
||||
else pXIncarnation->data3;
|
||||
|
||||
pXSprite->data4 = pXIncarnation->data4;
|
||||
|
@ -6306,7 +6306,7 @@ void actProcessSprites(void)
|
|||
}
|
||||
if (pXSprite->Proximity && !pXSprite->isTriggered)
|
||||
{
|
||||
for (int nSprite2 = headspritestat[6]; nSprite2 >= 0; nSprite2 = nNextSprite)
|
||||
for (int nSprite2 = headspritestat[kStatDude]; nSprite2 >= 0; nSprite2 = nNextSprite)
|
||||
{
|
||||
nNextSprite = nextspritestat[nSprite2];
|
||||
spritetype *pSprite2 = &sprite[nSprite2];
|
||||
|
@ -6362,7 +6362,7 @@ void actProcessSprites(void)
|
|||
ProcessTouchObjects(pSprite, nXSprite);
|
||||
}
|
||||
}
|
||||
for (nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->flags & 32)
|
||||
|
@ -6409,7 +6409,7 @@ void actProcessSprites(void)
|
|||
velFloor[pSprite->sectnum] || velCeil[pSprite->sectnum])
|
||||
MoveDude(pSprite);
|
||||
}
|
||||
for (nSprite = headspritestat[14]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (nSprite = headspritestat[kStatFlare]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->flags & 32)
|
||||
|
@ -6425,7 +6425,7 @@ void actProcessSprites(void)
|
|||
if (pTarget->statnum == kMaxStatus)
|
||||
{
|
||||
GibSprite(pSprite, GIBTYPE_17, NULL, NULL);
|
||||
actPostSprite(pSprite->index, 1024);
|
||||
actPostSprite(pSprite->index, kStatFree);
|
||||
}
|
||||
if (pTarget->extra > 0 && xsprite[pTarget->extra].health > 0)
|
||||
{
|
||||
|
@ -6441,7 +6441,7 @@ void actProcessSprites(void)
|
|||
else
|
||||
{
|
||||
GibSprite(pSprite, GIBTYPE_17, NULL, NULL);
|
||||
actPostSprite(pSprite->index, 1024);
|
||||
actPostSprite(pSprite->index, kStatFree);
|
||||
}
|
||||
}
|
||||
aiProcessDudes();
|
||||
|
@ -6455,7 +6455,7 @@ spritetype * actSpawnSprite(int nSector, int x, int y, int z, int nStat, char a6
|
|||
sprite[nSprite].extra = -1;
|
||||
else
|
||||
{
|
||||
nSprite = headspritestat[9];
|
||||
nSprite = headspritestat[kStatPurge];
|
||||
dassert(nSprite >= 0);
|
||||
dassert(nSector >= 0 && nSector < kMaxSectors);
|
||||
ChangeSpriteSect(nSprite, nSector);
|
||||
|
@ -6541,7 +6541,7 @@ spritetype * actSpawnSprite(spritetype *pSource, int nStat)
|
|||
int nSprite = InsertSprite(pSource->sectnum, nStat);
|
||||
if (nSprite < 0)
|
||||
{
|
||||
nSprite = headspritestat[9];
|
||||
nSprite = headspritestat[kStatPurge];
|
||||
dassert(nSprite >= 0);
|
||||
dassert(pSource->sectnum >= 0 && pSource->sectnum < kMaxSectors);
|
||||
ChangeSpriteSect(nSprite, pSource->sectnum);
|
||||
|
@ -6878,7 +6878,7 @@ bool actCheckRespawn(spritetype *pSprite)
|
|||
if (pXSprite->respawnPending == 1)
|
||||
nRespawnTime = mulscale16(nRespawnTime, 0xa000);
|
||||
pSprite->owner = pSprite->statnum;
|
||||
actPostSprite(pSprite->index, 8);
|
||||
actPostSprite(pSprite->index, kStatRespawn);
|
||||
pSprite->flags |= 16;
|
||||
if (!(pSprite->type >= kDudeBase && pSprite->type < kDudeMax))
|
||||
{
|
||||
|
@ -7025,7 +7025,7 @@ void actFireVector(spritetype *pShooter, int a2, int a3, int a4, int a5, int a6,
|
|||
if (pXSprite->Vector)
|
||||
trTriggerSprite(nSprite, pXSprite, 31);
|
||||
}
|
||||
if (pSprite->statnum == 4)
|
||||
if (pSprite->statnum == kStatThing)
|
||||
{
|
||||
int t = thingInfo[pSprite->type-kThingBase].at2;
|
||||
if (t > 0 && pVectorData->at5)
|
||||
|
@ -7043,7 +7043,7 @@ void actFireVector(spritetype *pShooter, int a2, int a3, int a4, int a5, int a6,
|
|||
actBurnSprite(actSpriteIdToOwnerId(nShooter), pXSprite, pVectorData->at11);
|
||||
}
|
||||
}
|
||||
if (pSprite->statnum == 6)
|
||||
if (pSprite->statnum == kStatDude)
|
||||
{
|
||||
int t = pSprite->type == 426 ? 0 : dudeInfo[pSprite->type-kDudeBase].mass;
|
||||
|
||||
|
@ -7126,8 +7126,8 @@ void actFireVector(spritetype *pShooter, int a2, int a3, int a4, int a5, int a6,
|
|||
}
|
||||
|
||||
if (pSprite->type >= kThingBase && pSprite->type < kThingMax)
|
||||
changespritestat(pSprite->index, 4);
|
||||
//actPostSprite(pSprite->index, 4); // if it was a thing, return it's statnum back
|
||||
changespritestat(pSprite->index, kStatThing);
|
||||
//actPostSprite(pSprite->index, kStatThing); // if it was a thing, return it's statnum back
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7743,8 +7743,8 @@ void debrisConcuss(int nOwner, int listIndex, int x, int y, int z, int dmg) {
|
|||
|
||||
|
||||
if (pSprite->type >= kThingBase && pSprite->type < kThingMax)
|
||||
//actPostSprite(pSprite->index, 4); // !!! (does not working here) if it was a thing, return it's statnum back
|
||||
changespritestat(pSprite->index, 4);
|
||||
//actPostSprite(pSprite->index, kStatThing); // !!! (does not working here) if it was a thing, return it's statnum back
|
||||
changespritestat(pSprite->index, kStatThing);
|
||||
}
|
||||
|
||||
|
||||
|
@ -7927,8 +7927,8 @@ void debrisMove(int listIndex) {
|
|||
|
||||
if (pSprite->type >= kThingBase && pSprite->type < kThingMax)
|
||||
// if thing was turned in debris, change it's stat back so it will do on impact what it supposed to do...
|
||||
//actPostSprite(nSprite, 4); // !!!! not working here for some reason
|
||||
changespritestat(nSprite, 4);
|
||||
//actPostSprite(nSprite, kStatThing); // !!!! not working here for some reason
|
||||
changespritestat(nSprite, kStatThing);
|
||||
|
||||
if (pXDebris->state == 1) trTriggerSprite(pSprite->xvel, pXDebris, COMMAND_ID_0);
|
||||
else trTriggerSprite(pSprite->xvel, pXDebris, COMMAND_ID_1);
|
||||
|
|
|
@ -208,7 +208,7 @@ inline bool IsDudeSprite(spritetype *pSprite)
|
|||
|
||||
inline void actBurnSprite(int nSource, XSPRITE *pXSprite, int nTime)
|
||||
{
|
||||
pXSprite->burnTime = ClipHigh(pXSprite->burnTime + nTime, sprite[pXSprite->reference].statnum == 6 ? 2400 : 1200);
|
||||
pXSprite->burnTime = ClipHigh(pXSprite->burnTime + nTime, sprite[pXSprite->reference].statnum == kStatDude ? 2400 : 1200);
|
||||
pXSprite->burnSource = nSource;
|
||||
}
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ void aiSetGenIdleState(spritetype* pSprite, XSPRITE* pXSprite) {
|
|||
|
||||
bool sub_5BDA8(spritetype *pSprite, int nSeq)
|
||||
{
|
||||
if (pSprite->statnum == 6 && pSprite->type >= kDudeBase && pSprite->type < kDudeMax)
|
||||
if (pSprite->statnum == kStatDude && pSprite->type >= kDudeBase && pSprite->type < kDudeMax)
|
||||
{
|
||||
DUDEINFO *pDudeInfo = &dudeInfo[pSprite->type-kDudeBase];
|
||||
if (seqGetID(3, pSprite->extra) == pDudeInfo->seqStartID + nSeq && seqGetStatus(3, pSprite->extra) >= 0)
|
||||
|
@ -1152,7 +1152,7 @@ void RecoilDude(spritetype *pSprite, XSPRITE *pXSprite)
|
|||
{
|
||||
char v4 = Chance(0x8000);
|
||||
DUDEEXTRA *pDudeExtra = &gDudeExtra[pSprite->extra];
|
||||
if (pSprite->statnum == 6 && (pSprite->type >= kDudeBase && pSprite->type < kDudeMax))
|
||||
if (pSprite->statnum == kStatDude && (pSprite->type >= kDudeBase && pSprite->type < kDudeMax))
|
||||
{
|
||||
DUDEINFO *pDudeInfo = &dudeInfo[pSprite->type-kDudeBase];
|
||||
switch (pSprite->type)
|
||||
|
@ -1470,7 +1470,7 @@ void sub_5F15C(spritetype *pSprite, XSPRITE *pXSprite)
|
|||
gAffectedSectors[0] = 0;
|
||||
gAffectedXWalls[0] = 0;
|
||||
GetClosestSpriteSectors(pSprite->sectnum, pSprite->x, pSprite->y, 400, gAffectedSectors, va4, gAffectedXWalls);
|
||||
for (int nSprite2 = headspritestat[6]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
for (int nSprite2 = headspritestat[kStatDude]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
{
|
||||
spritetype *pSprite2 = &sprite[nSprite2];
|
||||
int dx = pSprite2->x-pSprite->x;
|
||||
|
@ -1493,7 +1493,7 @@ void sub_5F15C(spritetype *pSprite, XSPRITE *pXSprite)
|
|||
|
||||
void aiProcessDudes(void)
|
||||
{
|
||||
for (int nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (int nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->flags&32)
|
||||
|
@ -1528,7 +1528,7 @@ void aiProcessDudes(void)
|
|||
|
||||
void aiInit(void)
|
||||
{
|
||||
for (int nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (int nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
aiInitSprite(&sprite[nSprite]);
|
||||
}
|
||||
|
|
|
@ -123,11 +123,11 @@ static void StompSeqCallback(int, int nXSprite)
|
|||
actHitcodeToData(hit, &gHitInfo, &v34, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
if (hit == 3 && v34 >= 0)
|
||||
{
|
||||
if (sprite[v34].statnum == 6)
|
||||
if (sprite[v34].statnum == kStatDude)
|
||||
v4 = 0;
|
||||
}
|
||||
vc <<= 4;
|
||||
for (int nSprite2 = headspritestat[6]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
for (int nSprite2 = headspritestat[kStatDude]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
{
|
||||
if (nSprite != nSprite2 || v4)
|
||||
{
|
||||
|
@ -163,7 +163,7 @@ static void StompSeqCallback(int, int nXSprite)
|
|||
}
|
||||
}
|
||||
}
|
||||
for (int nSprite2 = headspritestat[4]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
for (int nSprite2 = headspritestat[kStatThing]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
{
|
||||
spritetype *pSprite2 = &sprite[nSprite2];
|
||||
if (pSprite2->flags&32)
|
||||
|
|
|
@ -114,7 +114,7 @@ static void BurnSeqCallback(int, int nXSprite)
|
|||
aim.dy = Sin(pSprite->ang)>>16;
|
||||
aim.dz = gDudeSlope[nXSprite];
|
||||
int nClosest = 0x7fffffff;
|
||||
for (short nSprite2 = headspritestat[6]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
for (short nSprite2 = headspritestat[kStatDude]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
{
|
||||
spritetype *pSprite2 = &sprite[nSprite2];
|
||||
if (pSprite == pSprite2 || !(pSprite2->flags&8))
|
||||
|
@ -197,7 +197,7 @@ static void BurnSeqCallback2(int, int nXSprite)
|
|||
aim.dz = gDudeSlope[nXSprite];
|
||||
az = 0;
|
||||
int nClosest = 0x7fffffff;
|
||||
for (short nSprite2 = headspritestat[6]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
for (short nSprite2 = headspritestat[kStatDude]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
{
|
||||
spritetype *pSprite2 = &sprite[nSprite2];
|
||||
if (pSprite == pSprite2 || !(pSprite2->flags&8))
|
||||
|
|
|
@ -222,7 +222,7 @@ static char TargetNearExplosion(spritetype *pSprite)
|
|||
{
|
||||
for (short nSprite = headspritesect[pSprite->sectnum]; nSprite >= 0; nSprite = nextspritesect[nSprite])
|
||||
{
|
||||
if (sprite[nSprite].type == 418 || sprite[nSprite].statnum == 2)
|
||||
if (sprite[nSprite].type == 418 || sprite[nSprite].statnum == kStatExplosion)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -149,7 +149,7 @@ static void BlastSSeqCallback(int, int nXSprite)
|
|||
aim.dy = Sin(pSprite->ang)>>16;
|
||||
aim.dz = gDudeSlope[nXSprite];
|
||||
int nClosest = 0x7fffffff;
|
||||
for (short nSprite2 = headspritestat[6]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
for (short nSprite2 = headspritestat[kStatDude]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
{
|
||||
spritetype *pSprite2 = &sprite[nSprite2];
|
||||
if (pSprite == pSprite2 || !(pSprite2->flags&8))
|
||||
|
|
|
@ -132,7 +132,7 @@ static void BlastSeqCallback(int, int nXSprite)
|
|||
aim.dy = Sin(pSprite->ang)>>16;
|
||||
aim.dz = gDudeSlope[nXSprite];
|
||||
int nClosest = 0x7fffffff;
|
||||
for (short nSprite2 = headspritestat[6]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
for (short nSprite2 = headspritestat[kStatDude]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
{
|
||||
spritetype *pSprite2 = &sprite[nSprite2];
|
||||
if (pSprite == pSprite2 || !(pSprite2->flags&8))
|
||||
|
|
|
@ -101,7 +101,7 @@ static void sub_71BD4(int, int nXSprite)
|
|||
aim.dy = Sin(pSprite->ang)>>16;
|
||||
aim.dz = gDudeSlope[nXSprite];
|
||||
int nClosest = 0x7fffffff;
|
||||
for (short nSprite2 = headspritestat[6]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
for (short nSprite2 = headspritestat[kStatDude]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
{
|
||||
spritetype *pSprite2 = &sprite[nSprite2];
|
||||
if (pSprite == pSprite2 || !(pSprite2->flags&8))
|
||||
|
@ -177,7 +177,7 @@ static void sub_720AC(int, int nXSprite)
|
|||
aim.dz = gDudeSlope[nXSprite];
|
||||
int nClosest = 0x7fffffff;
|
||||
az = 0;
|
||||
for (short nSprite2 = headspritestat[6]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
for (short nSprite2 = headspritestat[kStatDude]; nSprite2 >= 0; nSprite2 = nextspritestat[nSprite2])
|
||||
{
|
||||
spritetype *pSprite2 = &sprite[nSprite2];
|
||||
if (pSprite == pSprite2 || !(pSprite2->flags&8))
|
||||
|
|
|
@ -722,35 +722,11 @@ int checkAttackState(spritetype* pSprite, XSPRITE* pXSprite) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*bool sub_5BDA8(spritetype* pSprite, int nSeq)
|
||||
{
|
||||
if (pSprite->statnum == 6 && pSprite->type >= kDudeBase && pSprite->type < kDudeMax)
|
||||
{
|
||||
DUDEINFO* pDudeInfo = &dudeInfo[pSprite->type - kDudeBase];
|
||||
if (seqGetID(3, pSprite->extra) == pDudeInfo->seqStartID + nSeq && seqGetStatus(3, pSprite->extra) >= 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool sub_57901(spritetype* pSprite, int nSeqID) {
|
||||
if ( pSprite->statnum == 6 )
|
||||
{
|
||||
if ( IsDudeSprite(pSprite) )
|
||||
{
|
||||
SEQINST* pSeqInst = GetInstance(3, pSprite->extra); Seq* pSeq = pSeqInst->pSequence;
|
||||
if ( pSeq == pSEQs.get(xsprite[pSprite->extra].data2 + nSeqID) && seqGetStatus(3, pSprite->extra) >= 0 )
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}*/
|
||||
|
||||
bool TargetNearThing(spritetype* pSprite, int thingType) {
|
||||
for ( int nSprite = headspritesect[pSprite->sectnum]; nSprite >= 0; nSprite = nextspritesect[nSprite] )
|
||||
{
|
||||
// check for required things or explosions in the same sector as the target
|
||||
if ( sprite[nSprite].type == thingType || sprite[nSprite].statnum == 2 )
|
||||
if ( sprite[nSprite].type == thingType || sprite[nSprite].statnum == kStatExplosion )
|
||||
return true; // indicate danger
|
||||
}
|
||||
return false;
|
||||
|
@ -866,7 +842,7 @@ bool spriteIsUnderwater(spritetype* pSprite,bool oldWay) {
|
|||
}
|
||||
|
||||
spritetype* leechIsDropped(spritetype* pSprite) {
|
||||
for (int nSprite = headspritestat[4]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
for (int nSprite = headspritestat[kStatThing]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
if (sprite[nSprite].type == kGDXThingCustomDudeLifeLeech && sprite[nSprite].owner == pSprite->xvel)
|
||||
return &sprite[nSprite];
|
||||
}
|
||||
|
@ -876,7 +852,7 @@ spritetype* leechIsDropped(spritetype* pSprite) {
|
|||
}
|
||||
|
||||
void removeDudeStuff(spritetype* pSprite) {
|
||||
for (short nSprite = headspritestat[4]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
for (short nSprite = headspritestat[kStatThing]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
if (sprite[nSprite].owner != pSprite->xvel) continue;
|
||||
switch (sprite[nSprite].type) {
|
||||
case 401:
|
||||
|
@ -891,7 +867,7 @@ void removeDudeStuff(spritetype* pSprite) {
|
|||
}
|
||||
}
|
||||
|
||||
for (short nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
for (short nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
if (sprite[nSprite].owner != pSprite->xvel) continue;
|
||||
actDamageSprite(sprite[nSprite].owner, &sprite[nSprite], (DAMAGE_TYPE) 0, 65535);
|
||||
}
|
||||
|
@ -928,8 +904,8 @@ XSPRITE* getNextIncarnation(XSPRITE* pXSprite) {
|
|||
continue;
|
||||
|
||||
switch (sprite[rxBucket[i].index].statnum) {
|
||||
case 6:
|
||||
case 7: // inactive (ambush) dudes
|
||||
case kStatDude:
|
||||
case kStatInactive: // inactive (ambush) dudes
|
||||
if (xsprite[sprite[rxBucket[i].index].extra].health > 0)
|
||||
return &xsprite[sprite[rxBucket[i].index].extra];
|
||||
}
|
||||
|
@ -1009,7 +985,7 @@ void dudeLeechOperate(spritetype* pSprite, XSPRITE* pXSprite, EVENT a3)
|
|||
int nTarget = pXSprite->target;
|
||||
if (nTarget >= 0 && nTarget < kMaxSprites) {
|
||||
spritetype* pTarget = &sprite[nTarget];
|
||||
if (pTarget->statnum == 6 && !(pTarget->flags & 32) && pTarget->extra > 0 && pTarget->extra < kMaxXSprites && !pXSprite->stateTimer)
|
||||
if (pTarget->statnum == kStatDude && !(pTarget->flags & 32) && pTarget->extra > 0 && pTarget->extra < kMaxXSprites && !pXSprite->stateTimer)
|
||||
{
|
||||
int top, bottom;
|
||||
GetSpriteExtents(pSprite, &top, &bottom);
|
||||
|
@ -1087,7 +1063,7 @@ bool doExplosion(spritetype* pSprite, int nType) {
|
|||
|
||||
|
||||
void updateTargetOfSlaves(spritetype* pSprite) {
|
||||
for (short nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
for (short nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
if (sprite[nSprite].owner != pSprite->xvel || sprite[nSprite].extra < 0 || !IsDudeSprite(&sprite[nSprite])) continue;
|
||||
else if (xsprite[pSprite->extra].target != xsprite[sprite[nSprite].extra].target
|
||||
&& IsDudeSprite(&sprite[xsprite[pSprite->extra].target])) {
|
||||
|
|
|
@ -55,7 +55,7 @@ void ambProcess(void)
|
|||
{
|
||||
if (!SoundToggle)
|
||||
return;
|
||||
for (int nSprite = headspritestat[12]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (int nSprite = headspritestat[kStatAmbience]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->owner < 0 || pSprite->owner >= kMaxAmbChannel)
|
||||
|
@ -116,7 +116,7 @@ void ambInit(void)
|
|||
{
|
||||
ambKillAll();
|
||||
memset(ambChannels, 0, sizeof(ambChannels));
|
||||
for (int nSprite = headspritestat[12]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (int nSprite = headspritestat[kStatAmbience]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
int nXSprite = pSprite->extra;
|
||||
|
|
|
@ -357,10 +357,10 @@ void PreloadTiles(void)
|
|||
spritetype *pSprite = &sprite[i];
|
||||
switch (pSprite->statnum)
|
||||
{
|
||||
case 6:
|
||||
case kStatDude:
|
||||
PrecacheDude(pSprite);
|
||||
break;
|
||||
case 4:
|
||||
case kStatThing:
|
||||
PrecacheThing(pSprite);
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -51,14 +51,14 @@ BEGIN_BLD_NS
|
|||
void makeMissileBlocking(int nSprite) // 23
|
||||
{
|
||||
dassert(nSprite >= 0 && nSprite < kMaxSprites);
|
||||
if (sprite[nSprite].statnum != 5) return;
|
||||
if (sprite[nSprite].statnum != kStatProjectile) return;
|
||||
sprite[nSprite].cstat |= CSTAT_SPRITE_BLOCK;
|
||||
}
|
||||
|
||||
void UniMissileBurst(int nSprite) // 22
|
||||
{
|
||||
dassert(nSprite >= 0 && nSprite < kMaxSprites);
|
||||
if (sprite[nSprite].statnum != 5) return;
|
||||
if (sprite[nSprite].statnum != kStatProjectile) return;
|
||||
spritetype * pSprite = &sprite[nSprite];
|
||||
int nAngle = getangle(xvel[nSprite], yvel[nSprite]);
|
||||
int nRadius = 0x55555;
|
||||
|
@ -306,7 +306,7 @@ void Respawn(int nSprite) // 9
|
|||
int nXSprite = pSprite->extra;
|
||||
dassert(nXSprite > 0 && nXSprite < kMaxXSprites);
|
||||
XSPRITE *pXSprite = &xsprite[nXSprite];
|
||||
if (pSprite->statnum != 8 && pSprite->statnum != 4)
|
||||
if (pSprite->statnum != kStatRespawn && pSprite->statnum != kStatThing)
|
||||
ThrowError("Sprite %d is not on Respawn or Thing list\n", nSprite);
|
||||
if (!(pSprite->flags&16))
|
||||
ThrowError("Sprite %d does not have the respawn attribute\n", nSprite);
|
||||
|
@ -622,7 +622,7 @@ void sub_768E8(int nSprite) // 18
|
|||
void sub_769B4(int nSprite) // 19
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->statnum == 4 && !(pSprite->flags & 32)) {
|
||||
if (pSprite->statnum == kStatThing && !(pSprite->flags & 32)) {
|
||||
switch (pSprite->type) {
|
||||
case 431:
|
||||
case kGDXThingCustomDudeLifeLeech:
|
||||
|
@ -683,7 +683,7 @@ void sub_76B78(int nSprite)
|
|||
return;
|
||||
}
|
||||
int nSprite2, nNextSprite;
|
||||
for (nSprite2 = headspritestat[6]; nSprite2 >= 0; nSprite2 = nNextSprite)
|
||||
for (nSprite2 = headspritestat[kStatDude]; nSprite2 >= 0; nSprite2 = nNextSprite)
|
||||
{
|
||||
nNextSprite = nextspritestat[nSprite2];
|
||||
if (nOwner == nSprite2)
|
||||
|
|
|
@ -32,7 +32,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
BEGIN_BLD_NS
|
||||
|
||||
extern int g_useCwd;
|
||||
|
||||
#ifndef APPNAME
|
||||
#define APPNAME "NBlood"
|
||||
#endif
|
||||
|
@ -89,9 +88,25 @@ void QuitGame(void);
|
|||
|
||||
#define kMaxPowerUps 51
|
||||
|
||||
#define kStatNothing -1
|
||||
#define kStatDecoration 0
|
||||
#define kStatFX 1
|
||||
#define kStatExplosion 2
|
||||
#define kStatItem 3
|
||||
#define kStatThing 4
|
||||
#define kStatProjectile 5
|
||||
#define kStatDude 6
|
||||
#define kStatInactive 7 // inactive (ambush) dudes
|
||||
#define kStatRespawn 8
|
||||
#define kStatPurge 9
|
||||
#define kStatMarker 10
|
||||
#define kStatGDXDudeTargetChanger 20
|
||||
#define kStatTraps 11
|
||||
#define kStatAmbience 12
|
||||
#define kStatSpares 13
|
||||
#define kStatFlare 14
|
||||
#define kStatDebris 15
|
||||
#define kStatPathMarker 16
|
||||
#define kStatModernDudeTargetChanger 20
|
||||
#define kStatFree 1024
|
||||
|
||||
#define kLensSize 80
|
||||
|
@ -185,9 +200,6 @@ void QuitGame(void);
|
|||
// projectile types
|
||||
#define kProjectileEctoSkull 307
|
||||
|
||||
// custom level end
|
||||
#define kGDXChannelEndLevelCustom 6
|
||||
|
||||
// GDX types
|
||||
#define kGDXTypeBase 24
|
||||
#define kGDXCustomDudeSpawn 24
|
||||
|
|
|
@ -32,6 +32,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
#include "globals.h"
|
||||
#include "db.h"
|
||||
#include "iob.h"
|
||||
#include "eventq.h"
|
||||
|
||||
BEGIN_BLD_NS
|
||||
|
||||
|
@ -48,7 +49,7 @@ int xvel[kMaxSprites], yvel[kMaxSprites], zvel[kMaxSprites];
|
|||
char qsprite_filler[kMaxSprites], qsector_filler[kMaxSectors];
|
||||
|
||||
int gVisibility;
|
||||
|
||||
bool gModernMap = false;
|
||||
const char *gItemText[] = {
|
||||
"Skull Key",
|
||||
"Eye Key",
|
||||
|
@ -236,7 +237,7 @@ void RemoveSpriteStat(int nSprite)
|
|||
{
|
||||
headspritestat[nStat] = nextspritestat[nSprite];
|
||||
}
|
||||
sprite[nSprite].statnum = -1;
|
||||
sprite[nSprite].statnum = kStatNothing;
|
||||
gStatCount[nStat]--;
|
||||
}
|
||||
|
||||
|
@ -599,7 +600,7 @@ void dbInit(void)
|
|||
void PropagateMarkerReferences(void)
|
||||
{
|
||||
int nSprite, nNextSprite;
|
||||
for (nSprite = headspritestat[10]; nSprite != -1; nSprite = nNextSprite)
|
||||
for (nSprite = headspritestat[kStatMarker]; nSprite != -1; nSprite = nNextSprite)
|
||||
{
|
||||
nNextSprite = nextspritestat[nSprite];
|
||||
switch (sprite[nSprite].type)
|
||||
|
@ -1008,6 +1009,11 @@ int dbLoadMap(const char *pPath, int *pX, int *pY, int *pZ, short *pAngle, short
|
|||
pXSector->bobRotate = bitReader.readUnsigned(1);
|
||||
xsector[sector[i].extra].reference = i;
|
||||
xsector[sector[i].extra].busy = xsector[sector[i].extra].state<<16;
|
||||
|
||||
// by NoOne: indicate if the map requires modern features to work properly
|
||||
// for maps wich created in different editors (include vanilla MAPEDIT) or in PMAPEDIT version below than BETA13
|
||||
if (pXSector->rxID == kChannelMapExtended && pXSector->rxID == pXSector->txID && pXSector->command == kCommandMapExtend)
|
||||
gModernMap = true;
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < numwalls; i++)
|
||||
|
@ -1082,6 +1088,11 @@ int dbLoadMap(const char *pPath, int *pX, int *pY, int *pZ, short *pAngle, short
|
|||
pXWall->at14_0 = bitReader.readUnsigned(32);
|
||||
xwall[wall[i].extra].reference = i;
|
||||
xwall[wall[i].extra].busy = xwall[wall[i].extra].state << 16;
|
||||
|
||||
// by NoOne: indicate if the map requires modern features to work properly
|
||||
// for maps wich created in different editors (include vanilla MAPEDIT) or in PMAPEDIT version below than BETA13
|
||||
if (pXWall->rxID == kChannelMapExtended && pXWall->rxID == pXWall->txID && pXWall->command == kCommandMapExtend)
|
||||
gModernMap = true;
|
||||
}
|
||||
}
|
||||
initspritelists();
|
||||
|
@ -1198,10 +1209,14 @@ int dbLoadMap(const char *pPath, int *pX, int *pY, int *pZ, short *pAngle, short
|
|||
bitReader.skipBits(32);
|
||||
xsprite[sprite[i].extra].reference = i;
|
||||
xsprite[sprite[i].extra].busy = xsprite[sprite[i].extra].state << 16;
|
||||
if (!byte_1A76C8)
|
||||
{
|
||||
if (!byte_1A76C8) {
|
||||
xsprite[sprite[i].extra].lT |= xsprite[sprite[i].extra].lB;
|
||||
}
|
||||
|
||||
// by NoOne: indicate if the map requires modern features to work properly
|
||||
// for maps wich created in different editors (include vanilla MAPEDIT) or in PMAPEDIT version below than BETA13
|
||||
if (pXSprite->rxID == kChannelMapExtended && pXSprite->rxID == pXSprite->txID && pXSprite->command == kCommandMapExtend)
|
||||
gModernMap = true;
|
||||
}
|
||||
if ((sprite[i].cstat & 0x30) == 0x30)
|
||||
{
|
||||
|
|
|
@ -31,6 +31,8 @@ BEGIN_BLD_NS
|
|||
// by NoOne additional non-thing proximity, sight and physics sprites
|
||||
#define kMaxSuperXSprites 128
|
||||
|
||||
extern bool gModernMap;
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
struct AISTATE;
|
||||
|
|
|
@ -140,19 +140,19 @@ void CKillMgr::sub_263E0(int nCount)
|
|||
|
||||
void CKillMgr::AddKill(spritetype *pSprite)
|
||||
{
|
||||
if (pSprite->statnum == 6 && pSprite->type != 219 && pSprite->type != 220 && pSprite->type != 245 && pSprite->type != 239)
|
||||
if (pSprite->statnum == kStatDude && pSprite->type != 219 && pSprite->type != 220 && pSprite->type != 245 && pSprite->type != 239)
|
||||
at4++;
|
||||
}
|
||||
|
||||
void CKillMgr::sub_2641C(void)
|
||||
{
|
||||
at0 = 0;
|
||||
for (int nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (int nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->type < kDudeBase || pSprite->type >= kDudeMax)
|
||||
ThrowError("Non-enemy sprite (%d) in the enemy sprite list.", nSprite);
|
||||
if (pSprite->statnum == 6 && pSprite->type != 219 && pSprite->type != 220 && pSprite->type != 245 && pSprite->type != 239)
|
||||
if (pSprite->statnum == kStatDude && pSprite->type != 219 && pSprite->type != 220 && pSprite->type != 245 && pSprite->type != 239)
|
||||
at0++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
#include "loadsave.h"
|
||||
#include "pqueue.h"
|
||||
#include "triggers.h"
|
||||
#include "view.h"
|
||||
|
||||
BEGIN_BLD_NS
|
||||
|
||||
|
@ -360,55 +361,50 @@ char evGetSourceState(int nType, int nIndex)
|
|||
|
||||
void evSend(int nIndex, int nType, int rxId, COMMAND_ID command)
|
||||
{
|
||||
if (command == COMMAND_ID_2)
|
||||
command = evGetSourceState(nType, nIndex) ? COMMAND_ID_1 : COMMAND_ID_0;
|
||||
else if (command == COMMAND_ID_4)
|
||||
command = evGetSourceState(nType, nIndex) ? COMMAND_ID_0 : COMMAND_ID_1;
|
||||
EVENT evn;
|
||||
evn.index = nIndex;
|
||||
evn.type = nType;
|
||||
evn.cmd = command;
|
||||
if (rxId > 0)
|
||||
{
|
||||
switch (rxId)
|
||||
{
|
||||
case 7:
|
||||
case 10:
|
||||
EVENT event; event.index = nIndex; event.type = nType; event.cmd = command;
|
||||
|
||||
switch (command) {
|
||||
case COMMAND_ID_2:
|
||||
command = evGetSourceState(nType, nIndex) ? COMMAND_ID_1 : COMMAND_ID_0;
|
||||
break;
|
||||
case 3:
|
||||
if (command < COMMAND_ID_64)
|
||||
ThrowError("Invalid TextOver command by xobject %d(type %d)", nIndex, nType);
|
||||
trTextOver(command-COMMAND_ID_64);
|
||||
case COMMAND_ID_4:
|
||||
command = evGetSourceState(nType, nIndex) ? COMMAND_ID_0 : COMMAND_ID_1;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (rxId) {
|
||||
case kChannelTextOver:
|
||||
if (command >= COMMAND_ID_64) trTextOver(command - COMMAND_ID_64);
|
||||
else viewSetSystemMessage("Invalid TextOver command by xobject #%d (object type %d)", nIndex, nType);
|
||||
return;
|
||||
case 4:
|
||||
case kChannelLevelExitNormal:
|
||||
levelEndLevel(0);
|
||||
return;
|
||||
case 5:
|
||||
case kChannelLevelExitSecret:
|
||||
levelEndLevel(1);
|
||||
return;
|
||||
// By NoOne: finished level and load custom level ¹ via numbered command.
|
||||
case kGDXChannelEndLevelCustom:
|
||||
levelEndLevelCustom(command - 64);
|
||||
case kChannelModernEndLevelCustom:
|
||||
if (command >= COMMAND_ID_64) levelEndLevelCustom(command - COMMAND_ID_64);
|
||||
else viewSetSystemMessage("Invalid Level-Exit# command by xobject #%d (object type %d)", nIndex, nType);
|
||||
return;
|
||||
case 1:
|
||||
if (command < COMMAND_ID_64)
|
||||
ThrowError("Invalid SetupSecret command by xobject %d(type %d)", nIndex, nType);
|
||||
levelSetupSecret(command - COMMAND_ID_64);
|
||||
case kChannelSetTotalSecrets:
|
||||
if (command >= COMMAND_ID_64) levelSetupSecret(command - COMMAND_ID_64);
|
||||
else viewSetSystemMessage("Invalid Total-Secrets command by xobject #%d (object type %d)", nIndex, nType);
|
||||
break;
|
||||
case 2:
|
||||
if (command < COMMAND_ID_64)
|
||||
ThrowError("Invalid Secret command by xobject %d(type %d)", nIndex, nType);
|
||||
levelTriggerSecret(command - COMMAND_ID_64);
|
||||
case kChannelSecretFound:
|
||||
if (command >= COMMAND_ID_64) levelTriggerSecret(command - COMMAND_ID_64);
|
||||
else viewSetSystemMessage("Invalid Trigger-Secret command by xobject #%d (object type %d)", nIndex, nType);
|
||||
break;
|
||||
case 90:
|
||||
case 91:
|
||||
case 92:
|
||||
case 93:
|
||||
case 94:
|
||||
case 95:
|
||||
case 96:
|
||||
case 97:
|
||||
for (int nSprite = headspritestat[4]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
case kChannelRemoteBomb0:
|
||||
case kChannelRemoteBomb1:
|
||||
case kChannelRemoteBomb2:
|
||||
case kChannelRemoteBomb3:
|
||||
case kChannelRemoteBomb4:
|
||||
case kChannelRemoteBomb5:
|
||||
case kChannelRemoteBomb6:
|
||||
case kChannelRemoteBomb7:
|
||||
for (int nSprite = headspritestat[kStatThing]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->flags&32)
|
||||
|
@ -418,13 +414,13 @@ void evSend(int nIndex, int nType, int rxId, COMMAND_ID command)
|
|||
{
|
||||
XSPRITE *pXSprite = &xsprite[nXSprite];
|
||||
if (pXSprite->rxID == rxId)
|
||||
trMessageSprite(nSprite, evn);
|
||||
trMessageSprite(nSprite, event);
|
||||
}
|
||||
}
|
||||
return;
|
||||
case 80:
|
||||
case 81:
|
||||
for (int nSprite = headspritestat[3]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
case kChannelTeamAFlagCaptured:
|
||||
case kChannelTeamBFlagCaptured:
|
||||
for (int nSprite = headspritestat[kStatItem]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->flags&32)
|
||||
|
@ -434,39 +430,38 @@ void evSend(int nIndex, int nType, int rxId, COMMAND_ID command)
|
|||
{
|
||||
XSPRITE *pXSprite = &xsprite[nXSprite];
|
||||
if (pXSprite->rxID == rxId)
|
||||
trMessageSprite(nSprite, evn);
|
||||
trMessageSprite(nSprite, event);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
for (int i = bucketHead[rxId]; i < bucketHead[rxId+1]; i++)
|
||||
{
|
||||
if (evn.type != rxBucket[i].type || evn.index != rxBucket[i].index)
|
||||
{
|
||||
switch (rxBucket[i].type)
|
||||
{
|
||||
case 6:
|
||||
trMessageSector(rxBucket[i].index, evn);
|
||||
break;
|
||||
case 0:
|
||||
trMessageWall(rxBucket[i].index, evn);
|
||||
break;
|
||||
case 3:
|
||||
{
|
||||
int nSprite = rxBucket[i].index;
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->flags&32)
|
||||
continue;
|
||||
int nXSprite = pSprite->extra;
|
||||
if (nXSprite > 0)
|
||||
|
||||
for (int i = bucketHead[rxId]; i < bucketHead[rxId+1]; i++) {
|
||||
if (event.type != rxBucket[i].type || event.index != rxBucket[i].index) {
|
||||
switch (rxBucket[i].type) {
|
||||
case 6:
|
||||
trMessageSector(rxBucket[i].index, event);
|
||||
break;
|
||||
case 0:
|
||||
trMessageWall(rxBucket[i].index, event);
|
||||
break;
|
||||
case 3:
|
||||
{
|
||||
XSPRITE *pXSprite = &xsprite[nXSprite];
|
||||
if (pXSprite->rxID > 0)
|
||||
trMessageSprite(nSprite, evn);
|
||||
int nSprite = rxBucket[i].index;
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->flags&32)
|
||||
continue;
|
||||
int nXSprite = pSprite->extra;
|
||||
if (nXSprite > 0)
|
||||
{
|
||||
XSPRITE *pXSprite = &xsprite[nXSprite];
|
||||
if (pXSprite->rxID > 0)
|
||||
trMessageSprite(nSprite, event);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,6 +25,34 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
|
||||
BEGIN_BLD_NS
|
||||
|
||||
|
||||
enum {
|
||||
kChannelZero = 0,
|
||||
kChannelSetTotalSecrets,
|
||||
kChannelSecretFound,
|
||||
kChannelTextOver,
|
||||
kChannelLevelExitNormal,
|
||||
kChannelLevelExitSecret,
|
||||
kChannelModernEndLevelCustom, // // custom level end
|
||||
kChannelLevelStartSinglePlayer,
|
||||
kChannelLevelStartMatch, // DM and TEAMS
|
||||
kChannelLevelStartCoop,
|
||||
kChannelLevelStartTeamsOnly,
|
||||
kChannelPlayerDeathTeamA = 15,
|
||||
kChannelPlayerDeathTeamB,
|
||||
kChannelMapExtended = 60, // map requires modern features to work properly
|
||||
kChannelTeamAFlagCaptured = 80,
|
||||
kChannelTeamBFlagCaptured,
|
||||
kChannelRemoteBomb0 = 90,
|
||||
kChannelRemoteBomb1,
|
||||
kChannelRemoteBomb2,
|
||||
kChannelRemoteBomb3,
|
||||
kChannelRemoteBomb4,
|
||||
kChannelRemoteBomb5,
|
||||
kChannelRemoteBomb6,
|
||||
kChannelRemoteBomb7,
|
||||
};
|
||||
|
||||
#define kMaxChannels 4096
|
||||
|
||||
struct RXBUCKET
|
||||
|
@ -51,6 +79,7 @@ enum COMMAND_ID {
|
|||
COMMAND_ID_21,
|
||||
kGDXCommandPaste = 53, // used by some new GDX types
|
||||
COMMAND_ID_64 = 64,
|
||||
kCommandMapExtend = 100
|
||||
};
|
||||
|
||||
struct EVENT {
|
||||
|
|
|
@ -169,7 +169,7 @@ spritetype * CFX::fxSpawn(FX_ID nFx, int nSector, int x, int y, int z, unsigned
|
|||
FXDATA *pFX = &gFXData[nFx];
|
||||
if (gStatCount[1] == 512)
|
||||
{
|
||||
int nSprite = headspritestat[1];;
|
||||
int nSprite = headspritestat[kStatFX];;
|
||||
while ((sprite[nSprite].flags & 32) && nSprite != -1)
|
||||
nSprite = nextspritestat[nSprite];
|
||||
if (nSprite == -1)
|
||||
|
@ -205,7 +205,7 @@ spritetype * CFX::fxSpawn(FX_ID nFx, int nSector, int x, int y, int z, unsigned
|
|||
|
||||
void CFX::fxProcess(void)
|
||||
{
|
||||
for (int nSprite = headspritestat[1]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (int nSprite = headspritestat[kStatFX]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
viewBackupSpriteLoc(nSprite, pSprite);
|
||||
|
|
|
@ -42,6 +42,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
#include "sound.h"
|
||||
#include "sfx.h"
|
||||
#include "view.h"
|
||||
#include "eventq.h"
|
||||
|
||||
BEGIN_BLD_NS
|
||||
|
||||
|
|
|
@ -35,7 +35,8 @@ enum MESSAGE_PRIORITY {
|
|||
MESSAGE_PRIORITY_PICKUP = -10,
|
||||
MESSAGE_PRIORITY_NORMAL = 0,
|
||||
MESSAGE_PRIORITY_SECRET = 10,
|
||||
MESSAGE_PRIORITY_INI = 20
|
||||
MESSAGE_PRIORITY_INI = 20,
|
||||
MESSAGE_PRIORITY_SYSTEM = 100
|
||||
};
|
||||
|
||||
class CGameMessageMgr
|
||||
|
|
|
@ -258,7 +258,7 @@ void sub_557C4(int x, int y, int interpolation)
|
|||
GetSpriteExtents(pSprite, &top, &bottom);
|
||||
int zCeil, zFloor;
|
||||
getzsofslope(nSector, pSprite->x, pSprite->y, &zCeil, &zFloor);
|
||||
if (pSprite->statnum == 6 && (top < zCeil || bottom > zFloor))
|
||||
if (pSprite->statnum == kStatDude && (top < zCeil || bottom > zFloor))
|
||||
{
|
||||
int j = i;
|
||||
if (mirror[i].at0 == 2)
|
||||
|
@ -285,7 +285,7 @@ void sub_557C4(int x, int y, int interpolation)
|
|||
pTSprite->xoffset = pSprite->xoffset;
|
||||
pTSprite->yoffset = pSprite->yoffset;
|
||||
pTSprite->cstat = pSprite->cstat;
|
||||
pTSprite->statnum = 0;
|
||||
pTSprite->statnum = kStatDecoration;
|
||||
pTSprite->owner = pSprite->index;
|
||||
pTSprite->extra = pSprite->extra;
|
||||
pTSprite->flags = pSprite->hitag|0x200;
|
||||
|
|
|
@ -1056,7 +1056,7 @@ void playerInit(int nPlayer, unsigned int a2)
|
|||
|
||||
char sub_3A158(PLAYER *a1, spritetype *a2)
|
||||
{
|
||||
for (int nSprite = headspritestat[4]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (int nSprite = headspritestat[kStatThing]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
if (a2 && a2->index == nSprite)
|
||||
continue;
|
||||
|
@ -1392,7 +1392,7 @@ void CheckPickUp(PLAYER *pPlayer)
|
|||
int z = pSprite->z;
|
||||
int nSector = pSprite->sectnum;
|
||||
int nNextSprite;
|
||||
for (int nSprite = headspritestat[3]; nSprite >= 0; nSprite = nNextSprite)
|
||||
for (int nSprite = headspritestat[kStatItem]; nSprite >= 0; nSprite = nNextSprite)
|
||||
{
|
||||
spritetype *pItem = &sprite[nSprite];
|
||||
nNextSprite = nextspritestat[nSprite];
|
||||
|
@ -1440,7 +1440,7 @@ int ActionScan(PLAYER *pPlayer, int *a2, int *a3)
|
|||
case 3:
|
||||
*a2 = gHitInfo.hitsprite;
|
||||
*a3 = sprite[*a2].extra;
|
||||
if (*a3 > 0 && sprite[*a2].statnum == 4)
|
||||
if (*a3 > 0 && sprite[*a2].statnum == kStatThing)
|
||||
{
|
||||
spritetype *pSprite = &sprite[*a2];
|
||||
XSPRITE *pXSprite = &xsprite[*a3];
|
||||
|
@ -1454,7 +1454,7 @@ int ActionScan(PLAYER *pPlayer, int *a2, int *a3)
|
|||
}
|
||||
if (*a3 > 0 && xsprite[*a3].Push)
|
||||
return 3;
|
||||
if (sprite[*a2].statnum == 6)
|
||||
if (sprite[*a2].statnum == kStatDude)
|
||||
{
|
||||
spritetype *pSprite = &sprite[*a2];
|
||||
XSPRITE *pXSprite = &xsprite[*a3];
|
||||
|
@ -1542,7 +1542,7 @@ void ProcessInput(PLAYER *pPlayer)
|
|||
{
|
||||
if (pPlayer->pSprite)
|
||||
pPlayer->pSprite->type = 426;
|
||||
actPostSprite(pPlayer->at5b, 4);
|
||||
actPostSprite(pPlayer->at5b, kStatThing);
|
||||
seqSpawn(pPlayer->pDudeInfo->seqStartID+15, 3, pPlayer->pSprite->extra, -1);
|
||||
playerReset(pPlayer);
|
||||
if (gGameOptions.nGameType == 0 && numplayers == 1)
|
||||
|
|
|
@ -315,7 +315,7 @@ void sub_43CF8(spritetype *pSprite, XSPRITE *pXSprite, EVENT a3)
|
|||
if (!pXSprite->stateTimer)
|
||||
{
|
||||
spritetype *pTarget = &sprite[nTarget];
|
||||
if (pTarget->statnum == 6 && !(pTarget->flags&32) && pTarget->extra > 0 && pTarget->extra < kMaxXSprites)
|
||||
if (pTarget->statnum == kStatDude && !(pTarget->flags&32) && pTarget->extra > 0 && pTarget->extra < kMaxXSprites)
|
||||
{
|
||||
int top, bottom;
|
||||
GetSpriteExtents(pSprite, &top, &bottom);
|
||||
|
@ -389,7 +389,7 @@ void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT a3)
|
|||
}
|
||||
return;
|
||||
}
|
||||
if (pSprite->statnum == 6 && pSprite->type >= kDudeBase && pSprite->type < kDudeMax)
|
||||
if (pSprite->statnum == kStatDude && pSprite->type >= kDudeBase && pSprite->type < kDudeMax)
|
||||
{
|
||||
switch (a3.cmd)
|
||||
{
|
||||
|
@ -658,6 +658,13 @@ void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT a3)
|
|||
modernTypeSetSpriteState(nSprite, pXSprite, pXSprite->state ^ 1);
|
||||
break;
|
||||
case kGDXObjPropertiesChanger:
|
||||
if (pXSprite->txID <= 0) {
|
||||
if (SetSpriteState(nSprite, pXSprite, pXSprite->state ^ 1) == 1)
|
||||
usePropertiesChanger(pXSprite, -1, -1);
|
||||
break;
|
||||
}
|
||||
modernTypeSetSpriteState(nSprite, pXSprite, pXSprite->state ^ 1);
|
||||
break;
|
||||
case kGDXObjPicnumChanger:
|
||||
case kGDXObjSizeChanger:
|
||||
case kGDXSectorFXChanger:
|
||||
|
@ -878,7 +885,7 @@ void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT a3)
|
|||
|
||||
break;
|
||||
case 402:
|
||||
if (pSprite->statnum == 8)
|
||||
if (pSprite->statnum == kStatRespawn)
|
||||
break;
|
||||
if (a3.cmd != 1)
|
||||
actExplodeSprite(pSprite);
|
||||
|
@ -890,7 +897,7 @@ void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT a3)
|
|||
break;
|
||||
case 401:
|
||||
case kGDXThingTNTProx:
|
||||
if (pSprite->statnum == 8)
|
||||
if (pSprite->statnum == kStatRespawn)
|
||||
break;
|
||||
switch (a3.cmd)
|
||||
{
|
||||
|
@ -1208,6 +1215,241 @@ void useConcussSprite(XSPRITE* pXSource, spritetype* pSprite) {
|
|||
//debrisConcuss(pXSource->reference, nIndex, pSprite->x - 100, pSprite->y - 100, pSprite->z - 100, pXSource->data1);
|
||||
}
|
||||
|
||||
void usePropertiesChanger(XSPRITE* pXSource, short objType, int objIndex) {
|
||||
|
||||
switch (objType) {
|
||||
|
||||
// for walls
|
||||
case 0: {
|
||||
walltype* pWall = &wall[objIndex]; int old = -1;
|
||||
|
||||
// data3 = set wall hitag
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767))
|
||||
pWall->hitag = pXSource->data3;
|
||||
|
||||
// data4 = set wall cstat
|
||||
if (valueIsBetween(pXSource->data4, -1, 65535)) {
|
||||
old = pWall->cstat;
|
||||
pWall->cstat = pXSource->data4; // set new cstat
|
||||
|
||||
// and hanlde exceptions
|
||||
if ((old & 0x2) && !(pWall->cstat & 0x2)) pWall->cstat |= 0x2; // kWallBottomSwap
|
||||
if ((old & 0x4) && !(pWall->cstat & 0x4)) pWall->cstat |= 0x4; // kWallBottomOrg, kWallOutsideOrg
|
||||
if ((old & 0x20) && !(pWall->cstat & 0x20)) pWall->cstat |= 0x20; // kWallOneWay
|
||||
|
||||
if (old & 0xc000) {
|
||||
|
||||
if (!(pWall->cstat & 0xc000))
|
||||
pWall->cstat |= 0xc000; // kWallMoveMask
|
||||
|
||||
if ((old & 0x0) && !(pWall->cstat & 0x0)) pWall->cstat |= 0x0; // kWallMoveNone
|
||||
else if ((old & 0x4000) && !(pWall->cstat & 0x4000)) pWall->cstat |= 0x4000; // kWallMoveForward
|
||||
else if ((old & 0x8000) && !(pWall->cstat & 0x8000)) pWall->cstat |= 0x8000; // kWallMoveBackward
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// for sprites
|
||||
case 3: {
|
||||
spritetype* pSprite = &sprite[objIndex]; bool thing2debris = false;
|
||||
XSPRITE* pXSprite = &xsprite[pSprite->extra]; int old = -1;
|
||||
|
||||
// data3 = set sprite hitag
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767)) {
|
||||
old = pSprite->hitag; pSprite->hitag = pXSource->data3; // set new hitag
|
||||
|
||||
// and handle exceptions
|
||||
if ((old & kHitagFree) && !(pSprite->hitag & kHitagFree)) pSprite->hitag |= kHitagFree;
|
||||
if ((old & kHitagRespawn) && !(pSprite->hitag & kHitagRespawn)) pSprite->hitag |= kHitagRespawn;
|
||||
|
||||
// prepare things for different (debris) physics.
|
||||
if (pSprite->statnum == kStatThing && debrisGetFreeIndex() >= 0) thing2debris = true;
|
||||
|
||||
}
|
||||
|
||||
// data2 = sprite physics settings
|
||||
if ((pXSource->data2 >= 0 && pXSource->data3 <= 33) || thing2debris) {
|
||||
switch (pSprite->statnum) {
|
||||
case kStatDude: // dudes already treating in game
|
||||
case kStatFree:
|
||||
case kStatMarker:
|
||||
case kStatPathMarker: // path marker
|
||||
break;
|
||||
default:
|
||||
// store physics attributes in xsprite to avoid setting hitag for modern types!
|
||||
int flags = (pXSprite->physAttr != 0) ? pXSprite->physAttr : 0;
|
||||
|
||||
if (thing2debris) {
|
||||
|
||||
// converting thing to debris
|
||||
if ((pSprite->hitag & kPhysMove) != 0) flags |= kPhysMove;
|
||||
else flags &= ~kPhysMove;
|
||||
|
||||
if ((pSprite->hitag & kPhysGravity) != 0) flags |= (kPhysGravity | kPhysFalling);
|
||||
else flags &= ~(kPhysGravity | kPhysFalling);
|
||||
|
||||
pSprite->hitag &= ~(kPhysMove | kPhysGravity | kPhysFalling);
|
||||
xvel[objIndex] = yvel[objIndex] = zvel[objIndex] = 0; pXSprite->restState = pXSprite->state;
|
||||
|
||||
} else {
|
||||
|
||||
// first digit of data2: set main physics attributes
|
||||
switch (pXSource->data2) {
|
||||
case 0:
|
||||
flags &= ~kPhysMove;
|
||||
flags &= ~(kPhysGravity | kPhysFalling);
|
||||
break;
|
||||
|
||||
case 1: case 10: case 11: case 12: case 13:
|
||||
flags |= kPhysMove;
|
||||
flags &= ~(kPhysGravity | kPhysFalling);
|
||||
break;
|
||||
|
||||
case 2: case 20: case 21: case 22: case 23:
|
||||
flags &= ~kPhysMove;
|
||||
flags |= (kPhysGravity | kPhysFalling);
|
||||
break;
|
||||
|
||||
case 3: case 30: case 31: case 32: case 33:
|
||||
flags |= kPhysMove;
|
||||
flags |= (kPhysGravity | kPhysFalling);
|
||||
break;
|
||||
}
|
||||
|
||||
// second digit of data2: set physics flags
|
||||
switch (pXSource->data2) {
|
||||
case 0: case 1: case 2: case 3:
|
||||
case 10: case 20: case 30:
|
||||
flags &= ~kPhysDebrisVector;
|
||||
flags &= ~kPhysDebrisExplode;
|
||||
break;
|
||||
|
||||
case 11: case 21: case 31:
|
||||
flags |= kPhysDebrisVector;
|
||||
flags &= ~kPhysDebrisExplode;
|
||||
break;
|
||||
|
||||
case 12: case 22: case 32:
|
||||
flags &= ~kPhysDebrisVector;
|
||||
flags |= kPhysDebrisExplode;
|
||||
break;
|
||||
|
||||
case 13: case 23: case 33:
|
||||
flags |= kPhysDebrisVector;
|
||||
flags |= kPhysDebrisExplode;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int nIndex = isDebris(objIndex); // check if there is no sprite in list
|
||||
|
||||
// adding physics sprite in list
|
||||
if ((flags & kPhysGravity) != 0 || (flags & kPhysMove) != 0) {
|
||||
|
||||
if (nIndex != -1) pXSprite->physAttr = flags; // just update physics attributes
|
||||
else if ((nIndex = debrisGetFreeIndex()) < 0)
|
||||
showWarning("Max (%d) Physics affected sprites reached!", kMaxSuperXSprites);
|
||||
else {
|
||||
|
||||
pXSprite->physAttr = flags; // update physics attributes
|
||||
|
||||
// allow things to became debris, so they use different physics...
|
||||
if (pSprite->statnum == kStatThing) changespritestat(objIndex, 0);
|
||||
//actPostSprite(nDest, kStatDecoration); // !!!! not working here for some reason
|
||||
|
||||
gPhysSpritesList[nIndex] = objIndex;
|
||||
if (nIndex >= gPhysSpritesCount) gPhysSpritesCount++;
|
||||
getSpriteMassBySize(pSprite); // create physics cache
|
||||
|
||||
}
|
||||
|
||||
// removing physics from sprite in list (don't remove sprite from list)
|
||||
} else if (nIndex != -1) {
|
||||
|
||||
pXSprite->physAttr = flags;
|
||||
xvel[objIndex] = yvel[objIndex] = zvel[objIndex] = 0;
|
||||
if (pSprite->lotag >= kThingBase && pSprite->lotag < kThingMax)
|
||||
changespritestat(objIndex, kStatThing); // if it was a thing - restore statnum
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// data4 = sprite cstat
|
||||
if (valueIsBetween(pXSource->data4, -1, 65535)) {
|
||||
|
||||
old = pSprite->cstat;
|
||||
pSprite->cstat = pXSource->data4; // set new cstat
|
||||
|
||||
// and handle exceptions
|
||||
if ((old & 0x1000) && !(pSprite->cstat & 0x1000)) pSprite->cstat |= 0x1000; //kSpritePushable
|
||||
if ((old & 0x80) && !(pSprite->cstat & 0x80)) pSprite->cstat |= 0x80; // kSpriteOriginAlign
|
||||
|
||||
if (old & 0x6000) {
|
||||
|
||||
if (!(pSprite->cstat & 0x6000))
|
||||
pSprite->cstat |= 0x6000; // kSpriteMoveMask
|
||||
|
||||
if ((old & 0x0) && !(pSprite->cstat & 0x0)) pSprite->cstat |= 0x0; // kSpriteMoveNone
|
||||
else if ((old & 0x2000) && !(pSprite->cstat & 0x2000)) pSprite->cstat |= 0x2000; // kSpriteMoveForward, kSpriteMoveFloor
|
||||
else if ((old & 0x4000) && !(pSprite->cstat & 0x4000)) pSprite->cstat |= 0x4000; // kSpriteMoveReverse, kSpriteMoveCeiling
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// for sectors
|
||||
case 6: {
|
||||
|
||||
XSECTOR* pXSector = &xsector[sector[objIndex].extra];
|
||||
|
||||
// data1 = sector underwater status and depth level
|
||||
if (pXSource->data1 == 0) pXSector->Underwater = false;
|
||||
else if (pXSource->data1 == 1) pXSector->Underwater = true;
|
||||
else if (pXSource->data1 > 9) pXSector->Depth = 7;
|
||||
else if (pXSource->data1 > 1) pXSector->Depth = pXSource->data1 - 2;
|
||||
|
||||
|
||||
// data2 = sector visibility
|
||||
if (valueIsBetween(pXSource->data2, -1, 32767)) {
|
||||
if (pXSource->data2 > 234) sector[objIndex].visibility = 234;
|
||||
else sector[objIndex].visibility = pXSource->data2;
|
||||
}
|
||||
|
||||
// data3 = sector ceil cstat
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767))
|
||||
sector[objIndex].ceilingstat = pXSource->data3;
|
||||
|
||||
// data4 = sector floor cstat
|
||||
if (valueIsBetween(pXSource->data4, -1, 65535))
|
||||
sector[objIndex].floorstat = pXSource->data4;
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
// no TX id
|
||||
case -1: {
|
||||
|
||||
// data2 = global visibility
|
||||
if (valueIsBetween(pXSource->data2, -1, 32767))
|
||||
gVisibility = ClipRange(pXSource->data2, 0, 4096);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void useTeleportTarget(XSPRITE* pXSource, spritetype* pSprite) {
|
||||
spritetype* pSource = &sprite[pXSource->reference];
|
||||
XSECTOR* pXSector = (sector[pSource->sectnum].extra >= 0) ? &xsector[sector[pSource->sectnum].extra] : NULL;
|
||||
|
@ -1270,21 +1512,14 @@ void useEffectGen(XSPRITE * pXSource, spritetype * pSprite) {
|
|||
if (pSprite == NULL) pSprite = &sprite[pXSource->reference];
|
||||
if (pSprite->extra < 0) return;
|
||||
|
||||
int fxId = pXSource->data2 + Random(pXSource->data3);
|
||||
int top, bottom; GetSpriteExtents(pSprite, &top, &bottom); spritetype * pEffect = NULL;
|
||||
int dx = 0, dy = 0; int cnt = (pXSource->data4 > 32) ? 32 : pXSource->data4;
|
||||
|
||||
while (cnt-- >= 0) {
|
||||
if (cnt > 0) {
|
||||
int dx = Random3(250);
|
||||
int dy = Random3(150);
|
||||
}
|
||||
|
||||
pEffect = gFX.fxSpawn((FX_ID)pXSource->data2, pSprite->sectnum, pSprite->x + dx, pSprite->y + dy, top, 0);
|
||||
if (pEffect != NULL) {
|
||||
|
||||
if (fxId > 0 && fxId < 57 && (pEffect = gFX.fxSpawn((FX_ID) fxId, pSprite->sectnum, pSprite->x, pSprite->y, top, 0)) != NULL) {
|
||||
if ((pEffect->cstat & CSTAT_SPRITE_ALIGNMENT_WALL) && (pEffect->cstat & CSTAT_SPRITE_ONE_SIDED))
|
||||
pEffect->cstat &= ~CSTAT_SPRITE_ONE_SIDED;
|
||||
|
||||
if (pSprite->flags & kModernTypeFlag1) {
|
||||
if (pEffect->pal <= 0) pEffect->pal = pSprite->pal;
|
||||
if (pEffect->xrepeat <= 0) pEffect->xrepeat = pSprite->xrepeat;
|
||||
if (pEffect->yrepeat <= 0) pEffect->yrepeat = pSprite->yrepeat;
|
||||
|
@ -1292,8 +1527,9 @@ void useEffectGen(XSPRITE * pXSource, spritetype * pSprite) {
|
|||
}
|
||||
}
|
||||
|
||||
if (pXSource->data3 > 0)
|
||||
sfxPlay3DSound(pSprite, pXSource->data3, -1, 0);
|
||||
if (pXSource->data4 > 0)
|
||||
sfxPlay3DSound(pSprite, pXSource->data4, -1, 0);
|
||||
// kModernTypeFlag = 2: kill the sound before play again
|
||||
|
||||
}
|
||||
|
||||
|
@ -1590,7 +1826,7 @@ void SectorStartSound(int nSector, int nState)
|
|||
for (int nSprite = headspritesect[nSector]; nSprite >= 0; nSprite = nextspritesect[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->statnum == 0 && pSprite->type == 709)
|
||||
if (pSprite->statnum == kStatDecoration && pSprite->type == 709)
|
||||
{
|
||||
int nXSprite = pSprite->extra;
|
||||
dassert(nXSprite > 0 && nXSprite < kMaxXSprites);
|
||||
|
@ -1614,7 +1850,7 @@ void SectorEndSound(int nSector, int nState)
|
|||
for (int nSprite = headspritesect[nSector]; nSprite >= 0; nSprite = nextspritesect[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->statnum == 0 && pSprite->type == 709)
|
||||
if (pSprite->statnum == kStatDecoration && pSprite->type == 709)
|
||||
{
|
||||
int nXSprite = pSprite->extra;
|
||||
dassert(nXSprite > 0 && nXSprite < kMaxXSprites);
|
||||
|
@ -1638,7 +1874,7 @@ void PathSound(int nSector, int nSound)
|
|||
for (int nSprite = headspritesect[nSector]; nSprite >= 0; nSprite = nextspritesect[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->statnum == 0 && pSprite->type == 709)
|
||||
if (pSprite->statnum == kStatDecoration && pSprite->type == 709)
|
||||
sfxPlay3DSound(pSprite, nSound, 0, 0);
|
||||
}
|
||||
}
|
||||
|
@ -1751,7 +1987,7 @@ void TranslateSector(int nSector, int a2, int a3, int a4, int a5, int a6, int a7
|
|||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
// By NoOne: allow to move markers by sector movements in game if flags 1 is added in editor.
|
||||
if (pSprite->statnum == 10 || pSprite->statnum == 16) {
|
||||
if (pSprite->statnum == kStatMarker || pSprite->statnum == kStatPathMarker) {
|
||||
if (!(pSprite->flags & kModernTypeFlag1)) continue;
|
||||
}
|
||||
x = baseSprite[nSprite].x;
|
||||
|
@ -1805,7 +2041,7 @@ void ZTranslateSector(int nSector, XSECTOR *pXSector, int a3, int a4)
|
|||
for (int nSprite = headspritesect[nSector]; nSprite >= 0; nSprite = nextspritesect[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->statnum == 10 || pSprite->statnum == 16)
|
||||
if (pSprite->statnum == kStatMarker || pSprite->statnum == kStatPathMarker)
|
||||
continue;
|
||||
int top, bottom;
|
||||
GetSpriteExtents(pSprite, &top, &bottom);
|
||||
|
@ -1832,7 +2068,7 @@ void ZTranslateSector(int nSector, XSECTOR *pXSector, int a3, int a4)
|
|||
for (int nSprite = headspritesect[nSector]; nSprite >= 0; nSprite = nextspritesect[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->statnum == 10 || pSprite->statnum == 16)
|
||||
if (pSprite->statnum == kStatMarker || pSprite->statnum == kStatPathMarker)
|
||||
continue;
|
||||
if (pSprite->cstat&16384)
|
||||
{
|
||||
|
@ -1849,7 +2085,7 @@ int GetHighestSprite(int nSector, int nStatus, int *a3)
|
|||
int v8 = -1;
|
||||
for (int nSprite = headspritesect[nSector]; nSprite >= 0; nSprite = nextspritesect[nSprite])
|
||||
{
|
||||
if (sprite[nSprite].statnum == nStatus || nStatus == 1024)
|
||||
if (sprite[nSprite].statnum == nStatus || nStatus == kStatFree)
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
int top, bottom;
|
||||
|
@ -1874,7 +2110,7 @@ int GetCrushedSpriteExtents(unsigned int nSector, int *pzTop, int *pzBot)
|
|||
for (int nSprite = headspritesect[nSector]; nSprite >= 0; nSprite = nextspritesect[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->statnum == 6 || pSprite->statnum == 4)
|
||||
if (pSprite->statnum == kStatDude || pSprite->statnum == kStatThing)
|
||||
{
|
||||
int top, bottom;
|
||||
GetSpriteExtents(pSprite, &top, &bottom);
|
||||
|
@ -2261,7 +2497,7 @@ char SectorContainsDudes(int nSector)
|
|||
{
|
||||
for (int nSprite = headspritesect[nSector]; nSprite >= 0; nSprite = nextspritesect[nSprite])
|
||||
{
|
||||
if (sprite[nSprite].statnum == 6)
|
||||
if (sprite[nSprite].statnum == kStatDude)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
@ -2272,9 +2508,9 @@ void TeleFrag(int nKiller, int nSector)
|
|||
for (int nSprite = headspritesect[nSector]; nSprite >= 0; nSprite = nextspritesect[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->statnum == 6)
|
||||
if (pSprite->statnum == kStatDude)
|
||||
actDamageSprite(nKiller, pSprite, DAMAGE_TYPE_3, 4000);
|
||||
else if (pSprite->statnum == 4)
|
||||
else if (pSprite->statnum == kStatThing)
|
||||
actDamageSprite(nKiller, pSprite, DAMAGE_TYPE_3, 4000);
|
||||
}
|
||||
}
|
||||
|
@ -2291,7 +2527,7 @@ void OperateTeleport(unsigned int nSector, XSECTOR *pXSector)
|
|||
for (int nSprite = headspritesect[nSector]; nSprite >= 0; nSprite = nextspritesect[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->statnum == 6)
|
||||
if (pSprite->statnum == kStatDude)
|
||||
{
|
||||
PLAYER *pPlayer;
|
||||
char bPlayer = IsPlayerSprite(pSprite);
|
||||
|
@ -2331,10 +2567,10 @@ void OperatePath(unsigned int nSector, XSECTOR *pXSector, EVENT a3)
|
|||
spritetype *pSprite2 = &sprite[pXSector->at2c_0];
|
||||
XSPRITE *pXSprite2 = &xsprite[pSprite2->extra];
|
||||
int nId = pXSprite2->data2;
|
||||
for (nSprite = headspritestat[16]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (nSprite = headspritestat[kStatPathMarker]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
pSprite = &sprite[nSprite];
|
||||
if (pSprite->type == 15)
|
||||
if (pSprite->type == kMarkerPath)
|
||||
{
|
||||
pXSprite = &xsprite[pSprite->extra];
|
||||
if (pXSprite->data1 == nId)
|
||||
|
@ -2472,10 +2708,10 @@ void InitPath(unsigned int nSector, XSECTOR *pXSector)
|
|||
XSPRITE *pXSprite;
|
||||
dassert(nSector < (unsigned int)numsectors);
|
||||
int nId = pXSector->data;
|
||||
for (nSprite = headspritestat[16]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (nSprite = headspritestat[kStatPathMarker]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
pSprite = &sprite[nSprite];
|
||||
if (pSprite->type == 15)
|
||||
if (pSprite->type == kMarkerPath)
|
||||
{
|
||||
pXSprite = &xsprite[pSprite->extra];
|
||||
if (pXSprite->data1 == nId)
|
||||
|
@ -3041,7 +3277,7 @@ void pastePropertiesInObj(int type, int nDest, EVENT event) {
|
|||
/* 4: follow player(s) when no targets in sight, attack targets if any in sight - */
|
||||
|
||||
if (type != 3) return;
|
||||
else if (!IsDudeSprite(&sprite[nDest]) && sprite[nDest].statnum != 6 && xsprite[sprite[nDest].extra].data3 != 0) {
|
||||
else if (!IsDudeSprite(&sprite[nDest]) && sprite[nDest].statnum != kStatDude && xsprite[sprite[nDest].extra].data3 != 0) {
|
||||
switch (sprite[nDest].type) { // can be dead dude turned in gib
|
||||
// make current target and all other dudes not attack this dude anymore
|
||||
case 425:
|
||||
|
@ -3082,7 +3318,7 @@ void pastePropertiesInObj(int type, int nDest, EVENT event) {
|
|||
|
||||
// dude is dead?
|
||||
if (pXSprite->health <= 0) {
|
||||
pSprite->type = 426; actPostSprite(pSprite->xvel, 4); // turn it in gib
|
||||
pSprite->type = 426; actPostSprite(pSprite->xvel, kStatThing); // turn it in gib
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3226,7 +3462,7 @@ void pastePropertiesInObj(int type, int nDest, EVENT event) {
|
|||
|
||||
if ((pXSprite->target < 0 || pPlayer != NULL) && ((int)gFrameClock & 32) != 0) {
|
||||
// try find first target that dude can see
|
||||
for (int nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
for (int nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
pTarget = &sprite[nSprite]; pXTarget = &xsprite[pTarget->extra];
|
||||
|
||||
if (pXTarget->target == pSprite->xvel) {
|
||||
|
@ -3419,218 +3655,9 @@ void pastePropertiesInObj(int type, int nDest, EVENT event) {
|
|||
}
|
||||
|
||||
} else if (pSource->type == kGDXObjPropertiesChanger) {
|
||||
|
||||
/* - properties changer can change various properties of sprite/wall/sector via TX ID - */
|
||||
/* - data1 = sector underwater status - */
|
||||
/* - data2 = sector visibility - */
|
||||
/* - data3 = sector ceiling cstat / sprite / wall flags - */
|
||||
/* - data4 = sector floor / sprite / wall cstat - */
|
||||
int old = -1;
|
||||
switch (type) {
|
||||
|
||||
// for sectors
|
||||
case 6: {
|
||||
XSECTOR* pXSector = &xsector[sector[nDest].extra];
|
||||
|
||||
if (pXSource->data1 == 0) pXSector->Underwater = false;
|
||||
else if (pXSource->data1 == 1) pXSector->Underwater = true;
|
||||
else if (pXSource->data1 > 9) pXSector->Depth = 7;
|
||||
else if (pXSource->data1 > 1) pXSector->Depth = pXSource->data1 - 2;
|
||||
|
||||
if (valueIsBetween(pXSource->data2, -1, 32767)) {
|
||||
if (pXSource->data2 > 234) sector[nDest].visibility = 234;
|
||||
else sector[nDest].visibility = pXSource->data2;
|
||||
/* - properties changer can change various properties - */
|
||||
usePropertiesChanger(pXSource, type, nDest);
|
||||
}
|
||||
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767))
|
||||
sector[nDest].ceilingstat = pXSource->data3;
|
||||
|
||||
if (valueIsBetween(pXSource->data4, -1, 65535))
|
||||
sector[nDest].floorstat = pXSource->data4;
|
||||
}
|
||||
break;
|
||||
|
||||
// for sprites
|
||||
case 3: {
|
||||
|
||||
spritetype* pSprite = &sprite[nDest]; bool thing2debris = false;
|
||||
XSPRITE* pXSprite = &xsprite[pSprite->extra];
|
||||
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767)) {
|
||||
old = pSprite->flags; pSprite->flags = pXSource->data3; // set new flags
|
||||
|
||||
// and handle exceptions
|
||||
if ((old & kHitagFree) && !(pSprite->flags & kHitagFree)) pSprite->flags |= kHitagFree;
|
||||
if ((old & kHitagRespawn) && !(pSprite->flags & kHitagRespawn)) pSprite->flags |= kHitagRespawn;
|
||||
|
||||
// prepare things for different (debris) physics.
|
||||
if (pSprite->statnum == 4 && debrisGetFreeIndex() >= 0) thing2debris = true;
|
||||
|
||||
}
|
||||
|
||||
if ((pXSource->data2 >= 0 && pXSource->data3 <= 33) || thing2debris) {
|
||||
switch (pSprite->statnum) {
|
||||
case 6: // dudes already treating in game
|
||||
case kStatFree:
|
||||
case kStatMarker:
|
||||
case 16: // path marker
|
||||
break;
|
||||
default:
|
||||
// store physics attributes in xsprite to avoid setting flags for modern types!
|
||||
int flags = (pXSprite->physAttr != 0) ? pXSprite->physAttr : 0;
|
||||
|
||||
if (thing2debris) {
|
||||
|
||||
// converting thing to debris
|
||||
if ((pSprite->flags & kPhysMove) != 0) flags |= kPhysMove;
|
||||
else flags &= ~kPhysMove;
|
||||
|
||||
if ((pSprite->flags & kPhysGravity) != 0) flags |= (kPhysGravity | kPhysFalling);
|
||||
else flags &= ~(kPhysGravity | kPhysFalling);
|
||||
|
||||
pSprite->flags &= ~(kPhysMove | kPhysGravity | kPhysFalling);
|
||||
xvel[nDest] = yvel[nDest] = zvel[nDest] = 0; pXSprite->restState = pXSprite->state;
|
||||
|
||||
} else {
|
||||
|
||||
// first digit of data2: set main physics attributes first
|
||||
switch (pXSource->data2) {
|
||||
case 0:
|
||||
flags &= ~kPhysMove;
|
||||
flags &= ~(kPhysGravity | kPhysFalling);
|
||||
break;
|
||||
|
||||
case 1: case 10: case 11: case 12: case 13:
|
||||
flags |= kPhysMove;
|
||||
flags &= ~(kPhysGravity | kPhysFalling);
|
||||
break;
|
||||
|
||||
case 2: case 20: case 21: case 22: case 23:
|
||||
flags &= ~kPhysMove;
|
||||
flags |= (kPhysGravity | kPhysFalling);
|
||||
break;
|
||||
|
||||
case 3: case 30: case 31: case 32: case 33:
|
||||
flags |= kPhysMove;
|
||||
flags |= (kPhysGravity | kPhysFalling);
|
||||
break;
|
||||
}
|
||||
|
||||
// second digit of data2: then set physics flags
|
||||
switch (pXSource->data2) {
|
||||
case 0: case 1: case 2: case 3:
|
||||
case 10: case 20: case 30:
|
||||
flags &= ~kPhysDebrisVector;
|
||||
flags &= ~kPhysDebrisExplode;
|
||||
break;
|
||||
|
||||
case 11: case 21: case 31:
|
||||
flags |= kPhysDebrisVector;
|
||||
flags &= ~kPhysDebrisExplode;
|
||||
break;
|
||||
|
||||
case 12: case 22: case 32:
|
||||
flags &= ~kPhysDebrisVector;
|
||||
flags |= kPhysDebrisExplode;
|
||||
break;
|
||||
|
||||
case 13: case 23: case 33:
|
||||
flags |= kPhysDebrisVector;
|
||||
flags |= kPhysDebrisExplode;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int nIndex = isDebris(nDest); // check if there is no sprite in list
|
||||
|
||||
// adding physics sprite in list
|
||||
if ((flags & kPhysGravity) != 0 || (flags & kPhysMove) != 0) {
|
||||
if (nIndex != -1) pXSprite->physAttr = flags; // just update physics attributes
|
||||
else if ((nIndex = debrisGetFreeIndex()) < 0)
|
||||
;// showWarning("Max (%d) Physics affected sprites reached!", kMaxSuperXSprites);
|
||||
else {
|
||||
|
||||
pXSprite->physAttr = flags; // update physics attributes
|
||||
|
||||
// allow things to became debris, so they use different physics...
|
||||
if (pSprite->statnum == 4) changespritestat(nDest, 0);
|
||||
//actPostSprite(nDest, 0); // !!!! not working here for some reason
|
||||
|
||||
gPhysSpritesList[nIndex] = nDest;
|
||||
if (nIndex >= gPhysSpritesCount) gPhysSpritesCount++;
|
||||
getSpriteMassBySize(pSprite); // create physics cache
|
||||
|
||||
}
|
||||
// removing physics from sprite in list (don't remove sprite from list)
|
||||
} else if (nIndex != -1) {
|
||||
pXSprite->physAttr = flags;
|
||||
xvel[nDest] = yvel[nDest] = zvel[nDest] = 0;
|
||||
if (pSprite->type >= kThingBase && pSprite->type < kThingMax)
|
||||
changespritestat(nDest, 4); // if it was a thing - restore statnum
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (valueIsBetween(pXSource->data4, -1, 65535)) {
|
||||
|
||||
old = pSprite->cstat;
|
||||
pSprite->cstat = pXSource->data4; // set new cstat
|
||||
|
||||
// and handle exceptions
|
||||
if ((old & 0x1000) && !(pSprite->cstat & 0x1000)) pSprite->cstat |= 0x1000; //kSpritePushable
|
||||
if ((old & 0x80) && !(pSprite->cstat & 0x80)) pSprite->cstat |= 0x80; // kSpriteOriginAlign
|
||||
|
||||
if (old & 0x6000) {
|
||||
|
||||
if (!(pSprite->cstat & 0x6000))
|
||||
pSprite->cstat |= 0x6000; // kSpriteMoveMask
|
||||
|
||||
if ((old & 0x0) && !(pSprite->cstat & 0x0)) pSprite->cstat |= 0x0; // kSpriteMoveNone
|
||||
else if ((old & 0x2000) && !(pSprite->cstat & 0x2000)) pSprite->cstat |= 0x2000; // kSpriteMoveForward, kSpriteMoveFloor
|
||||
else if ((old & 0x4000) && !(pSprite->cstat & 0x4000)) pSprite->cstat |= 0x4000; // kSpriteMoveReverse, kSpriteMoveCeiling
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
// for walls
|
||||
case 0: {
|
||||
walltype* pWall = &wall[nDest];
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767))
|
||||
pWall->hitag = pXSource->data3;
|
||||
|
||||
if (valueIsBetween(pXSource->data4, -1, 65535)) {
|
||||
old = pWall->cstat;
|
||||
pWall->cstat = pXSource->data4; // set new cstat
|
||||
|
||||
// and hanlde exceptions
|
||||
if ((old & 0x2) && !(pWall->cstat & 0x2)) pWall->cstat |= 0x2; // kWallBottomSwap
|
||||
if ((old & 0x4) && !(pWall->cstat & 0x4)) pWall->cstat |= 0x4; // kWallBottomOrg, kWallOutsideOrg
|
||||
if ((old & 0x20) && !(pWall->cstat & 0x20)) pWall->cstat |= 0x20; // kWallOneWay
|
||||
|
||||
if (old & 0xc000) {
|
||||
|
||||
if (!(pWall->cstat & 0xc000))
|
||||
pWall->cstat |= 0xc000; // kWallMoveMask
|
||||
|
||||
if ((old & 0x0) && !(pWall->cstat & 0x0)) pWall->cstat |= 0x0; // kWallMoveNone
|
||||
else if ((old & 0x4000) && !(pWall->cstat & 0x4000)) pWall->cstat |= 0x4000; // kWallMoveForward
|
||||
else if ((old & 0x8000) && !(pWall->cstat & 0x8000)) pWall->cstat |= 0x8000; // kWallMoveBackward
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// By NoOne: the following functions required for kGDXDudeTargetChanger
|
||||
|
@ -3638,7 +3665,7 @@ void pastePropertiesInObj(int type, int nDest, EVENT event) {
|
|||
spritetype* getTargetInRange(spritetype* pSprite, int minDist, int maxDist, short data, short teamMode) {
|
||||
DUDEINFO* pDudeInfo = &dudeInfo[pSprite->type - kDudeBase]; XSPRITE* pXSprite = &xsprite[pSprite->extra];
|
||||
spritetype* pTarget = NULL; XSPRITE* pXTarget = NULL; spritetype* cTarget = NULL;
|
||||
for (int nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
for (int nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
pTarget = &sprite[nSprite]; pXTarget = &xsprite[pTarget->extra];
|
||||
if (!dudeCanSeeTarget(pXSprite, pDudeInfo, pTarget)) continue;
|
||||
|
||||
|
@ -3775,7 +3802,7 @@ void activateDudes(int rx) {
|
|||
|
||||
// by NoOne: this function sets target to -1 for all dudes that hunting for nSprite
|
||||
void freeTargets(int nSprite) {
|
||||
for (int nTarget = headspritestat[6]; nTarget >= 0; nTarget = nextspritestat[nTarget]) {
|
||||
for (int nTarget = headspritestat[kStatDude]; nTarget >= 0; nTarget = nextspritestat[nTarget]) {
|
||||
if (!IsDudeSprite(&sprite[nTarget]) || sprite[nTarget].extra < 0) continue;
|
||||
else if (xsprite[sprite[nTarget].extra].target == nSprite)
|
||||
aiSetTarget(&xsprite[sprite[nTarget].extra], sprite[nTarget].x, sprite[nTarget].y, sprite[nTarget].z);
|
||||
|
@ -3797,7 +3824,7 @@ void freeAllTargets(XSPRITE* pXSource) {
|
|||
|
||||
bool affectedByTargetChg(XSPRITE* pXDude) {
|
||||
if (pXDude->rxID <= 0 || pXDude->locked == 1) return false;
|
||||
for (int nSprite = headspritestat[kStatGDXDudeTargetChanger]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
for (int nSprite = headspritestat[kStatModernDudeTargetChanger]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
XSPRITE* pXSprite = (sprite[nSprite].extra >= 0) ? &xsprite[sprite[nSprite].extra] : NULL;
|
||||
if (pXSprite == NULL || pXSprite->txID <= 0 || pXSprite->state != 1) continue;
|
||||
for (int i = bucketHead[pXSprite->txID]; i < bucketHead[pXSprite->txID + 1]; i++) {
|
||||
|
@ -3910,7 +3937,7 @@ void disturbDudesInSight(spritetype* pSprite, int max) {
|
|||
spritetype* pDude = NULL; XSPRITE* pXDude = NULL;
|
||||
XSPRITE* pXSprite = &xsprite[pSprite->extra];
|
||||
DUDEINFO* pDudeInfo = &dudeInfo[pSprite->type - kDudeBase];
|
||||
for (int nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
for (int nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
|
||||
pDude = &sprite[nSprite];
|
||||
if (pDude->xvel == pSprite->xvel || !IsDudeSprite(pDude) || pDude->extra < 0)
|
||||
continue;
|
||||
|
@ -4415,7 +4442,7 @@ void ActivateGenerator(int nSprite)
|
|||
case 80: { // Random ammo
|
||||
// let's first search for previously dropped items and remove it
|
||||
if (pXSprite->dropMsg > 0) {
|
||||
for (short nItem = headspritestat[3]; nItem >= 0; nItem = nextspritestat[nItem]) {
|
||||
for (short nItem = headspritestat[kStatItem]; nItem >= 0; nItem = nextspritestat[nItem]) {
|
||||
spritetype* pItem = &sprite[nItem];
|
||||
if (pItem->type == pXSprite->dropMsg && pItem->x == pSprite->x && pItem->y == pSprite->y && pItem->z == pSprite->z) {
|
||||
gFX.fxSpawn((FX_ID)29, pSprite->sectnum, pSprite->x, pSprite->y, pSprite->z, 0);
|
||||
|
|
|
@ -75,7 +75,10 @@ void useEffectGen(XSPRITE* pXSource, spritetype* pSprite);
|
|||
void useSeqSpawnerGen(XSPRITE* pXSource, int objType, int index);
|
||||
void useSpriteDamager(XSPRITE* pXSource, spritetype* pSprite);
|
||||
void useTeleportTarget(XSPRITE* pXSource, spritetype* pSprite);
|
||||
void usePropertiesChanger(XSPRITE* pXSource, short objType, int objIndex);
|
||||
void TeleFrag(int nKiller, int nSector);
|
||||
bool valueIsBetween(int val, int min, int max);
|
||||
|
||||
// -------------------------------------------------------
|
||||
|
||||
END_BLD_NS
|
||||
|
|
|
@ -817,7 +817,7 @@ void fakeActAirDrag(spritetype *pSprite, int num)
|
|||
void fakeActProcessSprites(void)
|
||||
{
|
||||
spritetype *pSprite = gMe->pSprite;
|
||||
if (pSprite->statnum == 6)
|
||||
if (pSprite->statnum == kStatDude)
|
||||
{
|
||||
int nXSprite = pSprite->extra;
|
||||
dassert(nXSprite > 0 && nXSprite < kMaxXSprites);
|
||||
|
@ -1995,7 +1995,7 @@ uspritetype *viewAddEffect(int nTSprite, VIEW_EFFECT nViewEffect)
|
|||
pNSprite->shade = -128;
|
||||
pNSprite->z = pTSprite->z;
|
||||
pNSprite->picnum = 908;
|
||||
pNSprite->statnum = 0;
|
||||
pNSprite->statnum = kStatDecoration;
|
||||
pNSprite->xrepeat = pNSprite->yrepeat = (tilesiz[pTSprite->picnum].x*pTSprite->xrepeat)/64;
|
||||
break;
|
||||
}
|
||||
|
@ -2364,7 +2364,7 @@ void viewProcessSprites(int32_t cX, int32_t cY, int32_t cZ, int32_t cA, int32_t
|
|||
}
|
||||
switch (pTSprite->statnum)
|
||||
{
|
||||
case 0:
|
||||
case kStatDecoration:
|
||||
{
|
||||
switch (pTSprite->type)
|
||||
{
|
||||
|
@ -2415,7 +2415,7 @@ void viewProcessSprites(int32_t cX, int32_t cY, int32_t cZ, int32_t cA, int32_t
|
|||
}
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
case kStatItem:
|
||||
{
|
||||
switch (pTSprite->type)
|
||||
{
|
||||
|
@ -2454,7 +2454,7 @@ void viewProcessSprites(int32_t cX, int32_t cY, int32_t cZ, int32_t cA, int32_t
|
|||
}
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
case kStatProjectile:
|
||||
{
|
||||
switch (pTSprite->type)
|
||||
{
|
||||
|
@ -2470,7 +2470,7 @@ void viewProcessSprites(int32_t cX, int32_t cY, int32_t cZ, int32_t cA, int32_t
|
|||
break;
|
||||
case 301:
|
||||
case 303:
|
||||
if (pTSprite->statnum == 14)
|
||||
if (pTSprite->statnum == kStatFlare)
|
||||
{
|
||||
dassert(pTXSprite != NULL);
|
||||
if (pTXSprite->target == gView->at5b)
|
||||
|
@ -2498,7 +2498,7 @@ void viewProcessSprites(int32_t cX, int32_t cY, int32_t cZ, int32_t cA, int32_t
|
|||
}
|
||||
break;
|
||||
}
|
||||
case 6:
|
||||
case kStatDude:
|
||||
{
|
||||
if (pTSprite->type == 212 && pTXSprite->aiState == &hand13A3B4)
|
||||
{
|
||||
|
@ -2585,7 +2585,7 @@ void viewProcessSprites(int32_t cX, int32_t cY, int32_t cZ, int32_t cA, int32_t
|
|||
}
|
||||
break;
|
||||
}
|
||||
case 11:
|
||||
case kStatTraps:
|
||||
{
|
||||
if (pTSprite->type == 454)
|
||||
{
|
||||
|
@ -2614,7 +2614,7 @@ void viewProcessSprites(int32_t cX, int32_t cY, int32_t cZ, int32_t cA, int32_t
|
|||
}
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
case kStatThing:
|
||||
{
|
||||
if (pXSector && pXSector->color)
|
||||
{
|
||||
|
@ -2805,6 +2805,15 @@ void viewBurnTime(int gScale)
|
|||
}
|
||||
}
|
||||
|
||||
// by NoOne: show warning msgs in game instead of throwing errors (in some cases)
|
||||
void viewSetSystemMessage(const char* pMessage, ...) {
|
||||
char buffer[256]; va_list args; va_start(args, pMessage);
|
||||
vsprintf(buffer, pMessage, args);
|
||||
|
||||
OSD_Printf("%s\n", buffer);
|
||||
gGameMessageMgr.Add(buffer, 15, 7, MESSAGE_PRIORITY_SYSTEM);
|
||||
}
|
||||
|
||||
void viewSetMessage(const char *pMessage, const int pal, const MESSAGE_PRIORITY priority)
|
||||
{
|
||||
OSD_Printf("%s\n", pMessage);
|
||||
|
@ -3340,7 +3349,7 @@ RORHACKOTHER:
|
|||
deliriumTurn = 0;
|
||||
deliriumPitch = 0;
|
||||
}
|
||||
int nSprite = headspritestat[2];
|
||||
int nSprite = headspritestat[kStatExplosion];
|
||||
int unk = 0;
|
||||
while (nSprite >= 0)
|
||||
{
|
||||
|
@ -3354,7 +3363,7 @@ RORHACKOTHER:
|
|||
}
|
||||
nSprite = nextspritestat[nSprite];
|
||||
}
|
||||
nSprite = headspritestat[5];
|
||||
nSprite = headspritestat[kStatProjectile];
|
||||
while (nSprite >= 0)
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
|
|
|
@ -160,7 +160,7 @@ void viewUpdateShake(void);
|
|||
void viewSetCrosshairColor(int32_t r, int32_t g, int32_t b);
|
||||
void viewResetCrosshairToDefault(void);
|
||||
void viewPrintFPS(void);
|
||||
|
||||
void viewSetSystemMessage(const char* pMessage, ...);
|
||||
|
||||
inline void viewInterpolateSector(int nSector, sectortype *pSector)
|
||||
{
|
||||
|
|
|
@ -320,7 +320,7 @@ void UpdateAimVector(PLAYER * pPlayer)
|
|||
if (gProfile[pPlayer->at57].nAutoAim == 1 || (gProfile[pPlayer->at57].nAutoAim == 2 && !pWeaponTrack->bIsProjectile) || pPlayer->atbd == 10 || pPlayer->atbd == 9)
|
||||
{
|
||||
int nClosest = 0x7fffffff;
|
||||
for (nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
pSprite = &sprite[nSprite];
|
||||
if (pSprite == pPSprite)
|
||||
|
@ -378,7 +378,7 @@ void UpdateAimVector(PLAYER * pPlayer)
|
|||
}
|
||||
if (pWeaponTrack->atc > 0)
|
||||
{
|
||||
for (nSprite = headspritestat[4]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (nSprite = headspritestat[kStatThing]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
pSprite = &sprite[nSprite];
|
||||
if (!gGameOptions.bFriendlyFire && IsTargetTeammate(pPlayer, pSprite))
|
||||
|
@ -2251,7 +2251,7 @@ void WeaponProcess(PLAYER *pPlayer)
|
|||
{
|
||||
}
|
||||
pPlayer->voodooTarget = pPlayer->at1d6;
|
||||
if (pPlayer->voodooTarget == -1 || sprite[pPlayer->voodooTarget].statnum != 6)
|
||||
if (pPlayer->voodooTarget == -1 || sprite[pPlayer->voodooTarget].statnum != kStatDude)
|
||||
i = 4;
|
||||
StartQAV(pPlayer,103+i, nClientFireVoodoo, 0);
|
||||
return;
|
||||
|
@ -2462,9 +2462,9 @@ void sub_51340(spritetype *pMissile, int a2)
|
|||
char v4 = 1;
|
||||
int v24 = -1;
|
||||
actHitcodeToData(a2, &gHitInfo, &v24, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
if (a2 == 3 && v24 >= 0 && sprite[v24].statnum == 6)
|
||||
if (a2 == 3 && v24 >= 0 && sprite[v24].statnum == kStatDude)
|
||||
v4 = 0;
|
||||
for (int nSprite = headspritestat[6]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (int nSprite = headspritestat[kStatDude]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
if (nSprite != nOwner || v4)
|
||||
{
|
||||
|
@ -2482,7 +2482,7 @@ void sub_51340(spritetype *pMissile, int a2)
|
|||
}
|
||||
}
|
||||
}
|
||||
for (int nSprite = headspritestat[4]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
for (int nSprite = headspritestat[kStatThing]; nSprite >= 0; nSprite = nextspritestat[nSprite])
|
||||
{
|
||||
spritetype *pSprite = &sprite[nSprite];
|
||||
if (pSprite->flags&32)
|
||||
|
|
Loading…
Reference in a new issue