- moved the 3 health related instructions out of the CON interpreter.

This code can be shared with ZScript so it needs to be elsewhere.
This commit is contained in:
Christoph Oelckers 2022-12-15 15:18:46 +01:00
parent 980b3f257a
commit 9ba0b18013
8 changed files with 175 additions and 143 deletions

View file

@ -404,7 +404,8 @@ enum sflags3_t
SFLAG3_BROWNBLOOD = 0x00000004,
SFLAG3_LIGHTDAMAGE = 0x00000008,
SFLAG3_FORCERUNCON = 0x00000010, // by default only STAT_ACTOR runs CON - this enables it for other statnums as well, provided they run Tick()
SFLAG3_NOGRAVITY = 0x00000020, // disables makeitfall.
SFLAG3_BIGHEALTH = 0x00000020,
SFLAG3_NOGRAVITY = 0x00000040, // disables makeitfall.
};

View file

@ -177,6 +177,7 @@ void initactorflags_d()
setflag(SFLAG3_BROWNBLOOD, { DTILE_FECES });
setflag(SFLAG3_DONTDIVEALIVE, { DTILE_OCTABRAIN, DTILE_SHARK, DTILE_GREENSLIME });
setflag(SFLAG3_LIGHTDAMAGE, { DTILE_SHOTSPARK1 });
setflag(SFLAG3_BIGHEALTH, { DTILE_ATOMICHEALTH });
if (isWorldTour())
{

View file

@ -184,6 +184,7 @@ void initactorflags_r()
setflag(SFLAG2_FREEZEDAMAGE | SFLAG2_REFLECTIVE, { RTILE_FREEZEBLAST });
setflag(SFLAG2_FLOATING, { RTILE_DRONE });
setflag(SFLAG3_BLOODY, { RTILE_BLOODPOOL });
setflag(SFLAG3_BIGHEALTH, { RTILE_ATOMICHEALTH });
setflag(SFLAG2_NOFLOORPAL, {
RTILE_RESPAWNMARKERRED,

View file

@ -115,6 +115,9 @@ int setpal(player_struct* p);
int madenoise(int playerNum);
int haskey(sectortype* sect, int snum);
void purplelavacheck(player_struct* p);
bool addphealth(player_struct* p, int amount, bool bigitem);
bool playereat(player_struct* p, int amount, bool bigitem);
void playerdrink(player_struct* p, int amount);
bool checkhitceiling(sectortype* sectp);
void checkhitwall(DDukeActor* spr, walltype* wal, const DVector3& pos);

View file

@ -1931,37 +1931,7 @@ int ParseState::parse(void)
case concmd_isdrunk: // todo: move out to player_r.
insptr++;
ps[g_p].drink_amt += *insptr;
j = ps[g_p].GetActor()->spr.extra;
if (j > 0)
j += *insptr;
if (j > gs.max_player_health * 2)
j = gs.max_player_health * 2;
if (j < 0)
j = 0;
if (ud.god == 0)
{
if (*insptr > 0)
{
if ((j - *insptr) < (gs.max_player_health >> 2) &&
j >= (gs.max_player_health >> 2))
S_PlayActorSound(DUKE_GOTHEALTHATLOW, ps[g_p].GetActor());
ps[g_p].last_extra = j;
}
ps[g_p].GetActor()->spr.extra = j;
}
if (ps[g_p].drink_amt > 100)
ps[g_p].drink_amt = 100;
if (ps[g_p].GetActor()->spr.extra >= gs.max_player_health)
{
ps[g_p].GetActor()->spr.extra = gs.max_player_health;
ps[g_p].last_extra = gs.max_player_health;
}
insptr++;
playerdrink(&ps[g_p], *insptr++);
break;
case concmd_strafeleft:
insptr++;
@ -1979,118 +1949,13 @@ int ParseState::parse(void)
insptr++;
destroyit(g_ac);
break;
case concmd_iseat: // move out to player_r.
insptr++;
ps[g_p].eat += *insptr;
if (ps[g_p].eat > 100)
{
ps[g_p].eat = 100;
}
ps[g_p].drink_amt -= *insptr;
if (ps[g_p].drink_amt < 0)
ps[g_p].drink_amt = 0;
j = ps[g_p].GetActor()->spr.extra;
if (g_ac->GetClass()->TypeName != NAME_RedneckGoogooCluster)
{
if (j > gs.max_player_health && *insptr > 0)
{
insptr++;
break;
}
else
{
if (j > 0)
j += (*insptr) * 3;
if (j > gs.max_player_health && *insptr > 0)
j = gs.max_player_health;
}
}
else
{
if (j > 0)
j += *insptr;
if (j > (gs.max_player_health << 1))
j = (gs.max_player_health << 1);
}
if (j < 0) j = 0;
if (ud.god == 0)
{
if (*insptr > 0)
{
if ((j - *insptr) < (gs.max_player_health >> 2) &&
j >= (gs.max_player_health >> 2))
S_PlayActorSound(229, ps[g_p].GetActor());
ps[g_p].last_extra = j;
}
ps[g_p].GetActor()->spr.extra = j;
}
case concmd_iseat:
insptr++;
playereat(&ps[g_p], *insptr++, actorflag(g_ac, SFLAG3_BIGHEALTH));
break;
case concmd_addphealth: // todo: move out to player.
insptr++;
if(!isRR() && ps[g_p].newOwner != nullptr)
{
ps[g_p].newOwner = nullptr;
ps[g_p].GetActor()->restoreloc();
updatesector(ps[g_p].GetActor()->getPosWithOffsetZ(), &ps[g_p].cursector);
DukeStatIterator it(STAT_ACTOR);
while (auto actj = it.Next())
{
if (actorflag(actj, SFLAG2_CAMERA))
actj->spr.yint = 0;
}
}
j = ps[g_p].GetActor()->spr.extra;
if(!g_ac->IsKindOf(NAME_DukeAtomicHealth) && g_ac->GetClass()->TypeName != NAME_RedneckGoogooCluster)
{
if( j > gs.max_player_health && *insptr > 0 )
{
insptr++;
break;
}
else
{
if(j > 0)
j += *insptr;
if ( j > gs.max_player_health && *insptr > 0 )
j = gs.max_player_health;
}
}
else
{
if( j > 0 )
j += *insptr;
if ( j > (gs.max_player_health<<1) )
j = (gs.max_player_health<<1);
}
if(j < 0) j = 0;
if(ud.god == 0)
{
if(*insptr > 0)
{
if( ( j - *insptr ) < (gs.max_player_health>>2) &&
j >= (gs.max_player_health>>2) )
S_PlayActorSound(isRR()? 229 : DUKE_GOTHEALTHATLOW,ps[g_p].GetActor());
ps[g_p].last_extra = j;
}
ps[g_p].GetActor()->spr.extra = j;
}
case concmd_addphealth:
insptr++;
addphealth(&ps[g_p], *insptr++, actorflag(g_ac, SFLAG3_BIGHEALTH));
break;
case concmd_state:

View file

@ -1030,4 +1030,165 @@ void purplelavacheck(player_struct* p)
}
}
//---------------------------------------------------------------------------
//
// moved out of the CON interpreter.
//
//---------------------------------------------------------------------------
bool addphealth(player_struct* p, int amount, bool bigitem)
{
if (p->newOwner != nullptr)
{
p->newOwner = nullptr;
p->GetActor()->restoreloc();
updatesector(p->GetActor()->getPosWithOffsetZ(), &p->cursector);
DukeStatIterator it(STAT_ACTOR);
while (auto actj = it.Next())
{
if (actorflag(actj, SFLAG2_CAMERA))
actj->spr.yint = 0;
}
}
int curhealth = p->GetActor()->spr.extra;
if (!bigitem)
{
if (curhealth > gs.max_player_health && amount > 0)
{
return false;
}
else
{
if (curhealth > 0)
curhealth += amount;
if (curhealth > gs.max_player_health && amount > 0)
curhealth = gs.max_player_health;
}
}
else
{
if (curhealth > 0)
curhealth += amount;
if (curhealth > (gs.max_player_health << 1))
curhealth = (gs.max_player_health << 1);
}
if (curhealth < 0) curhealth = 0;
if (ud.god == 0)
{
if (amount > 0)
{
if ((curhealth - amount) < (gs.max_player_health >> 2) &&
curhealth >= (gs.max_player_health >> 2))
S_PlayActorSound(PLAYER_GOTHEALTHATLOW, p->GetActor());
p->last_extra = curhealth;
}
p->GetActor()->spr.extra = curhealth;
}
return true;
}
//---------------------------------------------------------------------------
//
// moved out of the CON interpreter.
//
//---------------------------------------------------------------------------
bool playereat(player_struct* p, int amount, bool bigitem)
{
p->eat += amount;
if (p->eat > 100)
{
p->eat = 100;
}
p->drink_amt -= amount;
if (p->drink_amt < 0)
p->drink_amt = 0;
int curhealth = p->GetActor()->spr.extra;
if (!bigitem)
{
if (curhealth > gs.max_player_health && amount > 0)
{
return false;
}
else
{
if (curhealth > 0)
curhealth += (amount) * 3;
if (curhealth > gs.max_player_health && amount > 0)
curhealth = gs.max_player_health;
}
}
else
{
if (curhealth > 0)
curhealth += amount;
if (curhealth > (gs.max_player_health << 1))
curhealth = (gs.max_player_health << 1);
}
if (curhealth < 0) curhealth = 0;
if (ud.god == 0)
{
if (amount > 0)
{
if ((curhealth - amount) < (gs.max_player_health >> 2) &&
curhealth >= (gs.max_player_health >> 2))
S_PlayActorSound(PLAYER_GOTHEALTHATLOW, p->GetActor());
p->last_extra = curhealth;
}
p->GetActor()->spr.extra = curhealth;
}
return true;
}
//---------------------------------------------------------------------------
//
// moved out of the CON interpreter.
//
//---------------------------------------------------------------------------
void playerdrink(player_struct* p, int amount)
{
p->drink_amt += amount;
int curhealth = p->GetActor()->spr.extra;
if (curhealth > 0)
curhealth += amount;
if (curhealth > gs.max_player_health * 2)
curhealth = gs.max_player_health * 2;
if (curhealth < 0)
curhealth = 0;
if (ud.god == 0)
{
if (amount > 0)
{
if ((curhealth - amount) < (gs.max_player_health >> 2) &&
curhealth >= (gs.max_player_health >> 2))
S_PlayActorSound(PLAYER_GOTHEALTHATLOW, p->GetActor());
p->last_extra = curhealth;
}
p->GetActor()->spr.extra = curhealth;
}
if (p->drink_amt > 100)
p->drink_amt = 100;
if (p->GetActor()->spr.extra >= gs.max_player_health)
{
p->GetActor()->spr.extra = gs.max_player_health;
p->last_extra = gs.max_player_health;
}
}
END_DUKE_NS

View file

@ -254,7 +254,7 @@ enum
JIBBED_ACTOR5 =226,
JIBBED_ACTOR6 =227,
JIBBED_ACTOR7 =228,
DUKE_GOTHEALTHATLOW =229,
PLAYER_GOTHEALTHATLOW =229,
BOSSTALKTODUKE =230,
WAR_AMBIENCE1 =231,
WAR_AMBIENCE2 =232,

View file

@ -234,7 +234,7 @@ $conreserve JIBBED4 225
$conreserve JIBBED5 226
$conreserve JIBBED6 227
$conreserve JIBBED7 228
$conreserve LN_BACON 229
$conreserve PLAYER_GOTHEALTHATLOW 229
$conreserve E2L5 230
$conreserve REGISTER 231
$conreserve BBQGRILL 232