Welding tool, plasma cutter & misc item fixes/improvements

This commit is contained in:
Regalis
2015-06-10 01:13:34 +03:00
parent d7fde606e9
commit 270efd77e0
32 changed files with 275 additions and 95 deletions
+71 -24
View File
@@ -5,6 +5,7 @@ using FarseerPhysics;
using FarseerPhysics.Dynamics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Subsurface.Particles;
namespace Subsurface.Items.Components
{
@@ -16,29 +17,49 @@ namespace Subsurface.Items.Components
Vector2 pickedPosition;
Vector2 barrelPos;
float structureFixAmount, limbFixAmount;
[HasDefaultValue(100.0f, false)]
[HasDefaultValue(0.0f, false)]
public float Range
{
get { return ConvertUnits.ToDisplayUnits(range); }
set { range = ConvertUnits.ToSimUnits(value); }
}
[HasDefaultValue(1.0f, false)]
[HasDefaultValue(0.0f, false)]
public float StructureFixAmount
{
get { return structureFixAmount; }
set { structureFixAmount = value; }
}
[HasDefaultValue(1.0f, false)]
[HasDefaultValue(0.0f, false)]
public float LimbFixAmount
{
get { return limbFixAmount; }
set { limbFixAmount = value; }
}
[HasDefaultValue("0.0,0.0", false)]
public string BarrelPos
{
get { return ToolBox.Vector2ToString(ConvertUnits.ToDisplayUnits(barrelPos)); }
set { barrelPos = ConvertUnits.ToSimUnits(ToolBox.ParseToVector2(value)); }
}
public Vector2 TransformedBarrelPos
{
get
{
Matrix bodyTransform = Matrix.CreateRotationZ(item.body.Rotation);
Vector2 flippedPos = barrelPos;
if (item.body.Dir < 0.0f) flippedPos.X = -flippedPos.X;
return (Vector2.Transform(flippedPos, bodyTransform) + item.body.Position);
}
}
public RepairTool(Item item, XElement element)
: base(item, element)
{
@@ -69,16 +90,18 @@ namespace Subsurface.Items.Components
//}
public override bool Use(Character character = null)
public override bool Use(float deltaTime, Character character = null)
{
if (character == null) return false;
isActive = true;
Vector2 targetPosition = item.body.Position;
//targetPosition = targetPosition.X, -targetPosition.Y);
targetPosition += new Vector2(
(float)Math.Cos(item.body.Rotation) * range,
(float)Math.Sin(item.body.Rotation) * range) * item.body.Dir;
(float)Math.Cos(item.body.Rotation),
(float)Math.Sin(item.body.Rotation)) * range * item.body.Dir;
List<Body> ignoredBodies = new List<Body>();
foreach (Limb limb in character.animController.limbs)
@@ -86,13 +109,12 @@ namespace Subsurface.Items.Components
ignoredBodies.Add(limb.body.FarseerBody);
}
Body targetBody = Map.PickBody(item.body.Position, targetPosition, ignoredBodies);
Body targetBody = Map.PickBody(TransformedBarrelPos, targetPosition, ignoredBodies);
pickedPosition = Map.LastPickedPosition;
if (targetBody==null || targetBody.UserData==null) return false;
if (targetBody==null || targetBody.UserData==null) return true;
ApplyStatusEffects(ActionType.OnUse, 1.0f, character);
//ApplyStatusEffects(ActionType.OnUse, 1.0f, character);
Structure targetStructure;
@@ -100,18 +122,14 @@ namespace Subsurface.Items.Components
Item targetItem;
if ((targetStructure = (targetBody.UserData as Structure)) != null)
{
if (!fixableEntities.Contains(targetStructure.Name)) return false;
if (!fixableEntities.Contains(targetStructure.Name)) return true;
int sectionIndex = targetStructure.FindSectionIndex(ConvertUnits.ToDisplayUnits(pickedPosition));
if (sectionIndex < 0) return false;
if (sectionIndex < 0) return true;
targetStructure.HighLightSection(sectionIndex);
if (character.SecondaryKeyDown.State)
{
targetStructure.AddDamage(sectionIndex, -structureFixAmount);
isActive = true;
}
}
else if ((targetLimb = (targetBody.UserData as Limb)) != null)
@@ -119,26 +137,55 @@ namespace Subsurface.Items.Components
if (character.SecondaryKeyDown.State)
{
targetLimb.character.Health += limbFixAmount;
isActive = true;
//isActive = true;
}
}
else if ((targetItem = (targetBody.UserData as Item)) !=null)
else if ((targetItem = (targetBody.UserData as Item)) != null)
{
targetItem.Condition -= structureFixAmount;
//targetItem.Condition -= structureFixAmount;
targetItem.IsHighlighted = true;
foreach (StatusEffect effect in statusEffects)
{
if (Array.IndexOf(effect.TargetNames, targetItem.Name) == -1) continue;
effect.Apply(ActionType.OnUse, deltaTime, targetItem);
//targetItem.ApplyStatusEffect(effect, ActionType.OnUse, deltaTime);
}
//ApplyStatusEffects(ActionType.OnUse, 1.0f, null, targ);
}
//if (character.SecondaryKeyDown.State)
//{
// IPropertyObject propertyObject = targetBody.UserData as IPropertyObject;
// if (propertyObject!=null) ApplyStatusEffects(ActionType.OnUse, 1.0f, item.SimPosition, propertyObject);
// //isActive = true;
//}
return true;
}
public override void Update(float deltaTime, Camera cam)
{
base.Update(deltaTime, cam);
//isActive = true;
}
public override void Draw(SpriteBatch spriteBatch)
{
if (!isActive) return;
Vector2 startPos = ConvertUnits.ToDisplayUnits(item.body.Position);
Vector2 endPos = ConvertUnits.ToDisplayUnits(pickedPosition);
endPos = new Vector2(endPos.X + Game1.localRandom.Next(-2, 2), endPos.Y + Game1.localRandom.Next(-2, 2));
Vector2 particleSpeed = new Vector2(
(float)Math.Cos(item.body.Rotation),
(float)Math.Sin(item.body.Rotation)) *item.body.Dir * 5.0f;
GUI.DrawLine(spriteBatch, startPos, endPos, Color.Orange, 0.0f);
Game1.particleManager.CreateParticle("weld", TransformedBarrelPos, particleSpeed);
//Vector2 startPos = ConvertUnits.ToDisplayUnits(item.body.Position);
//Vector2 endPos = ConvertUnits.ToDisplayUnits(pickedPosition);
//endPos = new Vector2(endPos.X + Game1.localRandom.Next(-2, 2), endPos.Y + Game1.localRandom.Next(-2, 2));
//GUI.DrawLine(spriteBatch, startPos, endPos, Color.Orange, 0.0f);
isActive = false;
}