private SpaceStation2D CreateSpaceStations_Build(Point3D position, FlagProps flag = null, int? purchasedVolume = null, Inventory[] playerInventory = null)
        {
            Vector3D axis = new Vector3D(0, 0, 1);
            Quaternion rotation = Math3D.GetRotation(axis, Math3D.GetRandomVector_Cone(axis, 30));

            SpaceStation2D retVal = new SpaceStation2D(position, _world, _material_SpaceStation, rotation, flag);

            retVal.SpinDegreesPerSecond = Math1D.GetNearZeroValue(.33, 1.1);

            retVal.RandomizeInventory(true);

            if (purchasedVolume != null && purchasedVolume.Value > retVal.PurchasedVolume)
            {
                retVal.PurchasedVolume = purchasedVolume.Value;
            }

            if (playerInventory != null)
            {
                retVal.PlayerInventory.AddRange(playerInventory);
            }

            _map.AddItem(retVal);

            return retVal;
        }
 private void StoreInStation(ShipPartDNA dna)
 {
     Inventory inventory = new Inventory(dna);
     _spaceDock.AddInventory(inventory, true);
 }
        private void ShowShipCargo()
        {
            // Clear old
            foreach (InventoryEntry entry in pnlCargo.Children)
            {
                InventoryEntryRemoved(entry);
            }
            pnlCargo.Children.Clear();

            // Add new
            if (_player.Ship == null || _player.Ship.CargoBays == null)
            {
                return;
            }

            foreach (Cargo cargo in _player.Ship.CargoBays.GetCargoSnapshot())
            {
                Inventory inventory = null;

                switch (cargo.Type)
                {
                    case CargoType.Mineral:
                        Cargo_Mineral cargoMineral = (Cargo_Mineral)cargo;
                        inventory = new Inventory(ItemOptionsAstMin2D.GetMineral(cargoMineral.MineralType, cargoMineral.Volume));
                        break;

                    case CargoType.ShipPart:
                        Cargo_ShipPart part = (Cargo_ShipPart)cargo;
                        inventory = new Inventory(part.PartDNA);
                        break;

                    default:
                        throw new ApplicationException("Unknown CargoType: " + cargo.Type.ToString());
                }

                AddShipCargoGraphic(inventory);
            }
        }
        private void AddShipCargoGraphic(Inventory inventory)
        {
            string name = GetName(inventory);
            Tuple<decimal, decimal> credits = _station.GetPrice_Sell(inventory);

            string[] actions = inventory.Ship != null ?
                _actions_Player_Cargo_ship :
                _actions_Player_Cargo_nonship;

            InventoryEntry entry = new InventoryEntry();
            entry.SetInventory(inventory, name, credits.Item1 * credits.Item2, Convert.ToDouble(credits.Item2), null, _world, actions, _editorOptions);

            //pnlCargo.Children.Add(entry);
            AddToPanel(pnlCargo, entry);

            InventoryEntryAdded(entry);
        }
 private static string GetName(Inventory inventory)
 {
     if (inventory.Ship != null)
     {
         return GetName_Ship(inventory.Ship);
     }
     else if (inventory.Part != null)
     {
         return inventory.Part.PartType;
     }
     else if (inventory.Mineral != null)
     {
         return inventory.Mineral.MineralType.ToString();
     }
     else
     {
         throw new ApplicationException("Unknown type of inventory");
     }
 }
        private void AddStationMineralGraphic(Inventory inventory)
        {
            string name = GetName(inventory);
            Tuple<decimal, decimal> credits = _station.GetPrice_Buy(inventory);

            InventoryEntry entry = new InventoryEntry();
            entry.SetInventory(inventory, name, credits.Item1 * credits.Item2, Convert.ToDouble(credits.Item2), null, _world, _actions_Station_Minerals, _editorOptions);

            AddToPanel(pnlStationMinerals, entry);

            InventoryEntryAdded(entry);
        }
        private void StoreIn_Hangar_Nearby(Inventory inventory, string name)
        {
            // Figure out where to put it
            string[] actions;
            Panel panel;
            bool isHangar;

            if (_station.PurchasedVolume - _station.UsedVolume >= inventory.Volume)
            {
                // Hangar
                actions = inventory.Ship != null ? _actions_Player_Hangar_ship : _actions_Player_Hangar_nonship;
                panel = pnlHangar;
                isHangar = true;
            }
            else
            {
                // Nearby
                actions = inventory.Ship != null ? _actions_Player_FreeSpace_ship : _actions_Player_FreeSpace_nonship;
                panel = pnlNearbyItems;
                isHangar = false;
            }

            // Create an entry with the sell price
            Tuple<decimal, decimal> credits = _station.GetPrice_Sell(inventory);

            InventoryEntry newEntry = new InventoryEntry();
            newEntry.SetInventory(inventory, name, credits.Item1 * credits.Item2, Convert.ToDouble(credits.Item2), null, _world, actions, _editorOptions);

            // Store it
            //panel.Children.Add(newEntry);
            AddToPanel(panel, newEntry);
            InventoryEntryAdded(newEntry);

            if (isHangar)
            {
                _station.PlayerInventory.Add(inventory);
                OnHangarChanged();
            }
        }
 public InventoryActionClickedArgs(string action, Inventory inventory, string name, decimal credits)
 {
     this.Action = action;
     this.Inventory = inventory;
     this.Name = name;
     this.Credits = credits;
 }
        private async void SwapShip(InventoryEntry entry)
        {
            const double STARTPERCENT = .25;        // don't make it too high, or they will cheat and switch ships to refuel



            //TODO: Remember the cargo in a separate object
            //TODO: Remember the part damage in a separate object



            // Remove the old entry
            RemoveFrom_Cargo_Hangar_Neaby(entry);

            // Store the old ship
            if (_player.Ship != null)
            {
                Inventory prevInventory = new Inventory(_player.Ship.GetNewDNA(), 1d);
                string prevName = GetName_Ship(prevInventory.Ship);

                StoreIn_Hangar_Nearby(prevInventory, prevName);
            }

            //NOTE: Grabbing this now, because the ship creation is async, and station could be null
            // by the time it's finished
            Point3D stationPosition = _station.PositionWorld;

            // Need to do this now so that the old ship is off the map before adding a new one (the new one sometimes goes flying from the collision)
            _player.Ship = null;

            // Create the new ship
            ShipPlayer ship = ShipPlayer.GetNewShip(entry.Inventory.Ship, _world, _material_Ship, _map, _shipExtra);

            if (ship.Energy != null)
            {
                ship.Energy.QuantityCurrent = ship.Energy.QuantityMax * STARTPERCENT;
            }
            if (ship.Plasma != null)
            {
                ship.Plasma.QuantityCurrent = ship.Plasma.QuantityMax * STARTPERCENT;
            }
            if (ship.Fuel != null)
            {
                ship.Fuel.QuantityCurrent = ship.Fuel.QuantityMax * STARTPERCENT;
            }
            if (ship.Ammo != null)
            {
                ship.Ammo.QuantityCurrent = ship.Ammo.QuantityMax * STARTPERCENT;
            }
            ship.RecalculateMass();

            ship.PhysicsBody.Position = new Point3D(stationPosition.X, stationPosition.Y, 0);
            ship.PhysicsBody.Velocity = new Vector3D(0, 0, 0);
            ship.PhysicsBody.AngularVelocity = new Vector3D(0, 0, 0);

            _player.Ship = ship;        // the ship changed event listener will add the ship to the map
        }
        private void StoreIn_Mineral_Part_Ship(Inventory inventory)
        {
            _station.StationInventory.Add(inventory);

            if (inventory.Ship != null)
            {
                AddStationShipGraphic(inventory);
            }
            else if (inventory.Part != null)
            {
                AddStationPartGraphic(inventory);
            }
            else if (inventory.Mineral != null)
            {
                AddStationMineralGraphic(inventory);
            }
            else
            {
                throw new ArgumentException("Unknown type of inventory");
            }
        }
        private void ScrapShip(InventoryEntry entry)
        {
            if (entry == null || entry.Inventory == null || entry.Inventory.Ship == null)
            {
                throw new ArgumentException("entry is/contains null");
            }

            // Remove the old entry
            RemoveFrom_Cargo_Hangar_Neaby(entry);

            // Pull all the parts out of the ship, and turn them into inventory
            foreach (ShipPartDNA part in entry.Inventory.Ship.PartsByLayer.Values.SelectMany(o => o))
            {
                Inventory inventory = new Inventory(part);
                string name = GetName(inventory);

                StoreIn_Cargo_Hangar_Nearby(inventory, name);
            }
        }
        private void btnLoadShipFromFile_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                string foldername = System.IO.Path.Combine(UtilityCore.GetOptionsFolder(), ShipEditorWindow.SHIPFOLDER);

                ShipSelectorWindow dialog = new ShipSelectorWindow(foldername, _world);
                dialog.WindowStartupLocation = WindowStartupLocation.CenterScreen;

                bool? dialogResult = dialog.ShowDialog();

                if (dialogResult == null || !dialogResult.Value)
                {
                    return;
                }

                foreach (ShipDNA dna in dialog.SelectedItems)
                {
                    Inventory inventory = new Inventory(dna, 1);

                    _station.StationInventory.Add(inventory);
                    AddStationShipGraphic(inventory);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), TITLE, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
 //TODO: There should be a viewmodel instead of implementing all of this list->panel logic here
 public void AddInventory(Inventory inventory, bool isPlayerOwned)
 {
     if (isPlayerOwned)
     {
         string name = GetName(inventory);
         StoreIn_Hangar_Nearby(inventory, name);
     }
     else
     {
         StoreIn_Mineral_Part_Ship(inventory);
     }
 }
        private void StoreInStation(Cargo cargo)
        {
            Inventory inventory;
            if (cargo is Cargo_Mineral)
            {
                Cargo_Mineral cargoMineral = (Cargo_Mineral)cargo;
                MineralDNA mineralDNA = ItemOptionsAstMin2D.GetMineral(cargoMineral.MineralType, cargoMineral.Volume);
                inventory = new Inventory(mineralDNA);
            }
            else if (cargo is Cargo_ShipPart)
            {
                Cargo_ShipPart cargoPart = (Cargo_ShipPart)cargo;
                inventory = new Inventory(cargoPart.PartDNA);
            }
            else
            {
                throw new ApplicationException("Unknown type of cargo: " + cargo.GetType().ToString());
            }

            _spaceDock.AddInventory(inventory, true);
        }
        private void StoreIn_Cargo_Hangar_Nearby(Inventory inventory, string name)
        {
            Cargo cargo = null;
            if (inventory.Mineral != null)
            {
                cargo = new Cargo_Mineral(inventory.Mineral.MineralType, inventory.Mineral.Density, inventory.Mineral.Volume);
            }
            else if (inventory.Part != null)
            {
                cargo = new Cargo_ShipPart(inventory.Part, _itemOptions, _editorOptions);
            }
            else
            {
                throw new ApplicationException("finish this");
            }

            if (_player.Ship.CargoBays != null && _player.Ship.CargoBays.Add(cargo))
            {
                AddShipCargoGraphic(inventory);
            }
            else
            {
                StoreIn_Hangar_Nearby(inventory, name);
            }
        }
        private static Icon3D BuildIcon(Inventory inventory, World world, EditorOptions options, FrameworkElement parent)
        {
            Icon3D retVal = null;

            if (inventory.Ship != null)
            {
                retVal = new Icon3D("", inventory.Ship, world);       // don't want to autorotate the ship icons.  This is a 2D game, and the ships will always be viewed from the top
            }
            else if (inventory.Part != null)
            {
                retVal = new Icon3D(inventory.Part, options)
                {
                    AutoRotateOnMouseHover = true,
                    AutoRotateParent = parent,
                };
            }
            else if (inventory.Mineral != null)
            {
                retVal = new Icon3D(inventory.Mineral.MineralType)
                {
                    AutoRotateOnMouseHover = true,
                    AutoRotateParent = parent,
                };
            }

            if (retVal != null)
            {
                retVal.ShowName = false;
                retVal.ShowBorder = false;
            }

            return retVal;
        }
        private void StoreIn_Nearby(Inventory inventory, string name)
        {
            // Create an entry with the sell price
            Tuple<decimal, decimal> credits = _station.GetPrice_Sell(inventory);

            string[] actions = inventory.Ship != null ?
                _actions_Player_FreeSpace_ship :
                _actions_Player_FreeSpace_nonship;

            InventoryEntry newEntry = new InventoryEntry();
            newEntry.SetInventory(inventory, name, credits.Item1 * credits.Item2, Convert.ToDouble(credits.Item2), null, _world, actions, _editorOptions);

            // Store it
            AddToPanel(pnlNearbyItems, newEntry);
            InventoryEntryAdded(newEntry);
        }
        public void SetInventory(Inventory inventory, string name, decimal credits, double? creditsPercent, double? volumePercent, World world, string[] actionButtons, EditorOptions options)
        {
            // Icon
            pnlIcon.Content = BuildIcon(inventory, world, options, this);

            // Name
            lblName.Text = name;

            if (inventory.Count == 1)
            {
                lblMultipleX.Visibility = Visibility.Collapsed;
                lblMultiple.Visibility = Visibility.Collapsed;
            }
            else
            {
                lblMultipleX.Visibility = Visibility.Visible;
                lblMultiple.Visibility = Visibility.Visible;
                lblMultiple.Text = inventory.Count.ToString("N0");
            }

            // Price
            lblPrice.Text = credits.ToString("N0");
            if (creditsPercent == null)
            {
                lblPricePercent.Visibility = Visibility.Collapsed;
            }
            else
            {
                lblPricePercent.Text = GetPercentText(creditsPercent.Value);
            }

            // Volume
            lblVolume.Text = Math.Round(inventory.Volume, 2).ToString();
            if (volumePercent == null)
            {
                lblVolumePercent.Visibility = Visibility.Collapsed;
            }
            else
            {
                lblVolumePercent.Text = GetPercentText(volumePercent.Value);
            }

            // Mass
            //lblMass.Text = Math.Round(inventory.Mass, 2).ToString();
            lblMass.Text = inventory.Mass.ToStringSignificantDigits(2);

            // Action Buttons
            pnlActionButtons.Children.Clear();

            switch (actionButtons.Length)
            {
                case 2:
                case 4:
                    pnlActionButtons.Columns = 2;
                    break;

                default:
                    pnlActionButtons.Columns = 3;
                    break;
            }

            pnlActionButtons.Rows = Convert.ToInt32(Math.Ceiling(actionButtons.Length / Convert.ToDouble(pnlActionButtons.Columns)));

            foreach (string action in actionButtons)
            {
                pnlActionButtons.Children.Add(new Button()
                {
                    Content = action
                });
            }

            // Store props
            this.Inventory = inventory;
            this.InventoryName = name;
            this.Credits = credits;
        }
Beispiel #19
0
        private void StoreInStation(ShipPartDNA dna)
        {
            Inventory inventory = new Inventory(dna);

            _spaceDock.AddInventory(inventory, true);
        }