public void Tick(SceneGame scene) { var active = Curio.GetActionHolder(ActionSlot.Active); var lastSeen = Curio.GetBehavior <BehaviorLastSeen>(); var pathfinder = Curio.GetBehavior <BehaviorPathfinder>(); var orientable = Curio.GetBehavior <BehaviorOrientable>(); var tile = Curio.GetMainTile(); if (tile != null && active.Done && Curio.IsAlive()) { var map = tile.Map; var mace = Curio.GetBehavior <BehaviorMace>(); var delta = scene.PlayerCurio.GetVisualTarget() - Curio.GetVisualTarget(); if (mace != null && mace.IsInArea(scene.PlayerCurio) && map.CanSee(Curio.GetVisualTarget(), scene.PlayerCurio.GetVisualTarget())) { var angleCurrent = orientable.Angle; var angleTarget = Enumerable.Range(0, 8).Select(x => MathHelper.PiOver4 * x).GetClosestAngle(Util.VectorToAngle(delta)); var angleDelta = MathHelper.WrapAngle(angleTarget - angleCurrent); var attack = new List <ActionWrapper>() { //new ActionMaceAttack(Curio, scene.PlayerCurio, 20f, 5f).InSlot(ActionSlot.Active), new ActionMaceGoreAttack(Curio, scene.PlayerCurio, 40f, 20f, 5f).InSlot(ActionSlot.Active), new ActionTurn(Curio, angleDelta, 3).InSlot(ActionSlot.Active), }; attack.Apply(Curio); } else if (lastSeen.LastSeenTile != null) { var nextMove = pathfinder.GetNextMove(new Point(tile.X, tile.Y)); if (lastSeen.LastSeenTile != pathfinder.GetDestination() || !nextMove.HasValue) { pathfinder.FindPath(lastSeen.LastSeenTile); } if (nextMove.HasValue) { var angleCurrent = orientable.Angle; var angleTarget = Util.PointToAngle(nextMove.Value); var angleDelta = MathHelper.WrapAngle(angleTarget - angleCurrent); var movement = new List <ActionWrapper>(); if (Math.Abs(angleDelta) < 0.0001) { movement.Add(new ActionMoveForward(Curio, nextMove.Value.ToVector2(), 8).InSlot(ActionSlot.Active)); } else if (angleDelta < 0) { movement.Add(new ActionTurn(Curio, -MathHelper.PiOver4, 4).InSlot(ActionSlot.Active)); } else if (angleDelta > 0) { movement.Add(new ActionTurn(Curio, MathHelper.PiOver4, 4).InSlot(ActionSlot.Active)); } movement.Apply(Curio); } } } }
public void Tick(SceneGame scene) { var active = Curio.GetActionHolder(ActionSlot.Active); var lastSeen = Curio.GetBehavior <BehaviorLastSeen>(); var pathfinder = Curio.GetBehavior <BehaviorPathfinder>(); var orientable = Curio.GetBehavior <BehaviorOrientable>(); var tile = Curio.GetMainTile(); if (active.Done && Curio.IsAlive()) { var delta = scene.PlayerCurio.GetVisualTarget() - Curio.GetVisualTarget(); var distance = delta.Length(); if (distance < 24f) { var angleCurrent = orientable.Angle; var angleTarget = Enumerable.Range(0, 8).Select(x => MathHelper.PiOver4 * x).GetClosestAngle(Util.VectorToAngle(delta)); var angleDelta = MathHelper.WrapAngle(angleTarget - angleCurrent); var attack = new List <ActionWrapper>() { new ActionDaggerAttack(Curio, Util.ToTileOffset(Util.AngleToVector(angleTarget)), 5f, 2.5f).InSlot(ActionSlot.Active), new ActionTurn(Curio, angleDelta, 3).InSlot(ActionSlot.Active), }; attack.Apply(Curio); } else if (lastSeen.LastSeenTile != null) { var nextMove = pathfinder.GetNextMove(new Point(tile.X, tile.Y)); if (lastSeen.LastSeenTile != pathfinder.GetDestination() || !nextMove.HasValue) { pathfinder.FindPath(lastSeen.LastSeenTile); } if (nextMove.HasValue) { var angleCurrent = orientable.Angle; var angleTarget = Util.PointToAngle(nextMove.Value); var angleDelta = MathHelper.WrapAngle(angleTarget - angleCurrent); var movement = new List <ActionWrapper>(); if (Math.Abs(angleDelta) < 0.0001) { movement.Add(new ActionMoveForward(Curio, nextMove.Value.ToVector2(), 10).InSlot(ActionSlot.Active)); } else if (angleDelta < 0) { movement.Add(new ActionTurn(Curio, -MathHelper.PiOver4, 5).InSlot(ActionSlot.Active)); } else if (angleDelta > 0) { movement.Add(new ActionTurn(Curio, MathHelper.PiOver4, 5).InSlot(ActionSlot.Active)); } movement.Apply(Curio); } } } }
public override void Draw(ICurio curio, SceneGame scene, DrawPass pass) { var spriteHelmet = SpriteLoader.Instance.AddSprite("content/nemesis_helmet"); var spriteBodyForward = SpriteLoader.Instance.AddSprite("content/nemesis_forward"); var spriteBodyBack = SpriteLoader.Instance.AddSprite("content/nemesis_back"); var spriteWings = SpriteLoader.Instance.AddSprite("content/nemesis_wings"); var spriteParry = SpriteLoader.Instance.AddSprite("content/nemesis_parry"); var alive = curio.GetBehavior <BehaviorAlive>(); var nemesis = curio.GetBehavior <BehaviorNemesis>(); if (alive.Armor > 0) { spriteBodyForward = SpriteLoader.Instance.AddSprite("content/nemesis_forward_armor"); spriteBodyBack = SpriteLoader.Instance.AddSprite("content/nemesis_back_armor"); } var center = curio.GetVisualPosition() + new Vector2(8, 8); var offset = curio.GetOffset(); var color = curio.GetColor(); var angleBody = curio.GetVisualAngle(); scene.PushSpriteBatch(shader: scene.Shader, shaderSetup: (transform, projection) => { scene.SetupColorMatrix(color); }); SpriteReference spriteBody; float headPos = MathHelper.Lerp(-4, 4, nemesis.ForwardBack); if (nemesis.ForwardBack > 0.5f) { spriteBody = spriteBodyForward; } else { spriteBody = spriteBodyBack; } scene.DrawSpriteExt(spriteBody, 0, center + offset - spriteBody.Middle, spriteBody.Middle, angleBody, new Vector2(1), SpriteEffects.None, Color.White, 0); scene.DrawSpriteExt(spriteHelmet, 0, center + offset + Util.AngleToVector(angleBody) * headPos - spriteHelmet.Middle, spriteHelmet.Middle, angleBody, new Vector2(1), SpriteEffects.None, Color.White, 0); if (nemesis.State == NemesisState.Parry) { scene.DrawSpriteExt(spriteParry, 0, center + offset - spriteParry.Middle, spriteParry.Middle, angleBody, new Vector2(1), SpriteEffects.None, Color.White, 0); } if (nemesis.ForwardBack > 0.5f && nemesis.WingsOpen > 0f) { Color wingColor = Color.Lerp(Color.Red, Color.Black, nemesis.WingsOpen); scene.DrawSpriteExt(spriteWings, 0, center + offset - spriteWings.Middle, spriteWings.Middle, angleBody, new Vector2(1), SpriteEffects.None, wingColor, 0); } scene.PopSpriteBatch(); }
public void Tick(SceneGame scene) { var active = Curio.GetActionHolder(ActionSlot.Active); var lastSeen = Curio.GetBehavior <BehaviorLastSeen>(); if (active?.Done ?? true && Curio.IsAlive()) { bool specialAction = PerformSpecialAction(); if (!specialAction && lastSeen.LastSeenTile != null) { PerformMovement(lastSeen); } } }
private void DrawMace(ICurio curio, SceneGame scene, DrawPass pass) { var center = curio.GetVisualPosition() + new Vector2(8, 8); var offset = curio.GetOffset(); var angleBody = curio.GetVisualAngle(); var mace = curio.GetBehavior <BehaviorMace>(); if (mace != null && (!mace.Upswing.Done || !mace.MaceReturn.Done)) { var weaponAngle = (float)LerpHelper.QuadraticOut(0, 1, mace.Upswing.Slide); var weaponScale = (float)LerpHelper.QuadraticOut(0.5, 1.0, mace.Upswing.Slide); var weaponStartPos = Util.AngleToVector(angleBody + MathHelper.PiOver4 * 2) * 8; var weaponEndPos = Util.AngleToVector(angleBody + MathHelper.PiOver4 * 3) * 10; var weaponPos = center + offset + Vector2.Lerp(weaponStartPos, weaponEndPos, (float)LerpHelper.QuadraticOut(0, 1, mace.Upswing.Slide)); scene.DrawSpriteExt(SpriteWeapon, 0, weaponPos - SpriteWeapon.Middle, SpriteWeapon.Middle, angleBody + weaponAngle, new Vector2(weaponScale), SpriteEffects.None, Color.White, 0); if (!mace.Upswing.Done) { mace.DrawMace(scene, weaponPos, Util.AngleToVector(mace.UpswingAngle) * (float)LerpHelper.QuadraticOut(0, 12, mace.MaceReturn.Slide), 2); } if (!mace.MaceReturn.Done) { var maceOffset = mace.MacePosition - weaponPos; mace.DrawMace(scene, weaponPos, Vector2.Lerp(maceOffset, Vector2.Zero, (float)LerpHelper.QuadraticOut(0, 1, mace.MaceReturn.Slide)), 8); } } }
public void Fire(ICurio shooter, Vector2 direction, float moveTime, float lifeTime) { Shooter = shooter; Direction = direction; MoveFrame = new Slider(moveTime, moveTime); LifeTime = new Slider(lifeTime); Curio.GetBehavior <BehaviorOrientable>().OrientTo(Util.VectorToAngle(Direction)); }
public static void DelayDecay(this ICurio curio, float time) { var decay = curio.GetBehavior <BehaviorDecay>(); if (decay != null) { decay.Decay.Time -= time; } }
public static ShakeHelper GetShakeHelper(this ICurio curio) { var drawable = curio.GetBehavior <BehaviorDrawable>(); if (drawable != null) { return(drawable.ShakeHelper); } return(null); }
public static float GetAngle(this ICurio curio) { var orientable = curio.GetBehavior <BehaviorOrientable>(); if (orientable != null) { return(orientable.Angle); } return(0); }
public static ICurio GetCamera(this ICurio curio) { var cameraFollow = curio.GetBehavior <BehaviorFollowCamera>(); if (cameraFollow != null) { return(cameraFollow.Camera); } return(null); }
public static bool IsDead(this ICurio curio) { var alive = curio.GetBehavior <BehaviorAlive>(); if (alive != null) { return(alive.CurrentDead); } return(false); }
public static Mask GetMask(this ICurio curio) { var movable = curio.GetBehavior <BehaviorMovable>(); if (movable != null) { return(movable.Mask); } return(null); }
public static bool TeleportVisual(this ICurio curio, Vector2 newPosition) { var movable = curio.GetBehavior <BehaviorMovable>(); if (movable != null) { movable.TeleportVisual(newPosition); return(true); } return(false); }
public static bool MoveTo(this ICurio curio, MapTile tile, LerpHelper.Delegate lerp, ISlider slider) { var movable = curio.GetBehavior <BehaviorMovable>(); if (movable != null) { movable.MoveTo(tile, lerp, slider); return(true); } return(false); }
public static bool MoveVisual(this ICurio curio, Vector2 newPosition, LerpHelper.Delegate lerp, ISlider slider) { var movable = curio.GetBehavior <BehaviorMovable>(); if (movable != null) { movable.MoveVisual(newPosition, lerp, slider); return(true); } return(false); }
public void AddDefaultStab(List <ActionWrapper> actions) { var sword = Curio.GetBehavior <BehaviorSword>(); var orientable = Curio.GetBehavior <BehaviorOrientable>(); if (actions.Any(x => x.Action is ActionMoveForward) && sword != null && sword.Position == 0 && IsAngleAlmostEqual(Util.VectorToAngle(Momentum.Direction), orientable.Angle)) { actions.Add(new ActionSwordStab(Curio, Momentum.Direction).InSlot(ActionSlot.Passive)); } }
public static Vector2 GetVisualTarget(this ICurio curio) { var movable = curio.GetBehavior <BehaviorMovable>(); if (movable != null) { return(movable.VisualPosition() + new Vector2(8, 8)); } MapTile tile = curio.GetMainTile(); return(tile?.VisualTarget ?? Vector2.Zero); }
public IEnumerable <Wait> RoutineStartLevel() { var tile = PlayerCurio.GetMainTile(); var movable = PlayerCurio.GetBehavior <BehaviorMovable>(); var orientation = PlayerCurio.GetBehavior <BehaviorOrientable>(); var start = tile.GetBehavior <BehaviorLevelStart>(); var player = PlayerCurio.GetBehavior <BehaviorPlayer>(); player.LevelTransition = true; orientation.OrientTo(Util.PointToAngle(start.Direction) + MathHelper.Pi); var pos = tile.VisualPosition; CameraCurio.TeleportVisual(GetOutsidePosition(pos, start.Direction, 150)); PlayerCurio.TeleportVisual(GetOutsidePosition(pos, start.Direction, 200)); player.Fade.Set(0); yield return(new WaitTime(100)); CameraCurio.MoveVisual(tile.VisualPosition, LerpHelper.QuadraticOut, new SliderScene(this, 150)); yield return(new WaitTime(100)); CurrentTheme?.Stop(); CurrentTheme = new MusicEffect(Theme); CurrentTheme.Volume.Set(0, 1, LerpHelper.QuadraticIn, 20); CurrentTheme.Play(); SoundIngress.Play(1f, 0f, 0f); player.Fade.Set(1, LerpHelper.QuarticOut, 70); PlayerCurio.MoveVisual(tile.VisualPosition, LerpHelper.QuarticOut, new SliderScene(this, 100)); yield return(new WaitTime(70)); player.LevelTransition = false; yield return(new WaitTime(30)); }
public static void DrawIcon(this ICurio curio, SceneGame scene, Vector2 pos) { var behavior = curio.GetBehavior <BehaviorDrawable>(); if (behavior != null) { behavior.DrawIcon(scene, pos); } else if (curio is IDrawableIcon drawable) { drawable.DrawIcon(scene, pos); } }
public static void Apply(Behavior behavior, ICurio original) { IOrigin origin; var template = original.GetBehavior <BehaviorTemplate>(); if (template != null) { origin = new OriginCopyTemplate(template.Template); } else { origin = new OriginCopy(original); } Apply(behavior, origin); }
public void OnAction(EventAction e) { var hits = e.Actions.GetEffectsTargetting <ActionEnemyHit>(Curio).ToList(); var alive = Curio.GetBehavior <BehaviorAlive>(); foreach (var hit in hits) { if (alive.Armor <= 0) { e.Actions.Add(new ActionPlayerDamage(hit.Origin, hit.Target, 1, hit.HitSound).InSlot(ActionSlot.Active)); } else { e.Actions.Add(new ActionDestroyArmor(hit.Origin, hit.Target, 1, 0).InSlot(ActionSlot.Active)); } } }
private void DrawDagger(ICurio curio, SceneGame scene, DrawPass pass) { var center = curio.GetVisualPosition() + new Vector2(8, 8); var offset = curio.GetOffset(); var angleBody = curio.GetVisualAngle(); var dagger = curio.GetBehavior <BehaviorDagger>(); if (dagger != null && !dagger.Upswing.Done) { var weaponAngle = (float)LerpHelper.QuadraticOut(0, 1, dagger.Upswing.Slide); var weaponScale = (float)LerpHelper.QuadraticOut(0.5, 1.0, dagger.Upswing.Slide); var weaponStartPos = Util.AngleToVector(angleBody + MathHelper.PiOver4 * 2) * 8; var weaponEndPos = Util.AngleToVector(angleBody + MathHelper.PiOver4 * 3) * 10; var weaponPos = center + offset + Vector2.Lerp(weaponStartPos, weaponEndPos, (float)LerpHelper.QuadraticOut(0, 1, dagger.Upswing.Slide)); scene.DrawSpriteExt(SpriteWeapon, 0, weaponPos - SpriteWeapon.Middle, SpriteWeapon.Middle, angleBody + weaponAngle, new Vector2(weaponScale), SpriteEffects.None, Color.White, 0); } }
public override void Draw(ICurio curio, SceneGame scene, DrawPass pass) { var spriteHead = SpriteLoader.Instance.AddSprite("content/lich_head"); var spriteBody = SpriteLoader.Instance.AddSprite("content/lich_body"); var spriteHeart = SpriteLoader.Instance.AddSprite("content/lich_heart"); var spriteWeapon = SpriteLoader.Instance.AddSprite("content/lich_weapon"); var center = curio.GetVisualPosition() + new Vector2(8, 8); var offset = curio.GetOffset(); var color = curio.GetColor(); var angleBody = curio.GetVisualAngle(); var lich = curio.GetBehavior <BehaviorLich>(); scene.PushSpriteBatch(shader: scene.Shader, shaderSetup: (transform, projection) => { scene.SetupColorMatrix(color); }); if (pass == DrawPass.EffectLow) { scene.DrawSpriteExt(spriteBody, 0, center - spriteBody.Middle, spriteBody.Middle, scene.Frame * 0.1f, new Vector2(1), SpriteEffects.None, Color.Red, 0); scene.DrawSpriteExt(spriteBody, 0, center - spriteBody.Middle, spriteBody.Middle, scene.Frame * 0.2f, new Vector2(0.8f), SpriteEffects.None, Color.DarkRed, 0); var weaponMiddle = new Vector2(spriteWeapon.Width / 2, spriteWeapon.Height * 2 / 3); var weaponOffset = Util.AngleToVector(lich.SwordAngle); scene.DrawSpriteExt(spriteWeapon, 0, center + Util.AngleToVector(angleBody) + weaponOffset * 8 - weaponMiddle, weaponMiddle, lich.SwordAngle, new Vector2(lich.SwordScale), SpriteEffects.None, Color.White, 0); scene.DrawSpriteExt(spriteBody, 0, center - spriteBody.Middle, spriteBody.Middle, scene.Frame * 0.3f, new Vector2(0.6f), SpriteEffects.None, Color.Black, 0); } if (pass == DrawPass.Creature) { if (!curio.IsHeartless()) { scene.DrawSpriteExt(spriteHeart, 0, center + offset - spriteHeart.Middle, spriteHeart.Middle, 0, new Vector2(1), SpriteEffects.None, Color.White, 0); } } if (pass == DrawPass.Effect) { var headOffset = Util.AngleToVector(angleBody) * -8; scene.DrawSpriteExt(spriteHead, 0, center + headOffset + offset - spriteHead.Middle, spriteHead.Middle, angleBody, new Vector2(1), SpriteEffects.None, Color.White, 0); } scene.PopSpriteBatch(); }
public void OnMove(EventMove.Finish e) { if (e.Curio != Curio) { return; } var orientable = Curio.GetBehavior <BehaviorOrientable>(); var trail = new Curio(Template.BloodThornTrail); trail.MoveTo(e.Source); trail.GetBehavior <BehaviorTrailBloodThorn>().Shooter = Projectile.Shooter; new TrailParticle(Curio.GetWorld(), SpriteLoader.Instance.AddSprite("content/bloodthorn"), Curio.GetVisualTarget(), 30) { Angle = orientable.Angle, FadeLerp = LerpHelper.QuadraticIn, }; }
public override void Draw(ICurio curio, SceneGame scene, DrawPass pass) { var spriteIdle = SpriteLoader.Instance.AddSprite("content/rat_idle"); var spriteMove = SpriteLoader.Instance.AddSprite("content/rat_move"); var center = curio.GetVisualPosition() + new Vector2(8, 8); var offset = curio.GetOffset(); var color = curio.GetColor(); var angleBody = curio.GetVisualAngle(); var pathfinder = curio.GetBehavior <BehaviorPathfinder>(); scene.PushSpriteBatch(shader: scene.Shader, shaderSetup: (transform, projection) => { scene.SetupColorMatrix(color); }); var spriteBody = pathfinder.HasPath ? spriteMove : spriteIdle; scene.DrawSpriteExt(spriteBody, 0, center + offset - spriteBody.Middle, spriteBody.Middle, angleBody, new Vector2(1), SpriteEffects.None, Color.White, 0); scene.PopSpriteBatch(); }
public void OnAction(EventAction e) { var hits = e.Actions.GetEffectsTargetting <IWeaponHit>(Curio).ToList(); var alive = Curio.GetBehavior <BehaviorAlive>(); foreach (var hit in hits) { if (hit is ActionEnemyHit) { continue; } if (hit is ActionStabHit stab) { if (alive.Armor <= 0) { e.Actions.Add(new ActionDamage(hit.Origin, hit.Target, 1, 50, 3, SoundLoader.AddSound("content/sound/stab.wav")).InSlot(ActionSlot.Active)); e.Actions.Add(new ActionStabStuck(hit.Origin, hit.Target).InSlot(ActionSlot.Active)); e.Actions.Add(new ActionAlignGrid(hit.Origin, 2).InSlot(ActionSlot.Active)); } else { e.Actions.Add(new ActionParrySword(hit.Origin, hit.Target).InSlot(ActionSlot.Active)); } } else { if (alive.Armor <= 0) { e.Actions.Add(new ActionDamage(hit.Origin, hit.Target, 1, 50, 3, SoundLoader.AddSound("content/sound/hit.wav")).InSlot(ActionSlot.Active)); } else { e.Actions.Add(new ActionDestroyArmor(hit.Origin, hit.Target, 1, 50).InSlot(ActionSlot.Active)); } } } }
public void OnAction(EventAction e) { var hits = e.Actions.GetEffectsTargetting <IWeaponHit>(Curio).ToList(); var alive = Curio.GetBehavior <BehaviorAlive>(); foreach (var hit in hits) { if (hit is ActionEnemyHit) { continue; } if (hit is ActionStabHit stab) { e.Actions.Add(new ActionHitVisual(hit.Origin, hit.Target, SoundLoader.AddSound("content/sound/stab.wav")).InSlot(ActionSlot.Active)); e.Actions.Add(new ActionStabStuck(hit.Origin, hit.Target).InSlot(ActionSlot.Active)); } else { //Crickets } } }
public override void Draw(ICurio curio, SceneGame scene, DrawPass pass) { var body = SpriteBody; var alive = curio.GetBehavior <BehaviorAlive>(); if (alive.Armor > 0) { body = SpriteLoader.Instance.AddSprite($"{SpriteBody.FileName}_armor"); } var center = curio.GetVisualPosition() + new Vector2(8, 8); var offset = curio.GetOffset(); var color = curio.GetColor(); var angleBody = curio.GetVisualAngle(); scene.PushSpriteBatch(shader: scene.Shader, shaderSetup: (transform, projection) => { scene.SetupColorMatrix(color); }); scene.DrawSpriteExt(body, 0, center + offset - SpriteBody.Middle, SpriteBody.Middle, angleBody, new Vector2(1), SpriteEffects.None, Color.White, 0); DrawDagger(curio, scene, pass); DrawMace(curio, scene, pass); scene.PopSpriteBatch(); }
public void Tick(SceneGame scene) { var active = Curio.GetActionHolder(ActionSlot.Active); var lastSeen = Curio.GetBehavior <BehaviorLastSeen>(); var pathfinder = Curio.GetBehavior <BehaviorPathfinder>(); var orientable = Curio.GetBehavior <BehaviorOrientable>(); var alive = Curio.GetBehavior <BehaviorAlive>(); var tile = Curio.GetMainTile(); var enemyDistance = Vector2.Distance(scene.PlayerCurio.GetVisualTarget(), Curio.GetVisualTarget()); var isEnemyFar = enemyDistance > 200; var isEnemyClose = enemyDistance < 100; var isEnemyArmed = scene.PlayerCurio.HasBehaviors <BehaviorSword>(); WingsOpen.Update(); ForwardBack.Update(); if (active.Done && alive.CurrentDead) { var actions = new List <ActionWrapper>(); actions.Add(new ActionNemesisRevive(Curio, 120).InSlot(ActionSlot.Active)); actions.Apply(Curio); if (!actions.Any(x => x.Action is ActionNemesisRevive)) { scene.GameOver(GameOverType.NemesisKill); } } if (active.Done && Curio.IsAlive()) { if (ForwardBack.End > 0 && State != NemesisState.Forward) { ForwardBack.Set(0, LerpHelper.Quadratic, 30); } if (ForwardBack.End < 1 && State == NemesisState.Forward) { ForwardBack.Set(1, LerpHelper.Quadratic, 30); } if (State == NemesisState.Back) { if (isEnemyArmed) { ParryTimer += scene.TimeModCurrent; if (ParryTimer.Done) { State = NemesisState.Parry; ParryTimer.Time = 0; } } if (isEnemyFar) { ChaseTimer += scene.TimeModCurrent; if (ChaseTimer.Done) { State = NemesisState.Forward; ChaseTimer.Time = 0; } } } if (State == NemesisState.Parry) { if (!isEnemyArmed || isEnemyFar) { ParryTimer += scene.TimeModCurrent; if (ParryTimer.Done) { State = NemesisState.Back; ParryTimer.Time = 0; } } } if (State == NemesisState.Forward) { if (isEnemyClose) { State = NemesisState.Back; } ChaseTimer += 1; if (lastSeen.LastSeenTile != null) { var nextMove = pathfinder.GetNextMove(new Point(tile.X, tile.Y)); if (lastSeen.LastSeenTile != pathfinder.GetDestination() || !nextMove.HasValue) { pathfinder.FindPath(lastSeen.LastSeenTile); } if (nextMove.HasValue) { var angleCurrent = orientable.Angle; var angleTarget = Util.PointToAngle(nextMove.Value); var angleDelta = MathHelper.WrapAngle(angleTarget - angleCurrent); var movement = new List <ActionWrapper>(); if (ChaseTimer.Done) { var randomPath = pathfinder.Path.Pick(Random); var randomPathTile = Curio.GetMap().GetTileOrNull(randomPath.X, randomPath.Y); if (randomPathTile != tile) { var dist = Vector2.Distance(randomPathTile.VisualTarget, Curio.GetVisualTarget()); movement.Add(new ActionMoveNemesis(Curio, scene.PlayerCurio, randomPathTile, dist / 8f + 10).InSlot(ActionSlot.Active)); ChaseTimer.Time = 0; } } else if (Math.Abs(angleDelta) < 0.0001) { movement.Add(new ActionMoveForward(Curio, nextMove.Value.ToVector2(), 5).InSlot(ActionSlot.Active)); } else if (angleDelta < 0) { movement.Add(new ActionTurn(Curio, -MathHelper.PiOver4, 3).InSlot(ActionSlot.Active)); } else if (angleDelta > 0) { movement.Add(new ActionTurn(Curio, MathHelper.PiOver4, 3).InSlot(ActionSlot.Active)); } movement.Apply(Curio); } } } } }
public void Tick(SceneGame scene) { var active = Curio.GetActionHolder(ActionSlot.Active); var lastSeen = Curio.GetBehavior <BehaviorLastSeen>(); var pathfinder = Curio.GetBehavior <BehaviorPathfinder>(); var orientable = Curio.GetBehavior <BehaviorOrientable>(); var tile = Curio.GetMainTile(); var map = Curio.GetMap(); if (Curio.IsDead()) { Decay += scene.TimeModCurrent; } if (Decay.Done) { var actions = new List <ActionWrapper>(); actions.Add(new ActionRatGib(scene.PlayerCurio, Curio, 2000, SoundLoader.AddSound("content/sound/splat.wav")).InSlot(ActionSlot.Active)); actions.Apply(Curio); } if (active.Done && Curio.IsAlive()) { if (lastSeen.LastSeenTile != null) { var nextMove = pathfinder.GetNextMove(new Point(tile.X, tile.Y)); if (!pathfinder.HasPath) { var positions = map.EnumerateTiles().Shuffle(Random); foreach (var escapeTile in positions) { if (Vector2.Distance(escapeTile.VisualTarget, tile.VisualTarget) < 300) { continue; } if (escapeTile.IsChasm() || escapeTile.IsSolid()) { continue; } pathfinder.FindPath(escapeTile); SoundRat.Play(1, Random.NextFloat(-0.5f, +0.5f), 0); break; } } else if (nextMove.HasValue) { var angleCurrent = orientable.Angle; var angleTarget = Util.PointToAngle(nextMove.Value); var angleDelta = MathHelper.WrapAngle(angleTarget - angleCurrent); var movement = new List <ActionWrapper>(); if (Math.Abs(angleDelta) < 0.0001) { movement.Add(new ActionMoveForward(Curio, nextMove.Value.ToVector2(), 4).InSlot(ActionSlot.Active)); } else if (angleDelta < 0) { movement.Add(new ActionTurn(Curio, -MathHelper.PiOver4, 5).InSlot(ActionSlot.Active)); } else if (angleDelta > 0) { movement.Add(new ActionTurn(Curio, MathHelper.PiOver4, 5).InSlot(ActionSlot.Active)); } movement.Apply(Curio); } else { var actions = new List <ActionWrapper>(); actions.Add(new ActionRatGib(scene.PlayerCurio, Curio, 2000, SoundLoader.AddSound("content/sound/splat.wav")).InSlot(ActionSlot.Active)); actions.Apply(Curio); } } } }