Better autopilot, guiframe tweaking, fixed ui scaling, aicontroller bugfixes, human walk/run anim uses HandIK
This commit is contained in:
@@ -14,7 +14,7 @@
|
|||||||
flip="true">
|
flip="true">
|
||||||
|
|
||||||
<!-- head -->
|
<!-- head -->
|
||||||
<limb id = "0" radius="22" height="45" mass = "6" type="Head" flip="true" steerforce="1.0" armorsector="0.0,180.0" armorvalue="30.0">
|
<limb id = "0" radius="22" height="45" mass = "6" type="Head" flip="true" steerforce="1.0" armorsector="0.0,180.0" armorvalue="30.0" impacttolerance="50.0">
|
||||||
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="0,0,51,121" depth="0.02" origin="0.45,0.63"/>
|
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="0,0,51,121" depth="0.02" origin="0.45,0.63"/>
|
||||||
</limb>
|
</limb>
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="6,141,60,95" depth="0.022" origin="0.37,0.43"/>
|
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="6,141,60,95" depth="0.022" origin="0.37,0.43"/>
|
||||||
</limb>
|
</limb>
|
||||||
|
|
||||||
<limb id = "3" width="13" height="45" mass = "6" ignorecollisions="true" flip="true">
|
<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"/>
|
||||||
</limb>
|
</limb>
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
<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">
|
||||||
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="82,83,11,34" depth="0.03" origin="0.5,0.5"/>
|
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="82,83,11,34" depth="0.03" origin="0.5,0.5"/>
|
||||||
</limb>
|
</limb>
|
||||||
<limb id = "5" width="5" height="40" mass = "4" type="RightFoot" flip="true" pullpos="0.0,15.0" refjoint="3" stepoffset="20.0,0.0">
|
<limb id = "5" width="5" height="40" mass = "4" type="RightFoot" flip="true" pullpos="0.0,15.0" refjoint="3" stepoffset="20.0,0.0" impacttolerance="50.0">
|
||||||
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="59,78,19,43" depth="0.03" origin="0.5,0.5"/>
|
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="59,78,19,43" depth="0.03" origin="0.5,0.5"/>
|
||||||
<sound file ="Content/Sounds/stepMetal.ogg"/>
|
<sound file ="Content/Sounds/stepMetal.ogg"/>
|
||||||
</limb>
|
</limb>
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
<limb id = "6" width="13" height="35" mass = "4" type="LeftLeg" flip="true">
|
<limb id = "6" width="13" height="35" mass = "4" type="LeftLeg" flip="true">
|
||||||
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="82,83,11,34" depth="0.03" origin="0.5,0.5"/>
|
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="82,83,11,34" depth="0.03" origin="0.5,0.5"/>
|
||||||
</limb>
|
</limb>
|
||||||
<limb id = "7" width="5" height="40" mass = "4" type="LeftFoot" flip="true" pullpos="0.0,15.0" refjoint="5" stepoffset="20.0,0.0">
|
<limb id = "7" width="5" height="40" mass = "4" type="LeftFoot" flip="true" pullpos="0.0,15.0" refjoint="5" stepoffset="20.0,0.0" impacttolerance="50.0">
|
||||||
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="59,78,19,43" depth="0.03" origin="0.5,0.5"/>
|
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="59,78,19,43" depth="0.03" origin="0.5,0.5"/>
|
||||||
<sound file ="Content/Sounds/stepMetal.ogg"/>
|
<sound file ="Content/Sounds/stepMetal.ogg"/>
|
||||||
</limb>
|
</limb>
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
<limb id = "8" width="13" height="35" mass = "4" type="RightLeg" flip="true">
|
<limb id = "8" width="13" height="35" mass = "4" type="RightLeg" flip="true">
|
||||||
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="82,83,11,34" depth="0.03" origin="0.5,0.5"/>
|
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="82,83,11,34" depth="0.03" origin="0.5,0.5"/>
|
||||||
</limb>
|
</limb>
|
||||||
<limb id = "9" width="5" height="40" mass = "4" type="RightFoot" flip="true" pullpos="0.0,15.0" refjoint="7" stepoffset="20.0,0.0">
|
<limb id = "9" width="5" height="40" mass = "4" type="RightFoot" flip="true" pullpos="0.0,15.0" refjoint="7" stepoffset="20.0,0.0" impacttolerance="50.0">
|
||||||
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="59,78,19,43" depth="0.03" origin="0.5,0.5"/>
|
<sprite texture="Content/Characters/Crawler/crawler.png" sourcerect="59,78,19,43" depth="0.03" origin="0.5,0.5"/>
|
||||||
<sound file ="Content/Sounds/stepMetal.ogg"/>
|
<sound file ="Content/Sounds/stepMetal.ogg"/>
|
||||||
</limb>
|
</limb>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
<name firstname="Content/Characters/Human/[GENDER]firstnames.txt" lastname="Content/Characters/Human/lastnames.txt" />
|
<name firstname="Content/Characters/Human/[GENDER]firstnames.txt" lastname="Content/Characters/Human/lastnames.txt" />
|
||||||
|
|
||||||
<ragdoll headposition="156" torsoposition="120"
|
<ragdoll headposition="154" torsoposition="118"
|
||||||
stepsize="42.0, 12.0"
|
stepsize="42.0, 12.0"
|
||||||
walkanimspeed="4.58"
|
walkanimspeed="4.58"
|
||||||
movementlerp="0.4"
|
movementlerp="0.4"
|
||||||
|
|||||||
@@ -9,29 +9,29 @@
|
|||||||
|
|
||||||
<ragdoll headposition="120" headangle="-90"
|
<ragdoll headposition="120" headangle="-90"
|
||||||
waveamplitude="50.0" wavelength="2500"
|
waveamplitude="50.0" wavelength="2500"
|
||||||
swimspeed="2.0" walkspeed="1.0"
|
swimspeed="2.0" walkspeed="1.5"
|
||||||
stepsize ="20.0,20.0"
|
stepsize ="20.0,20.0"
|
||||||
legtorque="10"
|
legtorque="10"
|
||||||
footrotation ="180.0"
|
footrotation ="180.0"
|
||||||
flip="true">
|
flip="true">
|
||||||
|
|
||||||
<!-- head -->
|
<!-- head -->
|
||||||
<limb id = "0" radius="30" height="86" mass = "6" type="Head" flip="true" steerforce="1.0" armorsector="0.0,180.0" armorvalue="10.0">
|
<limb id = "0" radius="30" height="86" mass = "6" type="Head" flip="true" steerforce="1.0" armorsector="0.0,180.0" armor="10.0">
|
||||||
<sprite texture="Content/Characters/Mantis/mantis.png" sourcerect="0,0,101,168" depth="0.02" origin="0.4,0.53"/>
|
<sprite texture="Content/Characters/Mantis/mantis.png" sourcerect="0,0,101,168" depth="0.02" origin="0.4,0.53"/>
|
||||||
</limb>
|
</limb>
|
||||||
|
|
||||||
<!-- middle part -->
|
<!-- middle part -->
|
||||||
<limb id = "1" width="42" height="61" mass = "6" flip="true" armorsector="0.0,180.0" armorvalue="10.0">
|
<limb id = "1" width="42" height="61" mass = "6" flip="true" armorsector="0.0,180.0" armor="10.0">
|
||||||
<sprite texture="Content/Characters/Mantis/mantis.png" sourcerect="3,168,59,64" depth="0.021" origin="0.3,0.65"/>
|
<sprite texture="Content/Characters/Mantis/mantis.png" sourcerect="3,168,59,64" depth="0.021" origin="0.3,0.65"/>
|
||||||
</limb>
|
</limb>
|
||||||
|
|
||||||
<!-- middle part -->
|
<!-- middle part -->
|
||||||
<limb id = "2" width="35" height="52" mass = "6" flip="true" armorsector="0.0,180.0" armorvalue="10.0">
|
<limb id = "2" width="35" height="52" mass = "6" flip="true" armorsector="0.0,180.0" armor="10.0">
|
||||||
<sprite texture="Content/Characters/Mantis/mantis.png" sourcerect="66,180,65,70" depth="0.022" origin="0.3,0.65"/>
|
<sprite texture="Content/Characters/Mantis/mantis.png" sourcerect="66,180,65,70" depth="0.022" origin="0.3,0.65"/>
|
||||||
</limb>
|
</limb>
|
||||||
|
|
||||||
<!-- tail -->
|
<!-- tail -->
|
||||||
<limb id = "3" radius="20" mass = "6" type="Tail" flip="true" armorsector="0.0,180.0" armorvalue="10.0">
|
<limb id = "3" radius="20" mass = "6" type="Tail" flip="true" armorsector="0.0,180.0" armor="10.0">
|
||||||
<sprite texture="Content/Characters/Mantis/mantis.png" sourcerect="130,158,46,93" depth="0.023" origin="0.37,0.3"/>
|
<sprite texture="Content/Characters/Mantis/mantis.png" sourcerect="130,158,46,93" depth="0.023" origin="0.37,0.3"/>
|
||||||
</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="120" 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"/>
|
||||||
<sound file ="Content/Sounds/stepMetal.ogg"/>
|
<sound file ="Content/Sounds/stepMetal.ogg"/>
|
||||||
</limb>
|
</limb>
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<joint limb1="0" limb1anchor="16,2" limb2="4" limb2anchor="-5,-20" lowerlimit="-90" upperlimit="0"/>
|
<joint limb1="0" limb1anchor="16,2" limb2="4" limb2anchor="-5,-20" lowerlimit="-90" upperlimit="0"/>
|
||||||
<joint limb1="4" limb1anchor="-2,21" limb2="5" limb2anchor="-5,-20" lowerlimit="-350" upperlimit="-280"/>
|
<joint limb1="4" limb1anchor="-2,21" limb2="5" limb2anchor="-5,-20" lowerlimit="-290" upperlimit="-190"/>
|
||||||
<joint limb1="5" limb1anchor="-2,27" limb2="6" limb2anchor="0,-30" lowerlimit="-190" upperlimit="-30"/>
|
<joint limb1="5" limb1anchor="-2,27" limb2="6" limb2anchor="0,-30" lowerlimit="-190" upperlimit="-30"/>
|
||||||
|
|
||||||
<joint limb1="0" limb1anchor="52,-34" limb2="7" limb2anchor="-4,-19" lowerlimit="-90" upperlimit="0"/>
|
<joint limb1="0" limb1anchor="52,-34" limb2="7" limb2anchor="-4,-19" lowerlimit="-90" upperlimit="0"/>
|
||||||
@@ -87,6 +87,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>
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
</fixrequirement>
|
</fixrequirement>
|
||||||
|
|
||||||
<PowerTransfer canbeselected = "true">
|
<PowerTransfer canbeselected = "true">
|
||||||
<GuiFrame rect="0,0,0.3,0.3" alignment="Center" color="0.0,0.0,0.0,0.8"/>
|
<GuiFrame rect="0,0,350,160" alignment="Center" color="0.0,0.0,0.0,0.6"/>
|
||||||
</PowerTransfer>
|
</PowerTransfer>
|
||||||
|
|
||||||
<ConnectionPanel canbeselected = "true" msg="Rewire [Screwdriver]">
|
<ConnectionPanel canbeselected = "true" msg="Rewire [Screwdriver]">
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
<Sprite texture ="battery.png" depth="0.8"/>
|
<Sprite texture ="battery.png" depth="0.8"/>
|
||||||
|
|
||||||
<PowerContainer capacity="2000.0" maxrechargespeed="500.0" maxoutput="1000.0" canbeselected = "true">
|
<PowerContainer capacity="2000.0" maxrechargespeed="500.0" maxoutput="1000.0" canbeselected = "true">
|
||||||
<GuiFrame rect="0,0,0.3,0.3" alignment="Center" color="0.0,0.0,0.0,0.8"/>
|
<GuiFrame rect="0,0,350,160" alignment="Center" color="0.0,0.0,0.0,0.6"/>
|
||||||
</PowerContainer>
|
</PowerContainer>
|
||||||
|
|
||||||
<ConnectionPanel canbeselected = "true" msg="Rewire [Screwdriver]">
|
<ConnectionPanel canbeselected = "true" msg="Rewire [Screwdriver]">
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<Sprite texture ="engine.png" depth="0.8"/>
|
<Sprite texture ="engine.png" depth="0.8"/>
|
||||||
|
|
||||||
<Engine minvoltage="0.5" powerperforce="10.0" maxforce="500" canbeselected = "true">
|
<Engine minvoltage="0.5" powerperforce="10.0" maxforce="500" canbeselected = "true">
|
||||||
<GuiFrame rect="0,0,0.3,0.3" alignment="Center" color="0.0,0.0,0.0,0.8"/>
|
<GuiFrame rect="0,0,350,160" alignment="Center" color="0.0,0.0,0.0,0.6"/>
|
||||||
<sound file="engine.ogg" type="OnActive" range="3000.0" volume="CurrentVolume" loop="true"/>
|
<sound file="engine.ogg" type="OnActive" range="3000.0" volume="CurrentVolume" loop="true"/>
|
||||||
</Engine>
|
</Engine>
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
<Sprite texture ="fabricator.png" depth="0.8"/>
|
<Sprite texture ="fabricator.png" depth="0.8"/>
|
||||||
|
|
||||||
<Steering minvoltage="0.5" canbeselected = "true">
|
<Steering minvoltage="0.5" canbeselected = "true">
|
||||||
<GuiFrame rect="0,0,0.5,0.5" alignment="Center" color="0.0,0.0,0.0,0.8"/>
|
<GuiFrame rect="0,0,0.5,0.5" alignment="Center" color="0.0,0.0,0.0,0.6"/>
|
||||||
</Steering>
|
</Steering>
|
||||||
|
|
||||||
<Radar canbeselected = "true" powerconsumption="100">
|
<Radar canbeselected = "true" powerconsumption="100">
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<Body width="24" height="5"/>
|
<Body width="24" height="5"/>
|
||||||
|
|
||||||
<Holdable slots="Any,RightHand,LeftHand" RemoveOnUse="true">
|
<Holdable slots="Any,RightHand,LeftHand" RemoveOnUse="true">
|
||||||
<StatusEffect type="OnUse" target="This, Character" Condition="-100.0" health="30.0" disabledeltatime="true"/>
|
<StatusEffect type="OnUse" target="This, Character" health="30.0" Condition="-100.0" disabledeltatime="true"/>
|
||||||
</Holdable>
|
</Holdable>
|
||||||
</Item>
|
</Item>
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
<Body width="9" height="15"/>
|
<Body width="9" height="15"/>
|
||||||
|
|
||||||
<Holdable slots="Any,RightHand,LeftHand" RemoveOnUse="true">
|
<Holdable slots="Any,RightHand,LeftHand" RemoveOnUse="true">
|
||||||
<StatusEffect type="OnUse" target="This, Character" Condition="-100.0" bleeding="-10.0" disabledeltatime="true"/>
|
<StatusEffect type="OnUse" target="This, Character" bleeding="-10.0" Condition="-100.0" disabledeltatime="true"/>
|
||||||
</Holdable>
|
</Holdable>
|
||||||
</Item>
|
</Item>
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<Sprite texture ="pump.png" depth="0.08"/>
|
<Sprite texture ="pump.png" depth="0.08"/>
|
||||||
|
|
||||||
<Pump canbeselected = "true" maxflow="500" PowerConsumption="300.0" MinVoltage="0.3">
|
<Pump canbeselected = "true" maxflow="500" PowerConsumption="300.0" MinVoltage="0.3">
|
||||||
<GuiFrame rect="0,0,0.3,0.3" alignment="Center" color="0.0,0.0,0.0,0.8"/>
|
<GuiFrame rect="0,0,330,145" alignment="Center" color="0.0,0.0,0.0,0.6"/>
|
||||||
<sound file="pump.ogg" type="OnActive" range="800.0" volume="CurrFlow" volumemultiplier="0.01" loop="true"/>
|
<sound file="pump.ogg" type="OnActive" range="800.0" volume="CurrFlow" volumemultiplier="0.01" loop="true"/>
|
||||||
</Pump>
|
</Pump>
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<Sprite texture = "reactor.png" sourcerect="0,0,321,192" depth="0.8"/>
|
<Sprite texture = "reactor.png" sourcerect="0,0,321,192" depth="0.8"/>
|
||||||
|
|
||||||
<Reactor canbeselected = "true">
|
<Reactor canbeselected = "true">
|
||||||
<GuiFrame rect="0,0,0.6,0.7" alignment="Center" color="0.0,0.0,0.0,0.8"/>
|
<GuiFrame rect="0,0,760,460" alignment="Center" color="0.0,0.0,0.0,0.6"/>
|
||||||
<requireditem name="Fuel Rod" type="Contained" msg="Fuel required to run the engine"/>
|
<requireditem name="Fuel Rod" type="Contained" msg="Fuel required to run the engine"/>
|
||||||
<StatusEffect type="OnActive" target="Contained" targetnames="Fuel Rod, Heat Absorber, Temperature Control Circuit" Condition="-0.1" />
|
<StatusEffect type="OnActive" target="Contained" targetnames="Fuel Rod, Heat Absorber, Temperature Control Circuit" Condition="-0.1" />
|
||||||
<sound file="reactor.ogg" type="OnActive" range="2000.0" volume="FissionRate" volumemultiplier="0.02" loop="true"/>
|
<sound file="reactor.ogg" type="OnActive" range="2000.0" volume="FissionRate" volumemultiplier="0.02" loop="true"/>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using Lidgren.Network;
|
using Lidgren.Network;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
|
||||||
namespace Subsurface
|
namespace Subsurface
|
||||||
{
|
{
|
||||||
@@ -21,7 +22,7 @@ namespace Subsurface
|
|||||||
set { Character.AnimController.TargetMovement = value; }
|
set { Character.AnimController.TargetMovement = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector2 Position
|
public Vector2 SimPosition
|
||||||
{
|
{
|
||||||
get { return Character.AnimController.Limbs[0].SimPosition; }
|
get { return Character.AnimController.Limbs[0].SimPosition; }
|
||||||
}
|
}
|
||||||
@@ -44,6 +45,11 @@ namespace Subsurface
|
|||||||
steeringManager = new SteeringManager(this);
|
steeringManager = new SteeringManager(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void DebugDraw(SpriteBatch spriteBatch)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public virtual void OnAttacked(IDamageable attacker, float amount) { }
|
public virtual void OnAttacked(IDamageable attacker, float amount) { }
|
||||||
|
|
||||||
public virtual void SelectTarget(AITarget target) { }
|
public virtual void SelectTarget(AITarget target) { }
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using FarseerPhysics;
|
|||||||
using Lidgren.Network;
|
using Lidgren.Network;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using FarseerPhysics.Dynamics;
|
using FarseerPhysics.Dynamics;
|
||||||
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
|
||||||
namespace Subsurface
|
namespace Subsurface
|
||||||
{
|
{
|
||||||
@@ -264,6 +265,9 @@ namespace Subsurface
|
|||||||
|
|
||||||
public override void OnAttacked(IDamageable attacker, float amount)
|
public override void OnAttacked(IDamageable attacker, float amount)
|
||||||
{
|
{
|
||||||
|
updateTargetsTimer = Math.Min(updateTargetsTimer, 0.1f);
|
||||||
|
coolDownTimer *= 0.1f;
|
||||||
|
|
||||||
if (attacker==null || attacker.AiTarget==null) return;
|
if (attacker==null || attacker.AiTarget==null) return;
|
||||||
AITargetMemory targetMemory = FindTargetMemory(attacker.AiTarget);
|
AITargetMemory targetMemory = FindTargetMemory(attacker.AiTarget);
|
||||||
targetMemory.Priority += amount;
|
targetMemory.Priority += amount;
|
||||||
@@ -319,7 +323,7 @@ namespace Subsurface
|
|||||||
Vector2.Normalize(attackPosition - limb.SimPosition));
|
Vector2.Normalize(attackPosition - limb.SimPosition));
|
||||||
}
|
}
|
||||||
|
|
||||||
steeringManager.SteeringSeek(attackPosition + (limb.SimPosition-Position), 5.0f);
|
steeringManager.SteeringSeek(attackPosition + (limb.SimPosition-SimPosition), 5.0f);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -329,6 +333,7 @@ namespace Subsurface
|
|||||||
|
|
||||||
if (attackTimer >= limb.attack.Duration)
|
if (attackTimer >= limb.attack.Duration)
|
||||||
{
|
{
|
||||||
|
wallAttackPos = Vector2.Zero;
|
||||||
attackTimer = 0.0f;
|
attackTimer = 0.0f;
|
||||||
if (Vector2.Distance(limb.SimPosition, attackPosition)<5.0) coolDownTimer = attackCoolDown;
|
if (Vector2.Distance(limb.SimPosition, attackPosition)<5.0) coolDownTimer = attackCoolDown;
|
||||||
|
|
||||||
@@ -477,6 +482,32 @@ namespace Subsurface
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void DebugDraw(SpriteBatch spriteBatch)
|
||||||
|
{
|
||||||
|
if (Character.IsDead) return;
|
||||||
|
|
||||||
|
Vector2 pos = Character.Position;
|
||||||
|
pos.Y = -pos.Y;
|
||||||
|
|
||||||
|
if (selectedAiTarget!=null)
|
||||||
|
{
|
||||||
|
GUI.DrawLine(spriteBatch, pos, ConvertUnits.ToDisplayUnits(new Vector2(selectedAiTarget.Position.X, -selectedAiTarget.Position.Y)), Color.Red);
|
||||||
|
|
||||||
|
if (wallAttackPos!=Vector2.Zero)
|
||||||
|
{
|
||||||
|
GUI.DrawRectangle(spriteBatch, ConvertUnits.ToDisplayUnits(new Vector2(wallAttackPos.X, -wallAttackPos.Y)) - new Vector2(10.0f, 10.0f), new Vector2(20.0f, 20.0f), Color.Red, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
spriteBatch.DrawString(GUI.Font, targetValue.ToString(), pos - Vector2.UnitY*20.0f, Color.Red);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
spriteBatch.DrawString(GUI.Font, targetValue.ToString(), pos - Vector2.UnitY * 80.0f, Color.Red);
|
||||||
|
|
||||||
|
spriteBatch.DrawString(GUI.Font, "updatetargets: "+updateTargetsTimer, pos - Vector2.UnitY * 100.0f, Color.Red);
|
||||||
|
spriteBatch.DrawString(GUI.Font, "cooldown: " + coolDownTimer, pos - Vector2.UnitY * 120.0f, Color.Red);
|
||||||
|
}
|
||||||
|
|
||||||
public override void FillNetworkData(NetOutgoingMessage message)
|
public override void FillNetworkData(NetOutgoingMessage message)
|
||||||
{
|
{
|
||||||
message.Write((byte)state);
|
message.Write((byte)state);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ namespace Subsurface
|
|||||||
get;
|
get;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2 Position
|
Vector2 SimPosition
|
||||||
{
|
{
|
||||||
get;
|
get;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ namespace Subsurface
|
|||||||
|
|
||||||
private Vector2 DoSteeringSeek(Vector2 target, float speed = 1.0f)
|
private Vector2 DoSteeringSeek(Vector2 target, float speed = 1.0f)
|
||||||
{
|
{
|
||||||
Vector2 targetVel = target - host.Position;
|
Vector2 targetVel = target - host.SimPosition;
|
||||||
|
|
||||||
if (targetVel.LengthSquared() < 0.00001f) return Vector2.Zero;
|
if (targetVel.LengthSquared() < 0.00001f) return Vector2.Zero;
|
||||||
|
|
||||||
@@ -111,12 +111,12 @@ namespace Subsurface
|
|||||||
|
|
||||||
float maxDistance = 2.0f;
|
float maxDistance = 2.0f;
|
||||||
|
|
||||||
Vector2 ahead = host.Position + Vector2.Normalize(host.Steering)*maxDistance;
|
Vector2 ahead = host.SimPosition + Vector2.Normalize(host.Steering)*maxDistance;
|
||||||
|
|
||||||
if (rayCastTimer <= 0.0f)
|
if (rayCastTimer <= 0.0f)
|
||||||
{
|
{
|
||||||
rayCastTimer = RayCastInterval;
|
rayCastTimer = RayCastInterval;
|
||||||
Body closestBody = Submarine.CheckVisibility(host.Position, ahead);
|
Body closestBody = Submarine.CheckVisibility(host.SimPosition, ahead);
|
||||||
if (closestBody == null)
|
if (closestBody == null)
|
||||||
{
|
{
|
||||||
avoidSteering = Vector2.Zero;
|
avoidSteering = Vector2.Zero;
|
||||||
|
|||||||
@@ -5,32 +5,55 @@ namespace Subsurface
|
|||||||
{
|
{
|
||||||
class SteeringPath
|
class SteeringPath
|
||||||
{
|
{
|
||||||
private Queue<WayPoint> nodes;
|
private List<WayPoint> nodes;
|
||||||
|
|
||||||
WayPoint currentNode;
|
int currentIndex;
|
||||||
|
|
||||||
public SteeringPath()
|
public SteeringPath()
|
||||||
{
|
{
|
||||||
nodes = new Queue<WayPoint>();
|
nodes = new List<WayPoint>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddNode(WayPoint node)
|
public void AddNode(WayPoint node)
|
||||||
{
|
{
|
||||||
if (node == null) return;
|
if (node == null) return;
|
||||||
nodes.Enqueue(node);
|
nodes.Add(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
public WayPoint CurrentNode
|
public WayPoint CurrentNode
|
||||||
{
|
{
|
||||||
get { return currentNode; }
|
get
|
||||||
|
{
|
||||||
|
if (currentIndex < 0 || currentIndex > nodes.Count - 1) return null;
|
||||||
|
return nodes[currentIndex];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public WayPoint GetNode(Vector2 pos, float minDistance = 0.1f)
|
public List<WayPoint> Nodes
|
||||||
{
|
{
|
||||||
if (nodes.Count == 0) return null;
|
get { return nodes; }
|
||||||
if (currentNode == null || Vector2.Distance(pos, currentNode.SimPosition) < minDistance) currentNode = nodes.Dequeue();
|
}
|
||||||
|
|
||||||
return currentNode;
|
public WayPoint NextNode
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (currentIndex+1 < 0 || currentIndex+1 > nodes.Count - 1) return null;
|
||||||
|
return nodes[currentIndex+1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SkipToNextNode()
|
||||||
|
{
|
||||||
|
currentIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public WayPoint CheckProgress(Vector2 pos, float minSimDistance = 0.1f)
|
||||||
|
{
|
||||||
|
if (nodes.Count == 0 || currentIndex>nodes.Count-1) return null;
|
||||||
|
if (Vector2.Distance(pos, nodes[currentIndex].SimPosition) < minSimDistance) currentIndex++;
|
||||||
|
|
||||||
|
return CurrentNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClearPath()
|
public void ClearPath()
|
||||||
|
|||||||
@@ -59,6 +59,13 @@ namespace Subsurface
|
|||||||
aiController.Update(deltaTime);
|
aiController.Update(deltaTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void DrawFront(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch)
|
||||||
|
{
|
||||||
|
base.DrawFront(spriteBatch);
|
||||||
|
|
||||||
|
if (GameMain.DebugDraw) aiController.DebugDraw(spriteBatch);
|
||||||
|
}
|
||||||
|
|
||||||
public override AttackResult AddDamage(IDamageable attacker, Vector2 position, Attack attack, float deltaTime, bool playSound = false)
|
public override AttackResult AddDamage(IDamageable attacker, Vector2 position, Attack attack, float deltaTime, bool playSound = false)
|
||||||
{
|
{
|
||||||
AttackResult result = base.AddDamage(attacker, position, attack, deltaTime, playSound);
|
AttackResult result = base.AddDamage(attacker, position, attack, deltaTime, playSound);
|
||||||
@@ -113,7 +120,7 @@ namespace Subsurface
|
|||||||
LargeUpdateTimer = Math.Max(0, LargeUpdateTimer - 1);
|
LargeUpdateTimer = Math.Max(0, LargeUpdateTimer - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ReadNetworkData(NetworkEventType type, NetIncomingMessage message)
|
public override void ReadNetworkData(NetworkEventType type, NetIncomingMessage message)
|
||||||
{
|
{
|
||||||
if (type == NetworkEventType.KillCharacter)
|
if (type == NetworkEventType.KillCharacter)
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace Subsurface
|
|||||||
get { return drawPosition; }
|
get { return drawPosition; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector2 Position
|
public Vector2 SimPosition
|
||||||
{
|
{
|
||||||
get { return position; }
|
get { return position; }
|
||||||
}
|
}
|
||||||
@@ -179,7 +179,7 @@ namespace Subsurface
|
|||||||
|
|
||||||
foreach (BackgroundSprite member in Members)
|
foreach (BackgroundSprite member in Members)
|
||||||
{
|
{
|
||||||
midPoint += member.Position;
|
midPoint += member.SimPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
midPoint /= Members.Count;
|
midPoint /= Members.Count;
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ namespace Subsurface
|
|||||||
|
|
||||||
protected bool isDead;
|
protected bool isDead;
|
||||||
|
|
||||||
bool isHumanoid;
|
public readonly bool IsHumanoid;
|
||||||
|
|
||||||
//the name of the species (e.q. human)
|
//the name of the species (e.q. human)
|
||||||
public readonly string SpeciesName;
|
public readonly string SpeciesName;
|
||||||
@@ -200,7 +200,7 @@ namespace Subsurface
|
|||||||
get { return bleeding; }
|
get { return bleeding; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (MathUtils.IsValid(value)) return;
|
if (!MathUtils.IsValid(value)) return;
|
||||||
bleeding = Math.Max(value, 0.0f);
|
bleeding = Math.Max(value, 0.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -344,9 +344,9 @@ namespace Subsurface
|
|||||||
|
|
||||||
SpeciesName = ToolBox.GetAttributeString(doc.Root, "name", "Unknown");
|
SpeciesName = ToolBox.GetAttributeString(doc.Root, "name", "Unknown");
|
||||||
|
|
||||||
isHumanoid = ToolBox.GetAttributeBool(doc.Root, "humanoid", false);
|
IsHumanoid = ToolBox.GetAttributeBool(doc.Root, "humanoid", false);
|
||||||
|
|
||||||
if (isHumanoid)
|
if (IsHumanoid)
|
||||||
{
|
{
|
||||||
AnimController = new HumanoidAnimController(this, doc.Root.Element("ragdoll"));
|
AnimController = new HumanoidAnimController(this, doc.Root.Element("ragdoll"));
|
||||||
AnimController.TargetDir = Direction.Right;
|
AnimController.TargetDir = Direction.Right;
|
||||||
@@ -660,7 +660,7 @@ namespace Subsurface
|
|||||||
if (closestCharacter != null)
|
if (closestCharacter != null)
|
||||||
{
|
{
|
||||||
if (closestCharacter != selectedCharacter) selectedCharacter = null;
|
if (closestCharacter != selectedCharacter) selectedCharacter = null;
|
||||||
if (!closestCharacter.isHumanoid) closestCharacter = null;
|
if (!closestCharacter.IsHumanoid) closestCharacter = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
closestItem = FindClosestItem(mouseSimPos);
|
closestItem = FindClosestItem(mouseSimPos);
|
||||||
@@ -706,7 +706,7 @@ namespace Subsurface
|
|||||||
{
|
{
|
||||||
selectedCharacter = null;
|
selectedCharacter = null;
|
||||||
}
|
}
|
||||||
else if (closestCharacter != null && closestCharacter.isDead && closestCharacter.isHumanoid)
|
else if (closestCharacter != null && closestCharacter.isDead && closestCharacter.IsHumanoid)
|
||||||
{
|
{
|
||||||
selectedCharacter = closestCharacter;
|
selectedCharacter = closestCharacter;
|
||||||
}
|
}
|
||||||
@@ -758,7 +758,7 @@ namespace Subsurface
|
|||||||
ControlLocalPlayer(deltaTime, cam);
|
ControlLocalPlayer(deltaTime, cam);
|
||||||
}
|
}
|
||||||
|
|
||||||
Control(deltaTime, cam);
|
if (!(this is AICharacter)) Control(deltaTime, cam);
|
||||||
|
|
||||||
UpdateSightRange();
|
UpdateSightRange();
|
||||||
aiTarget.SoundRange = 0.0f;
|
aiTarget.SoundRange = 0.0f;
|
||||||
@@ -820,7 +820,7 @@ namespace Subsurface
|
|||||||
CharacterHUD.Draw(spriteBatch, this, cam);
|
CharacterHUD.Draw(spriteBatch, this, cam);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DrawFront(SpriteBatch spriteBatch)
|
public virtual void DrawFront(SpriteBatch spriteBatch)
|
||||||
{
|
{
|
||||||
Vector2 pos = ConvertUnits.ToDisplayUnits(AnimController.Limbs[0].SimPosition);
|
Vector2 pos = ConvertUnits.ToDisplayUnits(AnimController.Limbs[0].SimPosition);
|
||||||
pos.Y = -pos.Y;
|
pos.Y = -pos.Y;
|
||||||
|
|||||||
@@ -30,14 +30,9 @@ namespace Subsurface
|
|||||||
|
|
||||||
public override void UpdateAnim(float deltaTime)
|
public override void UpdateAnim(float deltaTime)
|
||||||
{
|
{
|
||||||
if (character.IsDead) return;
|
if (character.IsDead) return;
|
||||||
|
|
||||||
Vector2 colliderPos = GetLimb(LimbType.Torso).SimPosition;
|
|
||||||
|
|
||||||
if (!MathUtils.IsValid(RefLimb.body.SimPosition))
|
Vector2 colliderPos = GetLimb(LimbType.Torso).SimPosition;
|
||||||
{
|
|
||||||
int a = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//if (inWater) stairs = null;
|
//if (inWater) stairs = null;
|
||||||
|
|
||||||
@@ -57,7 +52,7 @@ namespace Subsurface
|
|||||||
case Physics.CollisionStairs:
|
case Physics.CollisionStairs:
|
||||||
if (inWater && TargetMovement.Y < 0.5f) return -1;
|
if (inWater && TargetMovement.Y < 0.5f) return -1;
|
||||||
Structure structure = fixture.Body.UserData as Structure;
|
Structure structure = fixture.Body.UserData as Structure;
|
||||||
if (stairs == null && structure!=null)
|
if (stairs == null && structure != null)
|
||||||
{
|
{
|
||||||
if (LowestLimb.SimPosition.Y < structure.SimPosition.Y)
|
if (LowestLimb.SimPosition.Y < structure.SimPosition.Y)
|
||||||
{
|
{
|
||||||
@@ -70,7 +65,7 @@ namespace Subsurface
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Physics.CollisionPlatform:
|
case Physics.CollisionPlatform:
|
||||||
Structure platform = fixture.Body.UserData as Structure;
|
Structure platform = fixture.Body.UserData as Structure;
|
||||||
if (IgnorePlatforms || LowestLimb.Position.Y < platform.Rect.Y) return -1;
|
if (IgnorePlatforms || LowestLimb.Position.Y < platform.Rect.Y) return -1;
|
||||||
break;
|
break;
|
||||||
case Physics.CollisionWall:
|
case Physics.CollisionWall:
|
||||||
@@ -118,12 +113,12 @@ namespace Subsurface
|
|||||||
if (closestFraction == 1) //raycast didn't hit anything
|
if (closestFraction == 1) //raycast didn't hit anything
|
||||||
{
|
{
|
||||||
floorY = (currentHull == null) ? -1000.0f : ConvertUnits.ToSimUnits(currentHull.Rect.Y - currentHull.Rect.Height);
|
floorY = (currentHull == null) ? -1000.0f : ConvertUnits.ToSimUnits(currentHull.Rect.Y - currentHull.Rect.Height);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
floorY = rayStart.Y + (rayEnd.Y - rayStart.Y) * closestFraction;
|
floorY = rayStart.Y + (rayEnd.Y - rayStart.Y) * closestFraction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
IgnorePlatforms = (TargetMovement.Y < 0.0f);
|
IgnorePlatforms = (TargetMovement.Y < 0.0f);
|
||||||
|
|
||||||
@@ -175,18 +170,20 @@ namespace Subsurface
|
|||||||
aiming = false;
|
aiming = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void UpdateStanding()
|
void UpdateStanding()
|
||||||
{
|
{
|
||||||
Vector2 handPos;
|
Vector2 handPos;
|
||||||
|
|
||||||
|
//if you're allergic to magic numbers, stop reading now
|
||||||
|
|
||||||
Limb leftFoot = GetLimb(LimbType.LeftFoot);
|
Limb leftFoot = GetLimb(LimbType.LeftFoot);
|
||||||
Limb rightFoot = GetLimb(LimbType.RightFoot);
|
Limb rightFoot = GetLimb(LimbType.RightFoot);
|
||||||
Limb head = GetLimb(LimbType.Head);
|
Limb head = GetLimb(LimbType.Head);
|
||||||
Limb torso = GetLimb(LimbType.Torso);
|
Limb torso = GetLimb(LimbType.Torso);
|
||||||
|
|
||||||
Limb waist = GetLimb(LimbType.Waist);
|
Limb waist = GetLimb(LimbType.Waist);
|
||||||
|
|
||||||
Limb leftHand = GetLimb(LimbType.LeftHand);
|
Limb leftHand = GetLimb(LimbType.LeftHand);
|
||||||
Limb rightHand = GetLimb(LimbType.RightHand);
|
Limb rightHand = GetLimb(LimbType.RightHand);
|
||||||
@@ -198,31 +195,31 @@ namespace Subsurface
|
|||||||
float walkCycleSpeed = head.LinearVelocity.X * walkAnimSpeed;
|
float walkCycleSpeed = head.LinearVelocity.X * walkAnimSpeed;
|
||||||
if (stairs != null)
|
if (stairs != null)
|
||||||
{
|
{
|
||||||
TargetMovement = new Vector2(MathHelper.Clamp(TargetMovement.X, -2.0f, 2.0f), TargetMovement.Y) ;
|
TargetMovement = new Vector2(MathHelper.Clamp(TargetMovement.X, -1.5f, 1.5f), TargetMovement.Y);
|
||||||
|
|
||||||
if ((TargetMovement.X>0.0f && stairs.StairDirection == Direction.Right) ||
|
if ((TargetMovement.X > 0.0f && stairs.StairDirection == Direction.Right) ||
|
||||||
TargetMovement.X < 0.0f && stairs.StairDirection == Direction.Left)
|
TargetMovement.X < 0.0f && stairs.StairDirection == Direction.Left)
|
||||||
{
|
{
|
||||||
TargetMovement *= 1.35f;
|
TargetMovement *= 1.7f;
|
||||||
|
walkCycleSpeed *= 1.7f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TargetMovement /= 1.2f;
|
TargetMovement /= 1.0f;
|
||||||
}
|
walkCycleSpeed *= 1.5f;
|
||||||
|
}
|
||||||
walkCycleSpeed *= 1.5f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2 colliderPos = new Vector2(torso.SimPosition.X, floorY);
|
Vector2 colliderPos = new Vector2(torso.SimPosition.X, floorY);
|
||||||
|
|
||||||
float walkPosX = (float)Math.Cos(walkPos);
|
float walkPosX = (float)Math.Cos(walkPos);
|
||||||
float walkPosY = (float)Math.Sin(walkPos);
|
float walkPosY = (float)Math.Sin(walkPos);
|
||||||
float runningModifier = (float)Math.Max(Math.Abs(movement.X) / 1.5f, 1.0);
|
float runningModifier = (float)Math.Max(Math.Abs(TargetMovement.X) / 1.5f, 1.0);
|
||||||
|
|
||||||
Vector2 stepSize = new Vector2(
|
Vector2 stepSize = new Vector2(
|
||||||
this.stepSize.X * walkPosX * runningModifier,
|
this.stepSize.X * walkPosX * runningModifier,
|
||||||
this.stepSize.Y * walkPosY * runningModifier * runningModifier);
|
this.stepSize.Y * walkPosY * runningModifier * runningModifier);
|
||||||
|
|
||||||
float footMid = waist.SimPosition.X;// (leftFoot.SimPosition.X + rightFoot.SimPosition.X) / 2.0f;
|
float footMid = waist.SimPosition.X;// (leftFoot.SimPosition.X + rightFoot.SimPosition.X) / 2.0f;
|
||||||
|
|
||||||
int limbsInWater = 0;
|
int limbsInWater = 0;
|
||||||
@@ -231,184 +228,169 @@ namespace Subsurface
|
|||||||
if (limb.inWater) limbsInWater++;
|
if (limb.inWater) limbsInWater++;
|
||||||
}
|
}
|
||||||
|
|
||||||
TargetMovement *= (1.0f - 0.5f*((float)limbsInWater/(float)Limbs.Count()));
|
TargetMovement *= (1.0f - 0.5f * ((float)limbsInWater / (float)Limbs.Count()));
|
||||||
|
|
||||||
movement = MathUtils.SmoothStep(movement, TargetMovement, movementLerp);
|
movement = MathUtils.SmoothStep(movement, TargetMovement, movementLerp);
|
||||||
movement.Y = 0.0f;
|
movement.Y = 0.0f;
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; i++)
|
||||||
|
|
||||||
//place the anchors of the head and the torso to make the ragdoll stand
|
|
||||||
if (onGround && LowestLimb != null && (LowestLimb.SimPosition.Y-floorY < 0.5f || stairs != null) && head !=null)
|
|
||||||
{
|
{
|
||||||
getUpSpeed = getUpSpeed * (head.SimPosition.Y - colliderPos.Y);//, 0.25f);
|
Limb leg = GetLimb((i == 0) ? LimbType.LeftThigh : LimbType.RightThigh);// : leftLeg;
|
||||||
|
|
||||||
if (stairs != null)
|
if (leg.SimPosition.Y < torso.SimPosition.Y) continue;
|
||||||
{
|
|
||||||
if (LowestLimb.SimPosition.Y < stairs.SimPosition.Y) IgnorePlatforms = true;
|
|
||||||
|
|
||||||
torso.pullJoint.Enabled = true;
|
|
||||||
torso.pullJoint.WorldAnchorB = new Vector2(
|
|
||||||
MathHelper.SmoothStep(torso.SimPosition.X, footMid + movement.X * 0.35f, getUpSpeed * 0.8f),
|
|
||||||
MathHelper.SmoothStep(torso.SimPosition.Y, colliderPos.Y + TorsoPosition - Math.Abs(walkPosX * 0.05f), getUpSpeed * 3.0f));
|
|
||||||
|
|
||||||
|
leg.body.ApplyTorque(-Dir * leg.Mass * 10.0f);
|
||||||
head.pullJoint.Enabled = true;
|
|
||||||
head.pullJoint.WorldAnchorB = new Vector2(
|
|
||||||
MathHelper.SmoothStep(head.SimPosition.X, footMid + movement.X * 0.4f, getUpSpeed * 0.8f),
|
|
||||||
MathHelper.SmoothStep(head.SimPosition.Y, colliderPos.Y + HeadPosition - Math.Abs(walkPosX * 0.05f), getUpSpeed * 3.0f));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
torso.pullJoint.Enabled = true;
|
|
||||||
torso.pullJoint.WorldAnchorB =
|
|
||||||
MathUtils.SmoothStep(torso.SimPosition,
|
|
||||||
new Vector2(footMid + movement.X * 0.3f, colliderPos.Y + TorsoPosition), getUpSpeed);
|
|
||||||
|
|
||||||
head.pullJoint.Enabled = true;
|
|
||||||
head.pullJoint.WorldAnchorB =
|
|
||||||
MathUtils.SmoothStep(head.SimPosition,
|
|
||||||
new Vector2(footMid + movement.X * (0.2f + runningModifier / 10.0f), colliderPos.Y + HeadPosition), getUpSpeed);
|
|
||||||
|
|
||||||
waist.pullJoint.Enabled = true;
|
|
||||||
waist.pullJoint.WorldAnchorB = waist.SimPosition + movement*0.1f;
|
|
||||||
//MathUtils.SmoothStep(waist.SimPosition,
|
|
||||||
//new Vector2(footMid + movement.X * 0.4f, colliderPos.Y + HeadPosition), getUpSpeed);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//moving horizontally
|
|
||||||
if (TargetMovement.X != 0.0f)
|
|
||||||
{
|
|
||||||
//progress the walking animation
|
|
||||||
walkPos -= (walkCycleSpeed / runningModifier)*0.8f;
|
|
||||||
|
|
||||||
MoveLimb(leftFoot,
|
|
||||||
colliderPos + new Vector2(
|
|
||||||
stepSize.X,
|
|
||||||
(stepSize.Y > 0.0f) ? stepSize.Y : -0.15f),
|
|
||||||
15.0f, true);
|
|
||||||
|
|
||||||
MoveLimb(rightFoot,
|
|
||||||
colliderPos + new Vector2(
|
|
||||||
-stepSize.X,
|
|
||||||
(-stepSize.Y > 0.0f) ? -stepSize.Y : -0.15f),
|
|
||||||
15.0f, true);
|
|
||||||
|
|
||||||
leftFoot.body.SmoothRotate(leftLeg.body.Rotation + MathHelper.PiOver2 * Dir * 1.6f, 20.0f * runningModifier);
|
|
||||||
rightFoot.body.SmoothRotate(rightLeg.body.Rotation + MathHelper.PiOver2 * Dir * 1.6f, 20.0f * runningModifier);
|
|
||||||
|
|
||||||
if (runningModifier>1.0f)
|
|
||||||
{
|
|
||||||
if (walkPosY > 0.0f)
|
|
||||||
{
|
|
||||||
GetLimb(LimbType.LeftThigh).body.ApplyTorque(-walkPosY * Dir * Math.Abs(movement.X) * thighTorque);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GetLimb(LimbType.RightThigh).body.ApplyTorque(walkPosY * Dir * Math.Abs(movement.X) * thighTorque);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (legTorque>0.0f)
|
|
||||||
{
|
|
||||||
if (Math.Sign(walkPosX) != Math.Sign(movement.X))
|
|
||||||
{
|
|
||||||
GetLimb(LimbType.LeftLeg).body.ApplyTorque(-walkPosY * Dir * Math.Abs(movement.X) * legTorque / runningModifier);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GetLimb(LimbType.RightLeg).body.ApplyTorque(walkPosY * Dir * Math.Abs(movement.X) * legTorque / runningModifier);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//calculate the positions of hands
|
|
||||||
handPos = torso.SimPosition;
|
|
||||||
handPos.X = -walkPosX * 0.2f;// *runningModifier;
|
|
||||||
|
|
||||||
float lowerY = -0.6f + runningModifier/3.5f;
|
|
||||||
|
|
||||||
handPos.Y = lowerY + (float)(Math.Abs(Math.Sin(walkPos - Math.PI * 1.5f) * 0.05)) / runningModifier;
|
|
||||||
|
|
||||||
Vector2 posAdditon = new Vector2(movement.X*0.07f, 0.0f);
|
|
||||||
if (stairs!=null)
|
|
||||||
{
|
|
||||||
if ((stairs.StairDirection == Direction.Right && movement.X < 0.0f) ||
|
|
||||||
(stairs.StairDirection == Direction.Left && movement.X > 0.0f))
|
|
||||||
{
|
|
||||||
posAdditon.Y -= 0.1f;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
posAdditon.Y += 0.1f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!rightHand.Disabled)
|
|
||||||
{
|
|
||||||
rightHand.body.ApplyTorque(walkPosY * runningModifier * Dir);
|
|
||||||
MoveLimb(rightHand, torso.SimPosition + posAdditon +
|
|
||||||
new Vector2(
|
|
||||||
-handPos.X,
|
|
||||||
(Math.Sign(walkPosX) == Math.Sign(Dir)) ? handPos.Y : lowerY),
|
|
||||||
15.0f, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!leftHand.Disabled)
|
|
||||||
{
|
|
||||||
leftHand.body.ApplyTorque(-walkPosY * runningModifier * Dir);
|
|
||||||
MoveLimb(leftHand, torso.SimPosition + posAdditon +
|
|
||||||
new Vector2(
|
|
||||||
handPos.X,
|
|
||||||
(Math.Sign(walkPosX) == Math.Sign(-Dir)) ? handPos.Y : lowerY),
|
|
||||||
15.0f, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
float movementFactor = (movement.X / 4.0f) * movement.X * Math.Sign(movement.X);
|
|
||||||
|
|
||||||
Vector2 footPos = new Vector2(
|
|
||||||
colliderPos.X + movementFactor - Dir * 0.05f,
|
|
||||||
colliderPos.Y - 0.2f - Math.Abs(movementFactor));
|
|
||||||
|
|
||||||
MoveLimb(leftFoot, footPos, 2.5f);
|
|
||||||
MoveLimb(rightFoot, footPos, 2.5f);
|
|
||||||
|
|
||||||
leftFoot.body.SmoothRotate(Dir * MathHelper.PiOver2, 5.0f);
|
|
||||||
rightFoot.body.SmoothRotate(Dir * MathHelper.PiOver2, 5.0f);
|
|
||||||
|
|
||||||
if (!rightHand.Disabled)
|
|
||||||
{
|
|
||||||
// MoveLimb(rightHand, handPos, 0.05f, true);
|
|
||||||
//rightHand.body.ApplyLinearImpulse((handPos - rightHand.Position));
|
|
||||||
rightHand.body.SmoothRotate(0.0f, 5.0f);
|
|
||||||
|
|
||||||
var rightArm = GetLimb(LimbType.RightArm);
|
|
||||||
rightArm.body.SmoothRotate(0.0f, 20.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!leftHand.Disabled)
|
|
||||||
{
|
|
||||||
//MoveLimb(leftHand, handPos, 0.05f, true);
|
|
||||||
//leftHand.body.ApplyLinearImpulse((handPos - leftHand.Position));
|
|
||||||
leftHand.body.SmoothRotate(0.0f, 5.0f);
|
|
||||||
|
|
||||||
var leftArm = GetLimb(LimbType.LeftArm);
|
|
||||||
leftArm.body.SmoothRotate(0.0f, 20.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//for (int i = 0; i < 2; i++)
|
//place the anchors of the head and the torso to make the ragdoll stand
|
||||||
//{
|
|
||||||
// Limb leg = (i == 0) ? rightLeg : leftLeg;
|
|
||||||
|
|
||||||
// if (leg.SimPosition.Y < waist.SimPosition.Y) continue;
|
if (LowestLimb == null) return;
|
||||||
|
|
||||||
|
if (!onGround || (LowestLimb.SimPosition.Y - floorY > 0.5f && stairs == null)) return;
|
||||||
|
|
||||||
|
getUpSpeed = getUpSpeed * (head.SimPosition.Y - colliderPos.Y);
|
||||||
|
|
||||||
|
if (stairs != null)
|
||||||
|
{
|
||||||
|
if (LowestLimb.SimPosition.Y < stairs.SimPosition.Y) IgnorePlatforms = true;
|
||||||
|
|
||||||
|
torso.pullJoint.Enabled = true;
|
||||||
|
torso.pullJoint.WorldAnchorB = new Vector2(
|
||||||
|
MathHelper.SmoothStep(torso.SimPosition.X, footMid + movement.X * 0.35f, getUpSpeed * 0.8f),
|
||||||
|
MathHelper.SmoothStep(torso.SimPosition.Y, colliderPos.Y + TorsoPosition - Math.Abs(walkPosX * 0.05f), getUpSpeed * 2.0f));
|
||||||
|
|
||||||
|
|
||||||
|
head.pullJoint.Enabled = true;
|
||||||
|
head.pullJoint.WorldAnchorB = new Vector2(
|
||||||
|
MathHelper.SmoothStep(head.SimPosition.X, footMid + movement.X * 0.4f, getUpSpeed * 0.8f),
|
||||||
|
MathHelper.SmoothStep(head.SimPosition.Y, colliderPos.Y + HeadPosition - Math.Abs(walkPosX * 0.05f), getUpSpeed * 2.0f));
|
||||||
|
|
||||||
|
waist.pullJoint.Enabled = true;
|
||||||
|
waist.pullJoint.WorldAnchorB = waist.SimPosition;// +movement * 0.3f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
torso.pullJoint.Enabled = true;
|
||||||
|
torso.pullJoint.WorldAnchorB =
|
||||||
|
MathUtils.SmoothStep(torso.SimPosition,
|
||||||
|
new Vector2(footMid + movement.X * 0.3f, colliderPos.Y + TorsoPosition), getUpSpeed);
|
||||||
|
|
||||||
|
|
||||||
|
head.pullJoint.Enabled = true;
|
||||||
|
head.pullJoint.WorldAnchorB =
|
||||||
|
MathUtils.SmoothStep(head.SimPosition,
|
||||||
|
new Vector2(footMid + movement.X * 0.3f, colliderPos.Y + HeadPosition), getUpSpeed*1.2f);
|
||||||
|
|
||||||
|
waist.pullJoint.Enabled = true;
|
||||||
|
waist.pullJoint.WorldAnchorB = waist.SimPosition + movement * 0.1f;
|
||||||
|
//MathUtils.SmoothStep(waist.SimPosition,
|
||||||
|
//new Vector2(footMid + movement.X * 0.4f, colliderPos.Y + HeadPosition), getUpSpeed);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//moving horizontally
|
||||||
|
if (TargetMovement.X != 0.0f)
|
||||||
|
{
|
||||||
|
//progress the walking animation
|
||||||
|
walkPos -= (walkCycleSpeed / runningModifier) * 0.8f;
|
||||||
|
|
||||||
|
MoveLimb(leftFoot,
|
||||||
|
colliderPos + new Vector2(
|
||||||
|
stepSize.X,
|
||||||
|
(stepSize.Y > 0.0f) ? stepSize.Y : -0.15f),
|
||||||
|
15.0f, true);
|
||||||
|
|
||||||
|
MoveLimb(rightFoot,
|
||||||
|
colliderPos + new Vector2(
|
||||||
|
-stepSize.X,
|
||||||
|
(-stepSize.Y > 0.0f) ? -stepSize.Y : -0.15f),
|
||||||
|
15.0f, true);
|
||||||
|
|
||||||
|
leftFoot.body.SmoothRotate(leftLeg.body.Rotation + MathHelper.PiOver2 * Dir * 1.6f, 20.0f * runningModifier);
|
||||||
|
rightFoot.body.SmoothRotate(rightLeg.body.Rotation + MathHelper.PiOver2 * Dir * 1.6f, 20.0f * runningModifier);
|
||||||
|
|
||||||
|
if (runningModifier > 1.0f)
|
||||||
|
{
|
||||||
|
if (walkPosY > 0.0f)
|
||||||
|
{
|
||||||
|
GetLimb(LimbType.LeftThigh).body.ApplyTorque(-walkPosY * Dir * Math.Abs(movement.X) * thighTorque);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GetLimb(LimbType.RightThigh).body.ApplyTorque(walkPosY * Dir * Math.Abs(movement.X) * thighTorque);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (legTorque > 0.0f)
|
||||||
|
{
|
||||||
|
if (Math.Sign(walkPosX) != Math.Sign(movement.X))
|
||||||
|
{
|
||||||
|
GetLimb(LimbType.LeftLeg).body.ApplyTorque(-walkPosY * Dir * Math.Abs(movement.X) * legTorque / runningModifier);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GetLimb(LimbType.RightLeg).body.ApplyTorque(walkPosY * Dir * Math.Abs(movement.X) * legTorque / runningModifier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//calculate the positions of hands
|
||||||
|
handPos = torso.SimPosition;
|
||||||
|
handPos.X = -walkPosX * 0.4f;
|
||||||
|
|
||||||
|
float lowerY = -1.0f + (runningModifier - 1.0f) * 0.8f;
|
||||||
|
|
||||||
|
handPos.Y = lowerY + (float)(Math.Abs(Math.Sin(walkPos - Math.PI * 1.5f) * 0.15 * runningModifier));
|
||||||
|
|
||||||
|
Vector2 posAddition = new Vector2(-movement.X * 0.015f * runningModifier, 0.0f);
|
||||||
|
|
||||||
|
if (!rightHand.Disabled)
|
||||||
|
{
|
||||||
|
HandIK(rightHand, torso.SimPosition + posAddition +
|
||||||
|
new Vector2(
|
||||||
|
-handPos.X,
|
||||||
|
(Math.Sign(walkPosX) == Math.Sign(Dir)) ? handPos.Y : lowerY), 0.7f*runningModifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!leftHand.Disabled)
|
||||||
|
{
|
||||||
|
HandIK(leftHand, torso.SimPosition + posAddition +
|
||||||
|
new Vector2(
|
||||||
|
handPos.X,
|
||||||
|
(Math.Sign(walkPosX) == Math.Sign(-Dir)) ? handPos.Y : lowerY), 0.7f * runningModifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float movementFactor = (movement.X / 4.0f) * movement.X * Math.Sign(movement.X);
|
||||||
|
|
||||||
|
Vector2 footPos = new Vector2(
|
||||||
|
colliderPos.X,
|
||||||
|
colliderPos.Y - 0.2f);
|
||||||
|
|
||||||
|
MoveLimb(leftFoot, footPos, 2.5f);
|
||||||
|
MoveLimb(rightFoot, footPos, 2.5f);
|
||||||
|
|
||||||
|
leftFoot.body.SmoothRotate(Dir * MathHelper.PiOver2, 5.0f);
|
||||||
|
rightFoot.body.SmoothRotate(Dir * MathHelper.PiOver2, 5.0f);
|
||||||
|
|
||||||
|
if (!rightHand.Disabled)
|
||||||
|
{
|
||||||
|
rightHand.body.SmoothRotate(0.0f, 5.0f);
|
||||||
|
|
||||||
|
var rightArm = GetLimb(LimbType.RightArm);
|
||||||
|
rightArm.body.SmoothRotate(0.0f, 20.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!leftHand.Disabled)
|
||||||
|
{
|
||||||
|
leftHand.body.SmoothRotate(0.0f, 5.0f);
|
||||||
|
|
||||||
|
var leftArm = GetLimb(LimbType.LeftArm);
|
||||||
|
leftArm.body.SmoothRotate(0.0f, 20.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// //leg.body.ApplyTorque(Dir * leg.Mass * 50.0f);
|
|
||||||
//}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -416,23 +398,23 @@ namespace Subsurface
|
|||||||
{
|
{
|
||||||
movement = MathUtils.SmoothStep(movement, TargetMovement, movementLerp);
|
movement = MathUtils.SmoothStep(movement, TargetMovement, movementLerp);
|
||||||
|
|
||||||
if (inWater && movement.LengthSquared()>0.00001f)
|
if (inWater && movement.LengthSquared() > 0.00001f)
|
||||||
{
|
{
|
||||||
movement = Vector2.Normalize(movement);
|
movement = Vector2.Normalize(movement);
|
||||||
}
|
}
|
||||||
|
|
||||||
RefLimb.pullJoint.Enabled = true;
|
RefLimb.pullJoint.Enabled = true;
|
||||||
RefLimb.pullJoint.WorldAnchorB =
|
RefLimb.pullJoint.WorldAnchorB =
|
||||||
RefLimb.SimPosition + movement*0.15f;
|
RefLimb.SimPosition + movement * 0.15f;
|
||||||
|
|
||||||
RefLimb.body.SmoothRotate(0.0f);
|
RefLimb.body.SmoothRotate(0.0f);
|
||||||
|
|
||||||
foreach (Limb l in Limbs)
|
foreach (Limb l in Limbs)
|
||||||
{
|
{
|
||||||
if (l==RefLimb) continue;
|
if (l == RefLimb) continue;
|
||||||
l.body.SetTransform(RefLimb.SimPosition, RefLimb.Rotation);
|
l.body.SetTransform(RefLimb.SimPosition, RefLimb.Rotation);
|
||||||
}
|
}
|
||||||
//new Vector2(movement.X, floorY + HeadPosition), 0.5f);
|
//new Vector2(movement.X, floorY + HeadPosition), 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateSwimming()
|
void UpdateSwimming()
|
||||||
@@ -447,20 +429,20 @@ namespace Subsurface
|
|||||||
|
|
||||||
if (currentHull != null && (currentHull.Rect.Y - currentHull.Surface > 50.0f) && !head.inWater)
|
if (currentHull != null && (currentHull.Rect.Y - currentHull.Surface > 50.0f) && !head.inWater)
|
||||||
{
|
{
|
||||||
surfaceLimiter = (ConvertUnits.ToDisplayUnits(head.SimPosition.Y)-surfaceY);
|
surfaceLimiter = (ConvertUnits.ToDisplayUnits(head.SimPosition.Y) - surfaceY);
|
||||||
surfaceLimiter = Math.Max(1.0f, surfaceLimiter);
|
surfaceLimiter = Math.Max(1.0f, surfaceLimiter);
|
||||||
if (surfaceLimiter > 20.0f) return;
|
if (surfaceLimiter > 20.0f) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Limb torso = GetLimb(LimbType.Torso);
|
Limb torso = GetLimb(LimbType.Torso);
|
||||||
Limb leftHand = GetLimb(LimbType.LeftHand);
|
Limb leftHand = GetLimb(LimbType.LeftHand);
|
||||||
Limb rightHand = GetLimb(LimbType.RightHand);
|
Limb rightHand = GetLimb(LimbType.RightHand);
|
||||||
|
|
||||||
|
Limb leftFoot = GetLimb(LimbType.LeftFoot);
|
||||||
|
Limb rightFoot = GetLimb(LimbType.RightFoot);
|
||||||
|
Limb leftLeg = GetLimb(LimbType.LeftLeg);
|
||||||
|
Limb rightLeg = GetLimb(LimbType.RightLeg);
|
||||||
|
|
||||||
Limb leftFoot = GetLimb(LimbType.LeftFoot);
|
|
||||||
Limb rightFoot = GetLimb(LimbType.RightFoot);
|
|
||||||
Limb leftLeg = GetLimb(LimbType.LeftLeg);
|
|
||||||
Limb rightLeg = GetLimb(LimbType.RightLeg);
|
|
||||||
|
|
||||||
float rotation = MathHelper.WrapAngle(torso.Rotation);
|
float rotation = MathHelper.WrapAngle(torso.Rotation);
|
||||||
rotation = MathHelper.ToDegrees(rotation);
|
rotation = MathHelper.ToDegrees(rotation);
|
||||||
if (rotation < 0.0f) rotation += 360;
|
if (rotation < 0.0f) rotation += 360;
|
||||||
@@ -475,12 +457,12 @@ namespace Subsurface
|
|||||||
|
|
||||||
float targetSpeed = TargetMovement.Length();
|
float targetSpeed = TargetMovement.Length();
|
||||||
if (targetSpeed > 0.0f) TargetMovement /= targetSpeed;
|
if (targetSpeed > 0.0f) TargetMovement /= targetSpeed;
|
||||||
|
|
||||||
if (targetSpeed > 0.1f)
|
if (targetSpeed > 0.1f)
|
||||||
{
|
{
|
||||||
if (!aiming)
|
if (!aiming)
|
||||||
{
|
{
|
||||||
torso.body.SmoothRotate(MathUtils.VectorToAngle(TargetMovement)-MathHelper.PiOver2);
|
torso.body.SmoothRotate(MathUtils.VectorToAngle(TargetMovement) - MathHelper.PiOver2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -526,7 +508,7 @@ namespace Subsurface
|
|||||||
movement.Y -= 0.05f;
|
movement.Y -= 0.05f;
|
||||||
|
|
||||||
head.body.ApplyForce((new Vector2(movement.X,
|
head.body.ApplyForce((new Vector2(movement.X,
|
||||||
movement.Y / surfaceLimiter + 0.2f) - head.body.LinearVelocity * 0.2f) *
|
movement.Y / surfaceLimiter + 0.2f) - head.body.LinearVelocity * 0.2f) *
|
||||||
30.0f * head.body.Mass);
|
30.0f * head.body.Mass);
|
||||||
|
|
||||||
torso.body.ApplyForce((new Vector2(movement.X,
|
torso.body.ApplyForce((new Vector2(movement.X,
|
||||||
@@ -546,7 +528,7 @@ namespace Subsurface
|
|||||||
transformedFootPos,
|
transformedFootPos,
|
||||||
Matrix.CreateRotationZ(torso.body.Rotation));
|
Matrix.CreateRotationZ(torso.body.Rotation));
|
||||||
|
|
||||||
if (Math.Abs(MathUtils.GetShortestAngle(torso.Rotation, rightThigh.Rotation))<0.3f)
|
if (Math.Abs(MathUtils.GetShortestAngle(torso.Rotation, rightThigh.Rotation)) < 0.3f)
|
||||||
{
|
{
|
||||||
MoveLimb(rightFoot, footPos - transformedFootPos, 1.0f);
|
MoveLimb(rightFoot, footPos - transformedFootPos, 1.0f);
|
||||||
}
|
}
|
||||||
@@ -554,14 +536,14 @@ namespace Subsurface
|
|||||||
{
|
{
|
||||||
MoveLimb(leftFoot, footPos + transformedFootPos, 1.0f);
|
MoveLimb(leftFoot, footPos + transformedFootPos, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
handPos = (torso.SimPosition + head.SimPosition) / 2.0f;
|
handPos = (torso.SimPosition + head.SimPosition) / 2.0f;
|
||||||
|
|
||||||
//if (!rightHand.Disabled) rightHand.body.ApplyTorque(leftHand.body.Mass * Dir);
|
//if (!rightHand.Disabled) rightHand.body.ApplyTorque(leftHand.body.Mass * Dir);
|
||||||
//if (!leftHand.Disabled) leftHand.body.ApplyTorque(leftHand.body.Mass * Dir);
|
//if (!leftHand.Disabled) leftHand.body.ApplyTorque(leftHand.body.Mass * Dir);
|
||||||
|
|
||||||
//at the surface, not moving sideways -> hands just float around
|
//at the surface, not moving sideways -> hands just float around
|
||||||
if (!headInWater && TargetMovement.X == 0.0f && TargetMovement.Y>0)
|
if (!headInWater && TargetMovement.X == 0.0f && TargetMovement.Y > 0)
|
||||||
{
|
{
|
||||||
handPos.X = handPos.X + Dir * 0.6f;
|
handPos.X = handPos.X + Dir * 0.6f;
|
||||||
|
|
||||||
@@ -612,12 +594,12 @@ namespace Subsurface
|
|||||||
|
|
||||||
//MoveLimb(leftHand, handPos + leftHandPos,1.5f);
|
//MoveLimb(leftHand, handPos + leftHandPos,1.5f);
|
||||||
HandIK(leftHand, handPos + leftHandPos, 0.5f);
|
HandIK(leftHand, handPos + leftHandPos, 0.5f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateClimbing()
|
void UpdateClimbing()
|
||||||
{
|
{
|
||||||
if (character.SelectedConstruction == null || character.SelectedConstruction.GetComponent<Ladder>()==null)
|
if (character.SelectedConstruction == null || character.SelectedConstruction.GetComponent<Ladder>() == null)
|
||||||
{
|
{
|
||||||
Anim = Animation.None;
|
Anim = Animation.None;
|
||||||
return;
|
return;
|
||||||
@@ -630,15 +612,15 @@ namespace Subsurface
|
|||||||
|
|
||||||
Vector2 footPos, handPos;
|
Vector2 footPos, handPos;
|
||||||
|
|
||||||
Limb leftFoot = GetLimb(LimbType.LeftFoot);
|
Limb leftFoot = GetLimb(LimbType.LeftFoot);
|
||||||
Limb rightFoot = GetLimb(LimbType.RightFoot);
|
Limb rightFoot = GetLimb(LimbType.RightFoot);
|
||||||
Limb head = GetLimb(LimbType.Head);
|
Limb head = GetLimb(LimbType.Head);
|
||||||
Limb torso = GetLimb(LimbType.Torso);
|
Limb torso = GetLimb(LimbType.Torso);
|
||||||
|
|
||||||
Limb waist = GetLimb(LimbType.Waist);
|
Limb waist = GetLimb(LimbType.Waist);
|
||||||
|
|
||||||
Limb leftHand = GetLimb(LimbType.LeftHand);
|
Limb leftHand = GetLimb(LimbType.LeftHand);
|
||||||
Limb rightHand = GetLimb(LimbType.RightHand);
|
Limb rightHand = GetLimb(LimbType.RightHand);
|
||||||
|
|
||||||
Vector2 ladderSimPos = ConvertUnits.ToSimUnits(
|
Vector2 ladderSimPos = ConvertUnits.ToSimUnits(
|
||||||
character.SelectedConstruction.Rect.X + character.SelectedConstruction.Rect.Width / 2.0f,
|
character.SelectedConstruction.Rect.X + character.SelectedConstruction.Rect.Width / 2.0f,
|
||||||
@@ -668,7 +650,7 @@ namespace Subsurface
|
|||||||
rightHand.body.ApplyTorque(Dir * 2.0f);
|
rightHand.body.ApplyTorque(Dir * 2.0f);
|
||||||
|
|
||||||
footPos = new Vector2(
|
footPos = new Vector2(
|
||||||
handPos.X - Dir*0.05f,
|
handPos.X - Dir * 0.05f,
|
||||||
head.SimPosition.Y - stepHeight * 2.7f - ladderSimPos.Y - 0.7f);
|
head.SimPosition.Y - stepHeight * 2.7f - ladderSimPos.Y - 0.7f);
|
||||||
|
|
||||||
//if (movement.Y < 0) footPos.Y += 0.05f;
|
//if (movement.Y < 0) footPos.Y += 0.05f;
|
||||||
@@ -712,7 +694,7 @@ namespace Subsurface
|
|||||||
// - reached the top or bottom of the ladder
|
// - reached the top or bottom of the ladder
|
||||||
if (Math.Abs(torso.LinearVelocity.Y) > 5.0f ||
|
if (Math.Abs(torso.LinearVelocity.Y) > 5.0f ||
|
||||||
TargetMovement.X != 0.0f ||
|
TargetMovement.X != 0.0f ||
|
||||||
(TargetMovement.Y < 0.0f && ConvertUnits.ToSimUnits(trigger.Height) + handPos.Y < HeadPosition*1.5f) ||
|
(TargetMovement.Y < 0.0f && ConvertUnits.ToSimUnits(trigger.Height) + handPos.Y < HeadPosition * 1.5f) ||
|
||||||
(TargetMovement.Y > 0.0f && handPos.Y > 0.3f))
|
(TargetMovement.Y > 0.0f && handPos.Y > 0.3f))
|
||||||
{
|
{
|
||||||
Anim = Animation.None;
|
Anim = Animation.None;
|
||||||
@@ -721,7 +703,7 @@ namespace Subsurface
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//float punchTimer;
|
//float punchTimer;
|
||||||
//bool punching;
|
//bool punching;
|
||||||
|
|
||||||
@@ -777,12 +759,12 @@ namespace Subsurface
|
|||||||
transformedHandlePos[0] = Vector2.Transform(handlePos[0], itemTransfrom);
|
transformedHandlePos[0] = Vector2.Transform(handlePos[0], itemTransfrom);
|
||||||
transformedHandlePos[1] = Vector2.Transform(handlePos[1], itemTransfrom);
|
transformedHandlePos[1] = Vector2.Transform(handlePos[1], itemTransfrom);
|
||||||
|
|
||||||
Limb head = GetLimb(LimbType.Head);
|
Limb head = GetLimb(LimbType.Head);
|
||||||
Limb torso = GetLimb(LimbType.Torso);
|
Limb torso = GetLimb(LimbType.Torso);
|
||||||
Limb leftHand = GetLimb(LimbType.LeftHand);
|
Limb leftHand = GetLimb(LimbType.LeftHand);
|
||||||
Limb rightHand = GetLimb(LimbType.RightHand);
|
Limb rightHand = GetLimb(LimbType.RightHand);
|
||||||
|
|
||||||
Vector2 itemPos = aim ? aimPos : holdPos;
|
Vector2 itemPos = aim ? aimPos : holdPos;
|
||||||
|
|
||||||
float itemAngle;
|
float itemAngle;
|
||||||
if (stunTimer <= 0.0f && aim && itemPos != Vector2.Zero)
|
if (stunTimer <= 0.0f && aim && itemPos != Vector2.Zero)
|
||||||
@@ -810,7 +792,7 @@ namespace Subsurface
|
|||||||
{
|
{
|
||||||
itemAngle = (torso.body.Rotation + holdAngle * Dir);
|
itemAngle = (torso.body.Rotation + holdAngle * Dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2 shoulderPos = limbJoints[2].WorldAnchorA;
|
Vector2 shoulderPos = limbJoints[2].WorldAnchorA;
|
||||||
Vector2 transformedHoldPos = shoulderPos;
|
Vector2 transformedHoldPos = shoulderPos;
|
||||||
|
|
||||||
@@ -847,7 +829,7 @@ namespace Subsurface
|
|||||||
}
|
}
|
||||||
|
|
||||||
Vector2 bodyVelocity = torso.body.LinearVelocity / 60.0f;
|
Vector2 bodyVelocity = torso.body.LinearVelocity / 60.0f;
|
||||||
|
|
||||||
item.body.ResetDynamics();
|
item.body.ResetDynamics();
|
||||||
item.body.SetTransform(MathUtils.SmoothStep(item.body.SimPosition, transformedHoldPos + bodyVelocity, 0.5f), itemAngle);
|
item.body.SetTransform(MathUtils.SmoothStep(item.body.SimPosition, transformedHoldPos + bodyVelocity, 0.5f), itemAngle);
|
||||||
|
|
||||||
@@ -859,7 +841,7 @@ namespace Subsurface
|
|||||||
Limb hand = (i == 0) ? rightHand : leftHand;
|
Limb hand = (i == 0) ? rightHand : leftHand;
|
||||||
|
|
||||||
HandIK(hand, transformedHoldPos + transformedHandlePos[i]);
|
HandIK(hand, transformedHoldPos + transformedHandlePos[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandIK(Limb hand, Vector2 pos, float force = 1.0f)
|
private void HandIK(Limb hand, Vector2 pos, float force = 1.0f)
|
||||||
@@ -883,20 +865,22 @@ namespace Subsurface
|
|||||||
float armAngle = MathUtils.SolveTriangleSSS(a, b, c);
|
float armAngle = MathUtils.SolveTriangleSSS(a, b, c);
|
||||||
float handAngle = MathUtils.SolveTriangleSSS(b, a, c);
|
float handAngle = MathUtils.SolveTriangleSSS(b, a, c);
|
||||||
|
|
||||||
arm.body.SmoothRotate((ang2 - armAngle * Dir), 20.0f*force);
|
arm.body.SmoothRotate((ang2 - armAngle * Dir), 20.0f * force);
|
||||||
hand.body.SmoothRotate((ang2 + handAngle * Dir), 100.0f*force);
|
hand.body.SmoothRotate((ang2 + handAngle * Dir), 100.0f * force);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Flip()
|
public override void Flip()
|
||||||
{
|
{
|
||||||
base.Flip();
|
base.Flip();
|
||||||
|
|
||||||
|
walkPos = -walkPos;
|
||||||
|
|
||||||
Limb torso = GetLimb(LimbType.Torso);
|
Limb torso = GetLimb(LimbType.Torso);
|
||||||
|
|
||||||
Vector2 difference;
|
Vector2 difference;
|
||||||
|
|
||||||
Matrix torsoTransform = Matrix.CreateRotationZ(torso.Rotation);
|
Matrix torsoTransform = Matrix.CreateRotationZ(torso.Rotation);
|
||||||
|
|
||||||
for (int i = 0; i < character.SelectedItems.Length; i++)
|
for (int i = 0; i < character.SelectedItems.Length; i++)
|
||||||
{
|
{
|
||||||
if (character.SelectedItems[i] != null)
|
if (character.SelectedItems[i] != null)
|
||||||
@@ -926,7 +910,7 @@ namespace Subsurface
|
|||||||
l.body.SetTransform(torso.SimPosition + Vector2.Transform(difference, -torsoTransform), -l.body.Rotation);
|
l.body.SetTransform(torso.SimPosition + Vector2.Transform(difference, -torsoTransform), -l.body.Rotation);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (!inWater) l.body.SetTransform(l.body.SimPosition,
|
if (!inWater) l.body.SetTransform(l.body.SimPosition,
|
||||||
MathUtils.WrapAnglePi(l.body.Rotation * (l.DoesFlip ? -1.0f : 1.0f)));
|
MathUtils.WrapAnglePi(l.body.Rotation * (l.DoesFlip ? -1.0f : 1.0f)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,7 +103,9 @@ namespace Subsurface
|
|||||||
{
|
{
|
||||||
int width = 500, height = 400;
|
int width = 500, height = 400;
|
||||||
|
|
||||||
GUIFrame frame = new GUIFrame(new Rectangle(GameMain.GraphicsWidth / 2 - width / 2, GameMain.GraphicsHeight / 2 - height / 2, width, height), GUI.Style);
|
GUIFrame backFrame = new GUIFrame(Rectangle.Empty, Color.Black*0.5f);
|
||||||
|
|
||||||
|
GUIFrame frame = new GUIFrame(new Rectangle(GameMain.GraphicsWidth / 2 - width / 2, GameMain.GraphicsHeight / 2 - height / 2, width, height), GUI.Style, backFrame);
|
||||||
frame.Padding = new Vector4(30.0f, 30.0f, 30.0f, 30.0f);
|
frame.Padding = new Vector4(30.0f, 30.0f, 30.0f, 30.0f);
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(0,0,100,20), name, GUI.Style, Alignment.TopLeft, Alignment.TopLeft, frame, false, GUI.LargeFont);
|
new GUITextBlock(new Rectangle(0,0,100,20), name, GUI.Style, Alignment.TopLeft, Alignment.TopLeft, frame, false, GUI.LargeFont);
|
||||||
@@ -142,7 +144,7 @@ namespace Subsurface
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
return frame;
|
return backFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void LoadAll(List<string> filePaths)
|
public static void LoadAll(List<string> filePaths)
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ namespace Subsurface
|
|||||||
body.CollidesWith = Physics.CollisionAll & ~Physics.CollisionCharacter & ~Physics.CollisionMisc;
|
body.CollidesWith = Physics.CollisionAll & ~Physics.CollisionCharacter & ~Physics.CollisionMisc;
|
||||||
}
|
}
|
||||||
|
|
||||||
impactTolerance = ToolBox.GetAttributeFloat(element, "impacttolerance", 10.0f);
|
impactTolerance = ToolBox.GetAttributeFloat(element, "impacttolerance", character.IsHumanoid ? 15.0f : 50.0f);
|
||||||
|
|
||||||
body.UserData = this;
|
body.UserData = this;
|
||||||
|
|
||||||
|
|||||||
@@ -212,6 +212,13 @@ namespace Subsurface
|
|||||||
case "editchar":
|
case "editchar":
|
||||||
GameMain.EditCharacterScreen.Select();
|
GameMain.EditCharacterScreen.Select();
|
||||||
break;
|
break;
|
||||||
|
case "heal":
|
||||||
|
if (Character.Controlled!=null)
|
||||||
|
{
|
||||||
|
Character.Controlled.Health = Character.Controlled.MaxHealth;
|
||||||
|
Character.Controlled.Bleeding = 0.0f;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case "freecamera":
|
case "freecamera":
|
||||||
case "freecam":
|
case "freecam":
|
||||||
Character.Controlled = null;
|
Character.Controlled = null;
|
||||||
|
|||||||
@@ -111,6 +111,12 @@ namespace Subsurface
|
|||||||
|
|
||||||
this.level = level;
|
this.level = level;
|
||||||
|
|
||||||
|
if (submarine==null)
|
||||||
|
{
|
||||||
|
DebugConsole.ThrowError("Couldn't start game session, submarine not selected");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (reloadSub || Submarine.Loaded != submarine) submarine.Load();
|
if (reloadSub || Submarine.Loaded != submarine) submarine.Load();
|
||||||
|
|
||||||
if (level != null)
|
if (level != null)
|
||||||
|
|||||||
@@ -207,11 +207,16 @@ namespace Subsurface.Items.Components
|
|||||||
statusEffects.Add(StatusEffect.Load(subElement));
|
statusEffects.Add(StatusEffect.Load(subElement));
|
||||||
break;
|
break;
|
||||||
case "guiframe":
|
case "guiframe":
|
||||||
|
string rectStr = ToolBox.GetAttributeString(subElement, "rect", "0.0,0.0,0.5,0.5");
|
||||||
|
|
||||||
|
string[] components = rectStr.Split(',');
|
||||||
|
if (components.Length < 4) continue;
|
||||||
|
|
||||||
Vector4 rect = ToolBox.GetAttributeVector4(subElement, "rect", Vector4.One);
|
Vector4 rect = ToolBox.GetAttributeVector4(subElement, "rect", Vector4.One);
|
||||||
rect.X *= GameMain.GraphicsWidth;
|
if (components[0].Contains(".")) rect.X *= GameMain.GraphicsWidth;
|
||||||
rect.Y *= GameMain.GraphicsHeight;
|
if (components[1].Contains(".")) rect.Y *= GameMain.GraphicsHeight;
|
||||||
rect.Z *= GameMain.GraphicsWidth;
|
if (components[2].Contains(".")) rect.Z *= GameMain.GraphicsWidth;
|
||||||
rect.W *= GameMain.GraphicsHeight;
|
if (components[3].Contains(".")) rect.W *= GameMain.GraphicsHeight;
|
||||||
|
|
||||||
Vector4 color = ToolBox.GetAttributeVector4(subElement, "color", Vector4.One);
|
Vector4 color = ToolBox.GetAttributeVector4(subElement, "color", Vector4.One);
|
||||||
|
|
||||||
@@ -228,7 +233,7 @@ namespace Subsurface.Items.Components
|
|||||||
|
|
||||||
guiFrame = new GUIFrame(
|
guiFrame = new GUIFrame(
|
||||||
new Rectangle((int)rect.X, (int)rect.Y, (int)rect.Z, (int)rect.W),
|
new Rectangle((int)rect.X, (int)rect.Y, (int)rect.Z, (int)rect.W),
|
||||||
new Color(color.X, color.Y, color.Z, color.W), alignment, GUI.Style);
|
new Color(color.X, color.Y, color.Z) * color.W, alignment, GUI.Style);
|
||||||
//guiFrame.Alpha = color.W;
|
//guiFrame.Alpha = color.W;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -172,6 +172,31 @@ namespace Subsurface.Items.Components
|
|||||||
quest.RadarPosition, displayScale, center, (rect.Width * 0.55f));
|
quest.RadarPosition, displayScale, center, (rect.Width * 0.55f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!GameMain.DebugDraw) return;
|
||||||
|
|
||||||
|
var steering = item.GetComponent<Steering>();
|
||||||
|
if (steering == null || steering.SteeringPath == null) return;
|
||||||
|
|
||||||
|
Vector2 prevPos = Vector2.Zero;
|
||||||
|
|
||||||
|
foreach (WayPoint wp in steering.SteeringPath.Nodes)
|
||||||
|
{
|
||||||
|
Vector2 pos = (wp.Position - Submarine.Loaded.Position) * displayScale;
|
||||||
|
if (pos.Length() > radius) continue;
|
||||||
|
|
||||||
|
pos.Y = -pos.Y;
|
||||||
|
pos += center;
|
||||||
|
|
||||||
|
GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X -3 / 2, (int)pos.Y - 3, 6, 6), (steering.SteeringPath.CurrentNode==wp) ? Color.LightGreen : Color.Green, false);
|
||||||
|
|
||||||
|
if (prevPos!=Vector2.Zero)
|
||||||
|
{
|
||||||
|
GUI.DrawLine(spriteBatch, pos, prevPos, Color.Green);
|
||||||
|
}
|
||||||
|
|
||||||
|
prevPos = pos;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawMarker(SpriteBatch spriteBatch, string label, Vector2 position, float scale, Vector2 center, float radius)
|
private void DrawMarker(SpriteBatch spriteBatch, string label, Vector2 position, float scale, Vector2 center, float radius)
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ namespace Subsurface.Items.Components
|
|||||||
{
|
{
|
||||||
class Steering : Powered
|
class Steering : Powered
|
||||||
{
|
{
|
||||||
|
private const float AutopilotRayCastInterval = 5.0f;
|
||||||
|
|
||||||
private Vector2 currVelocity;
|
private Vector2 currVelocity;
|
||||||
private Vector2 targetVelocity;
|
private Vector2 targetVelocity;
|
||||||
|
|
||||||
@@ -24,6 +26,8 @@ namespace Subsurface.Items.Components
|
|||||||
private float networkUpdateTimer;
|
private float networkUpdateTimer;
|
||||||
private bool valueChanged;
|
private bool valueChanged;
|
||||||
|
|
||||||
|
private float autopilotRayCastTimer;
|
||||||
|
|
||||||
bool AutoPilot
|
bool AutoPilot
|
||||||
{
|
{
|
||||||
get { return autoPilot; }
|
get { return autoPilot; }
|
||||||
@@ -37,7 +41,7 @@ namespace Subsurface.Items.Components
|
|||||||
{
|
{
|
||||||
if (pathFinder==null) pathFinder = new PathFinder(WayPoint.WayPointList, false);
|
if (pathFinder==null) pathFinder = new PathFinder(WayPoint.WayPointList, false);
|
||||||
steeringPath = pathFinder.FindPath(
|
steeringPath = pathFinder.FindPath(
|
||||||
ConvertUnits.ToSimUnits(Level.Loaded.Position),
|
ConvertUnits.ToSimUnits(Submarine.Loaded.Position),
|
||||||
ConvertUnits.ToSimUnits(Level.Loaded.EndPosition));
|
ConvertUnits.ToSimUnits(Level.Loaded.EndPosition));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -59,6 +63,11 @@ namespace Subsurface.Items.Components
|
|||||||
get { return targetVelocity; }
|
get { return targetVelocity; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SteeringPath SteeringPath
|
||||||
|
{
|
||||||
|
get { return steeringPath; }
|
||||||
|
}
|
||||||
|
|
||||||
public Steering(Item item, XElement element)
|
public Steering(Item item, XElement element)
|
||||||
: base(item, element)
|
: base(item, element)
|
||||||
{
|
{
|
||||||
@@ -81,21 +90,7 @@ namespace Subsurface.Items.Components
|
|||||||
// ConvertUnits.ToSimUnits(Level.Loaded.EndPosition));
|
// ConvertUnits.ToSimUnits(Level.Loaded.EndPosition));
|
||||||
//}
|
//}
|
||||||
|
|
||||||
steeringPath.GetNode(Vector2.Zero, 20.0f);
|
UpdateAutoPilot(deltaTime);
|
||||||
|
|
||||||
if (steeringPath.CurrentNode!=null)
|
|
||||||
{
|
|
||||||
float prediction = 10.0f;
|
|
||||||
|
|
||||||
Vector2 futurePosition = Submarine.Loaded.Speed * prediction;
|
|
||||||
|
|
||||||
Vector2 targetSpeed = (steeringPath.CurrentNode.Position - futurePosition);
|
|
||||||
|
|
||||||
//float dist = targetSpeed.Length();
|
|
||||||
targetSpeed = Vector2.Normalize(targetSpeed);
|
|
||||||
|
|
||||||
TargetVelocity = targetSpeed*100.0f;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (valueChanged)
|
else if (valueChanged)
|
||||||
{
|
{
|
||||||
@@ -160,6 +155,51 @@ namespace Subsurface.Items.Components
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void UpdateAutoPilot(float deltaTime)
|
||||||
|
{
|
||||||
|
autopilotRayCastTimer -= deltaTime;
|
||||||
|
|
||||||
|
steeringPath.CheckProgress(ConvertUnits.ToSimUnits(Submarine.Loaded.Position), 10.0f);
|
||||||
|
|
||||||
|
if (autopilotRayCastTimer<=0.0f && steeringPath.NextNode != null)
|
||||||
|
{
|
||||||
|
Vector2 diff = steeringPath.NextNode.Position - Submarine.Loaded.Position;
|
||||||
|
|
||||||
|
bool nextVisible = true;
|
||||||
|
for (int x = -1; x < 2; x += 2)
|
||||||
|
{
|
||||||
|
for (int y = -1; y < 2; y += 2)
|
||||||
|
{
|
||||||
|
Vector2 cornerPos =
|
||||||
|
new Vector2(Submarine.Borders.Width * x, Submarine.Borders.Height * y) / 2.0f;
|
||||||
|
|
||||||
|
cornerPos = ConvertUnits.ToSimUnits(cornerPos*1.2f);
|
||||||
|
|
||||||
|
if (Submarine.PickBody(cornerPos, cornerPos + diff, null, Physics.CollisionLevel) == null) continue;
|
||||||
|
|
||||||
|
nextVisible = false;
|
||||||
|
x = 2;
|
||||||
|
y = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nextVisible) steeringPath.SkipToNextNode();
|
||||||
|
|
||||||
|
autopilotRayCastTimer = AutopilotRayCastInterval;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (steeringPath.CurrentNode != null)
|
||||||
|
{
|
||||||
|
float prediction = 5.0f;
|
||||||
|
|
||||||
|
Vector2 futurePosition = Submarine.Loaded.Speed * prediction;
|
||||||
|
Vector2 targetSpeed = ((steeringPath.CurrentNode.Position - Submarine.Loaded.Position) - futurePosition);
|
||||||
|
|
||||||
|
targetSpeed = Vector2.Normalize(targetSpeed);
|
||||||
|
TargetVelocity = targetSpeed * 100.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override void ReceiveSignal(string signal, Connection connection, Item sender, float power=0.0f)
|
public override void ReceiveSignal(string signal, Connection connection, Item sender, float power=0.0f)
|
||||||
{
|
{
|
||||||
if (connection.Name == "velocity_in")
|
if (connection.Name == "velocity_in")
|
||||||
|
|||||||
@@ -184,24 +184,24 @@ namespace Subsurface.Items.Components
|
|||||||
|
|
||||||
public override void DrawHUD(SpriteBatch spriteBatch, Character character)
|
public override void DrawHUD(SpriteBatch spriteBatch, Character character)
|
||||||
{
|
{
|
||||||
int width = 300, height = 200;
|
GuiFrame.Draw(spriteBatch);
|
||||||
int x = GameMain.GraphicsWidth / 2 - width / 2;
|
|
||||||
int y = GameMain.GraphicsHeight / 2 - height / 2;
|
|
||||||
|
|
||||||
GUI.DrawRectangle(spriteBatch, new Rectangle(x, y, width, height), Color.Black, true);
|
int x = GuiFrame.Rect.X;
|
||||||
|
int y = GuiFrame.Rect.Y;
|
||||||
|
//GUI.DrawRectangle(spriteBatch, new Rectangle(x, y, width, height), Color.Black, true);
|
||||||
|
|
||||||
spriteBatch.DrawString(GUI.Font,
|
spriteBatch.DrawString(GUI.Font,
|
||||||
"Charge: " + (int)charge + "/" + (int)capacity + " (" + (int)((charge / capacity) * 100.0f) + " %)",
|
"Charge: " + (int)charge + "/" + (int)capacity + " (" + (int)((charge / capacity) * 100.0f) + " %)",
|
||||||
new Vector2(x + 30, y + 30), Color.White);
|
new Vector2(x + 30, y + 30), Color.White);
|
||||||
|
|
||||||
spriteBatch.DrawString(GUI.Font, "Recharge rate: " + (rechargeSpeed / maxRechargeSpeed), new Vector2(x + 30, y + 100), Color.White);
|
spriteBatch.DrawString(GUI.Font, "Recharge rate: " + (int)((rechargeSpeed / maxRechargeSpeed)*100.0f)+" %", new Vector2(x + 30, y + 100), Color.White);
|
||||||
if (GUI.DrawButton(spriteBatch, new Rectangle(x + 50, y + 150, 40, 40), "+"))
|
if (GUI.DrawButton(spriteBatch, new Rectangle(x + 200, y + 90, 40, 40), "+"))
|
||||||
{
|
{
|
||||||
rechargeSpeed = Math.Min(rechargeSpeed + maxRechargeSpeed*0.1f, maxRechargeSpeed);
|
rechargeSpeed = Math.Min(rechargeSpeed + maxRechargeSpeed*0.1f, maxRechargeSpeed);
|
||||||
item.NewComponentEvent(this, true);
|
item.NewComponentEvent(this, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GUI.DrawButton(spriteBatch, new Rectangle(x + 250, y + 150, 40, 40), "-"))
|
if (GUI.DrawButton(spriteBatch, new Rectangle(x + 250, y + 90, 40, 40), "-"))
|
||||||
{
|
{
|
||||||
rechargeSpeed = Math.Max(rechargeSpeed - maxRechargeSpeed * 0.1f, 0.0f);
|
rechargeSpeed = Math.Max(rechargeSpeed - maxRechargeSpeed * 0.1f, 0.0f);
|
||||||
item.NewComponentEvent(this, true);
|
item.NewComponentEvent(this, true);
|
||||||
|
|||||||
@@ -146,8 +146,6 @@ namespace Subsurface.Items.Components
|
|||||||
|
|
||||||
GuiFrame.Draw(spriteBatch);
|
GuiFrame.Draw(spriteBatch);
|
||||||
|
|
||||||
GUI.DrawRectangle(spriteBatch, new Rectangle(x, y, width, height), Color.Black, true);
|
|
||||||
|
|
||||||
spriteBatch.DrawString(GUI.Font, "Power: " + (int)(-currPowerConsumption), new Vector2(x + 30, y + 30), Color.White);
|
spriteBatch.DrawString(GUI.Font, "Power: " + (int)(-currPowerConsumption), new Vector2(x + 30, y + 30), Color.White);
|
||||||
spriteBatch.DrawString(GUI.Font, "Load: " + (int)powerLoad, new Vector2(x + 30, y + 100), Color.White);
|
spriteBatch.DrawString(GUI.Font, "Load: " + (int)powerLoad, new Vector2(x + 30, y + 100), Color.White);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ namespace Subsurface.Items.Components
|
|||||||
Limb limb;
|
Limb limb;
|
||||||
Structure structure;
|
Structure structure;
|
||||||
if ((limb = (f2.Body.UserData as Limb)) != null)
|
if ((limb = (f2.Body.UserData as Limb)) != null)
|
||||||
{
|
{
|
||||||
attackResult = attack.DoDamage(null, limb.character, item.SimPosition, 1.0f);
|
attackResult = attack.DoDamage(null, limb.character, item.SimPosition, 1.0f);
|
||||||
}
|
}
|
||||||
else if ((structure = (f2.Body.UserData as Structure)) != null)
|
else if ((structure = (f2.Body.UserData as Structure)) != null)
|
||||||
|
|||||||
@@ -818,17 +818,18 @@ int currentTargetIndex = 1;
|
|||||||
|
|
||||||
public void Draw(SpriteBatch spriteBatch)
|
public void Draw(SpriteBatch spriteBatch)
|
||||||
{
|
{
|
||||||
Vector2 pos = endPosition;
|
Vector2 pos = endPosition;
|
||||||
pos.X += Position.X;
|
|
||||||
pos.Y = -pos.Y - Position.Y;
|
pos.Y = -pos.Y - Position.Y;
|
||||||
|
|
||||||
if (GameMain.GameScreen.Cam.WorldView.Y < -pos.Y-512) return;
|
if (GameMain.GameScreen.Cam.WorldView.Y < -pos.Y-512) return;
|
||||||
|
|
||||||
float x = GameMain.GameScreen.Cam.WorldView.X-512.0f;
|
pos.X = GameMain.GameScreen.Cam.WorldView.X-512.0f;
|
||||||
|
//pos.X += Position.X % 512;
|
||||||
|
|
||||||
int width = (int)(Math.Ceiling(GameMain.GameScreen.Cam.WorldView.Width/512.0f + 2.0f)*512.0f);
|
int width = (int)(Math.Ceiling(GameMain.GameScreen.Cam.WorldView.Width/512.0f + 2.0f)*512.0f);
|
||||||
|
|
||||||
spriteBatch.Draw(shaftTexture,
|
spriteBatch.Draw(shaftTexture,
|
||||||
new Rectangle((int)(MathUtils.Round(x, 512.0f)), (int)pos.Y, width, 512),
|
new Rectangle((int)(MathUtils.Round(pos.X, 512.0f) + Position.X % 512) , (int)pos.Y, width, 512),
|
||||||
new Rectangle(0, 0, width, 256),
|
new Rectangle(0, 0, width, 256),
|
||||||
Color.White, 0.0f,
|
Color.White, 0.0f,
|
||||||
Vector2.Zero,
|
Vector2.Zero,
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ namespace Subsurface
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Body PickBody(Vector2 rayStart, Vector2 rayEnd, List<Body> ignoredBodies = null)
|
public static Body PickBody(Vector2 rayStart, Vector2 rayEnd, List<Body> ignoredBodies = null, Category? collisionCategory = null)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
@@ -251,7 +251,9 @@ namespace Subsurface
|
|||||||
{
|
{
|
||||||
if (fixture == null ||
|
if (fixture == null ||
|
||||||
fixture.CollisionCategories == Category.None ||
|
fixture.CollisionCategories == Category.None ||
|
||||||
fixture.CollisionCategories == Physics.CollisionMisc) return -1;
|
fixture.CollisionCategories == Physics.CollisionMisc) return -1;
|
||||||
|
|
||||||
|
if (collisionCategory != null && !fixture.CollisionCategories.HasFlag((Category)collisionCategory)) return -1;
|
||||||
|
|
||||||
if (ignoredBodies != null && ignoredBodies.Contains(fixture.Body)) return -1;
|
if (ignoredBodies != null && ignoredBodies.Contains(fixture.Body)) return -1;
|
||||||
|
|
||||||
|
|||||||
@@ -388,7 +388,10 @@ namespace Subsurface.Networking
|
|||||||
string mapName = inc.ReadString();
|
string mapName = inc.ReadString();
|
||||||
string mapHash = inc.ReadString();
|
string mapHash = inc.ReadString();
|
||||||
|
|
||||||
GameMain.NetLobbyScreen.TrySelectMap(mapName, mapHash);
|
if (!GameMain.NetLobbyScreen.TrySelectMap(mapName, mapHash))
|
||||||
|
{
|
||||||
|
yield return CoroutineStatus.Success;
|
||||||
|
}
|
||||||
|
|
||||||
yield return CoroutineStatus.Running;
|
yield return CoroutineStatus.Running;
|
||||||
|
|
||||||
@@ -397,7 +400,8 @@ namespace Subsurface.Networking
|
|||||||
TimeSpan duration = new TimeSpan(0, (int)durationMinutes, 0);
|
TimeSpan duration = new TimeSpan(0, (int)durationMinutes, 0);
|
||||||
Rand.SetSyncedSeed(seed);
|
Rand.SetSyncedSeed(seed);
|
||||||
//int gameModeIndex = inc.ReadInt32();
|
//int gameModeIndex = inc.ReadInt32();
|
||||||
GameMain.GameSession = new GameSession(Submarine.Loaded, "", GameMain.NetLobbyScreen.SelectedMode);
|
|
||||||
|
GameMain.GameSession = new GameSession(GameMain.NetLobbyScreen.SelectedMap, "", GameMain.NetLobbyScreen.SelectedMode);
|
||||||
|
|
||||||
yield return CoroutineStatus.Running;
|
yield return CoroutineStatus.Running;
|
||||||
|
|
||||||
|
|||||||
@@ -265,7 +265,17 @@ namespace Subsurface
|
|||||||
}
|
}
|
||||||
|
|
||||||
Hull.renderer.Render(graphics, cam, renderTargetAir, Cam.ShaderTransform);
|
Hull.renderer.Render(graphics, cam, renderTargetAir, Cam.ShaderTransform);
|
||||||
|
|
||||||
|
spriteBatch.Begin(SpriteSortMode.BackToFront,
|
||||||
|
BlendState.AlphaBlend, SamplerState.LinearWrap,
|
||||||
|
null, null, null,
|
||||||
|
cam.Transform);
|
||||||
|
|
||||||
|
Submarine.DrawFront(spriteBatch);
|
||||||
|
|
||||||
|
spriteBatch.End();
|
||||||
|
|
||||||
|
|
||||||
if (GameMain.GameSession != null && GameMain.GameSession.Level != null)
|
if (GameMain.GameSession != null && GameMain.GameSession.Level != null)
|
||||||
{
|
{
|
||||||
GameMain.GameSession.Level.Render(graphics, cam);
|
GameMain.GameSession.Level.Render(graphics, cam);
|
||||||
@@ -289,8 +299,6 @@ namespace Subsurface
|
|||||||
null, null, null,
|
null, null, null,
|
||||||
cam.Transform);
|
cam.Transform);
|
||||||
|
|
||||||
Submarine.DrawFront(spriteBatch);
|
|
||||||
|
|
||||||
foreach (Character c in Character.CharacterList) c.DrawFront(spriteBatch);
|
foreach (Character c in Character.CharacterList) c.DrawFront(spriteBatch);
|
||||||
|
|
||||||
if (GameMain.GameSession != null && GameMain.GameSession.Level != null)
|
if (GameMain.GameSession != null && GameMain.GameSession.Level != null)
|
||||||
|
|||||||
@@ -34,12 +34,11 @@ namespace Subsurface
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
buttonsTab = new GUIFrame(new Rectangle(50, 200, 200, 500), Color.Transparent, Alignment.Left);
|
buttonsTab = new GUIFrame(new Rectangle(50, 0, 200, 360), Color.Transparent, Alignment.Left | Alignment.CenterY);
|
||||||
//menuTabs[(int)Tabs.Main].Padding = GUI.style.smallPadding;
|
//menuTabs[(int)Tabs.Main].Padding = GUI.style.smallPadding;
|
||||||
|
|
||||||
Rectangle panelRect = new Rectangle(
|
Rectangle panelRect = new Rectangle(
|
||||||
GameMain.GraphicsWidth / 2 - 250,
|
290, buttonsTab.Rect.Y,
|
||||||
buttonsTab.Rect.Y,
|
|
||||||
500, 360);
|
500, 360);
|
||||||
|
|
||||||
GUIButton button = new GUIButton(new Rectangle(0, 0, 0, 30), "Tutorial", Alignment.CenterX, GUI.Style, buttonsTab);
|
GUIButton button = new GUIButton(new Rectangle(0, 0, 0, 30), "Tutorial", Alignment.CenterX, GUI.Style, buttonsTab);
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ namespace Subsurface
|
|||||||
|
|
||||||
public string DurationText()
|
public string DurationText()
|
||||||
{
|
{
|
||||||
return "Game duration: " + GameDuration + " min";
|
return "Duration: " + GameDuration.Minutes + " min";
|
||||||
}
|
}
|
||||||
|
|
||||||
public NetLobbyScreen()
|
public NetLobbyScreen()
|
||||||
@@ -138,6 +138,7 @@ namespace Subsurface
|
|||||||
new Rectangle((int)(panelRect.Width * 0.7f + 20), 0,
|
new Rectangle((int)(panelRect.Width * 0.7f + 20), 0,
|
||||||
(int)(panelRect.Width * 0.3f - 20), (int)(panelRect.Height * 0.6f)),
|
(int)(panelRect.Width * 0.3f - 20), (int)(panelRect.Height * 0.6f)),
|
||||||
GUI.Style, menu);
|
GUI.Style, menu);
|
||||||
|
playerFrame.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f);
|
||||||
|
|
||||||
//player list ------------------------------------------------------------------
|
//player list ------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -153,7 +154,7 @@ namespace Subsurface
|
|||||||
int columnWidth = infoFrame.Rect.Width / 5 - 30;
|
int columnWidth = infoFrame.Rect.Width / 5 - 30;
|
||||||
int columnX = 0;
|
int columnX = 0;
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(columnX, 120, columnWidth, 30), "Selected submarine:", GUI.Style, infoFrame);
|
new GUITextBlock(new Rectangle(columnX, 120, columnWidth, 30), "Submarine:", GUI.Style, infoFrame);
|
||||||
subList = new GUIListBox(new Rectangle(columnX, 150, columnWidth, infoFrame.Rect.Height - 150 - 80), Color.White, GUI.Style, infoFrame);
|
subList = new GUIListBox(new Rectangle(columnX, 150, columnWidth, infoFrame.Rect.Height - 150 - 80), Color.White, GUI.Style, infoFrame);
|
||||||
subList.OnSelected = SelectMap;
|
subList.OnSelected = SelectMap;
|
||||||
|
|
||||||
@@ -180,7 +181,7 @@ namespace Subsurface
|
|||||||
|
|
||||||
//gamemode ------------------------------------------------------------------
|
//gamemode ------------------------------------------------------------------
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(columnX, 120, 0, 30), "Selected game mode: ", GUI.Style, infoFrame);
|
new GUITextBlock(new Rectangle(columnX, 120, 0, 30), "Game mode: ", GUI.Style, infoFrame);
|
||||||
modeList = new GUIListBox(new Rectangle(columnX, 150, columnWidth, infoFrame.Rect.Height - 150 - 80), GUI.Style, infoFrame);
|
modeList = new GUIListBox(new Rectangle(columnX, 150, columnWidth, infoFrame.Rect.Height - 150 - 80), GUI.Style, infoFrame);
|
||||||
|
|
||||||
|
|
||||||
@@ -204,7 +205,8 @@ namespace Subsurface
|
|||||||
|
|
||||||
var modeDescription = new GUITextBlock(
|
var modeDescription = new GUITextBlock(
|
||||||
new Rectangle(columnX, 150, (int)(columnWidth * 1.5f), infoFrame.Rect.Height - 150 - 80),
|
new Rectangle(columnX, 150, (int)(columnWidth * 1.5f), infoFrame.Rect.Height - 150 - 80),
|
||||||
"", Color.Black*0.3f, Color.White, Alignment.TopLeft, Alignment.TopLeft, GUI.Style, infoFrame, true);
|
"", GUI.Style, Alignment.TopLeft, Alignment.TopLeft, infoFrame, true, GameMain.GraphicsWidth>1024 ? GUI.Font : GUI.SmallFont);
|
||||||
|
modeDescription.Color = Color.Black * 0.3f;
|
||||||
|
|
||||||
modeList.UserData = modeDescription;
|
modeList.UserData = modeDescription;
|
||||||
|
|
||||||
@@ -213,7 +215,7 @@ namespace Subsurface
|
|||||||
//duration ------------------------------------------------------------------
|
//duration ------------------------------------------------------------------
|
||||||
|
|
||||||
GUITextBlock durationText = new GUITextBlock(new Rectangle(columnX, 120, columnWidth, 20),
|
GUITextBlock durationText = new GUITextBlock(new Rectangle(columnX, 120, columnWidth, 20),
|
||||||
"Game duration: ", GUI.Style, Alignment.Left, Alignment.TopLeft, infoFrame);
|
"Duration: ", GUI.Style, Alignment.Left, Alignment.TopLeft, infoFrame);
|
||||||
durationText.TextGetter = DurationText;
|
durationText.TextGetter = DurationText;
|
||||||
|
|
||||||
durationBar = new GUIScrollBar(new Rectangle(columnX, 150, columnWidth, 20),
|
durationBar = new GUIScrollBar(new Rectangle(columnX, 150, columnWidth, 20),
|
||||||
@@ -272,7 +274,7 @@ namespace Subsurface
|
|||||||
|
|
||||||
if (IsServer && GameMain.Server != null)
|
if (IsServer && GameMain.Server != null)
|
||||||
{
|
{
|
||||||
GUIButton startButton = new GUIButton(new Rectangle(0, 0, 200, 30), "Start", Alignment.BottomRight, GUI.Style, infoFrame);
|
GUIButton startButton = new GUIButton(new Rectangle(0, 0, 100, 30), "Start", Alignment.BottomRight, GUI.Style, infoFrame);
|
||||||
startButton.OnClicked = GameMain.Server.StartGameClicked;
|
startButton.OnClicked = GameMain.Server.StartGameClicked;
|
||||||
startButton.UserData = "startButton";
|
startButton.UserData = "startButton";
|
||||||
|
|
||||||
@@ -285,7 +287,7 @@ namespace Subsurface
|
|||||||
|
|
||||||
if (playerFrame.children.Find(c => c.UserData as string == "playyourself") == null)
|
if (playerFrame.children.Find(c => c.UserData as string == "playyourself") == null)
|
||||||
{
|
{
|
||||||
var playYourself = new GUITickBox(new Rectangle(-30, -30, 20, 20), "Play yourself", Alignment.TopLeft, playerFrame);
|
var playYourself = new GUITickBox(new Rectangle(-10, -10, 20, 20), "Play yourself", Alignment.TopLeft, playerFrame);
|
||||||
playYourself.Selected = GameMain.Server.CharacterInfo != null;
|
playYourself.Selected = GameMain.Server.CharacterInfo != null;
|
||||||
playYourself.OnSelected = TogglePlayYourself;
|
playYourself.OnSelected = TogglePlayYourself;
|
||||||
playYourself.UserData = "playyourself";
|
playYourself.UserData = "playyourself";
|
||||||
@@ -307,34 +309,34 @@ namespace Subsurface
|
|||||||
|
|
||||||
if (IsServer && GameMain.Server != null)
|
if (IsServer && GameMain.Server != null)
|
||||||
{
|
{
|
||||||
var playYourself = new GUITickBox(new Rectangle(-30, -30, 20, 20), "Play yourself", Alignment.TopLeft, playerFrame);
|
var playYourself = new GUITickBox(new Rectangle(-10, -10, 20, 20), "Play yourself", Alignment.TopLeft, playerFrame);
|
||||||
playYourself.Selected = GameMain.Server.CharacterInfo != null;
|
playYourself.Selected = GameMain.Server.CharacterInfo != null;
|
||||||
playYourself.OnSelected = TogglePlayYourself;
|
playYourself.OnSelected = TogglePlayYourself;
|
||||||
playYourself.UserData = "playyourself";
|
playYourself.UserData = "playyourself";
|
||||||
}
|
}
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(60, 0, 200, 30), "Name: ", GUI.Style, playerFrame);
|
new GUITextBlock(new Rectangle(60, 30, 200, 30), "Name: ", GUI.Style, playerFrame);
|
||||||
|
|
||||||
GUITextBox playerName = new GUITextBox(new Rectangle(60, 30, 0, 20),
|
GUITextBox playerName = new GUITextBox(new Rectangle(60, 55, 0, 20),
|
||||||
Alignment.TopLeft, GUI.Style, playerFrame);
|
Alignment.TopLeft, GUI.Style, playerFrame);
|
||||||
playerName.Text = characterInfo.Name;
|
playerName.Text = characterInfo.Name;
|
||||||
playerName.OnEnter += ChangeCharacterName;
|
playerName.OnEnter += ChangeCharacterName;
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(0, 70, 200, 30), "Gender: ", GUI.Style, playerFrame);
|
new GUITextBlock(new Rectangle(0, 100, 200, 30), "Gender: ", GUI.Style, playerFrame);
|
||||||
|
|
||||||
GUIButton maleButton = new GUIButton(new Rectangle(0, 100, 70, 20), "Male",
|
GUIButton maleButton = new GUIButton(new Rectangle(70, 100, 60, 20), "Male",
|
||||||
Alignment.TopLeft, GUI.Style, playerFrame);
|
Alignment.TopLeft, GUI.Style, playerFrame);
|
||||||
maleButton.UserData = Gender.Male;
|
maleButton.UserData = Gender.Male;
|
||||||
maleButton.OnClicked += SwitchGender;
|
maleButton.OnClicked += SwitchGender;
|
||||||
|
|
||||||
GUIButton femaleButton = new GUIButton(new Rectangle(90, 100, 70, 20), "Female",
|
GUIButton femaleButton = new GUIButton(new Rectangle(140, 100, 60, 20), "Female",
|
||||||
Alignment.TopLeft, GUI.Style, playerFrame);
|
Alignment.TopLeft, GUI.Style, playerFrame);
|
||||||
femaleButton.UserData = Gender.Female;
|
femaleButton.UserData = Gender.Female;
|
||||||
femaleButton.OnClicked += SwitchGender;
|
femaleButton.OnClicked += SwitchGender;
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(0, 150, 200, 30), "Job preferences:", GUI.Style, playerFrame);
|
new GUITextBlock(new Rectangle(0, 150, 200, 30), "Job preferences:", GUI.Style, playerFrame);
|
||||||
|
|
||||||
jobList = new GUIListBox(new Rectangle(0, 180, 250, 0), GUI.Style, playerFrame);
|
jobList = new GUIListBox(new Rectangle(0, 180, 0, 0), GUI.Style, playerFrame);
|
||||||
jobList.Enabled = false;
|
jobList.Enabled = false;
|
||||||
|
|
||||||
|
|
||||||
@@ -393,12 +395,12 @@ namespace Subsurface
|
|||||||
{
|
{
|
||||||
if (GameMain.Server != null) GameMain.Server.UpdateNetLobby(obj);
|
if (GameMain.Server != null) GameMain.Server.UpdateNetLobby(obj);
|
||||||
|
|
||||||
Submarine sub = (Submarine)obj;
|
//Submarine sub = (Submarine)obj;
|
||||||
|
|
||||||
//submarine already loaded
|
//submarine already loaded
|
||||||
if (Submarine.Loaded != null && sub.FilePath == Submarine.Loaded.FilePath) return true;
|
//if (Submarine.Loaded != null && sub.FilePath == Submarine.Loaded.FilePath) return true;
|
||||||
|
|
||||||
sub.Load();
|
//sub.Load();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -538,7 +540,7 @@ namespace Subsurface
|
|||||||
GUIComponent existing = playerFrame.FindChild("playerhead");
|
GUIComponent existing = playerFrame.FindChild("playerhead");
|
||||||
if (existing != null) playerFrame.RemoveChild(existing);
|
if (existing != null) playerFrame.RemoveChild(existing);
|
||||||
|
|
||||||
GUIImage image = new GUIImage(new Rectangle(0, 0, 30, 30), characterInfo.HeadSprite, Alignment.TopLeft, playerFrame);
|
GUIImage image = new GUIImage(new Rectangle(0, 40, 30, 30), characterInfo.HeadSprite, Alignment.TopLeft, playerFrame);
|
||||||
image.UserData = "playerhead";
|
image.UserData = "playerhead";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -609,7 +611,7 @@ namespace Subsurface
|
|||||||
if (jobPrefab == null) return false;
|
if (jobPrefab == null) return false;
|
||||||
|
|
||||||
jobInfoFrame = jobPrefab.CreateInfoFrame();
|
jobInfoFrame = jobPrefab.CreateInfoFrame();
|
||||||
GUIButton closeButton = new GUIButton(new Rectangle(0,0,100,20), "Close", Alignment.BottomRight, GUI.Style, jobInfoFrame);
|
GUIButton closeButton = new GUIButton(new Rectangle(0,0,100,20), "Close", Alignment.BottomRight, GUI.Style, jobInfoFrame.children[0]);
|
||||||
closeButton.OnClicked = CloseJobInfo;
|
closeButton.OnClicked = CloseJobInfo;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -663,17 +665,17 @@ namespace Subsurface
|
|||||||
Submarine map = Submarine.SavedSubmarines.Find(m => m.Name == mapName);
|
Submarine map = Submarine.SavedSubmarines.Find(m => m.Name == mapName);
|
||||||
if (map == null)
|
if (map == null)
|
||||||
{
|
{
|
||||||
DebugConsole.ThrowError("The map ''" + mapName + "'' has been selected by the server.");
|
new GUIMessageBox("Submarine not found!","The submarine ''" + mapName + "'' has been selected by the server. Matching file not found in your map folder.");
|
||||||
DebugConsole.ThrowError("Matching map not found in your map folder.");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (map.MD5Hash.Hash != md5Hash)
|
if (map.MD5Hash.Hash != md5Hash)
|
||||||
{
|
{
|
||||||
DebugConsole.ThrowError("Your version of the map file ''" + map.Name + "'' doesn't match the server's version!");
|
new GUIMessageBox("Submarine not found!",
|
||||||
DebugConsole.ThrowError("Your file: " + map.Name + "(MD5 hash : " + map.MD5Hash.Hash + ")");
|
"Your version of the map file ''" + map.Name + "'' doesn't match the server's version!"
|
||||||
DebugConsole.ThrowError("Server's file: " + mapName + "(MD5 hash : " + md5Hash + ")");
|
+"\nYour file: " + map.Name + "(MD5 hash : " + map.MD5Hash.Hash + ")"
|
||||||
|
+"\nServer's file: " + mapName + "(MD5 hash : " + md5Hash + ")");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ namespace Subsurface.Sounds
|
|||||||
internal readonly int alSourceId;
|
internal readonly int alSourceId;
|
||||||
internal readonly int[] alBufferIds;
|
internal readonly int[] alBufferIds;
|
||||||
|
|
||||||
readonly int alFilterId;
|
//readonly int alFilterId;
|
||||||
readonly Stream underlyingStream;
|
readonly Stream underlyingStream;
|
||||||
|
|
||||||
internal VorbisReader Reader { get; private set; }
|
internal VorbisReader Reader { get; private set; }
|
||||||
@@ -99,15 +99,15 @@ namespace Subsurface.Sounds
|
|||||||
|
|
||||||
if (ALHelper.Efx.IsInitialized)
|
if (ALHelper.Efx.IsInitialized)
|
||||||
{
|
{
|
||||||
alFilterId = ALHelper.Efx.GenFilter();
|
//alFilterId = ALHelper.Efx.GenFilter();
|
||||||
ALHelper.Efx.Filter(alFilterId, EfxFilteri.FilterType, (int)EfxFilterType.Lowpass);
|
//ALHelper.Efx.Filter(alFilterId, EfxFilteri.FilterType, (int)EfxFilterType.Lowpass);
|
||||||
ALHelper.Efx.Filter(alFilterId, EfxFilterf.LowpassGain, 1);
|
//ALHelper.Efx.Filter(alFilterId, EfxFilterf.LowpassGain, 1);
|
||||||
LowPassHFGain = 1;
|
//ALHelper.Efx.BindFilterToSource(alSourceId, alFilterId);
|
||||||
|
//LowPassHFGain = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
underlyingStream = stream;
|
underlyingStream = stream;
|
||||||
|
|
||||||
Volume = 1;
|
|
||||||
IsLooped = true;
|
IsLooped = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -154,7 +154,7 @@ namespace Subsurface.Sounds
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Play()
|
public void Play(float volume)
|
||||||
{
|
{
|
||||||
var state = AL.GetSourceState(alSourceId);
|
var state = AL.GetSourceState(alSourceId);
|
||||||
|
|
||||||
@@ -172,6 +172,8 @@ namespace Subsurface.Sounds
|
|||||||
// LogHandler("{", logX++, logY);
|
// LogHandler("{", logX++, logY);
|
||||||
//#endif
|
//#endif
|
||||||
AL.SourcePlay(alSourceId);
|
AL.SourcePlay(alSourceId);
|
||||||
|
this.Volume = volume;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ALHelper.Check();
|
ALHelper.Check();
|
||||||
@@ -229,20 +231,20 @@ namespace Subsurface.Sounds
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float lowPassHfGain;
|
//float lowPassHfGain;
|
||||||
public float LowPassHFGain
|
//public float LowPassHFGain
|
||||||
{
|
//{
|
||||||
get { return lowPassHfGain; }
|
// get { return lowPassHfGain; }
|
||||||
set
|
// set
|
||||||
{
|
// {
|
||||||
if (ALHelper.Efx.IsInitialized)
|
// if (ALHelper.Efx.IsInitialized)
|
||||||
{
|
// {
|
||||||
ALHelper.Efx.Filter(alFilterId, EfxFilterf.LowpassGainHF, lowPassHfGain = value);
|
// ALHelper.Efx.Filter(alFilterId, EfxFilterf.LowpassGainHF, lowPassHfGain = value);
|
||||||
ALHelper.Efx.BindFilterToSource(alSourceId, alFilterId);
|
// ALHelper.Efx.BindFilterToSource(alSourceId, alFilterId);
|
||||||
ALHelper.Check();
|
// ALHelper.Check();
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
float volume;
|
float volume;
|
||||||
public float Volume
|
public float Volume
|
||||||
@@ -288,8 +290,8 @@ namespace Subsurface.Sounds
|
|||||||
AL.DeleteSource(alSourceId);
|
AL.DeleteSource(alSourceId);
|
||||||
AL.DeleteBuffers(alBufferIds);
|
AL.DeleteBuffers(alBufferIds);
|
||||||
|
|
||||||
if (ALHelper.Efx.IsInitialized)
|
//if (ALHelper.Efx.IsInitialized)
|
||||||
ALHelper.Efx.DeleteFilter(alFilterId);
|
// ALHelper.Efx.DeleteFilter(alFilterId);
|
||||||
|
|
||||||
ALHelper.Check();
|
ALHelper.Check();
|
||||||
#if TRACE
|
#if TRACE
|
||||||
|
|||||||
@@ -324,9 +324,7 @@ namespace Subsurface.Sounds
|
|||||||
|
|
||||||
oggStreamer.AddStream(oggStream);
|
oggStreamer.AddStream(oggStream);
|
||||||
|
|
||||||
oggStream.Volume = volume;
|
oggStream.Play(volume);
|
||||||
|
|
||||||
oggStream.Play();
|
|
||||||
|
|
||||||
return oggStream;
|
return oggStream;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<ErrorReportUrlHistory />
|
<ErrorReportUrlHistory />
|
||||||
<FallbackCulture>en-US</FallbackCulture>
|
<FallbackCulture>en-US</FallbackCulture>
|
||||||
<VerifyUploadedFiles>false</VerifyUploadedFiles>
|
<VerifyUploadedFiles>false</VerifyUploadedFiles>
|
||||||
<ProjectView>ShowAllFiles</ProjectView>
|
<ProjectView>ProjectFiles</ProjectView>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ReferencePath>
|
<ReferencePath>
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user