- Blood: applied all changes outside of nnexts.cpp from the latest modern update.

This commit is contained in:
Christoph Oelckers 2022-11-16 07:53:21 +01:00
parent d3217a3e54
commit e776e76ebf
8 changed files with 59 additions and 45 deletions

View file

@ -194,6 +194,11 @@ template<typename T> bool IsDudeSprite(T const * const pSprite)
return pSprite->type >= kDudeBase && pSprite->type < kDudeMax; return pSprite->type >= kDudeBase && pSprite->type < kDudeMax;
} }
template<typename T> bool IsThingSprite(T const* const pSprite)
{
return pSprite->type >= kThingBase && pSprite->type < kThingMax;
}
template<typename T> bool IsItemSprite(T const * const pSprite) template<typename T> bool IsItemSprite(T const * const pSprite)
{ {
return pSprite->type >= kItemBase && pSprite->type < kItemMax; return pSprite->type >= kItemBase && pSprite->type < kItemMax;

View file

@ -1278,37 +1278,15 @@ void aiGenDudeNewState(DBloodActor* actor, AISTATE* pAIState)
bool playGenDudeSound(DBloodActor* actor, int mode) bool playGenDudeSound(DBloodActor* actor, int mode)
{ {
if (mode < kGenDudeSndTargetSpot || mode >= kGenDudeSndMax) return false; if (mode < kGenDudeSndTargetSpot || mode >= kGenDudeSndMax || !actor->hasX()) return false;
const GENDUDESND* sndInfo = &gCustomDudeSnd[mode]; bool gotSnd = false; const GENDUDESND* sndInfo = &gCustomDudeSnd[mode];
int sndStartId = actor->xspr.sysData1; int sndStartId = actor->xspr.sysData1;
int rand = sndInfo->randomRange; int rand = sndInfo->randomRange;
int sndId = (sndStartId <= 0) ? sndInfo->defaultSndId : sndStartId + sndInfo->sndIdOffset; int sndId = (sndStartId <= 0) ? sndInfo->defaultSndId : sndStartId + sndInfo->sndIdOffset;
GENDUDEEXTRA* pExtra = &actor->genDudeExtra; GENDUDEEXTRA* pExtra = &actor->genDudeExtra;
// let's check if there same sounds already played by other dudes
// so we won't get a lot of annoying screams in the same time and ensure sound played in it's full length (if not interruptable)
if (pExtra->sndPlaying && !sndInfo->interruptable) {
#if 0
for (int i = 0; i < 256; i++) {
if (Bonkle[i].atc <= 0) continue;
for (int a = 0; a < rand; a++) {
if (sndId + a == Bonkle[i].atc) {
if (Bonkle[i].at0 <= 0) {
pExtra->sndPlaying = false;
break;
}
return true;
}
}
}
#endif
pExtra->sndPlaying = false;
}
if (sndId < 0) return false; if (sndId < 0) return false;
else if (sndStartId <= 0) { sndId += Random(rand); gotSnd = true; } else if (sndStartId <= 0) sndId += Random(rand);
else else
{ {
// Let's try to get random snd // Let's try to get random snd
@ -1317,26 +1295,31 @@ bool playGenDudeSound(DBloodActor* actor, int mode)
int random = Random(rand); int random = Random(rand);
if (!soundEngine->FindSoundByResID(sndId + random)) continue; if (!soundEngine->FindSoundByResID(sndId + random)) continue;
sndId = sndId + random; sndId = sndId + random;
gotSnd = true;
break; break;
} }
// If no success in getting random snd, get first existing one // If no success in getting random snd, get first existing one
if (gotSnd == false) if (maxRetries <= 0)
{ {
int maxSndId = sndId + rand; int maxSndId = sndId + rand;
while (sndId++ < maxSndId) while (sndId < maxSndId && !soundEngine->FindSoundByResID(sndId++));
{
if (!soundEngine->FindSoundByResID(sndId)) continue;
gotSnd = true;
break;
}
} }
// let's check if there same sounds already played by other dudes
// so we won't get a lot of annoying screams in the same time and
// ensure sound played in it's full length (if not interruptable)
if (pExtra->sndPlaying && !sndInfo->interruptable)
{
if (soundEngine->GetSoundPlayingInfo(SOURCE_Any, nullptr, soundEngine->FindSoundByResID(sndId)))
{
return true;
}
pExtra->sndPlaying = false;
}
} }
if (gotSnd == false) return false; if (sndInfo->aiPlaySound) aiPlay3DSound(actor, sndId, AI_SFX_PRIORITY_2, -1);
else if (sndInfo->aiPlaySound) aiPlay3DSound(actor, sndId, AI_SFX_PRIORITY_2, -1);
else sfxPlay3DSound(actor, sndId, -1, 0); else sfxPlay3DSound(actor, sndId, -1, 0);
pExtra->sndPlaying = true; pExtra->sndPlaying = true;

View file

@ -103,6 +103,11 @@ public:
return spr.type >= kDudeBase && spr.type < kDudeMax; return spr.type >= kDudeBase && spr.type < kDudeMax;
} }
bool IsThingActor()
{
return spr.type >= kThingBase && spr.type < kThingMax;
}
bool IsItemActor() bool IsItemActor()
{ {
return spr.type >= kItemBase && spr.type < kItemMax; return spr.type >= kItemBase && spr.type < kItemMax;

View file

@ -66,7 +66,7 @@ int DeleteSprite(DBloodActor* actor)
} }
bool gModernMap = false; uint8_t gModernMap = 0;
int gVisibility; int gVisibility;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -172,7 +172,17 @@ void dbLoadMap(const char* pPath, DVector3& pos, short* pAngle, sectortype** cur
// indicate if the map requires modern features to work properly // indicate if the map requires modern features to work properly
// for maps wich created in PMAPEDIT BETA13 or higher versions. Since only minor version changed, // for maps wich created in PMAPEDIT BETA13 or higher versions. Since only minor version changed,
// the map is still can be loaded with vanilla BLOOD / MAPEDIT and should work in other ports too. // the map is still can be loaded with vanilla BLOOD / MAPEDIT and should work in other ports too.
if ((header.version & 0x00ff) == 0x001) gModernMap = true; int tmp = (header.version & 0x00ff);
// get the modern features revision
switch (tmp) {
case 0x001:
gModernMap = 1;
break;
case 0x002:
gModernMap = 2;
break;
}
#endif #endif
} }
@ -579,8 +589,18 @@ void dbLoadMap(const char* pPath, DVector3& pos, short* pAngle, sectortype** cur
#ifdef NOONE_EXTENSIONS #ifdef NOONE_EXTENSIONS
// indicate if the map requires modern features to work properly // 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 // for maps wich created in different editors (include vanilla MAPEDIT) or in PMAPEDIT version below than BETA13
if (!gModernMap && pXSprite->rxID == kChannelMapModernize && pXSprite->rxID == pXSprite->txID && pXSprite->command == kCmdModernFeaturesEnable) if (!gModernMap && pXSprite->rxID == pXSprite->txID && pXSprite->command == kCmdModernFeaturesEnable)
gModernMap = true; {
// get the modern features revision
switch (pXSprite->txID) {
case kChannelMapModernRev1:
gModernMap = 1;
break;
case kChannelMapModernRev2:
gModernMap = 2;
break;
}
}
#endif #endif
} }
} }

