- Don't change statnum of thing converted to debris back to thing on impact trigger when firing with vector weapon.

- Change damage scale and min firedist for Custom Dude.
- Remove unnecessary checks in callback of tracking condition.
- Fix picWidth() function.
- Better initialization of modern stuff.
- kModernSeqSpawner: disable all other spawners with same TX ID when enabling current.
- Fix: sceneQav was not playing if resurrected with COUSTEAU cheat.
- kModernPictureChanger: remove kModernFlag01 feature (deprecated).
- kModernSectorFXChanger: add flags to control where exactly light effect should appear.
- kModernCondition:
 - add delay before sending command if condition is true.
 - take in account state, so kCmdState and kCmdNotState is useful.
 - fix wrong comparison result in some conditions.
 - add new various conditions.
- kModernPlayerControl:
 - fix start / stop playing qav scene when triggered with event command converted to sprite command.
 - add a way to resurrect / heal player.
 - add event commands to toggle inventory item status via trigger.
 - fix that Remote and Proximity detonators cannot be given.
 - add clear all screen effects option.
 - proper percents for changing movement / jumping.
- kModernRandomTX, kModernSequentialTX: change event redirection mode activation from kModernTypeFlag02 to kCmdLink.
- kModernSpriteDamager: treat damage value as percents by default, take in account god mode.
- kModernEffectGen: fix wrong cstat for effects.
- kModernPropertiesChanger: proper underwater status for sectors and players or enemies in it.
- Players: assign or update current player's sprite index for all conditions.

# Conflicts:
#	source/blood/src/nnexts.cpp
This commit is contained in:
NoOneBlood 2020-05-05 21:50:14 +03:00 committed by Christoph Oelckers
parent 96c9ca657e
commit 9428c88e29
10 changed files with 787 additions and 463 deletions

View file

@ -6745,8 +6745,8 @@ void actFireVector(spritetype *pShooter, int a2, int a3, int a4, int a5, int a6,
actBurnSprite(actSpriteIdToOwnerId(nShooter), &xsprite[nXSprite], pVectorData->burnTime); actBurnSprite(actSpriteIdToOwnerId(nShooter), &xsprite[nXSprite], pVectorData->burnTime);
} }
if (pSprite->type >= kThingBase && pSprite->type < kThingMax) //if (pSprite->type >= kThingBase && pSprite->type < kThingMax)
changespritestat(pSprite->index, kStatThing); //changespritestat(pSprite->index, kStatThing);
//actPostSprite(pSprite->index, kStatThing); // if it was a thing, return it's statnum back //actPostSprite(pSprite->index, kStatThing); // if it was a thing, return it's statnum back
} }
} }

View file

