From a4a82c98a5103644677ba72c1fee93e01cbc09ec Mon Sep 17 00:00:00 2001 From: PawelSapula Date: Sun, 24 May 2026 15:29:14 +0200 Subject: [PATCH] feat: Implement Finish barebone MVC to finish the game. --- .../edu/ntnu/idi/idatt/view/SceneFactory.java | 16 +++ .../view/primary/finish/FinishController.java | 92 +++++++++++++++++ .../view/primary/finish/FinishModel.java | 21 ++++ .../idatt/view/primary/finish/FinishView.java | 98 +++++++++++++++++++ .../portfolio/PortfolioController.java | 21 ++++ .../view/primary/portfolio/PortfolioView.java | 1 + .../portfolio/sections/PlayerInfoSection.java | 12 ++- 7 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 src/main/java/edu/ntnu/idi/idatt/view/primary/finish/FinishController.java create mode 100644 src/main/java/edu/ntnu/idi/idatt/view/primary/finish/FinishModel.java create mode 100644 src/main/java/edu/ntnu/idi/idatt/view/primary/finish/FinishView.java diff --git a/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java b/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java index 5eb1390..a7d5d3e 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java @@ -2,6 +2,7 @@ import edu.ntnu.idi.idatt.model.market.Stock; import edu.ntnu.idi.idatt.session.UserSession; +import edu.ntnu.idi.idatt.storage.SessionManager; import edu.ntnu.idi.idatt.view.entry.StartController; import edu.ntnu.idi.idatt.view.entry.StartModel; import edu.ntnu.idi.idatt.view.entry.StartView; @@ -14,6 +15,9 @@ import edu.ntnu.idi.idatt.view.primary.exchange.ExchangeController; import edu.ntnu.idi.idatt.view.primary.exchange.ExchangeModel; import edu.ntnu.idi.idatt.view.primary.exchange.ExchangeView; +import edu.ntnu.idi.idatt.view.primary.finish.FinishController; +import edu.ntnu.idi.idatt.view.primary.finish.FinishModel; +import edu.ntnu.idi.idatt.view.primary.finish.FinishView; import edu.ntnu.idi.idatt.view.primary.stock.StockController; import edu.ntnu.idi.idatt.view.primary.stock.StockModel; import edu.ntnu.idi.idatt.view.primary.stock.StockView; @@ -148,4 +152,16 @@ public static Parent createNewspaperView(String symbol) { return view.getInstance(); } + public static Parent createFinishView() { + + FinishModel model = new FinishModel(); + FinishView view = new FinishView(); + FinishController controller = new FinishController(model); + + view.setController(controller); + + SessionManager.removeSession(); + return view.getInstance(); + } + } diff --git a/src/main/java/edu/ntnu/idi/idatt/view/primary/finish/FinishController.java b/src/main/java/edu/ntnu/idi/idatt/view/primary/finish/FinishController.java new file mode 100644 index 0000000..232afe2 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt/view/primary/finish/FinishController.java @@ -0,0 +1,92 @@ +package edu.ntnu.idi.idatt.view.primary.finish; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; + +import edu.ntnu.idi.idatt.model.portfolio.Share; +import edu.ntnu.idi.idatt.session.UserSession; +import edu.ntnu.idi.idatt.view.components.AbstractController; +import edu.ntnu.idi.idatt.view.util.CssUtils; +import javafx.scene.Parent; + +public class FinishController extends AbstractController { + + private UserSession session = UserSession.getInstance(); + + public FinishController(FinishModel model) { + super(model); + makeFinishedGameState(); + } + + public void makeFinishedGameState() { + // Sell all shares + + // Copy shares (Avoid ConcurrentModificationException) + ArrayList holdings = new ArrayList<>(session.getPlayer().getPortfolio().getShares()); + + // Sell + holdings.forEach(share -> session.getExchange().sell(share, session.getPlayer())); + + // Update gamestate + session.updateGameState(); + + } + + public String getWeek() { + return String.format("Week: %d", session.getExchange().getWeek()); + } + + public String getTransactionAmount() { + return String.format("Transactions made: %d", + session.getPlayer().getTransactionArchive().getTransactions().size()); + } + + public String getPlayerStatus() { + return String.format("Player status: %s", + session.getPlayer().getStatus()); + } + + public String getPlayerName() { + return String.format("Player name: %s", session.getPlayer().getName()); + } + + public String getTotalNetWorth() { + return String.format("Total net worth: %.2f $", + session.getPlayer().getMoney()); + } + + private BigDecimal calculateProfits() { + BigDecimal profit = session.getPlayer().getMoney().subtract( + session.getPlayer().getStartingMoney()); + return profit; + } + + private BigDecimal calculateROI() { + BigDecimal profit = session.getPlayer().getMoney().subtract( + session.getPlayer().getStartingMoney()); + BigDecimal profitPercent = profit.divide(session.getPlayer().getStartingMoney()).setScale(2, RoundingMode.HALF_UP); + + BigDecimal returnOfInvestement = profitPercent.multiply(new BigDecimal("100")); + + return returnOfInvestement; + } + + public String getProfits() { + return String.format("Total profits: %.2f $", + calculateProfits()); + } + + public String getROI() { + return String.format("Return of investement: %.2f %%", calculateROI()); + } + + public void setProfitsColor(Parent profitsLabel) { + CssUtils.apply(profitsLabel, CssUtils.generateValueColors(calculateProfits())); + } + + public void setRoiColor(Parent roiLabel) { + CssUtils.apply(roiLabel, CssUtils.generateValueColors(calculateROI())); + } + +} diff --git a/src/main/java/edu/ntnu/idi/idatt/view/primary/finish/FinishModel.java b/src/main/java/edu/ntnu/idi/idatt/view/primary/finish/FinishModel.java new file mode 100644 index 0000000..d4182c3 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt/view/primary/finish/FinishModel.java @@ -0,0 +1,21 @@ +package edu.ntnu.idi.idatt.view.primary.finish; + +import java.math.BigDecimal; + +import edu.ntnu.idi.idatt.view.components.Model; +import javafx.beans.property.SimpleObjectProperty; + +public class FinishModel implements Model { + + private final SimpleObjectProperty profitProperty = new SimpleObjectProperty<>(); + private final SimpleObjectProperty roiProperty = new SimpleObjectProperty<>(); + + public SimpleObjectProperty getProfitProperty() { + return profitProperty; + } + + public SimpleObjectProperty getRoiProperty() { + return roiProperty; + } + +} diff --git a/src/main/java/edu/ntnu/idi/idatt/view/primary/finish/FinishView.java b/src/main/java/edu/ntnu/idi/idatt/view/primary/finish/FinishView.java new file mode 100644 index 0000000..5190dbc --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt/view/primary/finish/FinishView.java @@ -0,0 +1,98 @@ +package edu.ntnu.idi.idatt.view.primary.finish; + +import java.math.BigDecimal; +import java.util.List; + +import edu.ntnu.idi.idatt.view.SceneFactory; +import edu.ntnu.idi.idatt.view.SceneManager; +import edu.ntnu.idi.idatt.view.components.AbstractView; +import edu.ntnu.idi.idatt.view.components.ui.UICompositor; +import edu.ntnu.idi.idatt.view.util.CssUtils; +import javafx.application.Platform; +import javafx.geometry.Pos; +import javafx.scene.Parent; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.layout.HBox; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; + +public class FinishView extends AbstractView { + + public FinishView() { + StackPane root = new StackPane(); + super(root); + root.getStyleClass().add("dark"); + } + + Label playerName; + Label playerStatus; + Label weeksPassed; + Label transactionsAmount; + Label totalNetWorth; + Label totalProfits; + Label returnOfInvestement; + + Button newGame; + Button exit; + + @Override + public Parent createContent() { + + Label title = new Label("Finished game! - Summary"); + CssUtils.apply(title, CssUtils.BIG_TEXT_32); + + playerName = new Label(); + playerStatus = new Label(); + weeksPassed = new Label(); + transactionsAmount = new Label(); + totalNetWorth = new Label(); + totalProfits = new Label(); + returnOfInvestement = new Label(); + + List