/// <summary>
        /// Replaces one ConstructingBuilding with an IStructure.
        /// </summary>
        /// <param name="sender">ConstructingBuilding to be replaced</param>
        /// <param name="eventArgs">EventArgs containing new structure's definition</param>
        public void ReplaceBuilding(object sender, EventArgsWithPayload <IStructureDef> eventArgs)
        {
            if (!(sender is ConstructingBuildingController structure))
            {
                return;
            }

            //    Remove old structure
            DespawnStructure(structure);

            //    Add new structure
            BuildingFactory factory = new BuildingFactory(structure.Faction, Game);

            IStructure <IStructureDef> building = factory.CreateNewBuilding(structure.Def.CompletedBuildingDef);

            SpawnStructure(structure.StartCoords, building);
        }
        /// <summary>
        /// TODO move to (new) BalanceManager-class
        /// Calculates balance based on income and upkeep.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="eventArgs"></param>
        private void OnDayPassed(object sender, EventArgsWithPayload <IngameTime> eventArgs)
        {
            double balance = 0;

            using (ResourceCalculator resourceCalculator = new ResourceCalculator())
            {
                foreach (ResourceFactoryController resourceFactory in FactionModel.ResourceFactories)
                {
                    resourceCalculator.AddResource(resourceFactory.ResourceValue, resourceFactory.ResourceType);
                }

                balance += resourceCalculator.CalculateResourceWorth();
            }

            balance -= FactionModel.Buildings.Sum(structure => structure.Def.UpkeepCost);
            balance -= FactionModel.Units.Sum(unit => unit.UnitModel.Def.Upkeep);

            CurrencyController.AlterCurrency((float)balance);
        }
        public void OnRightClick(object sender, EventArgsWithPayload <MouseState> mouseEvent)
        {
            if (mouseEvent.Value.RightButton == ButtonState.Pressed)
            {
                BoxView.Coords = new FloatCoords()
                {
                    x = mouseEvent.Value.X, y = mouseEvent.Value.Y
                };
                BoxModel.Text.Coords = new FloatCoords()
                {
                    x = mouseEvent.Value.X, y = mouseEvent.Value.Y
                };
                BoxModel.Show = true;
            }

            if (mouseEvent.Value.LeftButton == ButtonState.Pressed)
            {
                BoxModel.Show = false;
            }
        }
        public void OnMouseStateChange(object sender, EventArgsWithPayload <MouseState> mouseEvent)
        {
            if (mouseEvent.Value.LeftButton != PreviousMouseState.LeftButton)
            {
                MouseInputStatus = mouseEvent.Value.LeftButton;
                MouseState temp = Mouse.GetState();
                GuiOrMap(new FloatCoords {
                    x = temp.X, y = temp.Y
                }, mouseEvent.Value, MouseButton.Left);
            }

            if (mouseEvent.Value.RightButton != PreviousMouseState.RightButton)
            {
                MouseInputStatus = mouseEvent.Value.RightButton;
                MouseState temp = Mouse.GetState();
                GuiOrMap(new FloatCoords {
                    x = temp.X, y = temp.Y
                }, mouseEvent.Value, MouseButton.Right);
            }


            PreviousMouseState = mouseEvent.Value;
        }