@ -1307,7 +1307,7 @@ void scaleDamage(XSPRITE* pXSprite) {
case kThingPodFireBall: case kThingPodFireBall:
case kThingNapalmBall: case kThingNapalmBall:
curScale[kDmgBurn] = 32; curScale[kDmgBurn] = 32;
curScale[kDmgExplode] -= 20; curScale[kDmgExplode] -= 32;
break; break;
case kMissileLifeLeechRegular: case kMissileLifeLeechRegular:
curScale[kDmgBurn] = 60 + Random(4); curScale[kDmgBurn] = 60 + Random(4);
@ -1330,6 +1330,7 @@ void scaleDamage(XSPRITE* pXSprite) {
case kThingArmedTNTBundle: case kThingArmedTNTBundle:
case kThingArmedTNTStick: case kThingArmedTNTStick:
case kModernThingTNTProx: case kModernThingTNTProx:
curScale[kDmgBurn] -= 32;
curScale[kDmgExplode] = 32; curScale[kDmgExplode] = 32;
curScale[kDmgFall] = 65 + Random(15); curScale[kDmgFall] = 65 + Random(15);
break; break;
@ -2008,7 +2009,7 @@ bool genDudePrepare(spritetype* pSprite, int propId) {
fallthrough__; fallthrough__;
} }
case kGenDudePropertyAttack: case kGenDudePropertyAttack:
pExtra->fireDist = getRangeAttackDist(pSprite, 1200, 45000); pExtra->fireDist = getRangeAttackDist(pSprite, 3000, 45000);
pExtra->throwDist = pExtra->fireDist; // temp pExtra->throwDist = pExtra->fireDist; // temp
pExtra->baseDispersion = getDispersionModifier(pSprite, 200, 3500); pExtra->baseDispersion = getDispersionModifier(pSprite, 200, 3500);
if (propId) break; if (propId) break;

View file

@ -216,7 +216,7 @@ short inSearch(AISTATE* aiState);
short inChase(AISTATE* aiState); short inChase(AISTATE* aiState);
short inDuck(AISTATE* aiState); short inDuck(AISTATE* aiState);
int genDudeSeqStartId(XSPRITE* pXSprite); int genDudeSeqStartId(XSPRITE* pXSprite);
int getRangeAttackDist(spritetype* pSprite, int minDist = 1200, int maxDist = 80000); int getRangeAttackDist(spritetype* pSprite, int minDist = 3000, int maxDist = 80000);
int getDispersionModifier(spritetype* pSprite, int minDisp, int maxDisp); int getDispersionModifier(spritetype* pSprite, int minDisp, int maxDisp);
void scaleDamage(XSPRITE* pXSprite); void scaleDamage(XSPRITE* pXSprite);
bool genDudePrepare(spritetype* pSprite, int propId); bool genDudePrepare(spritetype* pSprite, int propId);

View file

@ -726,14 +726,14 @@ void DropVoodoo(int nSprite) // unused
void callbackCondition(int nSprite) { void callbackCondition(int nSprite) {
spritetype* pSprite = &sprite[nSprite]; XSPRITE* pXSprite = &xsprite[pSprite->extra]; XSPRITE* pXSprite = &xsprite[sprite[nSprite].extra];
if (pXSprite->state || pXSprite->locked || pXSprite->isTriggered) return; if (pXSprite->isTriggered) return;
TRCONDITION* pCond = &gCondition[pXSprite->sysData1]; TRCONDITION* pCond = &gCondition[pXSprite->sysData1];
for (int i = 0; i < pCond->length; i++) { for (int i = 0; i < pCond->length; i++) {
EVENT evn; evn.index = pCond->obj[i].index; evn.type = pCond->obj[i].type; EVENT evn; evn.index = pCond->obj[i].index; evn.type = pCond->obj[i].type;
evn.cmd = pCond->obj[i].cmd; evn.funcID = kCallbackCondition; evn.cmd = pCond->obj[i].cmd; evn.funcID = kCallbackCondition;
useCondition(pXSprite, evn); useCondition(&sprite[pXSprite->reference], pXSprite, evn);
} }
evPost(nSprite, OBJ_SPRITE, pXSprite->busyTime, kCallbackCondition); evPost(nSprite, OBJ_SPRITE, pXSprite->busyTime, kCallbackCondition);

View file

@ -1570,7 +1570,7 @@ DUDEINFO dudeInfo[kDudeMax-kDudeBase] =
256, // angSpeed 256, // angSpeed
// 0, // 0,
7, -1, 18, // nGibType 7, -1, 18, // nGibType
128, 150, 128, 256, 128, 128, 128, 64, 256, 256, 256, 256, 256, 256,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,
0 0

View file

@ -910,7 +910,7 @@ int GetClosestSpriteSectors(int nSector, int x, int y, int nDist, short *pSector
} }
int picWidth(short nPic, short repeat) { int picWidth(short nPic, short repeat) {
return ClipLow((tilesiz[nPic].x * repeat) >> 2, 0); return ClipLow((tilesiz[nPic].x * repeat) << 2, 0);
} }
int picHeight(short nPic, short repeat) { int picHeight(short nPic, short repeat) {

File diff suppressed because it is too large Load diff

View file

@ -61,7 +61,9 @@ BEGIN_BLD_NS
#define kModernTypeFlag4 0x0004 #define kModernTypeFlag4 0x0004
#define kMaxRandomizeRetries 16 #define kMaxRandomizeRetries 16
#define kPercentFull 100
#define kCondRange 100 #define kCondRange 100
// modern statnums // modern statnums
enum { enum {
kStatModernBase = 20, kStatModernBase = 20,
@ -69,6 +71,9 @@ kStatModernDudeTargetChanger = kStatModernBase,
kStatModernCondition = 21, kStatModernCondition = 21,
kStatModernEventRedirector = 22, kStatModernEventRedirector = 22,
kStatModernPlayerLinker = 23, kStatModernPlayerLinker = 23,
kStatModernSeqSpawner = 24,
kStatModernQavScene = 25,
kStatModernTmp = 39,
kStatModernMax = 40, kStatModernMax = 40,
}; };
@ -126,7 +131,9 @@ kCondWallBase = 200,
kCondWallMax = 300, kCondWallMax = 300,
kCondSectorBase = 300, kCondSectorBase = 300,
kCondSectorMax = 400, kCondSectorMax = 400,
kCondDudeBase = 400, kCondPlayerBase = 400,
kCondPlayerMax = 450,
kCondDudeBase = 450,
kCondDudeMax = 500, kCondDudeMax = 500,
kCondSpriteBase = 500, kCondSpriteBase = 500,
kCondSpriteMax = 600, kCondSpriteMax = 600,
@ -283,14 +290,14 @@ void seqTxSendCmdAll(XSPRITE* pXSource, int nIndex, COMMAND_ID cmd, bool modernS
void trPlayerCtrlLink(XSPRITE* pXSource, PLAYER* pPlayer, bool checkCondition); void trPlayerCtrlLink(XSPRITE* pXSource, PLAYER* pPlayer, bool checkCondition);
void trPlayerCtrlSetRace(XSPRITE* pXSource, PLAYER* pPlayer); void trPlayerCtrlSetRace(XSPRITE* pXSource, PLAYER* pPlayer);
void trPlayerCtrlStartScene(XSPRITE* pXSource, PLAYER* pPlayer); void trPlayerCtrlStartScene(XSPRITE* pXSource, PLAYER* pPlayer);
void trPlayerCtrlStopScene(XSPRITE* pXSource, PLAYER* pPlayer); void trPlayerCtrlStopScene(PLAYER* pPlayer);
void trPlayerCtrlSetMoveSpeed(XSPRITE* pXSource, PLAYER* pPlayer); void trPlayerCtrlSetMoveSpeed(XSPRITE* pXSource, PLAYER* pPlayer);
void trPlayerCtrlSetJumpHeight(XSPRITE* pXSource, PLAYER* pPlayer); void trPlayerCtrlSetJumpHeight(XSPRITE* pXSource, PLAYER* pPlayer);
void trPlayerCtrlSetScreenEffect(XSPRITE* pXSource, PLAYER* pPlayer); void trPlayerCtrlSetScreenEffect(XSPRITE* pXSource, PLAYER* pPlayer);
void trPlayerCtrlSetLookAngle(XSPRITE* pXSource, PLAYER* pPlayer); void trPlayerCtrlSetLookAngle(XSPRITE* pXSource, PLAYER* pPlayer);
void trPlayerCtrlEraseStuff(XSPRITE* pXSource, PLAYER* pPlayer); void trPlayerCtrlEraseStuff(XSPRITE* pXSource, PLAYER* pPlayer);
void trPlayerCtrlGiveStuff(XSPRITE* pXSource, PLAYER* pPlayer, TRPLAYERCTRL* pCtrl); void trPlayerCtrlGiveStuff(XSPRITE* pXSource, PLAYER* pPlayer, TRPLAYERCTRL* pCtrl);
void trPlayerCtrlUsePackItem(XSPRITE* pXSource, PLAYER* pPlayer); void trPlayerCtrlUsePackItem(XSPRITE* pXSource, PLAYER* pPlayer, int evCmd);
// ------------------------------------------------------------------------- // // ------------------------------------------------------------------------- //
void modernTypeTrigger(int type, int nDest, EVENT event); void modernTypeTrigger(int type, int nDest, EVENT event);
char modernTypeSetSpriteState(int nSprite, XSPRITE* pXSprite, int nState); char modernTypeSetSpriteState(int nSprite, XSPRITE* pXSprite, int nState);
@ -327,19 +334,23 @@ void windGenStopWindOnSectors(XSPRITE* pXSource);
int getSpriteMassBySize(spritetype* pSprite); int getSpriteMassBySize(spritetype* pSprite);
bool ceilIsTooLow(spritetype* pSprite); bool ceilIsTooLow(spritetype* pSprite);
void levelEndLevelCustom(int nLevel); void levelEndLevelCustom(int nLevel);
bool useCondition(XSPRITE* pXSource, EVENT event); int useCondition(spritetype* pSource, XSPRITE* pXSource, EVENT event);
bool condPush(XSPRITE* pXSprite, int objType, int objIndex); bool condPush(XSPRITE* pXSprite, int objType, int objIndex);
bool condRestore(XSPRITE* pXSprite); bool condRestore(XSPRITE* pXSprite);
bool condCmp(int val, int arg1, int arg2, int comOp); bool condCmp(int val, int arg1, int arg2, int comOp);
bool condCmpne(int arg1, int arg2, int comOp); bool condCmpne(int arg1, int arg2, int comOp);
bool condCheckMixed(XSPRITE* pXCond, EVENT event, int cmpOp, bool PUSH, bool RVRS); void condError(XSPRITE* pXCond, const char* pzFormat, ...);
bool condCheckSector(XSPRITE* pXCond, int cmpOp, bool PUSH, bool RVRS); bool condCheckMixed(XSPRITE* pXCond, EVENT event, int cmpOp, bool PUSH);
bool condCheckWall(XSPRITE* pXCond, int cmpOp, bool PUSH, bool RVRS); bool condCheckSector(XSPRITE* pXCond, int cmpOp, bool PUSH);
bool condCheckSprite(XSPRITE* pXCond, int cmpOp, bool PUSH, bool RVRS); bool condCheckWall(XSPRITE* pXCond, int cmpOp, bool PUSH);
bool condCheckSprite(XSPRITE* pXCond, int cmpOp, bool PUSH);
bool condCheckPlayer(XSPRITE* pXCond, int cmpOp, bool PUSH);
bool condCheckDude(XSPRITE* pXCond, int cmpOp, bool PUSH);
void condUpdateObjectIndex(int objType, int oldIndex, int newIndex); void condUpdateObjectIndex(int objType, int oldIndex, int newIndex);
XSPRITE* evrListRedirectors(int objType, int objXIndex, XSPRITE* pXRedir, int* tx); XSPRITE* evrListRedirectors(int objType, int objXIndex, XSPRITE* pXRedir, int* tx);
XSPRITE* evrIsRedirector(int nSprite); XSPRITE* evrIsRedirector(int nSprite);
int listTx(XSPRITE* pXRedir, int tx); int listTx(XSPRITE* pXRedir, int tx);
void seqSpawnerOffSameTx(XSPRITE* pXSource);
#endif #endif
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////

View file

@ -776,19 +776,21 @@ void playerStart(int nPlayer, int bNewLevel)
#ifdef NOONE_EXTENSIONS #ifdef NOONE_EXTENSIONS
playerQavSceneReset(pPlayer); // reset qav scene playerQavSceneReset(pPlayer); // reset qav scene
// we must check if properties of old pPlayer->pXSprite was // assign or update player's sprite index for conditions
// changed with kModernPlayerControl and copy it to the new x-sprite if (gModernMap) {
if (gModernMap && gGameOptions.nGameType != 0) {
for (int nSprite = headspritestat[kStatModernPlayerLinker]; nSprite >= 0; nSprite = nextspritestat[nSprite]) { for (int nSprite = headspritestat[kStatModernPlayerLinker]; nSprite >= 0; nSprite = nextspritestat[nSprite]) {
XSPRITE* pXCtrl = &xsprite[sprite[nSprite].extra]; XSPRITE* pXCtrl = &xsprite[sprite[nSprite].extra];
if (pXCtrl->data1 != pPlayer->nPlayer + 1) continue; if (pXCtrl->data1 == pPlayer->nPlayer + 1) {
int nSpriteOld = pXCtrl->sysData1; int nSpriteOld = pXCtrl->sysData1;
trPlayerCtrlLink(pXCtrl, pPlayer, false); trPlayerCtrlLink(pXCtrl, pPlayer, (nSpriteOld < 0) ? true : false);
if (pPlayer->pXSprite->txID >= kChannelUser && gTrackingCondsCount > 0) if (nSpriteOld > 0)
condUpdateObjectIndex(OBJ_SPRITE, nSpriteOld, pXCtrl->sysData1); condUpdateObjectIndex(OBJ_SPRITE, nSpriteOld, pXCtrl->sysData1);
}
} }
} }
#endif #endif
pPlayer->hand = 0; pPlayer->hand = 0;
pPlayer->nWaterPal = 0; pPlayer->nWaterPal = 0;

View file

@ -334,31 +334,20 @@ void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT event)
#ifdef NOONE_EXTENSIONS #ifdef NOONE_EXTENSIONS
if (gModernMap && modernTypeOperateSprite(nSprite, pSprite, pXSprite, event)) if (gModernMap && modernTypeOperateSprite(nSprite, pSprite, pXSprite, event))
return; return;
switch (event.cmd) {
case kCmdLock:
pXSprite->locked = 1;
return;
case kCmdUnlock:
pXSprite->locked = 0;
return;
case kCmdToggleLock:
pXSprite->locked = pXSprite->locked ^ 1;
return;
}
#else
switch (event.cmd) {
case kCmdLock:
pXSprite->locked = 1;
return;
case kCmdUnlock:
pXSprite->locked = 0;
return;
case kCmdToggleLock:
pXSprite->locked = pXSprite->locked ^ 1;
return;
}
#endif #endif
switch (event.cmd) {
case kCmdLock:
pXSprite->locked = 1;
return;
case kCmdUnlock:
pXSprite->locked = 0;
return;
case kCmdToggleLock:
pXSprite->locked = pXSprite->locked ^ 1;
return;
}
if (pSprite->statnum == kStatDude && pSprite->type >= kDudeBase && pSprite->type < kDudeMax) { if (pSprite->statnum == kStatDude && pSprite->type >= kDudeBase && pSprite->type < kDudeMax) {
switch (event.cmd) { switch (event.cmd) {