protected ShipPlayer(BotConstruction_Result construction) : base(construction) { _map = construction.ArgsCore.Map; _cargoBays = base.Parts.Where(o => o is CargoBay).Select(o => (CargoBay)o).ToArray(); _guns = base.Parts.Where(o => o is ProjectileGun).Select(o => (ProjectileGun)o).ToArray(); // Listen to part destructions foreach (PartBase part in base.Parts) { if (part is Thruster) { part.Destroyed += Part_DestroyedResurrected; part.Resurrected += Part_DestroyedResurrected; } } // Explicitly set the bool so that the neurons are ignored (the ship shouldn't have a brain anyway, but it might) foreach (ProjectileGun gun in _guns) { gun.ShouldFire = false; } //No longer doing this here. Keep2D classes end up with gimbal lock, and too many places need to know about this rotation ////NOTE: The dna is expected to be built along Z (X is right, Y is up). But the world is in the XY plane //this.PhysicsBody.Rotation = this.PhysicsBody.Rotation.RotateBy(new Quaternion(new Vector3D(1, 0, 0), -90)); //this.PhysicsBody.ApplyForceAndTorque += new EventHandler<BodyApplyForceAndTorqueArgs>(PhysicsBody_ApplyForceAndTorque); EnsureThrustKeysBuilt_YISUP(); }
public Swimbot(BotConstruction_Result construction) : base(construction) { _map = construction.ArgsCore.Map; _cargoBays = base.Parts.Where(o => o is CargoBay).Select(o => (CargoBay)o).ToArray(); }
public Bean(BotConstruction_Result construction, FlyingBeanOptions beanOptions) : base(construction) { _beanOptions = beanOptions; _dyingCounters = new SortedList <CauseOfDeath, int>(); foreach (CauseOfDeath cause in Enum.GetValues(typeof(CauseOfDeath))) { _dyingCounters.Add(cause, 0); } }
public Bean(BotConstruction_Result construction, FlyingBeanOptions beanOptions) : base(construction) { _beanOptions = beanOptions; _dyingCounters = new SortedList<CauseOfDeath, int>(); foreach (CauseOfDeath cause in Enum.GetValues(typeof(CauseOfDeath))) { _dyingCounters.Add(cause, 0); } }
/// <param name="construction">Call GetConstruction for an instance of this</param> public ArcBot2(BotConstruction_Result construction, MaterialIDs materialIDs, KeepItems2D keepItems2D, Viewport3D viewport) : base(construction) { _world = construction.ArgsCore.World; _map = construction.ArgsCore.Map; _keepItems2D = keepItems2D; _materialIDs = materialIDs; _viewport = viewport; Inventory = new Inventory(); //BrainNEAT brainPart = Parts.FirstOrDefault(o => o is BrainNEAT) as BrainNEAT; //if (brainPart == null) //{ // throw new ApplicationException("There needs to be a brain part"); //} //foreach (PartBase part in Parts) //{ // if (part is SensorHoming partHoming) // { // partHoming.HomePoint = new Point3D(0, 0, 0); // partHoming.HomeRadius = HOMINGRADIUS; // } //} //int inputCount = brainPart.Neruons_Writeonly.Count(); //int outputCount = brainPart.Neruons_Readonly.Count(); #region MapObjectTransferArgs _transferArgs = new MapObjectTransferArgs() { World = _world, Map = _map, Inventory = Inventory, MaterialID_Weapon = _materialIDs.Weapon, Bot = this, ShouldKeep2D = _keepItems2D != null, KeepItems2D = _keepItems2D, Gravity = _gravity, Viewport = _viewport, Visuals3D = Visuals3D, }; #endregion }
/// <summary> /// Once the world is created on the worker thread, maps and bots need to be created for each room /// NOTE: This is called from the worker thread /// </summary> private void Arena_WorldCreated(object sender, EventArgs e) { World world = Arena.WorldAccessor.World; #region materials MaterialManager = new MaterialManager(world); MaterialIDs = new MaterialIDs(); // Wall Game.Newt.v2.NewtonDynamics.Material material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = ItemOptionsArco.ELASTICITY_WALL; MaterialIDs.Wall = MaterialManager.AddMaterial(material); // Bot material = new Game.Newt.v2.NewtonDynamics.Material(); MaterialIDs.Bot = MaterialManager.AddMaterial(material); // Bot Ram material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = ItemOptionsArco.ELASTICITY_BOTRAM; MaterialIDs.BotRam = MaterialManager.AddMaterial(material); // Exploding Bot material = new Game.Newt.v2.NewtonDynamics.Material(); material.IsCollidable = false; MaterialIDs.ExplodingBot = MaterialManager.AddMaterial(material); // Weapon material = new Game.Newt.v2.NewtonDynamics.Material(); MaterialIDs.Weapon = MaterialManager.AddMaterial(material); // Treasure Box material = new Game.Newt.v2.NewtonDynamics.Material(); MaterialIDs.TreasureBox = MaterialManager.AddMaterial(material); //TODO: Uncomment these // Collisions //_materialManager.RegisterCollisionEvent(_materialIDs.Bot, _materialIDs.Bot, Collision_BotBot); //_materialManager.RegisterCollisionEvent(_materialIDs.Bot, _materialIDs.Weapon, Collision_BotWeapon); //_materialManager.RegisterCollisionEvent(_materialIDs.Weapon, _materialIDs.Weapon, Collision_WeaponWeapon); ////_materialManager.RegisterCollisionEvent(_materialIDs.Bot, _materialIDs.Wall, Collision_BotWall); //_materialManager.RegisterCollisionEvent(_materialIDs.Weapon, _materialIDs.Wall, Collision_WeaponWall); //_materialManager.RegisterCollisionEvent(_materialIDs.Weapon, _materialIDs.TreasureBox, Collision_WeaponTreasureBox); //_materialManager.RegisterCollisionEvent(_materialIDs.Bot, _materialIDs.TreasureBox, Collision_BotTreasureBox); #endregion List <KeepItems2D> keep2Ds = new List <KeepItems2D>(); foreach (var(room, _) in Arena.AllRooms) { #region keep 2D //TODO: drag plane should either be a plane or a large cylinder, based on the current (level|scene|stage|area|arena|map|place|region|zone) // This game is 3D emulating 2D, so always have the mouse go to the XY plane DragHitShape dragPlane = new DragHitShape(); dragPlane.SetShape_Plane(new Triangle(new Point3D(-1, -1, room.Center.Z), new Point3D(1, -1, room.Center.Z), new Point3D(0, 1, room.Center.Z))); // This will keep objects onto that plane using forces (not velocities) KeepItems2D keep2D = new KeepItems2D { SnapShape = dragPlane, }; //keep2D.Add(room.Bot, false); keep2Ds.Add(keep2D); #endregion #region bot ShipCoreArgs core = new ShipCoreArgs() { World = world, Material_Ship = MaterialIDs.Bot, Map = room.Map, }; //BotConstructor_Events events = new BotConstructor_Events(); //events. // Create the bot Bot bot = null; if (RequestCustomBot != null) { bot = RequestCustomBot(core, keep2D, dragPlane, MaterialIDs); } else { BotConstruction_Result construction = BotConstructor.ConstructBot(DNA, core, ShipExtraArgs); bot = new Bot(construction); } // Find some parts BrainNEAT brainPart = bot.Parts.FirstOrDefault(o => o is BrainNEAT) as BrainNEAT; if (brainPart == null) { throw new ApplicationException("Didn't find BrainNEAT part"); } SensorHoming[] homingParts = bot.Parts. Where(o => o is SensorHoming). Select(o => (SensorHoming)o). ToArray(); if (homingParts.Length == 0) { throw new ApplicationException("Didn't find SensorHoming part"); } #endregion room.Bot = bot; room.BrainPart = brainPart; room.HomingParts = homingParts; foreach (SensorHoming homing in homingParts) { homing.HomePoint = room.Center; homing.HomeRadius = (ROOMSIZE / 2d) * Evaluator3.MULT_HOMINGSIZE; } room.Map.AddItem(bot); keep2D.Add(room.Bot, false); } Keep2D = keep2Ds.ToArray(); world.Updated += World_Updated; }
public Bot(BotConstruction_Result construction) { _options = construction.ArgsExtra.Options; _itemOptions = construction.ArgsExtra.ItemOptions; _radiation = construction.ArgsExtra.Radiation; _gravity = construction.ArgsExtra.Gravity; _cameraPool = construction.ArgsExtra.CameraPool; _parts = construction.PartConstruction; _thrusters = construction.PartConstruction.GetStandardParts <Thruster>(Thruster.PARTTYPE).ToArray(); _impulseEngines = construction.PartConstruction.GetStandardParts <ImpulseEngine>(ImpulseEngine.PARTTYPE).ToArray(); _projectileGuns = construction.PartConstruction.GetStandardParts <ProjectileGun>(ProjectileGun.PARTTYPE).ToArray(); _updatableParts_MainThread = construction.UpdatableParts_MainThread; _updatableParts_AnyThread = construction.UpdatableParts_AnyThread; _dna = construction.DNA; _dnaParts = construction.DNAParts; this.Model = construction.Model; _visualEffects = construction.VisualEffects; _isPhysicsStatic = construction.ArgsExtra.IsPhysicsStatic; this.PhysicsBody = construction.PhysicsBody; this.Radius = construction.Radius; _partTransformToModel = _parts.AllPartsArray. Select(o => { Transform3DGroup transform = new Transform3DGroup(); transform.Children.Add(new TranslateTransform3D(-o.Position.ToVector())); transform.Children.Add(new RotateTransform3D(new QuaternionRotation3D(o.Orientation.ToReverse()))); return(transform); }). ToArray(); // Hook up events if (!_isPhysicsStatic) { this.PhysicsBody.ApplyForceAndTorque += new EventHandler <BodyApplyForceAndTorqueArgs>(PhysicsBody_ApplyForceAndTorque); } foreach (var part in _parts.AllPartsArray) { part.RequestWorldLocation += new EventHandler <PartRequestWorldLocationArgs>(Part_RequestWorldLocation); part.RequestWorldSpeed += new EventHandler <PartRequestWorldSpeedArgs>(Part_RequestWorldSpeed); part.RequestParent += new EventHandler <PartRequestParentArgs>(Part_RequestParent); part.Resurrected += Part_Resurrected; part.Destroyed += Part_Destroyed; } // See if there are parts that can gradually change the ship's mass if ((_parts.Containers.Fuels.Count > 0 && _parts.StandardParts.ContainsKey(Thruster.PARTTYPE)) || (_parts.Containers.CargoBays.Count > 0 && (_parts.StandardParts.ContainsKey(ConverterMatterToEnergy.PARTTYPE) || _parts.StandardParts.ContainsKey(ConverterMatterToFuel.PARTTYPE))) || (_parts.Containers.Energies.Count > 0 && _parts.Containers.Fuels.Count > 0 && (_parts.StandardParts.ContainsKey(ConverterEnergyToFuel.PARTTYPE) || _parts.StandardParts.ContainsKey(ConverterFuelToEnergy.PARTTYPE))) ) { _hasMassChangingUpdatables_Small = true; } else { _hasMassChangingUpdatables_Small = false; } if (_parts.Containers.Ammos.Count > 0 && _parts.StandardParts.ContainsKey(ProjectileGun.PARTTYPE)) { _hasMassChangingUpdatables_Medium = true; } else { _hasMassChangingUpdatables_Medium = false; } // Set up a neural processor on its own thread/task _neuronLinks = construction.Links; if (_neuronLinks != null) { var result = AddToNeuralPool(_neuronLinks, construction.ArgsExtra.NeuralPoolManual); _linkBucket = result.bucket; _neuralPoolAddTask = result.addTask; _neuralPoolManualTick = result.manualPool; } _lifeEvents = construction.PartConstruction.LifeEventWatcher; this.ShouldRecalcMass_Large = false; this.ShouldRecalcMass_Small = false; this.CreationTime = DateTime.UtcNow; }
public ControlledThrustBot(BotConstruction_Result construction) : base(construction) { }
protected ShipPlayer(BotConstruction_Result construction) : base(construction) { _map = construction.ArgsCore.Map; _cargoBays = base.Parts.Where(o => o is CargoBay).Select(o => (CargoBay)o).ToArray(); _guns = base.Parts.Where(o => o is ProjectileGun).Select(o => (ProjectileGun)o).ToArray(); // Listen to part destructions foreach(PartBase part in base.Parts) { if(part is Thruster) { part.Destroyed += Part_DestroyedResurrected; part.Resurrected += Part_DestroyedResurrected; } } // Explicitly set the bool so that the neurons are ignored (the ship shouldn't have a brain anyway, but it might) foreach (ProjectileGun gun in _guns) { gun.ShouldFire = false; } //No longer doing this here. Keep2D classes end up with gimbal lock, and too many places need to know about this rotation ////NOTE: The dna is expected to be built along Z (X is right, Y is up). But the world is in the XY plane //this.PhysicsBody.Rotation = this.PhysicsBody.Rotation.RotateBy(new Quaternion(new Vector3D(1, 0, 0), -90)); //this.PhysicsBody.ApplyForceAndTorque += new EventHandler<BodyApplyForceAndTorqueArgs>(PhysicsBody_ApplyForceAndTorque); EnsureThrustKeysBuilt_YISUP(); }
private void SetBot_Click(object sender, RoutedEventArgs e) { try { int numThrusters; if (!int.TryParse(txtNumThrusters.Text, out numThrusters)) { MessageBox.Show("Couldn't parse the number of thrusters", this.Title, MessageBoxButton.OK, MessageBoxImage.Warning); return; } else if (numThrusters < 2) { MessageBox.Show("Must have at least two thrusters", this.Title, MessageBoxButton.OK, MessageBoxImage.Warning); return; } #region DNA List <ShipPartDNA> parts = new List <ShipPartDNA>(); parts.Add(new ShipPartDNA() { PartType = EnergyTank.PARTTYPE, Orientation = Quaternion.Identity, Position = new Point3D(0, 0, 0.283735185991315), Scale = new Vector3D(2.05963659008885, 2.05963659008885, 0.301082085094996) }); parts.Add(new ShipPartDNA() { PartType = FuelTank.PARTTYPE, Orientation = Quaternion.Identity, Position = new Point3D(0, 0, -0.490401090473184), Scale = new Vector3D(1.92697281805995, 1.92697281805995, 1.1591130722673) }); parts.Add(new ShipPartDNA() { PartType = SensorSpin.PARTTYPE, Orientation = Quaternion.Identity, Position = new Point3D(0, 0, 0.57985483357727), Scale = new Vector3D(1, 1, 1) }); parts.AddRange(GetRandomThrusters(numThrusters, chkRandRotateThrusters.IsChecked.Value, (ThrusterTypeValues)cboThrusterTypes.SelectedItem, chkSomeDestroyed.IsChecked.Value)); ShipDNA dna = ShipDNA.Create(parts); dna.ShipLineage = Guid.NewGuid().ToString(); #endregion ShipCoreArgs core = new ShipCoreArgs() { Map = _map, Material_Ship = _material_Bot, World = _world, }; BotConstruction_Result seed = BotConstructor.ConstructBot(dna, core); ControlledThrustBot bot = new ControlledThrustBot(seed); SetBot(bot); // Start looking for a solution immediately if (chkBalanceThrusters.IsChecked.Value) { BalanceBot_Forward(_bot); } } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }
public Bot(BotConstruction_Result construction) { _options = construction.ArgsExtra.Options; _itemOptions = construction.ArgsExtra.ItemOptions; _radiation = construction.ArgsExtra.Radiation; _gravity = construction.ArgsExtra.Gravity; _cameraPool = construction.ArgsExtra.CameraPool; _parts = construction.PartConstruction; _thrusters = construction.PartConstruction.GetStandardParts<Thruster>(Thruster.PARTTYPE).ToArray(); _projectileGuns = construction.PartConstruction.GetStandardParts<ProjectileGun>(ProjectileGun.PARTTYPE).ToArray(); _updatableParts_MainThread = construction.UpdatableParts_MainThread; _updatableParts_AnyThread = construction.UpdatableParts_AnyThread; _dna = construction.DNA; _dnaParts = construction.DNAParts; this.Model = construction.Model; _visualEffects = construction.VisualEffects; _isPhysicsStatic = construction.ArgsExtra.IsPhysicsStatic; this.PhysicsBody = construction.PhysicsBody; this.Radius = construction.Radius; _partTransformToModel = _parts.AllPartsArray. Select(o => { Transform3DGroup transform = new Transform3DGroup(); transform.Children.Add(new TranslateTransform3D(-o.Position.ToVector())); transform.Children.Add(new RotateTransform3D(new QuaternionRotation3D(o.Orientation.ToReverse()))); return transform; }). ToArray(); // Hook up events if (!_isPhysicsStatic) { this.PhysicsBody.ApplyForceAndTorque += new EventHandler<BodyApplyForceAndTorqueArgs>(PhysicsBody_ApplyForceAndTorque); } foreach (var part in _parts.AllPartsArray) { part.RequestWorldLocation += new EventHandler<PartRequestWorldLocationArgs>(Part_RequestWorldLocation); part.RequestWorldSpeed += new EventHandler<PartRequestWorldSpeedArgs>(Part_RequestWorldSpeed); part.RequestParent += new EventHandler<PartRequestParentArgs>(Part_RequestParent); part.Resurrected += Part_Resurrected; part.Destroyed += Part_Destroyed; } // See if there are parts that can gradually change the ship's mass if ((_parts.Containers.Fuels.Count > 0 && _parts.StandardParts.ContainsKey(Thruster.PARTTYPE)) || (_parts.Containers.CargoBays.Count > 0 && (_parts.StandardParts.ContainsKey(ConverterMatterToEnergy.PARTTYPE) || _parts.StandardParts.ContainsKey(ConverterMatterToFuel.PARTTYPE))) || (_parts.Containers.Energies.Count > 0 && _parts.Containers.Fuels.Count > 0 && (_parts.StandardParts.ContainsKey(ConverterEnergyToFuel.PARTTYPE) || _parts.StandardParts.ContainsKey(ConverterFuelToEnergy.PARTTYPE))) ) { _hasMassChangingUpdatables_Small = true; } else { _hasMassChangingUpdatables_Small = false; } if (_parts.Containers.Ammos.Count > 0 && _parts.StandardParts.ContainsKey(ProjectileGun.PARTTYPE)) { _hasMassChangingUpdatables_Medium = true; } else { _hasMassChangingUpdatables_Medium = false; } // Set up a neural processor on its own thread/task _neuronLinks = construction.Links; if (_neuronLinks != null) { var bucketTask = AddToNeuralPool(_neuronLinks); _neuralPoolAddTask = bucketTask.Item1; _linkBucket = bucketTask.Item2; } _lifeEvents = construction.PartConstruction.LifeEventWatcher; this.ShouldRecalcMass_Large = false; this.ShouldRecalcMass_Small = false; this.CreationTime = DateTime.UtcNow; }
public DefenseBot(BotConstruction_Result construction) : base(construction) { }