mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-26 03:30:46 +00:00
CON: Add EVENT_DAMAGESPRITE, EVENT_POSTDAMAGESPRITE, EVENT_DAMAGEWALL, EVENT_DAMAGECEILING, and EVENT_DAMAGEFLOOR.
In these events, THISACTOR is the projectile (or source of damage), and RETURN is the sprite/wall/sector affected. Set RETURN to -1 to cancel any hardcoded effects. ud.return 1 through 5 are the parameters passed to hitradius if RADIUSEXPLOSION is the source of the damage. ud.return 1 is -1 otherwise. New tokens "damageeventtile" and "damageeventtilerange" or tiledata[].gameflags & SFLAG_DAMAGEEVENT to enable processing for receivers with corresponding tilenums. CON commands to replicate hardcoded effects (beyond switching tilenums, such as spawning glass) are forthcoming. Use of EVENT_DAMAGEHPLANE is hereby discouraged. Patch from Striker, based on work by Fox. git-svn-id: https://svn.eduke32.com/eduke32@6771 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
cab8c9aadf
commit
928ce686a6
9 changed files with 181 additions and 33 deletions
|
@ -116,6 +116,12 @@ void A_RadiusDamage(int spriteNum, int blastRadius, int dmg1, int dmg2, int dmg3
|
||||||
int16_t *const sectorList = (int16_t *)tempbuf;
|
int16_t *const sectorList = (int16_t *)tempbuf;
|
||||||
const int32_t maxSectors = sizeof(tempbuf)/sizeof(int16_t);
|
const int32_t maxSectors = sizeof(tempbuf)/sizeof(int16_t);
|
||||||
|
|
||||||
|
ud.returnvar[0] = blastRadius; // Allow checking for radius damage in EVENT_DAMAGE(SPRITE/WALL/FLOOR/CEILING) events.
|
||||||
|
ud.returnvar[1] = dmg1;
|
||||||
|
ud.returnvar[2] = dmg2;
|
||||||
|
ud.returnvar[3] = dmg3;
|
||||||
|
ud.returnvar[4] = dmg4;
|
||||||
|
|
||||||
if (pSprite->picnum == RPG && pSprite->xrepeat < 11)
|
if (pSprite->picnum == RPG && pSprite->xrepeat < 11)
|
||||||
goto SKIPWALLCHECK;
|
goto SKIPWALLCHECK;
|
||||||
|
|
||||||
|
@ -139,9 +145,9 @@ void A_RadiusDamage(int spriteNum, int blastRadius, int dmg1, int dmg2, int dmg3
|
||||||
G_WallSpriteDist((uwalltype *)&wall[wall[w2].point2], pSprite) < blastRadius)
|
G_WallSpriteDist((uwalltype *)&wall[wall[w2].point2], pSprite) < blastRadius)
|
||||||
{
|
{
|
||||||
if (((sector[sectorNum].ceilingz-pSprite->z)>>8) < blastRadius)
|
if (((sector[sectorNum].ceilingz-pSprite->z)>>8) < blastRadius)
|
||||||
Sect_DamageCeilingOrFloor(0, sectorNum);
|
Sect_DamageCeiling_Internal(spriteNum, sectorNum);
|
||||||
if (((pSprite->z-sector[sectorNum].floorz)>>8) < blastRadius)
|
if (((pSprite->z-sector[sectorNum].floorz)>>8) < blastRadius)
|
||||||
Sect_DamageCeilingOrFloor(1, sectorNum);
|
Sect_DamageFloor_Internal(spriteNum, sectorNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
uwalltype const *pWall;
|
uwalltype const *pWall;
|
||||||
|
@ -178,7 +184,7 @@ void A_RadiusDamage(int spriteNum, int blastRadius, int dmg1, int dmg2, int dmg3
|
||||||
pSprite->x, pSprite->y, pSprite->z, pSprite->sectnum))
|
pSprite->x, pSprite->y, pSprite->z, pSprite->sectnum))
|
||||||
{
|
{
|
||||||
vec3_t const tmpvect = { pWall->x, pWall->y, pSprite->z };
|
vec3_t const tmpvect = { pWall->x, pWall->y, pSprite->z };
|
||||||
A_DamageWall(spriteNum, w, &tmpvect, pSprite->picnum);
|
A_DamageWall_Internal(spriteNum, w, &tmpvect, pSprite->picnum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -207,7 +213,7 @@ SKIPWALLCHECK:
|
||||||
{
|
{
|
||||||
if (A_CheckEnemySprite(pOther) && !cansee(pOther->x, pOther->y,pOther->z+q, pOther->sectnum, pSprite->x, pSprite->y, pSprite->z+q, pSprite->sectnum))
|
if (A_CheckEnemySprite(pOther) && !cansee(pOther->x, pOther->y,pOther->z+q, pOther->sectnum, pSprite->x, pSprite->y, pSprite->z+q, pSprite->sectnum))
|
||||||
goto next_sprite;
|
goto next_sprite;
|
||||||
A_DamageObject(otherSprite, spriteNum);
|
A_DamageObject_Internal(otherSprite, spriteNum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (pOther->extra >= 0 && (uspritetype *)pOther != pSprite &&
|
else if (pOther->extra >= 0 && (uspritetype *)pOther != pSprite &&
|
||||||
|
@ -233,6 +239,12 @@ SKIPWALLCHECK:
|
||||||
if (d < blastRadius && cansee(pOther->x, pOther->y, pOther->z - ZOFFSET3, pOther->sectnum, pSprite->x,
|
if (d < blastRadius && cansee(pOther->x, pOther->y, pOther->z - ZOFFSET3, pOther->sectnum, pSprite->x,
|
||||||
pSprite->y, pSprite->z - ZOFFSET4, pSprite->sectnum))
|
pSprite->y, pSprite->z - ZOFFSET4, pSprite->sectnum))
|
||||||
{
|
{
|
||||||
|
if (A_CheckSpriteFlags(otherSprite, SFLAG_DAMAGEEVENT))
|
||||||
|
{
|
||||||
|
if (VM_OnEventWithReturn(EVENT_DAMAGESPRITE, spriteNum, -1, otherSprite) < 0)
|
||||||
|
goto next_sprite;
|
||||||
|
}
|
||||||
|
|
||||||
actor[otherSprite].ang = getangle(pOther->x-pSprite->x,pOther->y-pSprite->y);
|
actor[otherSprite].ang = getangle(pOther->x-pSprite->x,pOther->y-pSprite->y);
|
||||||
|
|
||||||
if (pSprite->picnum == RPG && pOther->extra > 0)
|
if (pSprite->picnum == RPG && pOther->extra > 0)
|
||||||
|
@ -272,13 +284,16 @@ SKIPWALLCHECK:
|
||||||
pOther->xvel += (pSprite->extra<<2);
|
pOther->xvel += (pSprite->extra<<2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (A_CheckSpriteFlags(otherSprite, SFLAG_DAMAGEEVENT))
|
||||||
|
VM_OnEventWithReturn(EVENT_POSTDAMAGESPRITE, spriteNum, -1, otherSprite);
|
||||||
|
|
||||||
if (pOther->picnum == PODFEM1 || pOther->picnum == FEM1 || pOther->picnum == FEM2 ||
|
if (pOther->picnum == PODFEM1 || pOther->picnum == FEM1 || pOther->picnum == FEM2 ||
|
||||||
pOther->picnum == FEM3 || pOther->picnum == FEM4 || pOther->picnum == FEM5 ||
|
pOther->picnum == FEM3 || pOther->picnum == FEM4 || pOther->picnum == FEM5 ||
|
||||||
pOther->picnum == FEM6 || pOther->picnum == FEM7 || pOther->picnum == FEM8 ||
|
pOther->picnum == FEM6 || pOther->picnum == FEM7 || pOther->picnum == FEM8 ||
|
||||||
pOther->picnum == FEM9 || pOther->picnum == FEM10 || pOther->picnum == STATUE ||
|
pOther->picnum == FEM9 || pOther->picnum == FEM10 || pOther->picnum == STATUE ||
|
||||||
pOther->picnum == STATUEFLASH || pOther->picnum == SPACEMARINE || pOther->picnum == QUEBALL ||
|
pOther->picnum == STATUEFLASH || pOther->picnum == SPACEMARINE || pOther->picnum == QUEBALL ||
|
||||||
pOther->picnum == STRIPEBALL)
|
pOther->picnum == STRIPEBALL)
|
||||||
A_DamageObject(otherSprite, spriteNum);
|
A_DamageObject_Internal(otherSprite, spriteNum);
|
||||||
}
|
}
|
||||||
else if (pSprite->extra == 0) actor[otherSprite].extra = 0;
|
else if (pSprite->extra == 0) actor[otherSprite].extra = 0;
|
||||||
|
|
||||||
|
@ -2697,14 +2712,16 @@ static void Proj_BounceOffWall(spritetype *s, int j)
|
||||||
// Maybe damage a ceiling or floor as the consequence of projectile impact.
|
// Maybe damage a ceiling or floor as the consequence of projectile impact.
|
||||||
// Returns 1 if sprite <s> should be killed.
|
// Returns 1 if sprite <s> should be killed.
|
||||||
// NOTE: Compare with Proj_MaybeDamageCF2() in sector.c
|
// NOTE: Compare with Proj_MaybeDamageCF2() in sector.c
|
||||||
static int Proj_MaybeDamageCF(uspritetype const * const s)
|
static int Proj_MaybeDamageCF(int spriteNum)
|
||||||
{
|
{
|
||||||
|
uspritetype const * const s = &sprite[spriteNum];
|
||||||
|
|
||||||
if (s->zvel < 0)
|
if (s->zvel < 0)
|
||||||
{
|
{
|
||||||
if ((sector[s->sectnum].ceilingstat&1) && sector[s->sectnum].ceilingpal == 0)
|
if ((sector[s->sectnum].ceilingstat&1) && sector[s->sectnum].ceilingpal == 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
Sect_DamageCeilingOrFloor(0, s->sectnum);
|
Sect_DamageCeiling(spriteNum, s->sectnum);
|
||||||
}
|
}
|
||||||
else if (s->zvel > 0)
|
else if (s->zvel > 0)
|
||||||
{
|
{
|
||||||
|
@ -2715,7 +2732,7 @@ static int Proj_MaybeDamageCF(uspritetype const * const s)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Sect_DamageCeilingOrFloor(1, s->sectnum);
|
Sect_DamageFloor(spriteNum, s->sectnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2954,7 +2971,7 @@ ACTOR_STATIC void Proj_MoveCustom(int const spriteNum)
|
||||||
case 16384:
|
case 16384:
|
||||||
setsprite(spriteNum, &davect);
|
setsprite(spriteNum, &davect);
|
||||||
|
|
||||||
if (Proj_MaybeDamageCF((uspritetype *)pSprite))
|
if (Proj_MaybeDamageCF(spriteNum))
|
||||||
{
|
{
|
||||||
A_DeleteSprite(spriteNum);
|
A_DeleteSprite(spriteNum);
|
||||||
return;
|
return;
|
||||||
|
@ -3172,7 +3189,7 @@ ACTOR_STATIC void G_MoveWeapons(void)
|
||||||
case 16384:
|
case 16384:
|
||||||
setsprite(spriteNum, &davect);
|
setsprite(spriteNum, &davect);
|
||||||
|
|
||||||
if (Proj_MaybeDamageCF((uspritetype *)pSprite))
|
if (Proj_MaybeDamageCF(spriteNum))
|
||||||
DELETE_SPRITE_AND_CONTINUE(spriteNum);
|
DELETE_SPRITE_AND_CONTINUE(spriteNum);
|
||||||
|
|
||||||
if (pSprite->picnum == FREEZEBLAST)
|
if (pSprite->picnum == FREEZEBLAST)
|
||||||
|
|
|
@ -254,7 +254,8 @@ enum sflags_t
|
||||||
SFLAG_HURTSPAWNBLOOD = 0x00400000,
|
SFLAG_HURTSPAWNBLOOD = 0x00400000,
|
||||||
SFLAG_GREENSLIMEFOOD = 0x00800000,
|
SFLAG_GREENSLIMEFOOD = 0x00800000,
|
||||||
SFLAG_REALCLIPDIST = 0x01000000,
|
SFLAG_REALCLIPDIST = 0x01000000,
|
||||||
SFLAG_WAKEUPBADGUYS = 0x02000000
|
SFLAG_WAKEUPBADGUYS = 0x02000000,
|
||||||
|
SFLAG_DAMAGEEVENT = 0x04000000,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Custom projectiles "workslike" flags.
|
// Custom projectiles "workslike" flags.
|
||||||
|
|
|
@ -150,6 +150,11 @@ enum GameEvent_t {
|
||||||
EVENT_CONTINUELEVELMUSICSLOT,
|
EVENT_CONTINUELEVELMUSICSLOT,
|
||||||
EVENT_DISPLAYPOINTER,
|
EVENT_DISPLAYPOINTER,
|
||||||
EVENT_LASTWEAPON,
|
EVENT_LASTWEAPON,
|
||||||
|
EVENT_DAMAGESPRITE,
|
||||||
|
EVENT_POSTDAMAGESPRITE,
|
||||||
|
EVENT_DAMAGEWALL,
|
||||||
|
EVENT_DAMAGEFLOOR,
|
||||||
|
EVENT_DAMAGECEILING,
|
||||||
#ifdef LUNATIC
|
#ifdef LUNATIC
|
||||||
EVENT_ANIMATEALLSPRITES,
|
EVENT_ANIMATEALLSPRITES,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -153,7 +153,7 @@ extern camera_t g_camera;
|
||||||
#define MAXPWLOCKOUT 128
|
#define MAXPWLOCKOUT 128
|
||||||
#define MAXRTSNAME 128
|
#define MAXRTSNAME 128
|
||||||
|
|
||||||
#define MAX_RETURN_VALUES 4
|
#define MAX_RETURN_VALUES 6
|
||||||
|
|
||||||
// KEEPINSYNC lunatic/_defs_game.lua
|
// KEEPINSYNC lunatic/_defs_game.lua
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -149,6 +149,8 @@ static tokenmap_t const vm_keywords[] =
|
||||||
{ "count", CON_COUNT },
|
{ "count", CON_COUNT },
|
||||||
{ "cstat", CON_CSTAT },
|
{ "cstat", CON_CSTAT },
|
||||||
{ "cstator", CON_CSTATOR },
|
{ "cstator", CON_CSTATOR },
|
||||||
|
{ "damageeventtile", CON_DAMAGEEVENTTILE },
|
||||||
|
{ "damageeventtilerange", CON_DAMAGEEVENTTILERANGE },
|
||||||
{ "debris", CON_DEBRIS },
|
{ "debris", CON_DEBRIS },
|
||||||
{ "debug", CON_DEBUG },
|
{ "debug", CON_DEBUG },
|
||||||
{ "default", CON_DEFAULT },
|
{ "default", CON_DEFAULT },
|
||||||
|
@ -759,6 +761,11 @@ const char *EventNames[MAXEVENTS] =
|
||||||
"EVENT_CONTINUELEVELMUSICSLOT",
|
"EVENT_CONTINUELEVELMUSICSLOT",
|
||||||
"EVENT_DISPLAYPOINTER",
|
"EVENT_DISPLAYPOINTER",
|
||||||
"EVENT_LASTWEAPON",
|
"EVENT_LASTWEAPON",
|
||||||
|
"EVENT_DAMAGESPRITE",
|
||||||
|
"EVENT_POSTDAMAGESPRITE",
|
||||||
|
"EVENT_DAMAGEWALL",
|
||||||
|
"EVENT_DAMAGEFLOOR",
|
||||||
|
"EVENT_DAMAGECEILING",
|
||||||
#ifdef LUNATIC
|
#ifdef LUNATIC
|
||||||
"EVENT_ANIMATEALLSPRITES",
|
"EVENT_ANIMATEALLSPRITES",
|
||||||
#endif
|
#endif
|
||||||
|
@ -4585,6 +4592,59 @@ DO_DEFSTATE:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case CON_DAMAGEEVENTTILE:
|
||||||
|
{
|
||||||
|
if (EDUKE32_PREDICT_FALSE(g_processingState || g_parsingActorPtr))
|
||||||
|
{
|
||||||
|
C_ReportError(ERROR_FOUNDWITHIN);
|
||||||
|
g_errorCnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_scriptPtr--;
|
||||||
|
|
||||||
|
C_GetNextValue(LABEL_DEFINE);
|
||||||
|
j = *(g_scriptPtr - 1);
|
||||||
|
|
||||||
|
if (EDUKE32_PREDICT_FALSE((unsigned)j >= MAXTILES))
|
||||||
|
{
|
||||||
|
C_ReportError(ERROR_EXCEEDSMAXTILES);
|
||||||
|
g_errorCnt++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_tile[j].flags |= SFLAG_DAMAGEEVENT;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
case CON_DAMAGEEVENTTILERANGE:
|
||||||
|
{
|
||||||
|
if (EDUKE32_PREDICT_FALSE(g_processingState || g_parsingActorPtr))
|
||||||
|
{
|
||||||
|
C_ReportError(ERROR_FOUNDWITHIN);
|
||||||
|
g_errorCnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_scriptPtr--;
|
||||||
|
|
||||||
|
C_GetNextValue(LABEL_DEFINE);
|
||||||
|
i = *(g_scriptPtr - 1);
|
||||||
|
C_GetNextValue(LABEL_DEFINE);
|
||||||
|
j = *(g_scriptPtr - 1);
|
||||||
|
|
||||||
|
if (EDUKE32_PREDICT_FALSE((unsigned)i >= MAXTILES || (unsigned)j >= MAXTILES))
|
||||||
|
{
|
||||||
|
C_ReportError(ERROR_EXCEEDSMAXTILES);
|
||||||
|
g_errorCnt++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (tiledata_t * t = g_tile + i, * t_end = g_tile + j; t <= t_end; ++t)
|
||||||
|
t->flags |= SFLAG_DAMAGEEVENT;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
case CON_SPRITEFLAGS:
|
case CON_SPRITEFLAGS:
|
||||||
if (!g_parsingActorPtr && g_processingState == 0)
|
if (!g_parsingActorPtr && g_processingState == 0)
|
||||||
{
|
{
|
||||||
|
@ -6352,6 +6412,7 @@ static void C_AddDefaultDefinitions(void)
|
||||||
{ "SFLAG_GREENSLIMEFOOD", SFLAG_GREENSLIMEFOOD },
|
{ "SFLAG_GREENSLIMEFOOD", SFLAG_GREENSLIMEFOOD },
|
||||||
{ "SFLAG_REALCLIPDIST", SFLAG_REALCLIPDIST },
|
{ "SFLAG_REALCLIPDIST", SFLAG_REALCLIPDIST },
|
||||||
{ "SFLAG_WAKEUPBADGUYS", SFLAG_WAKEUPBADGUYS },
|
{ "SFLAG_WAKEUPBADGUYS", SFLAG_WAKEUPBADGUYS },
|
||||||
|
{ "SFLAG_DAMAGEEVENT", SFLAG_DAMAGEEVENT },
|
||||||
|
|
||||||
{ "STR_MAPNAME", STR_MAPNAME },
|
{ "STR_MAPNAME", STR_MAPNAME },
|
||||||
{ "STR_MAPFILENAME", STR_MAPFILENAME },
|
{ "STR_MAPFILENAME", STR_MAPFILENAME },
|
||||||
|
|
|
@ -1247,6 +1247,8 @@ enum ScriptKeywords_t
|
||||||
CON_SHOWVIEWQ16UNBIASED,// 426
|
CON_SHOWVIEWQ16UNBIASED,// 426
|
||||||
CON_GETTILEDATA, // 427
|
CON_GETTILEDATA, // 427
|
||||||
CON_SETTILEDATA, // 428
|
CON_SETTILEDATA, // 428
|
||||||
|
CON_DAMAGEEVENTTILE, // 429
|
||||||
|
CON_DAMAGEEVENTTILERANGE, // 430
|
||||||
CON_END
|
CON_END
|
||||||
};
|
};
|
||||||
// KEEPINSYNC with the keyword list in lunatic/con_lang.lua
|
// KEEPINSYNC with the keyword list in lunatic/con_lang.lua
|
||||||
|
|
|
@ -581,7 +581,7 @@ static inline void HandleHitWall(hitdata_t *hitData)
|
||||||
// Maybe damage a ceiling or floor as the consequence of projectile impact.
|
// Maybe damage a ceiling or floor as the consequence of projectile impact.
|
||||||
// Returns 1 if projectile hit a parallaxed ceiling.
|
// Returns 1 if projectile hit a parallaxed ceiling.
|
||||||
// NOTE: Compare with Proj_MaybeDamageCF() in actors.c
|
// NOTE: Compare with Proj_MaybeDamageCF() in actors.c
|
||||||
static int Proj_MaybeDamageCF2(int const zvel, int const hitSect)
|
static int Proj_MaybeDamageCF2(int const spriteNum, int const zvel, int const hitSect)
|
||||||
{
|
{
|
||||||
Bassert(hitSect >= 0);
|
Bassert(hitSect >= 0);
|
||||||
|
|
||||||
|
@ -590,7 +590,7 @@ static int Proj_MaybeDamageCF2(int const zvel, int const hitSect)
|
||||||
if (sector[hitSect].ceilingstat&1)
|
if (sector[hitSect].ceilingstat&1)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
Sect_DamageCeilingOrFloor(0, hitSect);
|
Sect_DamageCeiling(spriteNum, hitSect);
|
||||||
}
|
}
|
||||||
else if (zvel > 0)
|
else if (zvel > 0)
|
||||||
{
|
{
|
||||||
|
@ -601,7 +601,7 @@ static int Proj_MaybeDamageCF2(int const zvel, int const hitSect)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Sect_DamageCeilingOrFloor(1, hitSect);
|
Sect_DamageFloor(spriteNum, hitSect);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -622,7 +622,7 @@ static int P_PostFireHitscan(int const playerNum, int const spriteNum, hitdata_t
|
||||||
{
|
{
|
||||||
if (hitData->wall == -1 && hitData->sprite == -1)
|
if (hitData->wall == -1 && hitData->sprite == -1)
|
||||||
{
|
{
|
||||||
if (Proj_MaybeDamageCF2(zvel, hitData->sect))
|
if (Proj_MaybeDamageCF2(spriteNum, zvel, hitData->sect))
|
||||||
{
|
{
|
||||||
sprite[spriteNum].xrepeat = 0;
|
sprite[spriteNum].xrepeat = 0;
|
||||||
sprite[spriteNum].yrepeat = 0;
|
sprite[spriteNum].yrepeat = 0;
|
||||||
|
@ -746,7 +746,7 @@ static int A_PostFireHitscan(const hitdata_t *hitData, int const spriteNum, int
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Proj_MaybeDamageCF2(zvel, hitData->sect))
|
if (Proj_MaybeDamageCF2(returnSprite, zvel, hitData->sect))
|
||||||
{
|
{
|
||||||
sprite[returnSprite].xrepeat = 0;
|
sprite[returnSprite].xrepeat = 0;
|
||||||
sprite[returnSprite].yrepeat = 0;
|
sprite[returnSprite].yrepeat = 0;
|
||||||
|
@ -1206,7 +1206,7 @@ static int32_t A_ShootHardcoded(int spriteNum, int projecTile, int shootAng, vec
|
||||||
|
|
||||||
if (hitData.wall == -1 && hitData.sprite == -1 && hitData.sect >= 0)
|
if (hitData.wall == -1 && hitData.sprite == -1 && hitData.sect >= 0)
|
||||||
{
|
{
|
||||||
Proj_MaybeDamageCF2(Zvel, hitData.sect);
|
Proj_MaybeDamageCF2(otherSprite, Zvel, hitData.sect);
|
||||||
}
|
}
|
||||||
else if (hitData.sprite >= 0)
|
else if (hitData.sprite >= 0)
|
||||||
A_DamageObject(hitData.sprite, otherSprite);
|
A_DamageObject(hitData.sprite, otherSprite);
|
||||||
|
|
|
@ -1479,11 +1479,17 @@ static void G_BreakWall(int tileNum, int spriteNum, int wallNum)
|
||||||
A_SpawnWallGlass(spriteNum,wallNum,10);
|
A_SpawnWallGlass(spriteNum,wallNum,10);
|
||||||
}
|
}
|
||||||
|
|
||||||
void A_DamageWall(int spriteNum, int wallNum, const vec3_t *vPos, int weaponNum)
|
void A_DamageWall_Internal(int spriteNum, int wallNum, const vec3_t *vPos, int weaponNum)
|
||||||
{
|
{
|
||||||
int16_t sectNum = -1;
|
int16_t sectNum = -1;
|
||||||
walltype *pWall = &wall[wallNum];
|
walltype *pWall = &wall[wallNum];
|
||||||
|
|
||||||
|
if ((g_tile[pWall->overpicnum].flags & SFLAG_DAMAGEEVENT) || (g_tile[pWall->picnum].flags & SFLAG_DAMAGEEVENT))
|
||||||
|
{
|
||||||
|
if (VM_OnEventWithReturn(EVENT_DAMAGEWALL, spriteNum, -1, wallNum) < 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (pWall->overpicnum == MIRROR && pWall->pal != 4 &&
|
if (pWall->overpicnum == MIRROR && pWall->pal != 4 &&
|
||||||
A_CheckSpriteFlags(spriteNum, SFLAG_PROJECTILE) &&
|
A_CheckSpriteFlags(spriteNum, SFLAG_PROJECTILE) &&
|
||||||
(SpriteProjectile[spriteNum].workslike & PROJECTILE_RPG))
|
(SpriteProjectile[spriteNum].workslike & PROJECTILE_RPG))
|
||||||
|
@ -1753,19 +1759,53 @@ void A_DamageWall(int spriteNum, int wallNum, const vec3_t *vPos, int weaponNum)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: return value never examined in any of the callers.
|
void A_DamageWall(int spriteNum, int wallNum, const vec3_t *vPos, int weaponNum)
|
||||||
int Sect_DamageCeilingOrFloor(int const dmgFloor, int const sectNum)
|
|
||||||
{
|
{
|
||||||
|
ud.returnvar[0] = -1;
|
||||||
|
A_DamageWall_Internal(spriteNum, wallNum, vPos, weaponNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sect_DamageFloor_Internal(int const spriteNum, int const sectNum)
|
||||||
|
{
|
||||||
|
int16_t tileNum = sector[sectNum].floorpicnum;
|
||||||
|
if (g_tile[tileNum].flags & SFLAG_DAMAGEEVENT)
|
||||||
|
{
|
||||||
|
if (VM_OnEventWithReturn(EVENT_DAMAGEFLOOR, spriteNum, -1, sectNum) < 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE: pass RETURN in the dist argument, too.
|
// NOTE: pass RETURN in the dist argument, too.
|
||||||
int const RETURN_in = dmgFloor ? 131072 + sectNum : 65536 + sectNum;
|
int const RETURN_in = 131072 + sectNum;
|
||||||
int32_t const returnValue =
|
/* int32_t const returnValue = */ VM_OnEventWithBoth(EVENT_DAMAGEHPLANE, -1, -1, RETURN_in, RETURN_in);
|
||||||
VM_OnEventWithBoth(EVENT_DAMAGEHPLANE, g_player[screenpeek].ps->i, screenpeek, RETURN_in, RETURN_in);
|
|
||||||
|
#if 0
|
||||||
|
// No hard-coded floor damage effects.
|
||||||
|
if (returnValue < 0)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sect_DamageFloor(int const spriteNum, int const sectNum)
|
||||||
|
{
|
||||||
|
ud.returnvar[0] = -1;
|
||||||
|
Sect_DamageFloor_Internal(spriteNum, sectNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sect_DamageCeiling_Internal(int const spriteNum, int const sectNum)
|
||||||
|
{
|
||||||
|
int16_t tileNum = sector[sectNum].ceilingpicnum;
|
||||||
|
if (g_tile[tileNum].flags & SFLAG_DAMAGEEVENT)
|
||||||
|
{
|
||||||
|
if (VM_OnEventWithReturn(EVENT_DAMAGECEILING, spriteNum, -1, sectNum) < 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: pass RETURN in the dist argument, too.
|
||||||
|
int const RETURN_in = 65536 + sectNum;
|
||||||
|
int32_t const returnValue = VM_OnEventWithBoth(EVENT_DAMAGEHPLANE, -1, -1, RETURN_in, RETURN_in);
|
||||||
|
|
||||||
if (returnValue < 0)
|
if (returnValue < 0)
|
||||||
return 0;
|
return;
|
||||||
|
|
||||||
if (dmgFloor)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
int16_t * const pPicnum = §or[sectNum].ceilingpicnum;
|
int16_t * const pPicnum = §or[sectNum].ceilingpicnum;
|
||||||
|
|
||||||
|
@ -1813,19 +1853,27 @@ int Sect_DamageCeilingOrFloor(int const dmgFloor, int const sectNum)
|
||||||
T5(i) = 1;
|
T5(i) = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
void Sect_DamageCeiling(int const spriteNum, int const sectNum)
|
||||||
|
{
|
||||||
|
ud.returnvar[0] = -1;
|
||||||
|
Sect_DamageCeiling_Internal(spriteNum, sectNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
// hard coded props... :(
|
// hard coded props... :(
|
||||||
void A_DamageObject(int spriteNum, int const dmgSrc)
|
void A_DamageObject_Internal(int spriteNum, int const dmgSrc)
|
||||||
{
|
{
|
||||||
if (g_netClient)
|
if (g_netClient)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (A_CheckSpriteFlags(spriteNum, SFLAG_DAMAGEEVENT))
|
||||||
|
{
|
||||||
|
if (VM_OnEventWithReturn(EVENT_DAMAGESPRITE, dmgSrc, -1, spriteNum) < 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int radiusDamage = 0;
|
int radiusDamage = 0;
|
||||||
|
|
||||||
spriteNum &= (MAXSPRITES-1);
|
spriteNum &= (MAXSPRITES-1);
|
||||||
|
@ -2272,6 +2320,9 @@ void A_DamageObject(int spriteNum, int const dmgSrc)
|
||||||
actor[spriteNum].extra += sprite[dmgSrc].extra;
|
actor[spriteNum].extra += sprite[dmgSrc].extra;
|
||||||
actor[spriteNum].ang = sprite[dmgSrc].ang;
|
actor[spriteNum].ang = sprite[dmgSrc].ang;
|
||||||
actor[spriteNum].owner = sprite[dmgSrc].owner;
|
actor[spriteNum].owner = sprite[dmgSrc].owner;
|
||||||
|
|
||||||
|
if(A_CheckSpriteFlags(spriteNum, SFLAG_DAMAGEEVENT))
|
||||||
|
VM_OnEventWithReturn(EVENT_POSTDAMAGESPRITE, dmgSrc, -1, spriteNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sprite[spriteNum].statnum == STAT_PLAYER)
|
if (sprite[spriteNum].statnum == STAT_PLAYER)
|
||||||
|
@ -2294,6 +2345,12 @@ void A_DamageObject(int spriteNum, int const dmgSrc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void A_DamageObject(int spriteNum, int const dmgSrc)
|
||||||
|
{
|
||||||
|
ud.returnvar[0] = -1;
|
||||||
|
A_DamageObject_Internal(spriteNum, dmgSrc);
|
||||||
|
}
|
||||||
|
|
||||||
void G_AlignWarpElevators(void)
|
void G_AlignWarpElevators(void)
|
||||||
{
|
{
|
||||||
for (bssize_t SPRITES_OF(STAT_EFFECTOR, i))
|
for (bssize_t SPRITES_OF(STAT_EFFECTOR, i))
|
||||||
|
|
|
@ -118,7 +118,9 @@ void G_ActivateBySector(int sect,int j);
|
||||||
int S_FindMusicSFX(int sectNum, int *sndptr);
|
int S_FindMusicSFX(int sectNum, int *sndptr);
|
||||||
int A_CallSound(int sectNum,int spriteNum);
|
int A_CallSound(int sectNum,int spriteNum);
|
||||||
int A_CheckHitSprite(int spriteNum,int16_t *hitSprite);
|
int A_CheckHitSprite(int spriteNum,int16_t *hitSprite);
|
||||||
|
void A_DamageObject_Internal(int spriteNum, int const dmgSrc);
|
||||||
void A_DamageObject(int spriteNum,int const dmgSrc);
|
void A_DamageObject(int spriteNum,int const dmgSrc);
|
||||||
|
void A_DamageWall_Internal(int spr, int dawallnum, const vec3_t *pos, int atwith);
|
||||||
void A_DamageWall(int spr,int dawallnum,const vec3_t *pos,int atwith);
|
void A_DamageWall(int spr,int dawallnum,const vec3_t *pos,int atwith);
|
||||||
int __fastcall A_FindPlayer(const spritetype *pSprite,int32_t *dist);
|
int __fastcall A_FindPlayer(const spritetype *pSprite,int32_t *dist);
|
||||||
void G_AlignWarpElevators(void);
|
void G_AlignWarpElevators(void);
|
||||||
|
@ -139,7 +141,10 @@ int isanearoperator(int lotag);
|
||||||
int isanunderoperator(int lotag);
|
int isanunderoperator(int lotag);
|
||||||
int P_ActivateSwitch(int playerNum, int nObject, int nSwitchType);
|
int P_ActivateSwitch(int playerNum, int nObject, int nSwitchType);
|
||||||
void P_CheckSectors(int snum);
|
void P_CheckSectors(int snum);
|
||||||
int Sect_DamageCeilingOrFloor(int const dmgFloor, int const sectNum);
|
void Sect_DamageFloor_Internal(int const spriteNum, int const sectNum);
|
||||||
|
void Sect_DamageFloor(int const spriteNum, int const sectNum);
|
||||||
|
void Sect_DamageCeiling_Internal(int const spriteNum, int const sectNum);
|
||||||
|
void Sect_DamageCeiling(int const spriteNum, int const sectNum);
|
||||||
int SetAnimation(int sectNum,int32_t *animPtr,int goalVal,int animVel);
|
int SetAnimation(int sectNum,int32_t *animPtr,int goalVal,int animVel);
|
||||||
|
|
||||||
#define FORCEFIELD_CSTAT (64+16+4+1)
|
#define FORCEFIELD_CSTAT (64+16+4+1)
|
||||||
|
|
Loading…
Reference in a new issue