Attacks can apply a force to the target (i.e. monsters can throw characters around)

This commit is contained in:
Regalis
2016-05-22 01:28:46 +03:00
parent 1d3d1d5459
commit b2f83b43f8
13 changed files with 30 additions and 28 deletions
@@ -15,7 +15,7 @@
<!-- lower yaw --> <!-- lower yaw -->
<limb id = "1" radius="20" height="240" impacttolerance="50.0"> <limb id = "1" radius="20" height="240" impacttolerance="50.0">
<sprite texture="Content/Characters/Coelanth/coelanth.png" sourcerect="425,1,101,309" depth="0.025" origin="0.5,0.5"/> <sprite texture="Content/Characters/Coelanth/coelanth.png" sourcerect="425,1,101,309" depth="0.025" origin="0.5,0.5"/>
<attack type="PinchCCW" range="300" duration="0.5" damage="200" bleedingdamage="50" structuredamage="150" damagetype="slash"/> <attack type="PinchCCW" range="300" duration="0.5" damage="200" bleedingdamage="50" structuredamage="150" damagetype="slash" targetforce="-50"/>
</limb> </limb>
<!-- body --> <!-- body -->
@@ -30,7 +30,7 @@
<limb id = "3" width="13" height="45" mass = "6" ignorecollisions="true" flip="true" impacttolerance="50.0"> <limb id = "3" width="13" height="45" mass = "6" ignorecollisions="true" flip="true" impacttolerance="50.0">
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="65,131,36,50" depth="0.15" origin="0.4,0.5"/> <sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="65,131,36,50" depth="0.15" origin="0.4,0.5"/>
<attack type="PinchCW" range="120" duration="0.5" damage="30" stun="0.1" bleedingdamage="3" structuredamage="50" damagetype="slash"/> <attack type="PinchCW" range="120" duration="0.5" damage="30" stun="0.1" bleedingdamage="3" structuredamage="50" damagetype="slash" targetforce="-30"/>
</limb> </limb>
<limb id = "4" width="11" height="34" mass = "4" type="RightLeg" flip="true"> <limb id = "4" width="11" height="34" mass = "4" type="RightLeg" flip="true">
@@ -76,6 +76,6 @@
<ai attackhumans="500" attackrooms="50.0" attackweaker="50" attackstronger="-30" <ai attackhumans="500" attackrooms="50.0" attackweaker="50" attackstronger="-30"
sight="0.5" hearing="1.0" sight="0.5" hearing="1.0"
attackcooldown="5.0"/> attackcooldown="3.0"/>
</Character> </Character>
@@ -9,7 +9,7 @@
<!-- head --> <!-- head -->
<limb id = "0" radius="65" type="Head" steerforce="3.0"> <limb id = "0" radius="65" type="Head" steerforce="3.0">
<sprite texture="Content/Characters/Fractalguardian/fractalguardian.png" sourcerect="0,0,129,128" depth="0.04"/> <sprite texture="Content/Characters/Fractalguardian/fractalguardian.png" sourcerect="0,0,129,128" depth="0.04"/>
<attack type="Hit" range="120" duration="0.2" damage="50" stun="2" force="20" damagetype="blunt"/> <attack type="Hit" range="120" duration="0.2" damage="50" stun="2" force="20" damagetype="blunt" targetforce="80"/>
</limb> </limb>
<!-- body --> <!-- body -->
@@ -9,7 +9,7 @@
<!-- head --> <!-- head -->
<limb id = "0" radius="80" height="30" type="Head" steerforce="3.0"> <limb id = "0" radius="80" height="30" type="Head" steerforce="3.0">
<sprite texture="Content/Characters/Fractalguardian/fractalguardian.png" sourcerect="299,0,171,208" depth="0.05"/> <sprite texture="Content/Characters/Fractalguardian/fractalguardian.png" sourcerect="299,0,171,208" depth="0.05"/>
<attack type="Hit" range="120" duration="0.2" damage="50" stun="2" force="20" damagetype="blunt"/> <attack type="Hit" range="120" duration="0.2" damage="50" stun="2" force="20" damagetype="blunt" targetforce="100"/>
</limb> </limb>
@@ -46,7 +46,7 @@
<!-- ""claw" --> <!-- ""claw" -->
<limb id = "6" width="15" height="63" mass = "4" flip="true" pullpos="0.0,30.0" refjoint="0"> <limb id = "6" width="15" height="63" mass = "4" flip="true" pullpos="0.0,30.0" refjoint="0">
<sprite texture="Content/Characters/Mantis/mantis.png" sourcerect="228,1,28,76" depth="0.01" origin="0.5,0.5"/> <sprite texture="Content/Characters/Mantis/mantis.png" sourcerect="228,1,28,76" depth="0.01" origin="0.5,0.5"/>
<attack type="PinchCW" range="200" duration="0.5" damage="30" stun="0.1" bleedingdamage="5" structuredamage="50" damagetype="slash"/> <attack type="PinchCW" range="200" duration="0.5" damage="30" stun="0.1" bleedingdamage="5" structuredamage="50" damagetype="slash" targetforce="-50"/>
<sound file ="Content/Sounds/stepMetal.ogg"/> <sound file ="Content/Sounds/stepMetal.ogg"/>
</limb> </limb>
@@ -11,7 +11,7 @@
<!-- head --> <!-- head -->
<limb id = "0" radius="230" height="500" type="Head" steerforce="1.0" flip="true" armorsector="0.0,180.0" armorvalue="100.0" impacttolerance="100"> <limb id = "0" radius="230" height="500" type="Head" steerforce="1.0" flip="true" armorsector="0.0,180.0" armorvalue="100.0" impacttolerance="100">
<sprite texture="Content/Characters/Moloch/moloch.png" sourcerect="0,0,628,1024" depth="0.02" origin ="0.4,0.5"/> <sprite texture="Content/Characters/Moloch/moloch.png" sourcerect="0,0,628,1024" depth="0.02" origin ="0.4,0.5"/>
<attack type="Hit" range="700" duration="0.2" damage="200" stun="5" force="400" damagetype="blunt"/> <attack type="Hit" range="700" duration="0.2" damage="200" stun="5" force="400" damagetype="blunt" targetforce="100"/>
</limb> </limb>
<limb id = "1" width="50" height="440" flip="true"> <limb id = "1" width="50" height="440" flip="true">
@@ -17,7 +17,7 @@
<limb id = "1" width="16" height="103" impacttolerance="50.0"> <limb id = "1" width="16" height="103" impacttolerance="50.0">
<sprite texture="Content/Characters/TigerThresher/tigerthresher.png" sourcerect="391,169,28,110" depth="0.025" origin="0.5,0.5"/> <sprite texture="Content/Characters/TigerThresher/tigerthresher.png" sourcerect="391,169,28,110" depth="0.025" origin="0.5,0.5"/>
<damagedsprite texture="Content/Characters/TigerThresher/damagedtigerthresher.png" sourcerect="391,169,28,110" origin="0.5,0.5"/> <damagedsprite texture="Content/Characters/TigerThresher/damagedtigerthresher.png" sourcerect="391,169,28,110" origin="0.5,0.5"/>
<attack type="PinchCCW" range="200" duration="0.5" damage="150" bleedingdamage="10" structuredamage="200" damagetype="slash"/> <attack type="PinchCCW" range="200" duration="0.5" damage="150" bleedingdamage="10" structuredamage="200" damagetype="slash" targetforce="-50"/>
</limb> </limb>
<!-- body --> <!-- body -->
+3 -3
View File
@@ -78,11 +78,11 @@ namespace Barotrauma
if (attacker!=null) aiController.OnAttacked(attacker, amount); if (attacker!=null) aiController.OnAttacked(attacker, amount);
} }
public override AttackResult AddDamage(IDamageable attacker, Vector2 position, Attack attack, float deltaTime, bool playSound = false) public override AttackResult AddDamage(IDamageable attacker, Vector2 worldPosition, Attack attack, float deltaTime, bool playSound = false)
{ {
AttackResult result = base.AddDamage(attacker, position, attack, deltaTime, playSound); AttackResult result = base.AddDamage(attacker, worldPosition, attack, deltaTime, playSound);
aiController.OnAttacked(attacker, (result.Damage + result.Bleeding)/Math.Max(health,1.0f)); aiController.OnAttacked(attacker, (result.Damage + result.Bleeding) / Math.Max(health,1.0f));
return result; return result;
} }
+4
View File
@@ -49,6 +49,8 @@ namespace Barotrauma
public readonly float Force; public readonly float Force;
public readonly float TargetForce;
private Sound sound; private Sound sound;
private ParticleEmitterPrefab particleEmitterPrefab; private ParticleEmitterPrefab particleEmitterPrefab;
@@ -105,6 +107,8 @@ namespace Barotrauma
Force = ToolBox.GetAttributeFloat(element,"force", 0.0f); Force = ToolBox.GetAttributeFloat(element,"force", 0.0f);
TargetForce = ToolBox.GetAttributeFloat(element, "targetforce", 0.0f);
Stun = ToolBox.GetAttributeFloat(element, "stun", 0.0f); Stun = ToolBox.GetAttributeFloat(element, "stun", 0.0f);
string soundPath = ToolBox.GetAttributeString(element, "sound", ""); string soundPath = ToolBox.GetAttributeString(element, "sound", "");
+10 -12
View File
@@ -1200,9 +1200,7 @@ namespace Barotrauma
public virtual AttackResult AddDamage(IDamageable attacker, Vector2 worldPosition, Attack attack, float deltaTime, bool playSound = false) public virtual AttackResult AddDamage(IDamageable attacker, Vector2 worldPosition, Attack attack, float deltaTime, bool playSound = false)
{ {
var attackResult = AddDamage(worldPosition, attack.DamageType, attack.GetDamage(deltaTime), attack.GetBleedingDamage(deltaTime), attack.Stun, playSound, attack.TargetForce);
var attackResult = AddDamage(worldPosition, attack.DamageType, attack.GetDamage(deltaTime), attack.GetBleedingDamage(deltaTime), attack.Stun, playSound);
var attackingCharacter = attacker as Character; var attackingCharacter = attacker as Character;
if (attackingCharacter != null && attackingCharacter.AIController == null) if (attackingCharacter != null && attackingCharacter.AIController == null)
@@ -1213,28 +1211,28 @@ namespace Barotrauma
return attackResult; return attackResult;
} }
public AttackResult AddDamage(Vector2 simPosition, DamageType damageType, float amount, float bleedingAmount, float stun, bool playSound) public AttackResult AddDamage(Vector2 worldPosition, DamageType damageType, float amount, float bleedingAmount, float stun, bool playSound, float attackForce = 0.0f)
{ {
StartStun(stun); StartStun(stun);
Limb closestLimb = null; Limb closestLimb = null;
float closestDistance = 0.0f; float closestDistance = 0.0f;
foreach (Limb limb in AnimController.Limbs) foreach (Limb limb in AnimController.Limbs)
{ {
float distance = Vector2.Distance(simPosition, limb.SimPosition); float distance = Vector2.Distance(worldPosition, limb.WorldPosition);
if (closestLimb == null || distance < closestDistance) if (closestLimb == null || distance < closestDistance)
{ {
closestLimb = limb; closestLimb = limb;
closestDistance = distance; closestDistance = distance;
} }
} }
if (Math.Abs(attackForce) > 0.0f)
{
closestLimb.body.ApplyForce((closestLimb.WorldPosition - worldPosition) * attackForce);
}
Vector2 pull = simPosition - closestLimb.SimPosition; AttackResult attackResult = closestLimb.AddDamage(worldPosition, damageType, amount, bleedingAmount, playSound);
if (pull != Vector2.Zero) pull = Vector2.Normalize(pull);
closestLimb.body.ApplyForce(pull*Math.Min(amount*100.0f, 100.0f));
AttackResult attackResult = closestLimb.AddDamage(simPosition, damageType, amount, bleedingAmount, playSound);
AddDamage(damageType == DamageType.Burn ? CauseOfDeath.Burn : causeOfDeath, attackResult.Damage, null); AddDamage(damageType == DamageType.Burn ? CauseOfDeath.Burn : causeOfDeath, attackResult.Damage, null);
+1 -1
View File
@@ -649,7 +649,7 @@ namespace Barotrauma
} }
public AttackResult AddDamage(IDamageable attacker, Vector2 position, Attack attack, float deltaTime, bool playSound = true) public AttackResult AddDamage(IDamageable attacker, Vector2 worldPosition, Attack attack, float deltaTime, bool playSound = true)
{ {
float damageAmount = attack.GetDamage(deltaTime); float damageAmount = attack.GetDamage(deltaTime);
Condition -= damageAmount; Condition -= damageAmount;
+1 -1
View File
@@ -24,6 +24,6 @@ namespace Barotrauma
get; get;
} }
AttackResult AddDamage(IDamageable attacker, Vector2 position, Attack attack, float deltaTime, bool playSound=true); AttackResult AddDamage(IDamageable attacker, Vector2 worldPosition, Attack attack, float deltaTime, bool playSound=true);
} }
} }
+3 -3
View File
@@ -533,12 +533,12 @@ namespace Barotrauma
return sectionPos; return sectionPos;
} }
public AttackResult AddDamage(IDamageable attacker, Vector2 position, Attack attack, float deltaTime, bool playSound = false) public AttackResult AddDamage(IDamageable attacker, Vector2 worldPosition, Attack attack, float deltaTime, bool playSound = false)
{ {
if (Submarine.Loaded != null && Submarine.Loaded.GodMode && Submarine == Submarine.Loaded) return new AttackResult(0.0f, 0.0f); if (Submarine.Loaded != null && Submarine.Loaded.GodMode && Submarine == Submarine.Loaded) return new AttackResult(0.0f, 0.0f);
if (!prefab.HasBody || prefab.IsPlatform) return new AttackResult(0.0f, 0.0f); if (!prefab.HasBody || prefab.IsPlatform) return new AttackResult(0.0f, 0.0f);
Vector2 transformedPos = position; Vector2 transformedPos = worldPosition;
if (Submarine != null) transformedPos -= Submarine.Position; if (Submarine != null) transformedPos -= Submarine.Position;
int i = FindSectionIndex(transformedPos); int i = FindSectionIndex(transformedPos);
@@ -551,7 +551,7 @@ namespace Barotrauma
if (playSound && !SectionBodyDisabled(i)) if (playSound && !SectionBodyDisabled(i))
{ {
DamageSoundType damageSoundType = (attack.DamageType == DamageType.Blunt) ? DamageSoundType.StructureBlunt : DamageSoundType.StructureSlash; DamageSoundType damageSoundType = (attack.DamageType == DamageType.Blunt) ? DamageSoundType.StructureBlunt : DamageSoundType.StructureSlash;
SoundPlayer.PlayDamageSound(damageSoundType, damageAmount, position); SoundPlayer.PlayDamageSound(damageSoundType, damageAmount, worldPosition);
} }
AddDamage(i, damageAmount); AddDamage(i, damageAmount);