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

View file

@ -216,7 +216,7 @@ short inSearch(AISTATE* aiState);
short inChase(AISTATE* aiState);
short inDuck(AISTATE* aiState);
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);
void scaleDamage(XSPRITE* pXSprite);
bool genDudePrepare(spritetype* pSprite, int propId);

View file

@ -726,14 +726,14 @@ void DropVoodoo(int nSprite) // unused
void callbackCondition(int nSprite) {
spritetype* pSprite = &sprite[nSprite]; XSPRITE* pXSprite = &xsprite[pSprite->extra];
if (pXSprite->state || pXSprite->locked || pXSprite->isTriggered) return;
XSPRITE* pXSprite = &xsprite[sprite[nSprite].extra];
if (pXSprite->isTriggered) return;
TRCONDITION* pCond = &gCondition[pXSprite->sysData1];
for (int i = 0; i < pCond->length; i++) {
EVENT evn; evn.index = pCond->obj[i].index; evn.type = pCond->obj[i].type;
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);

View file

@ -1570,7 +1570,7 @@ DUDEINFO dudeInfo[kDudeMax-kDudeBase] =
256, // angSpeed
// 0,
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

View file

@ -910,7 +910,7 @@ int GetClosestSpriteSectors(int nSector, int x, int y, int nDist, short *pSector
}
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) {

File diff suppressed because it is too large Load diff

View file

@ -61,7 +61,9 @@ BEGIN_BLD_NS
#define kModernTypeFlag4 0x0004
#define kMaxRandomizeRetries 16
#define kPercentFull 100
#define kCondRange 100
// modern statnums
enum {
kStatModernBase = 20,
@ -69,6 +71,9 @@ kStatModernDudeTargetChanger = kStatModernBase,
kStatModernCondition = 21,
kStatModernEventRedirector = 22,
kStatModernPlayerLinker = 23,
kStatModernSeqSpawner = 24,
kStatModernQavScene = 25,
kStatModernTmp = 39,
kStatModernMax = 40,
};
@ -126,7 +131,9 @@ kCondWallBase = 200,
kCondWallMax = 300,
kCondSectorBase = 300,
kCondSectorMax = 400,
kCondDudeBase = 400,
kCondPlayerBase = 400,
kCondPlayerMax = 450,
kCondDudeBase = 450,
kCondDudeMax = 500,
kCondSpriteBase = 500,
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 trPlayerCtrlSetRace(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 trPlayerCtrlSetJumpHeight(XSPRITE* pXSource, PLAYER* pPlayer);
void trPlayerCtrlSetScreenEffect(XSPRITE* pXSource, PLAYER* pPlayer);
void trPlayerCtrlSetLookAngle(XSPRITE* pXSource, PLAYER* pPlayer);
void trPlayerCtrlEraseStuff(XSPRITE* pXSource, PLAYER* pPlayer);
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);
char modernTypeSetSpriteState(int nSprite, XSPRITE* pXSprite, int nState);
@ -327,19 +334,23 @@ void windGenStopWindOnSectors(XSPRITE* pXSource);
int getSpriteMassBySize(spritetype* pSprite);
bool ceilIsTooLow(spritetype* pSprite);
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 condRestore(XSPRITE* pXSprite);
bool condCmp(int val, 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);
bool condCheckSector(XSPRITE* pXCond, int cmpOp, bool PUSH, bool RVRS);
bool condCheckWall(XSPRITE* pXCond, int cmpOp, bool PUSH, bool RVRS);
bool condCheckSprite(XSPRITE* pXCond, int cmpOp, bool PUSH, bool RVRS);
void condError(XSPRITE* pXCond, const char* pzFormat, ...);
bool condCheckMixed(XSPRITE* pXCond, EVENT event, int cmpOp, bool PUSH);
bool condCheckSector(XSPRITE* pXCond, int cmpOp, bool PUSH);
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);
XSPRITE* evrListRedirectors(int objType, int objXIndex, XSPRITE* pXRedir, int* tx);
XSPRITE* evrIsRedirector(int nSprite);
int listTx(XSPRITE* pXRedir, int tx);
void seqSpawnerOffSameTx(XSPRITE* pXSource);
#endif
////////////////////////////////////////////////////////////////////////

View file

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

View file

@ -334,31 +334,20 @@ void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT event)
#ifdef NOONE_EXTENSIONS
if (gModernMap && modernTypeOperateSprite(nSprite, pSprite, pXSprite, event))
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
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) {
switch (event.cmd) {