mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-14 00:20:38 +00:00
- Added code submissions for non-piercing railguns and new skill options.
SVN r1706 (trunk)
This commit is contained in:
parent
3786ced96e
commit
635d71e660
25 changed files with 155 additions and 50 deletions
|
@ -1,4 +1,7 @@
|
||||||
July 3, 2009
|
July 4, 2009 (Changes by Graf Zahl)
|
||||||
|
- Added code submissions for non-piercing railguns and new skill options.
|
||||||
|
|
||||||
|
July 3, 2009
|
||||||
- ZDoom now disables the input method editor, since it has no east-Asian
|
- ZDoom now disables the input method editor, since it has no east-Asian
|
||||||
support, and having it open a composition window when you're only expecting
|
support, and having it open a composition window when you're only expecting
|
||||||
a single keypress is not so good.
|
a single keypress is not so good.
|
||||||
|
|
|
@ -639,6 +639,9 @@ public:
|
||||||
// Enter the crash state
|
// Enter the crash state
|
||||||
void Crash();
|
void Crash();
|
||||||
|
|
||||||
|
// Return starting health adjusted by skill level
|
||||||
|
int SpawnHealth();
|
||||||
|
|
||||||
// Check for monsters that count as kill but excludes all friendlies.
|
// Check for monsters that count as kill but excludes all friendlies.
|
||||||
bool CountsAsKill() const
|
bool CountsAsKill() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -768,7 +768,7 @@ CCMD(linetarget)
|
||||||
Printf("Target=%s, Health=%d, Spawnhealth=%d\n",
|
Printf("Target=%s, Health=%d, Spawnhealth=%d\n",
|
||||||
linetarget->GetClass()->TypeName.GetChars(),
|
linetarget->GetClass()->TypeName.GetChars(),
|
||||||
linetarget->health,
|
linetarget->health,
|
||||||
linetarget->GetDefault()->health);
|
linetarget->SpawnHealth());
|
||||||
}
|
}
|
||||||
else Printf("No target found\n");
|
else Printf("No target found\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -2129,11 +2129,13 @@ void Net_DoCommand (int type, BYTE **stream, int player)
|
||||||
spawned->FriendPlayer = player + 1;
|
spawned->FriendPlayer = player + 1;
|
||||||
spawned->flags |= MF_FRIENDLY;
|
spawned->flags |= MF_FRIENDLY;
|
||||||
spawned->LastHeard = players[player].mo;
|
spawned->LastHeard = players[player].mo;
|
||||||
|
spawned->health = spawned->SpawnHealth();
|
||||||
}
|
}
|
||||||
else if (type == DEM_SUMMONFOE || type == DEM_SUMMONFOE2)
|
else if (type == DEM_SUMMONFOE || type == DEM_SUMMONFOE2)
|
||||||
{
|
{
|
||||||
spawned->FriendPlayer = 0;
|
spawned->FriendPlayer = 0;
|
||||||
spawned->flags &= ~MF_FRIENDLY;
|
spawned->flags &= ~MF_FRIENDLY;
|
||||||
|
spawned->health = spawned->SpawnHealth();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (type >= DEM_SUMMON2 && type <= DEM_SUMMONFOE2)
|
if (type >= DEM_SUMMON2 && type <= DEM_SUMMONFOE2)
|
||||||
|
|
|
@ -76,7 +76,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Srcr1Attack)
|
||||||
}
|
}
|
||||||
|
|
||||||
const PClass *fx = PClass::FindClass("SorcererFX1");
|
const PClass *fx = PClass::FindClass("SorcererFX1");
|
||||||
if (self->health > (self->GetDefault()->health/3)*2)
|
if (self->health > (self->SpawnHealth()/3)*2)
|
||||||
{ // Spit one fireball
|
{ // Spit one fireball
|
||||||
P_SpawnMissileZ (self, self->z + 48*FRACUNIT, self->target, fx );
|
P_SpawnMissileZ (self, self->z + 48*FRACUNIT, self->target, fx );
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Srcr1Attack)
|
||||||
P_SpawnMissileAngleZ (self, self->z + 48*FRACUNIT, fx, angle-ANGLE_1*3, velz);
|
P_SpawnMissileAngleZ (self, self->z + 48*FRACUNIT, fx, angle-ANGLE_1*3, velz);
|
||||||
P_SpawnMissileAngleZ (self, self->z + 48*FRACUNIT, fx, angle+ANGLE_1*3, velz);
|
P_SpawnMissileAngleZ (self, self->z + 48*FRACUNIT, fx, angle+ANGLE_1*3, velz);
|
||||||
}
|
}
|
||||||
if (self->health < self->GetDefault()->health/3)
|
if (self->health < self->SpawnHealth()/3)
|
||||||
{ // Maybe attack again
|
{ // Maybe attack again
|
||||||
if (self->special1)
|
if (self->special1)
|
||||||
{ // Just attacked, so don't attack again
|
{ // Just attacked, so don't attack again
|
||||||
|
@ -171,7 +171,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Srcr2Decide)
|
||||||
192, 120, 120, 120, 64, 64, 32, 16, 0
|
192, 120, 120, 120, 64, 64, 32, 16, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned int chanceindex = self->health / (self->GetDefault()->health/8);
|
unsigned int chanceindex = self->health / ((self->SpawnHealth()/8 == 0) ? 1 : self->SpawnHealth()/8);
|
||||||
if (chanceindex >= countof(chance))
|
if (chanceindex >= countof(chance))
|
||||||
{
|
{
|
||||||
chanceindex = countof(chance) - 1;
|
chanceindex = countof(chance) - 1;
|
||||||
|
@ -205,7 +205,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Srcr2Attack)
|
||||||
P_TraceBleed (damage, self->target, self);
|
P_TraceBleed (damage, self->target, self);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
chance = self->health < self->GetDefault()->health/2 ? 96 : 48;
|
chance = self->health < self->SpawnHealth()/2 ? 96 : 48;
|
||||||
if (pr_s2a() < chance)
|
if (pr_s2a() < chance)
|
||||||
{ // Wizard spawners
|
{ // Wizard spawners
|
||||||
|
|
||||||
|
|
|
@ -426,7 +426,7 @@ void A_StopBalls(AActor *scary)
|
||||||
{
|
{
|
||||||
actor->StopBall = RUNTIME_CLASS(ASorcBall2); // Blue
|
actor->StopBall = RUNTIME_CLASS(ASorcBall2); // Blue
|
||||||
}
|
}
|
||||||
else if((actor->health < (actor->GetDefault()->health >> 1)) &&
|
else if((actor->health < (actor->SpawnHealth() >> 1)) &&
|
||||||
(chance < 200))
|
(chance < 200))
|
||||||
{
|
{
|
||||||
actor->StopBall = RUNTIME_CLASS(ASorcBall3); // Green
|
actor->StopBall = RUNTIME_CLASS(ASorcBall3); // Green
|
||||||
|
@ -566,7 +566,7 @@ void ASorcBall3::CastSorcererSpell ()
|
||||||
ang1 = angle - ANGLE_45;
|
ang1 = angle - ANGLE_45;
|
||||||
ang2 = angle + ANGLE_45;
|
ang2 = angle + ANGLE_45;
|
||||||
const PClass *cls = PClass::FindClass("SorcFX3");
|
const PClass *cls = PClass::FindClass("SorcFX3");
|
||||||
if (health < (GetDefault()->health/3))
|
if (health < (SpawnHealth()/3))
|
||||||
{ // Spawn 2 at a time
|
{ // Spawn 2 at a time
|
||||||
mo = P_SpawnMissileAngle(parent, cls, ang1, 4*FRACUNIT);
|
mo = P_SpawnMissileAngle(parent, cls, ang1, 4*FRACUNIT);
|
||||||
if (mo) mo->target = parent;
|
if (mo) mo->target = parent;
|
||||||
|
|
|
@ -91,7 +91,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_KoraxChase)
|
||||||
{
|
{
|
||||||
AActor *spot;
|
AActor *spot;
|
||||||
|
|
||||||
if ((!self->special2) && (self->health <= (self->GetDefault()->health/2)))
|
if ((!self->special2) && (self->health <= (self->SpawnHealth()/2)))
|
||||||
{
|
{
|
||||||
FActorIterator iterator (KORAX_FIRST_TELEPORT_TID);
|
FActorIterator iterator (KORAX_FIRST_TELEPORT_TID);
|
||||||
spot = iterator.Next ();
|
spot = iterator.Next ();
|
||||||
|
@ -117,7 +117,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_KoraxChase)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Teleport away
|
// Teleport away
|
||||||
if (self->health < (self->GetDefault()->health>>1))
|
if (self->health < (self->SpawnHealth()>>1))
|
||||||
{
|
{
|
||||||
if (pr_koraxchase()<10)
|
if (pr_koraxchase()<10)
|
||||||
{
|
{
|
||||||
|
@ -261,7 +261,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_KoraxCommand)
|
||||||
z = self->z + KORAX_COMMAND_HEIGHT*FRACUNIT;
|
z = self->z + KORAX_COMMAND_HEIGHT*FRACUNIT;
|
||||||
Spawn("KoraxBolt", x, y, z, ALLOW_REPLACE);
|
Spawn("KoraxBolt", x, y, z, ALLOW_REPLACE);
|
||||||
|
|
||||||
if (self->health <= (self->GetDefault()->health >> 1))
|
if (self->health <= (self->SpawnHealth() >> 1))
|
||||||
{
|
{
|
||||||
numcommands = 5;
|
numcommands = 5;
|
||||||
}
|
}
|
||||||
|
|
|
@ -527,7 +527,10 @@ enum ESkillProperty
|
||||||
SKILLP_AutoUseHealth,
|
SKILLP_AutoUseHealth,
|
||||||
SKILLP_SpawnFilter,
|
SKILLP_SpawnFilter,
|
||||||
SKILLP_EasyBossBrain,
|
SKILLP_EasyBossBrain,
|
||||||
SKILLP_ACSReturn
|
SKILLP_ACSReturn,
|
||||||
|
SKILLP_MonsterHealth,
|
||||||
|
SKILLP_FriendlyHealth,
|
||||||
|
SKILLP_NoPain
|
||||||
};
|
};
|
||||||
int G_SkillProperty(ESkillProperty prop);
|
int G_SkillProperty(ESkillProperty prop);
|
||||||
|
|
||||||
|
@ -558,6 +561,9 @@ struct FSkillInfo
|
||||||
FString TextColor;
|
FString TextColor;
|
||||||
SkillActorReplacement Replace;
|
SkillActorReplacement Replace;
|
||||||
SkillActorReplacement Replaced;
|
SkillActorReplacement Replaced;
|
||||||
|
fixed_t MonsterHealth;
|
||||||
|
fixed_t FriendlyHealth;
|
||||||
|
bool NoPain;
|
||||||
|
|
||||||
FSkillInfo() {}
|
FSkillInfo() {}
|
||||||
FSkillInfo(const FSkillInfo &other)
|
FSkillInfo(const FSkillInfo &other)
|
||||||
|
|
|
@ -450,7 +450,7 @@ bool P_UndoMonsterMorph (AMorphedMonster *beast, bool force)
|
||||||
actor->flags4 = (actor->flags4 & ~MF4_NOHATEPLAYERS) | (beast->flags4 & MF4_NOHATEPLAYERS);
|
actor->flags4 = (actor->flags4 & ~MF4_NOHATEPLAYERS) | (beast->flags4 & MF4_NOHATEPLAYERS);
|
||||||
if (!(beast->FlagsSave & MF_JUSTHIT))
|
if (!(beast->FlagsSave & MF_JUSTHIT))
|
||||||
actor->renderflags &= ~RF_INVISIBLE;
|
actor->renderflags &= ~RF_INVISIBLE;
|
||||||
actor->health = actor->GetDefault()->health;
|
actor->health = actor->SpawnHealth();
|
||||||
actor->velx = beast->velx;
|
actor->velx = beast->velx;
|
||||||
actor->vely = beast->vely;
|
actor->vely = beast->vely;
|
||||||
actor->velz = beast->velz;
|
actor->velz = beast->velz;
|
||||||
|
|
|
@ -233,7 +233,7 @@ bool P_GiveBody (AActor *actor, int num)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
max = actor->GetDefault()->health;
|
max = actor->SpawnHealth();
|
||||||
if (num < 0)
|
if (num < 0)
|
||||||
{
|
{
|
||||||
num = max * -num / 100;
|
num = max * -num / 100;
|
||||||
|
|
|
@ -72,6 +72,9 @@ void FMapInfoParser::ParseSkill ()
|
||||||
skill.TextColor = "";
|
skill.TextColor = "";
|
||||||
skill.Replace.Clear();
|
skill.Replace.Clear();
|
||||||
skill.Replaced.Clear();
|
skill.Replaced.Clear();
|
||||||
|
skill.MonsterHealth = FRACUNIT;
|
||||||
|
skill.FriendlyHealth = FRACUNIT;
|
||||||
|
skill.NoPain = false;
|
||||||
|
|
||||||
sc.MustGetString();
|
sc.MustGetString();
|
||||||
skill.Name = sc.String;
|
skill.Name = sc.String;
|
||||||
|
@ -226,6 +229,22 @@ void FMapInfoParser::ParseSkill ()
|
||||||
sc.MustGetString();
|
sc.MustGetString();
|
||||||
skill.TextColor.Format("[%s]", sc.String);
|
skill.TextColor.Format("[%s]", sc.String);
|
||||||
}
|
}
|
||||||
|
else if (sc.Compare("MonsterHealth"))
|
||||||
|
{
|
||||||
|
ParseAssign();
|
||||||
|
sc.MustGetFloat();
|
||||||
|
skill.MonsterHealth = FLOAT2FIXED(sc.Float);
|
||||||
|
}
|
||||||
|
else if (sc.Compare("FriendlyHealth"))
|
||||||
|
{
|
||||||
|
ParseAssign();
|
||||||
|
sc.MustGetFloat();
|
||||||
|
skill.FriendlyHealth = FLOAT2FIXED(sc.Float);
|
||||||
|
}
|
||||||
|
else if (sc.Compare("NoPain"))
|
||||||
|
{
|
||||||
|
skill.NoPain = true;
|
||||||
|
}
|
||||||
else if (!ParseCloseBrace())
|
else if (!ParseCloseBrace())
|
||||||
{
|
{
|
||||||
// Unknown
|
// Unknown
|
||||||
|
@ -302,6 +321,15 @@ int G_SkillProperty(ESkillProperty prop)
|
||||||
|
|
||||||
case SKILLP_ACSReturn:
|
case SKILLP_ACSReturn:
|
||||||
return AllSkills[gameskill].ACSReturn;
|
return AllSkills[gameskill].ACSReturn;
|
||||||
|
|
||||||
|
case SKILLP_MonsterHealth:
|
||||||
|
return AllSkills[gameskill].MonsterHealth;
|
||||||
|
|
||||||
|
case SKILLP_FriendlyHealth:
|
||||||
|
return AllSkills[gameskill].FriendlyHealth;
|
||||||
|
|
||||||
|
case SKILLP_NoPain:
|
||||||
|
return AllSkills[gameskill].NoPain;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -353,6 +381,9 @@ FSkillInfo &FSkillInfo::operator=(const FSkillInfo &other)
|
||||||
TextColor = other.TextColor;
|
TextColor = other.TextColor;
|
||||||
Replace = other.Replace;
|
Replace = other.Replace;
|
||||||
Replaced = other.Replaced;
|
Replaced = other.Replaced;
|
||||||
|
MonsterHealth = other.MonsterHealth;
|
||||||
|
FriendlyHealth = other.FriendlyHealth;
|
||||||
|
NoPain = other.NoPain;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2610,7 +2610,7 @@ int DLevelScript::GetActorProperty (int tid, int property)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return actor->GetDefault()->health;
|
return actor->SpawnHealth();
|
||||||
}
|
}
|
||||||
|
|
||||||
case APROP_JumpZ: if (actor->IsKindOf (RUNTIME_CLASS (APlayerPawn)))
|
case APROP_JumpZ: if (actor->IsKindOf (RUNTIME_CLASS (APlayerPawn)))
|
||||||
|
|
|
@ -1299,7 +1299,7 @@ AActor *LookForEnemiesInBlock (AActor *lookee, int index)
|
||||||
{
|
{
|
||||||
AActor *targ = other->target;
|
AActor *targ = other->target;
|
||||||
if (targ && targ->target == other && pr_skiptarget() > 100 && lookee->IsFriend (targ) &&
|
if (targ && targ->target == other && pr_skiptarget() > 100 && lookee->IsFriend (targ) &&
|
||||||
targ->health*2 >= targ->GetDefault()->health)
|
targ->health*2 >= targ->SpawnHealth())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -199,7 +199,7 @@ AActor *LookForEnemiesInBlockEx (AActor *lookee, int index)
|
||||||
{
|
{
|
||||||
AActor *targ = other->target;
|
AActor *targ = other->target;
|
||||||
if (targ && targ->target == other && pr_skiptarget() > 100 && lookee->IsFriend (targ) &&
|
if (targ && targ->target == other && pr_skiptarget() > 100 && lookee->IsFriend (targ) &&
|
||||||
targ->health*2 >= targ->GetDefault()->health)
|
targ->health*2 >= targ->SpawnHealth())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -324,14 +324,15 @@ static int GibHealth(AActor *actor)
|
||||||
actor->GetClass()->Meta.GetMetaInt (
|
actor->GetClass()->Meta.GetMetaInt (
|
||||||
AMETA_GibHealth,
|
AMETA_GibHealth,
|
||||||
gameinfo.gametype & GAME_DoomChex ?
|
gameinfo.gametype & GAME_DoomChex ?
|
||||||
-actor->GetDefault()->health :
|
-actor->SpawnHealth() :
|
||||||
-actor->GetDefault()->health/2));
|
-actor->SpawnHealth()/2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AActor::Die (AActor *source, AActor *inflictor)
|
void AActor::Die (AActor *source, AActor *inflictor)
|
||||||
{
|
{
|
||||||
// Handle possible unmorph on death
|
// Handle possible unmorph on death
|
||||||
bool wasgibbed = (health < GibHealth(this));
|
bool wasgibbed = (health < GibHealth(this));
|
||||||
|
|
||||||
AActor *realthis = NULL;
|
AActor *realthis = NULL;
|
||||||
int realstyle = 0;
|
int realstyle = 0;
|
||||||
int realhealth = 0;
|
int realhealth = 0;
|
||||||
|
@ -1266,8 +1267,8 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
||||||
|
|
||||||
dopain:
|
dopain:
|
||||||
if (!(target->flags5 & MF5_NOPAIN) && (inflictor == NULL || !(inflictor->flags5 & MF5_PAINLESS)) &&
|
if (!(target->flags5 & MF5_NOPAIN) && (inflictor == NULL || !(inflictor->flags5 & MF5_PAINLESS)) &&
|
||||||
(pr_damagemobj() < painchance || (inflictor != NULL && (inflictor->flags6 & MF6_FORCEPAIN))) &&
|
!G_SkillProperty(SKILLP_NoPain) && (pr_damagemobj() < painchance ||
|
||||||
!(target->flags & MF_SKULLFLY))
|
(inflictor != NULL && (inflictor->flags6 & MF6_FORCEPAIN))) && !(target->flags & MF_SKULLFLY))
|
||||||
{
|
{
|
||||||
if (mod == NAME_Electric)
|
if (mod == NAME_Electric)
|
||||||
{
|
{
|
||||||
|
|
|
@ -993,8 +993,8 @@ FUNC(LS_DamageThing)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
it->health -= arg0;
|
it->health -= arg0;
|
||||||
if (it->GetDefault()->health < it->health)
|
if (it->SpawnHealth() < it->health)
|
||||||
it->health = it->GetDefault()->health;
|
it->health = it->SpawnHealth();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (arg0 > 0)
|
else if (arg0 > 0)
|
||||||
|
|
|
@ -397,7 +397,7 @@ void P_TraceBleed (int damage, fixed_t x, fixed_t y, fixed_t z, AActor *target,
|
||||||
void P_TraceBleed (int damage, AActor *target, angle_t angle, int pitch);
|
void P_TraceBleed (int damage, AActor *target, angle_t angle, int pitch);
|
||||||
void P_TraceBleed (int damage, AActor *target, AActor *missile); // missile version
|
void P_TraceBleed (int damage, AActor *target, AActor *missile); // missile version
|
||||||
void P_TraceBleed (int damage, AActor *target); // random direction version
|
void P_TraceBleed (int damage, AActor *target); // random direction version
|
||||||
void P_RailAttack (AActor *source, int damage, int offset, int color1 = 0, int color2 = 0, float maxdiff = 0, bool silent = false, const PClass *puff = NULL); // [RH] Shoot a railgun
|
void P_RailAttack (AActor *source, int damage, int offset, int color1 = 0, int color2 = 0, float maxdiff = 0, bool silent = false, const PClass *puff = NULL, bool pierce = true); // [RH] Shoot a railgun
|
||||||
bool P_HitFloor (AActor *thing);
|
bool P_HitFloor (AActor *thing);
|
||||||
bool P_HitWater (AActor *thing, sector_t *sec, fixed_t splashx = FIXED_MIN, fixed_t splashy = FIXED_MIN, fixed_t splashz=FIXED_MIN, bool checkabove = false);
|
bool P_HitWater (AActor *thing, sector_t *sec, fixed_t splashx = FIXED_MIN, fixed_t splashy = FIXED_MIN, fixed_t splashz=FIXED_MIN, bool checkabove = false);
|
||||||
bool P_CheckMissileSpawn (AActor *missile);
|
bool P_CheckMissileSpawn (AActor *missile);
|
||||||
|
|
|
@ -3472,7 +3472,29 @@ static bool ProcessRailHit (FTraceResults &res)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void P_RailAttack (AActor *source, int damage, int offset, int color1, int color2, float maxdiff, bool silent, const PClass *puffclass)
|
static bool ProcessNoPierceRailHit (FTraceResults &res)
|
||||||
|
{
|
||||||
|
if (res.HitType != TRACE_HitActor)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invulnerable things completely block the shot
|
||||||
|
if (res.Actor->flags2 & MF2_INVULNERABLE)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only process the first hit
|
||||||
|
SRailHit newhit;
|
||||||
|
newhit.HitActor = res.Actor;
|
||||||
|
newhit.Distance = res.Distance - 10*FRACUNIT; // put blood in front
|
||||||
|
RailHits.Push (newhit);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void P_RailAttack (AActor *source, int damage, int offset, int color1, int color2, float maxdiff, bool silent, const PClass *puffclass, bool pierce)
|
||||||
{
|
{
|
||||||
fixed_t vx, vy, vz;
|
fixed_t vx, vy, vz;
|
||||||
angle_t angle, pitch;
|
angle_t angle, pitch;
|
||||||
|
@ -3513,9 +3535,18 @@ void P_RailAttack (AActor *source, int damage, int offset, int color1, int color
|
||||||
start.Y = FIXED2FLOAT(y1);
|
start.Y = FIXED2FLOAT(y1);
|
||||||
start.Z = FIXED2FLOAT(shootz);
|
start.Z = FIXED2FLOAT(shootz);
|
||||||
|
|
||||||
Trace (x1, y1, shootz, source->Sector, vx, vy, vz,
|
if (pierce)
|
||||||
8192*FRACUNIT, MF_SHOOTABLE, ML_BLOCKEVERYTHING, source, trace,
|
{
|
||||||
TRACE_PCross|TRACE_Impact, ProcessRailHit);
|
Trace (x1, y1, shootz, source->Sector, vx, vy, vz,
|
||||||
|
8192*FRACUNIT, MF_SHOOTABLE, ML_BLOCKEVERYTHING, source, trace,
|
||||||
|
TRACE_PCross|TRACE_Impact, ProcessRailHit);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Trace (x1, y1, shootz, source->Sector, vx, vy, vz,
|
||||||
|
8192*FRACUNIT, MF_SHOOTABLE, ML_BLOCKEVERYTHING, source, trace,
|
||||||
|
TRACE_PCross|TRACE_Impact, ProcessNoPierceRailHit);
|
||||||
|
}
|
||||||
|
|
||||||
// Hurt anything the trace hit
|
// Hurt anything the trace hit
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
|
@ -860,6 +860,7 @@ void AActor::CopyFriendliness (AActor *other, bool changeTarget)
|
||||||
// LastHeard must be set as well so that A_Look can react to the new target if called
|
// LastHeard must be set as well so that A_Look can react to the new target if called
|
||||||
LastHeard = target = other->target;
|
LastHeard = target = other->target;
|
||||||
}
|
}
|
||||||
|
health = SpawnHealth();
|
||||||
level.total_monsters += CountsAsKill();
|
level.total_monsters += CountsAsKill();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3369,6 +3370,7 @@ AActor *AActor::StaticSpawn (const PClass *type, fixed_t ix, fixed_t iy, fixed_t
|
||||||
actor->y = actor->PrevY = iy;
|
actor->y = actor->PrevY = iy;
|
||||||
actor->z = actor->PrevZ = iz;
|
actor->z = actor->PrevZ = iz;
|
||||||
actor->picnum.SetInvalid();
|
actor->picnum.SetInvalid();
|
||||||
|
actor->health = actor->SpawnHealth();
|
||||||
|
|
||||||
FRandom &rng = bglobal.m_Thinking ? pr_botspawnmobj : pr_spawnmobj;
|
FRandom &rng = bglobal.m_Thinking ? pr_botspawnmobj : pr_spawnmobj;
|
||||||
|
|
||||||
|
@ -5256,7 +5258,7 @@ void AActor::Crash()
|
||||||
if (crashstate == NULL)
|
if (crashstate == NULL)
|
||||||
{
|
{
|
||||||
int gibhealth = -abs(GetClass()->Meta.GetMetaInt (AMETA_GibHealth,
|
int gibhealth = -abs(GetClass()->Meta.GetMetaInt (AMETA_GibHealth,
|
||||||
gameinfo.gametype & GAME_DoomChex ? -GetDefault()->health : -GetDefault()->health/2));
|
gameinfo.gametype & GAME_DoomChex ? -SpawnHealth() : -SpawnHealth()/2));
|
||||||
|
|
||||||
if (health < gibhealth)
|
if (health < gibhealth)
|
||||||
{ // Extreme death
|
{ // Extreme death
|
||||||
|
@ -5281,6 +5283,23 @@ void AActor::SetIdle()
|
||||||
SetState(idle);
|
SetState(idle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int AActor::SpawnHealth()
|
||||||
|
{
|
||||||
|
if (!(flags3 & MF3_ISMONSTER) || GetDefault()->health == 0)
|
||||||
|
{
|
||||||
|
return GetDefault()->health;
|
||||||
|
}
|
||||||
|
else if (flags & MF_FRIENDLY)
|
||||||
|
{
|
||||||
|
int adj = FixedMul(GetDefault()->health, G_SkillProperty(SKILLP_FriendlyHealth));
|
||||||
|
return (adj <= 0) ? 1 : adj;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int adj = FixedMul(GetDefault()->health, G_SkillProperty(SKILLP_MonsterHealth));
|
||||||
|
return (adj <= 0) ? 1 : adj;
|
||||||
|
}
|
||||||
|
}
|
||||||
FDropItem *AActor::GetDropItems()
|
FDropItem *AActor::GetDropItems()
|
||||||
{
|
{
|
||||||
unsigned int index = GetClass()->Meta.GetMetaInt (ACMETA_DropItems) - 1;
|
unsigned int index = GetClass()->Meta.GetMetaInt (ACMETA_DropItems) - 1;
|
||||||
|
|
|
@ -393,12 +393,12 @@ int P_Thing_Damage (int tid, AActor *whofor0, int amount, FName type)
|
||||||
{
|
{
|
||||||
P_DamageMobj (actor, NULL, whofor0, amount, type);
|
P_DamageMobj (actor, NULL, whofor0, amount, type);
|
||||||
}
|
}
|
||||||
else if (actor->health < actor->GetDefault()->health)
|
else if (actor->health < actor->SpawnHealth())
|
||||||
{
|
{
|
||||||
actor->health -= amount;
|
actor->health -= amount;
|
||||||
if (actor->health > actor->GetDefault()->health)
|
if (actor->health > actor->SpawnHealth())
|
||||||
{
|
{
|
||||||
actor->health = actor->GetDefault()->health;
|
actor->health = actor->SpawnHealth();
|
||||||
}
|
}
|
||||||
if (actor->player != NULL)
|
if (actor->player != NULL)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1089,6 +1089,12 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomPunch)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
RAF_SILENT = 1,
|
||||||
|
RAF_NOPIERCE = 2
|
||||||
|
};
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// customizable railgun attack function
|
// customizable railgun attack function
|
||||||
|
@ -1102,7 +1108,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_RailAttack)
|
||||||
ACTION_PARAM_BOOL(UseAmmo, 2);
|
ACTION_PARAM_BOOL(UseAmmo, 2);
|
||||||
ACTION_PARAM_COLOR(Color1, 3);
|
ACTION_PARAM_COLOR(Color1, 3);
|
||||||
ACTION_PARAM_COLOR(Color2, 4);
|
ACTION_PARAM_COLOR(Color2, 4);
|
||||||
ACTION_PARAM_BOOL(Silent, 5);
|
ACTION_PARAM_INT(Flags, 5);
|
||||||
ACTION_PARAM_FLOAT(MaxDiff, 6);
|
ACTION_PARAM_FLOAT(MaxDiff, 6);
|
||||||
ACTION_PARAM_CLASS(PuffType, 7);
|
ACTION_PARAM_CLASS(PuffType, 7);
|
||||||
|
|
||||||
|
@ -1116,7 +1122,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_RailAttack)
|
||||||
if (!weapon->DepleteAmmo(weapon->bAltFire, true)) return; // out of ammo
|
if (!weapon->DepleteAmmo(weapon->bAltFire, true)) return; // out of ammo
|
||||||
}
|
}
|
||||||
|
|
||||||
P_RailAttack (self, Damage, Spawnofs_XY, Color1, Color2, MaxDiff, Silent, PuffType);
|
P_RailAttack (self, Damage, Spawnofs_XY, Color1, Color2, MaxDiff, (Flags & RAF_SILENT), PuffType, (!(Flags & RAF_NOPIERCE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -1138,7 +1144,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomRailgun)
|
||||||
ACTION_PARAM_INT(Spawnofs_XY, 1);
|
ACTION_PARAM_INT(Spawnofs_XY, 1);
|
||||||
ACTION_PARAM_COLOR(Color1, 2);
|
ACTION_PARAM_COLOR(Color1, 2);
|
||||||
ACTION_PARAM_COLOR(Color2, 3);
|
ACTION_PARAM_COLOR(Color2, 3);
|
||||||
ACTION_PARAM_BOOL(Silent, 4);
|
ACTION_PARAM_INT(Flags, 4);
|
||||||
ACTION_PARAM_INT(aim, 5);
|
ACTION_PARAM_INT(aim, 5);
|
||||||
ACTION_PARAM_FLOAT(MaxDiff, 6);
|
ACTION_PARAM_FLOAT(MaxDiff, 6);
|
||||||
ACTION_PARAM_CLASS(PuffType, 7);
|
ACTION_PARAM_CLASS(PuffType, 7);
|
||||||
|
@ -1201,7 +1207,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomRailgun)
|
||||||
|
|
||||||
angle_t angle = (self->angle - ANG90) >> ANGLETOFINESHIFT;
|
angle_t angle = (self->angle - ANG90) >> ANGLETOFINESHIFT;
|
||||||
|
|
||||||
P_RailAttack (self, Damage, Spawnofs_XY, Color1, Color2, MaxDiff, Silent, PuffType);
|
P_RailAttack (self, Damage, Spawnofs_XY, Color1, Color2, MaxDiff, (Flags & RAF_SILENT), PuffType, (!(Flags & RAF_NOPIERCE)));
|
||||||
|
|
||||||
self->x = saved_x;
|
self->x = saved_x;
|
||||||
self->y = saved_y;
|
self->y = saved_y;
|
||||||
|
|
|
@ -195,13 +195,6 @@ public:
|
||||||
void STACK_ARGS DrawText (FFont *font, int normalcolor, int x, int y, const char *string, ...);
|
void STACK_ARGS DrawText (FFont *font, int normalcolor, int x, int y, const char *string, ...);
|
||||||
void STACK_ARGS DrawChar (FFont *font, int normalcolor, int x, int y, BYTE character, ...);
|
void STACK_ARGS DrawChar (FFont *font, int normalcolor, int x, int y, BYTE character, ...);
|
||||||
|
|
||||||
protected:
|
|
||||||
BYTE *Buffer;
|
|
||||||
int Width;
|
|
||||||
int Height;
|
|
||||||
int Pitch;
|
|
||||||
int LockCount;
|
|
||||||
|
|
||||||
struct DrawParms
|
struct DrawParms
|
||||||
{
|
{
|
||||||
fixed_t x, y;
|
fixed_t x, y;
|
||||||
|
@ -234,6 +227,13 @@ protected:
|
||||||
FRenderStyle style;
|
FRenderStyle style;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
protected:
|
||||||
|
BYTE *Buffer;
|
||||||
|
int Width;
|
||||||
|
int Height;
|
||||||
|
int Pitch;
|
||||||
|
int LockCount;
|
||||||
|
|
||||||
bool ClipBox (int &left, int &top, int &width, int &height, const BYTE *&src, const int srcpitch) const;
|
bool ClipBox (int &left, int &top, int &width, int &height, const BYTE *&src, const int srcpitch) const;
|
||||||
virtual void STACK_ARGS DrawTextureV (FTexture *img, int x, int y, uint32 tag, va_list tags);
|
virtual void STACK_ARGS DrawTextureV (FTexture *img, int x, int y, uint32 tag, va_list tags);
|
||||||
bool ParseDrawTextureTags (FTexture *img, int x, int y, uint32 tag, va_list tags, DrawParms *parms, bool hw) const;
|
bool ParseDrawTextureTags (FTexture *img, int x, int y, uint32 tag, va_list tags, DrawParms *parms, bool hw) const;
|
||||||
|
|
|
@ -175,7 +175,7 @@ ACTOR Actor native //: Thinker
|
||||||
action native A_Jump(int chance, state label, ...);
|
action native A_Jump(int chance, state label, ...);
|
||||||
action native A_CustomMissile(class<Actor> missiletype, float spawnheight = 32, int spawnofs_xy = 0, float angle = 0, int flags = 0, float pitch = 0);
|
action native A_CustomMissile(class<Actor> missiletype, float spawnheight = 32, int spawnofs_xy = 0, float angle = 0, int flags = 0, float pitch = 0);
|
||||||
action native A_CustomBulletAttack(float spread_xy, float spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", float range = 0, bool aimfacing = false);
|
action native A_CustomBulletAttack(float spread_xy, float spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", float range = 0, bool aimfacing = false);
|
||||||
action native A_CustomRailgun(int damage, int spawnofs_xy = 0, color color1 = "", color color2 = "", bool silent = false, bool aim = false, float maxdiff = 0, class<Actor> pufftype = "BulletPuff");
|
action native A_CustomRailgun(int damage, int spawnofs_xy = 0, color color1 = "", color color2 = "", int flags = 0, bool aim = false, float maxdiff = 0, class<Actor> pufftype = "BulletPuff");
|
||||||
action native A_JumpIfHealthLower(int health, state label);
|
action native A_JumpIfHealthLower(int health, state label);
|
||||||
action native A_JumpIfCloser(float distance, state label);
|
action native A_JumpIfCloser(float distance, state label);
|
||||||
action native A_JumpIfInventory(class<Inventory> itemtype, int itemamount, state label);
|
action native A_JumpIfInventory(class<Inventory> itemtype, int itemamount, state label);
|
||||||
|
|
|
@ -51,6 +51,9 @@ const int MRF_UNDOBYDEATH = 512;
|
||||||
const int MRF_UNDOBYDEATHFORCED = 1024;
|
const int MRF_UNDOBYDEATHFORCED = 1024;
|
||||||
const int MRF_UNDOBYDEATHSAVES = 2048;
|
const int MRF_UNDOBYDEATHSAVES = 2048;
|
||||||
|
|
||||||
|
const int RGF_SILENT = 1;
|
||||||
|
const int RGF_NOPIERCING = 2;
|
||||||
|
|
||||||
// constants for A_PlaySound
|
// constants for A_PlaySound
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,7 +9,7 @@ ACTOR Inventory native
|
||||||
action native A_CustomPunch(int damage, bool norandom = false, bool useammo = true, class<Actor> pufftype = "BulletPuff", float range = 0);
|
action native A_CustomPunch(int damage, bool norandom = false, bool useammo = true, class<Actor> pufftype = "BulletPuff", float range = 0);
|
||||||
action native A_FireBullets(float spread_xy, float spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", bool useammo = true, float range = 0);
|
action native A_FireBullets(float spread_xy, float spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", bool useammo = true, float range = 0);
|
||||||
action native A_FireCustomMissile(class<Actor> missiletype, float angle = 0, bool useammo = true, int spawnofs_xy = 0, float spawnheight = 0, bool aimatangle = false, float pitch = 0);
|
action native A_FireCustomMissile(class<Actor> missiletype, float angle = 0, bool useammo = true, int spawnofs_xy = 0, float spawnheight = 0, bool aimatangle = false, float pitch = 0);
|
||||||
action native A_RailAttack(int damage, int spawnofs_xy = 0, int useammo = true, color color1 = "", color color2 = "", bool silent = false, float maxdiff = 0, class<Actor> pufftype = "BulletPuff");
|
action native A_RailAttack(int damage, int spawnofs_xy = 0, int useammo = true, color color1 = "", color color2 = "", int flags = 0, float maxdiff = 0, class<Actor> pufftype = "BulletPuff");
|
||||||
action native A_Light(int extralight);
|
action native A_Light(int extralight);
|
||||||
action native A_Light0();
|
action native A_Light0();
|
||||||
action native A_Light1();
|
action native A_Light1();
|
||||||
|
|
Loading…
Reference in a new issue