View file

@ -100,7 +100,8 @@ enum {
// channel of event causer // channel of event causer
kChannelEventCauser = 50, kChannelEventCauser = 50,
// map requires modern features to work properly // map requires modern features to work properly
kChannelMapModernize = 60, kChannelMapModernRev1 = 60,
kChannelMapModernRev2 = 61,
///////////////////////////// /////////////////////////////
kChannelTeamAFlagCaptured = 80, kChannelTeamAFlagCaptured = 80,
kChannelTeamBFlagCaptured, kChannelTeamBFlagCaptured,

View file

@ -4802,7 +4802,7 @@ bool condCheckSprite(DBloodActor* aCond, int cmpOp, bool PUSH)
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void condUpdateObjectIndex(DBloodActor* oldActor, DBloodActor* newActor) void conditionsUpdateIndex(DBloodActor* oldActor, DBloodActor* newActor)
{ {
// update index in tracking conditions first // update index in tracking conditions first
for (int i = 0; i < gTrackingCondsCount; i++) for (int i = 0; i < gTrackingCondsCount; i++)

View file

@ -265,7 +265,7 @@ struct CONDITION_TYPE_NAMES {
}; };
// - VARIABLES ------------------------------------------------------------------ // - VARIABLES ------------------------------------------------------------------
extern bool gModernMap; extern uint8_t gModernMap;
extern bool gTeamsSpawnUsed; extern bool gTeamsSpawnUsed;
extern bool gEventRedirectsUsed; extern bool gEventRedirectsUsed;
extern ZONE gStartZoneTeam1[kMaxPlayers]; extern ZONE gStartZoneTeam1[kMaxPlayers];
@ -372,7 +372,7 @@ void levelEndLevelCustom(int nLevel);
int useCondition(DBloodActor*, EVENT& event); int useCondition(DBloodActor*, EVENT& event);
bool condCmp(int val, int arg1, int arg2, int comOp); bool condCmp(int val, int arg1, int arg2, int comOp);
void condError(DBloodActor* pXCond, const char* pzFormat, ...); void condError(DBloodActor* pXCond, const char* pzFormat, ...);
void condUpdateObjectIndex(DBloodActor* oldplayer, DBloodActor* newplayer); void conditionsUpdateIndex(DBloodActor* oldplayer, DBloodActor* newplayer);
DBloodActor* evrListRedirectors(int objType, sectortype*, walltype*, DBloodActor* objActor, DBloodActor* pXRedir, int* tx); DBloodActor* evrListRedirectors(int objType, sectortype*, walltype*, DBloodActor* objActor, DBloodActor* pXRedir, int* tx);
void seqSpawnerOffSameTx(DBloodActor* actor); void seqSpawnerOffSameTx(DBloodActor* actor);
void triggerTouchSprite(DBloodActor* pSprite, DBloodActor* nHSprite); void triggerTouchSprite(DBloodActor* pSprite, DBloodActor* nHSprite);

View file

@ -883,12 +883,12 @@ void playerStart(int nPlayer, int bNewLevel)
BloodStatIterator it(kStatModernPlayerLinker); BloodStatIterator it(kStatModernPlayerLinker);
while (auto iactor = it.Next()) while (auto iactor = it.Next())
{ {
if (iactor->xspr.data1 == pPlayer->nPlayer + 1) if (!iactor->xspr.data1 || iactor->xspr.data1 == pPlayer->nPlayer + 1)
{ {
DBloodActor* SpriteOld = iactor->prevmarker; DBloodActor* SpriteOld = iactor->prevmarker;
trPlayerCtrlLink(iactor, pPlayer, (SpriteOld == nullptr)); // this modifies iactor's prevmarker field! trPlayerCtrlLink(iactor, pPlayer, (SpriteOld == nullptr)); // this modifies iactor's prevmarker field!
if (SpriteOld) if (SpriteOld)
condUpdateObjectIndex(SpriteOld, iactor->prevmarker); conditionsUpdateIndex(SpriteOld, iactor->prevmarker);
} }
} }