public override void Think (PhysicsComponent ownPhysics, HealthComponent ownHealth, object map, List<Entity> entitiesNearby) { Maze.Maze maze = map as Maze.Maze; if (maze != null && maze.HasFinished) { RigidBody rigidBody; JVector normal, temp_direction, old_direction = direction; float fraction; const int res_over_two = resolution / 2; direction = JVector.Zero; for (int i = -res_over_two; i <= res_over_two; i++) { temp_direction = JVector.Transform (old_direction, JMatrix.CreateFromAxisAngle (JVector.Up, i / res_over_two * MathHelper.PiOver4)); ownPhysics.World.CollisionSystem.Raycast ( ownPhysics.RigidBody.Position, temp_direction, new Jitter.Collision.RaycastCallback((rb, n, f) => { var e = rb.Tag as Entity; return f < max_distance && e != null && (e.HasComponent<WallComponent>() || e.Name.Contains("exit")); }), out rigidBody, out normal, out fraction); if (rigidBody != null) { var diff = ownPhysics.RigidBody.Position - rigidBody.Position; diff = new JVector (diff.X, 0, diff.Z); diff.Normalize(); direction += diff * (max_distance - fraction); } else { direction += temp_direction * max_distance; } } if (direction.Length() > 0.1) direction.Normalize(); else { fallback = JVector.Transform (fallback, JMatrix.CreateFromAxisAngle (JVector.Up, MathHelper.PiOver6)); direction = fallback; } if (ownPhysics.RigidBody.Position.X > maze.Size.X * 8) direction = new JVector ((maze.Size.X * 8) - ownPhysics.RigidBody.Position.X, 0, direction.Z); else if (ownPhysics.RigidBody.Position.X < 0) direction = new JVector (0 - ownPhysics.RigidBody.Position.X, 0, direction.Z); if (ownPhysics.RigidBody.Position.Z > maze.Size.Y * 8) direction = new JVector (direction.X, 0, (maze.Size.Y * 8) - ownPhysics.RigidBody.Position.Z); else if (ownPhysics.RigidBody.Position.Z < 0) direction = new JVector (direction.X, 0, 0 - ownPhysics.RigidBody.Position.Z); if (ownPhysics.RigidBody.LinearVelocity.Length() < speed) ownPhysics.RigidBody.LinearVelocity += (direction * acceleration); ownPhysics.RigidBody.Position = new JVector (ownPhysics.RigidBody.Position.X, height, ownPhysics.RigidBody.Position.Z); var player = entitiesNearby.FirstOrDefault (e => e.Name == "player"); if (player != null && gameState.Scene.CameraManager.ActiveCamera != null) { do_reset = true; var player_pos = player.GetComponent<TransformComponent>().Position; var ghost_pos = ownPhysics.RigidBody.Position.ToFreezingArcherVector(); float distance; Vector3.Distance(ref player_pos, ref ghost_pos, out distance); float fov = ((AIcomp.MaximumEntityDistance - distance) / AIcomp.MaximumEntityDistance); if (fov >= 0.5f) { var player_health = player.GetComponent<HealthComponent> (); player_health.Health += player_health.MaximumHealth * 0.05f; } } else if (do_reset) { do_reset = false; } } }
public override void Think (PhysicsComponent ownPhysics, HealthComponent ownHealth, object map, List<Entity> entitiesNearby) { Maze.Maze maze = map as Maze.Maze; if (maze != null && maze.HasFinished) { RigidBody rigidBody; JVector normal, temp_direction, old_direction = direction; float fraction; const int res_over_two = resolution / 2; direction = JVector.Zero; for (int i = -res_over_two; i <= res_over_two; i++) { temp_direction = JVector.Transform (old_direction, JMatrix.CreateFromAxisAngle (JVector.Up, i / res_over_two * MathHelper.PiOver4)); ownPhysics.World.CollisionSystem.Raycast ( ownPhysics.RigidBody.Position, temp_direction, new Jitter.Collision.RaycastCallback((rb, n, f) => { var e = rb.Tag as Entity; return f < max_distance && e != null && (e.HasComponent<WallComponent>() || e.Name.Contains("exit")); }), out rigidBody, out normal, out fraction); if (rigidBody != null) { var diff = ownPhysics.RigidBody.Position - rigidBody.Position; diff = new JVector (diff.X, 0, diff.Z); diff.Normalize(); direction += diff * (max_distance - fraction); } else { direction += temp_direction * max_distance; } } if (direction.Length() > 0.1) direction.Normalize(); else { fallback = JVector.Transform (fallback, JMatrix.CreateFromAxisAngle (JVector.Up, MathHelper.PiOver6)); direction = fallback; } if (ownPhysics.RigidBody.Position.X > maze.Size.X * 8) direction = new JVector ((maze.Size.X * 8) - ownPhysics.RigidBody.Position.X, 0, direction.Z); else if (ownPhysics.RigidBody.Position.X < 0) direction = new JVector (0 - ownPhysics.RigidBody.Position.X, 0, direction.Z); if (ownPhysics.RigidBody.Position.Z > maze.Size.Y * 8) direction = new JVector (direction.X, 0, (maze.Size.Y * 8) - ownPhysics.RigidBody.Position.Z); else if (ownPhysics.RigidBody.Position.Z < 0) direction = new JVector (direction.X, 0, 0 - ownPhysics.RigidBody.Position.Z); if (ownPhysics.RigidBody.LinearVelocity.Length() < speed) ownPhysics.RigidBody.LinearVelocity += (direction * acceleration); ownPhysics.RigidBody.Position = new JVector (ownPhysics.RigidBody.Position.X, height, ownPhysics.RigidBody.Position.Z); var player = entitiesNearby.FirstOrDefault (e => e.Name == "player"); if (player != null) { do_reset = true; var player_pos = player.GetComponent<TransformComponent>().Position; var ghost_pos = ownPhysics.RigidBody.Position.ToFreezingArcherVector(); float distance; Vector3.Distance(ref player_pos, ref ghost_pos, out distance); float fac = ((AIcomp.MaximumEntityDistance - distance) / AIcomp.MaximumEntityDistance); warpingNode.WarpFactor = fac / 10; var playerPhysics = player.GetComponent<PhysicsComponent>(); if (playerPhysics != null) playerPhysics.SpeedMultiplier = 1 - fac; if ((DateTime.Now - lastDamage).TotalSeconds > 0.5f) { player.GetComponent<HealthComponent>().Health -= fac * 40; lastDamage = DateTime.Now; } var lowpass = state.AudioContext.GlobalFilter as LowpassFilter; if (lowpass == null) { lowpass = new LowpassFilter (); state.AudioContext.GlobalFilter = lowpass; } lowpass.GainHF = (1 - fac) / 10; temp_player = player; //Here send Caligo Attack Message if (MessageCreated != null) MessageCreated (new AIAttackMessage (entity)); } else if (do_reset) { do_reset = false; warpingNode.WarpFactor = 0; if (temp_player != null) temp_player.GetComponent<PhysicsComponent>().SpeedMultiplier = 1; var lowpass = state.AudioContext.GlobalFilter as LowpassFilter; if (lowpass != null) lowpass.GainHF = 1; state.AudioContext.GlobalFilter = null; } } }
public override void Think (PhysicsComponent ownPhysics, HealthComponent ownHealth, object map, List<Entity> entitiesNearby) { Maze.Maze maze = map as Maze.Maze; if (maze != null && maze.HasFinished) { RigidBody rigidBody; JVector normal, temp_direction, old_direction = direction; float fraction; const int res_over_two = resolution / 2; direction = JVector.Zero; for (int i = -res_over_two; i <= res_over_two; i++) { temp_direction = JVector.Transform (old_direction, JMatrix.CreateFromAxisAngle (JVector.Up, i / res_over_two * MathHelper.PiOver4)); ownPhysics.World.CollisionSystem.Raycast ( ownPhysics.RigidBody.Position, temp_direction, new Jitter.Collision.RaycastCallback((rb, n, f) => { var e = rb.Tag as Entity; return f < max_distance && e != null && (e.HasComponent<WallComponent>() || e.Name.Contains("exit")); }), out rigidBody, out normal, out fraction); if (rigidBody != null) { var diff = ownPhysics.RigidBody.Position - rigidBody.Position; diff = new JVector (diff.X, 0, diff.Z); diff.Normalize(); direction += diff * (max_distance - fraction); } else { direction += temp_direction * max_distance; } } foreach (var light in state.Scene.Lights) { var temp = ownPhysics.RigidBody.Position.ToFreezingArcherVector () - light.PointLightPosition; if (temp.LengthSquared < 400 && light.On) { if (Vector3.CalculateAngle (temp, light.DirectionalLightDirection) < degInRad) { direction += new JVector (temp.X * 20, 0, temp.Z * 20); } } } if (direction.Length() > 0.1) direction.Normalize(); else { fallback = JVector.Transform (fallback, JMatrix.CreateFromAxisAngle (JVector.Up, MathHelper.PiOver6)); direction = fallback; } if (ownPhysics.RigidBody.Position.X > maze.Size.X * 8) direction = new JVector ((maze.Size.X * 8) - ownPhysics.RigidBody.Position.X, 0, direction.Z); else if (ownPhysics.RigidBody.Position.X < 0) direction = new JVector (0 - ownPhysics.RigidBody.Position.X, 0, direction.Z); if (ownPhysics.RigidBody.Position.Z > maze.Size.Y * 8) direction = new JVector (direction.X, 0, (maze.Size.Y * 8) - ownPhysics.RigidBody.Position.Z); else if (ownPhysics.RigidBody.Position.Z < 0) direction = new JVector (direction.X, 0, 0 - ownPhysics.RigidBody.Position.Z); if (ownPhysics.RigidBody.LinearVelocity.Length() < speed) ownPhysics.RigidBody.LinearVelocity += (direction * acceleration); ownPhysics.RigidBody.Position = new JVector (ownPhysics.RigidBody.Position.X, height, ownPhysics.RigidBody.Position.Z); var player = entitiesNearby.FirstOrDefault (e => e.Name == "player"); if (player != null) { do_reset = true; var player_pos = player.GetComponent<TransformComponent>().Position; bool damage = false; foreach (var particle in smokeParticleEmitter.Particles) { if ((player_pos - particle.Position).LengthSquared < 4) { damage = true; break; } } if (damage && (DateTime.Now - lastDamage).TotalSeconds > 2) { var ghost_pos = ownPhysics.RigidBody.Position.ToFreezingArcherVector(); float distance; Vector3.Distance(ref player_pos, ref ghost_pos, out distance); float fac = ((AIcomp.MaximumEntityDistance - distance) / AIcomp.MaximumEntityDistance); var player_health = player.GetComponent<HealthComponent>(); player_health.Health -= fac * 20; lastDamage = DateTime.Now; } if (MessageCreated != null) MessageCreated (new AIAttackMessage (entity)); } else if (do_reset) { do_reset = false; } } }
public abstract void Think (PhysicsComponent ownPhysics, HealthComponent ownHealth, object map, List<Entity> entitiesNearby);