mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-24 21:11:39 +00:00
- added ACS CheckActprClass function
- fixed: When a blasted actor collided with another one this other actor's DONTBLAST flag was not checked. - added a global DamageFactor actor property. All damage this actor takes is multiplied by this factor in addition to damage type specific damage factors. SVN r1915 (trunk)
This commit is contained in:
parent
efd3e7f94e
commit
ce2e85c7b2
7 changed files with 42 additions and 7 deletions
|
@ -1,4 +1,9 @@
|
||||||
October 15, 2009 (Changes by Graf Zahl)
|
October 15, 2009 (Changes by Graf Zahl)
|
||||||
|
- added ACS CheckActprClass function
|
||||||
|
- fixed: When a blasted actor collided with another one this other actor's
|
||||||
|
DONTBLAST flag was not checked.
|
||||||
|
- added a global DamageFactor actor property. All damage this actor takes is multiplied
|
||||||
|
by this factor in addition to damage type specific damage factors.
|
||||||
- added better earthquake functions for ACS and DECORATE.
|
- added better earthquake functions for ACS and DECORATE.
|
||||||
|
|
||||||
October 10, 2009 (Changes by Graf Zahl)
|
October 10, 2009 (Changes by Graf Zahl)
|
||||||
|
|
|
@ -850,6 +850,7 @@ public:
|
||||||
SWORD PainChance;
|
SWORD PainChance;
|
||||||
int PainThreshold;
|
int PainThreshold;
|
||||||
FNameNoInit DamageType;
|
FNameNoInit DamageType;
|
||||||
|
fixed_t DamageFactor;
|
||||||
|
|
||||||
FState *SpawnState;
|
FState *SpawnState;
|
||||||
FState *SeeState;
|
FState *SeeState;
|
||||||
|
|
|
@ -2429,6 +2429,7 @@ enum
|
||||||
APROP_NameTag = 21,
|
APROP_NameTag = 21,
|
||||||
APROP_Score = 22,
|
APROP_Score = 22,
|
||||||
APROP_Notrigger = 23,
|
APROP_Notrigger = 23,
|
||||||
|
APROP_DamageFactor = 24,
|
||||||
};
|
};
|
||||||
|
|
||||||
// These are needed for ACS's APROP_RenderStyle
|
// These are needed for ACS's APROP_RenderStyle
|
||||||
|
@ -2593,6 +2594,10 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value)
|
||||||
actor->Tag = FBehavior::StaticLookupString(value);
|
actor->Tag = FBehavior::StaticLookupString(value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case APROP_DamageFactor:
|
||||||
|
actor->DamageFactor = value;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// do nothing.
|
// do nothing.
|
||||||
break;
|
break;
|
||||||
|
@ -2625,6 +2630,7 @@ int DLevelScript::GetActorProperty (int tid, int property)
|
||||||
case APROP_Health: return actor->health;
|
case APROP_Health: return actor->health;
|
||||||
case APROP_Speed: return actor->Speed;
|
case APROP_Speed: return actor->Speed;
|
||||||
case APROP_Damage: return actor->Damage; // Should this call GetMissileDamage() instead?
|
case APROP_Damage: return actor->Damage; // Should this call GetMissileDamage() instead?
|
||||||
|
case APROP_DamageFactor:return actor->DamageFactor;
|
||||||
case APROP_Alpha: return actor->alpha;
|
case APROP_Alpha: return actor->alpha;
|
||||||
case APROP_RenderStyle: for (int style = STYLE_None; style < STYLE_Count; ++style)
|
case APROP_RenderStyle: for (int style = STYLE_None; style < STYLE_Count; ++style)
|
||||||
{ // Check for a legacy render style that matches.
|
{ // Check for a legacy render style that matches.
|
||||||
|
@ -2685,6 +2691,7 @@ int DLevelScript::CheckActorProperty (int tid, int property, int value)
|
||||||
case APROP_Health:
|
case APROP_Health:
|
||||||
case APROP_Speed:
|
case APROP_Speed:
|
||||||
case APROP_Damage:
|
case APROP_Damage:
|
||||||
|
case APROP_DamageFactor:
|
||||||
case APROP_Alpha:
|
case APROP_Alpha:
|
||||||
case APROP_RenderStyle:
|
case APROP_RenderStyle:
|
||||||
case APROP_Gravity:
|
case APROP_Gravity:
|
||||||
|
@ -2900,6 +2907,7 @@ enum EACSFunctions
|
||||||
ACSF_SetUserVariable,
|
ACSF_SetUserVariable,
|
||||||
ACSF_GetUserVariable,
|
ACSF_GetUserVariable,
|
||||||
ACSF_Radius_Quake2,
|
ACSF_Radius_Quake2,
|
||||||
|
ACSF_CheckActorClass,
|
||||||
};
|
};
|
||||||
|
|
||||||
int DLevelScript::SideFromID(int id, int side)
|
int DLevelScript::SideFromID(int id, int side)
|
||||||
|
@ -3139,6 +3147,13 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args)
|
||||||
P_StartQuake(activator, args[0], args[1], args[2], args[3], args[4], FBehavior::StaticLookupString(args[5]));
|
P_StartQuake(activator, args[0], args[1], args[2], args[3], args[4], FBehavior::StaticLookupString(args[5]));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ACSF_CheckActorClass:
|
||||||
|
{
|
||||||
|
AActor *a = args[0] == 0 ? (AActor *)activator : SingleActorFromTID(args[0], NULL);
|
||||||
|
return a->GetClass()->TypeName == FName(FBehavior::StaticLookupString(args[1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1009,6 +1009,8 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
|
||||||
if (damage <= 0) return;
|
if (damage <= 0) return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
damage = FixedMul(damage, target->DamageFactor);
|
||||||
|
if (damage <= 0) return;
|
||||||
|
|
||||||
damage = target->TakeSpecialDamage (inflictor, source, damage, mod);
|
damage = target->TakeSpecialDamage (inflictor, source, damage, mod);
|
||||||
}
|
}
|
||||||
|
|
|
@ -886,8 +886,9 @@ bool PIT_CheckThing (AActor *thing, FCheckPosition &tm)
|
||||||
// Check for blasted thing running into another
|
// Check for blasted thing running into another
|
||||||
if ((tm.thing->flags2 & MF2_BLASTED) && (thing->flags & MF_SHOOTABLE))
|
if ((tm.thing->flags2 & MF2_BLASTED) && (thing->flags & MF_SHOOTABLE))
|
||||||
{
|
{
|
||||||
if (!(thing->flags2 & MF2_BOSS) && (thing->flags3 & MF3_ISMONSTER))
|
if (!(thing->flags2 & MF2_BOSS) && (thing->flags3 & MF3_ISMONSTER) && !(thing->flags3 & MF3_DONTBLAST))
|
||||||
{
|
{
|
||||||
|
// ideally this should take the mass factor into account
|
||||||
thing->velx += tm.thing->velx;
|
thing->velx += tm.thing->velx;
|
||||||
thing->vely += tm.thing->vely;
|
thing->vely += tm.thing->vely;
|
||||||
if ((thing->velx + thing->vely) > 3*FRACUNIT)
|
if ((thing->velx + thing->vely) > 3*FRACUNIT)
|
||||||
|
|
|
@ -309,6 +309,10 @@ void AActor::Serialize (FArchive &arc)
|
||||||
{
|
{
|
||||||
arc << PainThreshold;
|
arc << PainThreshold;
|
||||||
}
|
}
|
||||||
|
if (SaveVersion >= 1914)
|
||||||
|
{
|
||||||
|
arc << DamageFactor;
|
||||||
|
}
|
||||||
|
|
||||||
for(int i=0; i<10; i++) arc << uservar[i];
|
for(int i=0; i<10; i++) arc << uservar[i];
|
||||||
|
|
||||||
|
|
|
@ -924,11 +924,17 @@ DEFINE_PROPERTY(damagetype, S, Actor)
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
DEFINE_PROPERTY(damagefactor, SF, Actor)
|
DEFINE_PROPERTY(damagefactor, ZF, Actor)
|
||||||
{
|
{
|
||||||
PROP_STRING_PARM(str, 0);
|
PROP_STRING_PARM(str, 0);
|
||||||
PROP_FIXED_PARM(id, 1);
|
PROP_FIXED_PARM(id, 1);
|
||||||
|
|
||||||
|
if (str == NULL)
|
||||||
|
{
|
||||||
|
defaults->DamageFactor = id;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (info->DamageFactors == NULL) info->DamageFactors=new DmgFactors;
|
if (info->DamageFactors == NULL) info->DamageFactors=new DmgFactors;
|
||||||
|
|
||||||
FName dmgType;
|
FName dmgType;
|
||||||
|
@ -936,6 +942,7 @@ DEFINE_PROPERTY(damagefactor, SF, Actor)
|
||||||
else dmgType=str;
|
else dmgType=str;
|
||||||
|
|
||||||
(*info->DamageFactors)[dmgType]=id;
|
(*info->DamageFactors)[dmgType]=id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
Loading…
Reference in a new issue