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 bool IsInArea(ICurio target) { var delta = target.GetVisualTarget() - Curio.GetVisualTarget(); var distance = delta.Length(); return(distance < MaxDistance); }
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 void Draw(SceneGame scene, DrawPass pass) { var sprite = SpriteLoader.Instance.AddSprite("content/ui_area"); var pos = Curio.GetVisualTarget(); var area = new Rectangle(Area.X * 16, Area.Y * 16, Area.Width * 16, Area.Height * 16); if (pass == DrawPass.UIWorld) { scene.DrawUI(sprite, area, Color.White); } if (pass == DrawPass.UI) { SkillUtil.DrawPointer(scene, pos, "ESCAPE"); } }
public void Tick(SceneGame scene) { if (!Activated) { return; } Frame += scene.TimeModCurrent; if (Frame.Done) { float radius = 240; if (scene.PlayerCurio.IsAlive() && Vector2.DistanceSquared(Curio.GetVisualTarget(), scene.PlayerCurio.GetVisualTarget()) < radius * radius) { EmitWraith(scene.PlayerCurio); } Frame.Reset(); Frame.EndTime = Random.NextFloat(40, 80); } }
bool PerformSpecialAction() { var world = Curio.GetWorld(); var orientable = Curio.GetBehavior <BehaviorOrientable>(); var delta = world.PlayerCurio.GetVisualTarget() - Curio.GetVisualTarget(); var distance = delta.Length(); var attacks = Curio.GetBehaviors <IGruntAttack>().Shuffle(Random).OrderByDescending(x => x.Priority); foreach (var attack in attacks) { if (attack.CanUse()) { attack.Perform(); return(true); } } return(false); }
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 bool CanSee(ICurio curio) { return(CanSee(Curio.GetVisualTarget(), curio.GetVisualTarget())); }
private void Retarget() { var origin = Origin.GetMainTile(); var target = Target.GetMainTile(); var mace = Origin.GetBehavior <BehaviorMace>(); var map = origin.Map; if (origin != null && target != null && mace != null && mace.IsInArea(Target) && map.CanSee(Origin.GetVisualTarget(), Target.GetVisualTarget())) { Offset = new Point(target.X - origin.X, target.Y - origin.Y); } }
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 override void Draw(GameTime gameTime) { CameraTarget.Setup(this, Viewport.Width, Viewport.Height); Util.SetupRenderTarget(this, ref DistortionMap, Viewport.Width, Viewport.Height); Util.SetupRenderTarget(this, ref BloodMapAdditive, Viewport.Width, Viewport.Height); Util.SetupRenderTarget(this, ref BloodMapMultiply, Viewport.Width, Viewport.Height); Projection = Matrix.CreateOrthographicOffCenter(0, Viewport.Width, Viewport.Height, 0, 0, -1); WorldTransform = CreateViewMatrix(); ApplyScreenShake(ref WorldTransform); DrawTextures(); SetRenderTarget(null); var cameraTile = CameraCurio.GetMainTile(); //var tiles = cameraTile?.GetNearby(15) ?? Enumerable.Empty<MapTile>(); //var curios = Manager.GetCurios().Where(x => !(x is MapTile)).Concat(tiles); //var gameObjects = curios.SelectMany(curio => curio.GetDrawables()); var globalDrawables = Manager.Drawable.GetDrawables(); var cameraPos = CameraCurio.GetVisualTarget(); var drawPasses = globalDrawables .Concat(VisualEffects) .Concat(Menu.GetAllMenus().OfType <IDrawable>()) .Where(x => x.ShouldDraw(this, cameraPos)) .ToMultiLookup(x => x.GetDrawPasses()); SetRenderTarget(CameraTarget.A); int width = 19 * 32; int height = 19 * 32; GraphicsDevice.ScissorRectangle = new Rectangle((Viewport.Width - width) / 2, (Viewport.Height - height) / 2, width, height); PushSpriteBatch(samplerState: SamplerState.PointWrap, blendState: NonPremultiplied, transform: WorldTransform, projection: Projection); PushSpriteBatch(transform: WorldTransform *Matrix.CreateTranslation(new Vector3(-CameraSize, 0)) * Matrix.CreateScale(0.80f) * Matrix.CreateTranslation(new Vector3(CameraSize, 0))); drawPasses.DrawPass(this, DrawPass.ChasmBottom); PopSpriteBatch(); PushSpriteBatch(transform: WorldTransform *Matrix.CreateTranslation(new Vector3(-CameraSize, 0)) * Matrix.CreateScale(0.85f) * Matrix.CreateTranslation(new Vector3(CameraSize, 0))); drawPasses.DrawPass(this, DrawPass.Chasm1); PopSpriteBatch(); PushSpriteBatch(transform: WorldTransform *Matrix.CreateTranslation(new Vector3(-CameraSize, 0)) * Matrix.CreateScale(0.90f) * Matrix.CreateTranslation(new Vector3(CameraSize, 0))); drawPasses.DrawPass(this, DrawPass.Chasm2); PopSpriteBatch(); PushSpriteBatch(transform: WorldTransform *Matrix.CreateTranslation(new Vector3(-CameraSize, 0)) * Matrix.CreateScale(0.95f) * Matrix.CreateTranslation(new Vector3(CameraSize, 0))); drawPasses.DrawPass(this, DrawPass.Chasm3); PopSpriteBatch(); drawPasses.DrawPass(this, DrawPass.Tile); drawPasses.DrawPass(this, DrawPass.Item); drawPasses.DrawPass(this, DrawPass.EffectLow); PushSpriteBatch(blendState: BlendState.Additive); drawPasses.DrawPass(this, DrawPass.EffectLowAdditive); PopSpriteBatch(); drawPasses.DrawPass(this, DrawPass.WallBottom); drawPasses.DrawPass(this, DrawPass.Creature); PushSpriteBatch(blendState: BlendState.Additive); drawPasses.DrawPass(this, DrawPass.EffectCreatureAdditive); PopSpriteBatch(); drawPasses.DrawPass(this, DrawPass.WallTop); drawPasses.DrawPass(this, DrawPass.Effect); PushSpriteBatch(blendState: BlendState.Additive); drawPasses.DrawPass(this, DrawPass.EffectAdditive); PopSpriteBatch(); PopSpriteBatch(); SetRenderTarget(CameraTarget.B); CameraTarget.Swap(); //Draw screenflashes ColorMatrix color = ColorMatrix.Identity; ApplyScreenFlash(ref color); PushSpriteBatch(samplerState: SamplerState.PointWrap, blendState: NonPremultiplied, shader: Shader, shaderSetup: (transform, projection) => { SetupColorMatrix(color, Matrix.Identity, Projection); }); SpriteBatch.Draw(CameraTarget.B, CameraTarget.B.Bounds, Color.White); PopSpriteBatch(); SetRenderTarget(CameraTarget.B); CameraTarget.Swap(); //Draw glitches RenderGlitches(CameraTarget); //Draw to screen SetRenderTarget(null); PushSpriteBatch(samplerState: SamplerState.PointWrap, blendState: NonPremultiplied, shader: Shader, shaderSetup: (transform, projection) => { SetupColorMatrix(ColorMatrix.Identity, Matrix.Identity, Projection); }); SpriteBatch.Draw(CameraTarget.B, CameraTarget.B.Bounds, Color.White); PopSpriteBatch(); PushSpriteBatch(samplerState: SamplerState.PointWrap, blendState: BlendState.Additive, shader: Shader, shaderSetup: (transform, projection) => { SetupColorMatrix(ColorMatrix.Identity, Matrix.Identity, Projection); }); SpriteBatch.Draw(BloodMapAdditive, BloodMapAdditive.Bounds, Color.White); PopSpriteBatch(); PushSpriteBatch(samplerState: SamplerState.PointWrap, blendState: MultiplyBoth, shader: Shader, shaderSetup: (transform, projection) => { SetupColorMatrix(ColorMatrix.Identity, Matrix.Identity, Projection); }); SpriteBatch.Draw(BloodMapMultiply, BloodMapMultiply.Bounds, Color.White); PopSpriteBatch(); //Draw cursor and tooltip SpriteReference cursor_tile = SpriteLoader.Instance.AddSprite("content/cursor_tile"); SetupNormal(Matrix.Identity, Projection); //SpriteBatch.Begin(blendState: NonPremultiplied, rasterizerState: RasterizerState.CullNone, samplerState: SamplerState.PointWrap, transformMatrix: WorldTransform); PushSpriteBatch(blendState: NonPremultiplied, samplerState: SamplerState.PointWrap, transform: WorldTransform, projection: Projection); if (TileCursor.HasValue) { DrawSprite(cursor_tile, Frame / 8, new Vector2(TileCursor.Value.X * 16, TileCursor.Value.Y * 16), SpriteEffects.None, 0); } drawPasses.DrawPass(this, DrawPass.UIWorld); //SpriteBatch.End(); PopSpriteBatch(); //SetupNormal(Matrix.Identity); //SpriteBatch.Begin(blendState: NonPremultiplied, rasterizerState: RasterizerState.CullNone, samplerState: SamplerState.PointWrap); PushSpriteBatch(blendState: NonPremultiplied, samplerState: SamplerState.PointWrap, projection: Projection); drawPasses.DrawPass(this, DrawPass.UI); Menu.Draw(this); var mousePos = new Vector2(InputState.MouseX, InputState.MouseY); var mouseCursor = SpriteLoader.Instance.AddSprite("content/ui_mouse_cursor"); DrawSprite(mouseCursor, 0, mousePos, SpriteEffects.None, 0); DrawTooltip(); PopSpriteBatch(); }
public IEnumerable <Wait> RoutineEndLevel() { var tile = PlayerCurio.GetMainTile(); var movable = PlayerCurio.GetBehavior <BehaviorMovable>(); var orientation = PlayerCurio.GetBehavior <BehaviorOrientable>(); var end = tile.GetBehavior <BehaviorLevelEnd>(); var player = PlayerCurio.GetBehavior <BehaviorPlayer>(); int stains = 0; float pitchSlide = 0; foreach (var bloodStain in VisualEffects.OfType <BloodStain>()) { RunStats.Splats += 1; stains += 1; var center = PlayerCurio.GetVisualTarget(); var emit = bloodStain.WorldPosition; var delta = Vector2.Normalize(emit - center); var offset = delta * Random.NextFloat(40, 80); int score; if (stains > 20) { score = 1000; } else if (stains > 10) { score = 500; } else { score = 50; } pitchSlide = (float)LerpHelper.QuadraticIn(-1, 1, Math.Min(0, stains / 50f)); var blob = new ScoreBlood(this, emit, center + delta * Random.NextFloat(4, 8), offset, Util.AngleToVector(Random.NextAngle()) * Random.NextFloat(80, 200), score, 20 + stains * 2); if (stains % 3 == 0) { blob.Sound = SoundBloodstainImpact.CreateInstance(); blob.Sound.Pitch = pitchSlide; } bloodStain.Destroy(); } SoundBloodstain.Play(1, pitchSlide, 0); yield return(new WaitTime(30 + stains * 2)); orientation.OrientTo(Util.PointToAngle(end.Direction), LerpHelper.QuadraticIn, new SliderScene(this, 10)); player.Fade.Set(0, LerpHelper.QuadraticIn, 70); var pos = tile.VisualPosition; PlayerCurio.MoveVisual(GetOutsidePosition(pos, end.Direction, 200), LerpHelper.QuadraticIn, new SliderScene(this, 100)); CameraCurio.MoveVisual(GetOutsidePosition(pos, end.Direction, 150), LerpHelper.QuadraticIn, new SliderScene(this, 100)); SoundEgress.Play(1f, 0f, 0f); CurrentTheme.Volume.Set(0, LerpHelper.QuadraticIn, 90); player.LevelTransition = true; yield return(new WaitTime(100)); CurrentTheme.Stop(false); PlayerCurio.MoveTo(null); CameraCurio.MoveTo(null); DestroyMap(); Menu.SubMenu.Open(new BetweenLevelMenu(this)); yield return(WaitForInput()); GenerateMap(); yield return(Scheduler.Instance.RunAndWait(RoutineStartLevel())); }
private void UpdateFootstep(SceneGame scene) { var active = Curio.GetActionHolder(ActionSlot.Active); var tile = Curio.GetMainTile(); Footstep += scene.TimeModCurrent; if (Momentum.Amount >= 32 && Footstep >= 4 && tile != null && !tile.IsChasm() && active.CurrentActions.Any(CanFootstep)) { Footstep = Footstep % 4; var angle = Curio.GetVisualAngle(); var offset = Util.AngleToVector(angle); var lateral = Util.AngleToVector(angle + MathHelper.PiOver2); var particle = new ExplosionParticle(scene, SpriteLoader.Instance.AddSprite("content/effect_moon"), Curio.GetVisualTarget() + FootstepOffset * lateral * 6 + offset * -12, 20) { Angle = angle + MathHelper.Pi, Color = Color.White, DrawPass = DrawPass.EffectLowAdditive, }; //new ScreenShakeRandom(scene, 0.5f, 5, LerpHelper.QuadraticIn); FootstepOffset *= -1; } }
public void Draw(SceneGame scene, DrawPass pass) { var pos = Curio.GetVisualTarget(); SkillUtil.DrawPointer(scene, pos, "KILL"); }