Coverage Summary for Class: MoveMotherNature (it.polimi.ingsw.Controller.Actions)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
MoveMotherNature |
100%
(1/1)
|
100%
(3/3)
|
64,3%
(9/14)
|
93,8%
(15/16)
|
1 package it.polimi.ingsw.Controller.Actions;
2
3 import it.polimi.ingsw.Exceptions.Input.GenericInputValidationException;
4 import it.polimi.ingsw.Exceptions.Input.InputValidationException;
5 import it.polimi.ingsw.Exceptions.Input.InvalidElementException;
6 import it.polimi.ingsw.Misc.OptionalValue;
7 import it.polimi.ingsw.Model.AssistantCard;
8 import it.polimi.ingsw.Model.Model;
9 import it.polimi.ingsw.Model.PlayerBoard;
10
11 import java.io.Serial;
12 import java.util.List;
13
14 import static it.polimi.ingsw.Misc.Utils.countSimilarClassOccurrences;
15
16 /**
17 * This {@link PlayerAction} allows the caller to move the mother nature entity forward by a specified amount. This action
18 * is linked to the Action Phase.
19 */
20 public class MoveMotherNature extends PlayerAction {
21 @Serial
22 private static final long serialVersionUID = 204L; // convention: 2 for controller, (01 -> 99) for objects
23
24 private final int distanceToMove;
25
26 /**
27 * Create a new instance of this class with the following inputs:
28 *
29 * @param playerBoardId the ID of the current {@link PlayerBoard}
30 * @param distanceToMove the amount of distance Mother Nature is going to be moved
31 */
32 public MoveMotherNature(int playerBoardId, int distanceToMove) {
33 super(playerBoardId, true);
34 this.distanceToMove = distanceToMove;
35 }
36
37 /**
38 * {@inheritDoc}
39 * <ul>
40 * <li>This action can be called only after having used all possible {@link MoveStudent} actions</li>
41 * <li>The previous {@link PlayerAction}s must be either {@link MoveStudent} or {@link PlayCharacterCard}</li>
42 * <li>The distance declared to move must be within acceptable ranges</li>
43 * </ul>
44 *
45 * @param history the controller stores a {@link List} of previous {@link PlayerAction}s related to the player taking
46 * the current turn (at every new turn, the history is cleared).
47 * Some actions may use this {@link List} to check for duplicates.
48 * @param ctx a reference to {@link Model}. Some actions may use this reference to check for consistency between what
49 * the actions declares and what the Model offers.
50 * @return An empty {@link OptionalValue} in case of a successful validation. Otherwise the returned {@link OptionalValue}
51 * contains the related {@link InputValidationException}
52 */
53 @Override
54 protected OptionalValue<InputValidationException> customValidation(List<PlayerAction> history, Model ctx) {
55 PlayerBoard currentPlayer = ctx.getMutableTurnOrder().getMutableCurrentPlayer();
56 int maxCount = ctx.getMutablePlayerBoards().size() == 3 ? 4 : 3;
57 OptionalValue<AssistantCard> optionalAssistantCard = ctx.getMutableTurnOrder().getMutableSelectedCard(currentPlayer);
58 if (!(countSimilarClassOccurrences(MoveStudent.class, history) == maxCount)) {
59 return OptionalValue.of(new GenericInputValidationException("History", "MotherNature can't be moved before having placed all " + maxCount + " pawns"));
60 }
61 if (!(history.get(history.size() - 1).getClass() == MoveStudent.class || (history.get(history.size() - 1).getClass() == PlayCharacterCard.class))) {
62 return OptionalValue.of(new GenericInputValidationException("History", "This action can only be executed after a MoveStudent action or PlayCharacterCard action"));
63 }
64 int maxMovement = optionalAssistantCard.get().getMaxMovement();
65 if (!(distanceToMove >= 1 &&
66 distanceToMove <= (ctx.getMutableEffects().isMotherNatureMovementIncreased() ?
67 maxMovement + 2 : maxMovement)
68 )) {
69 return OptionalValue.of(new InvalidElementException("DistanceToMove"));
70 }
71 return OptionalValue.empty();
72 }
73
74 @Override
75 public void unsafeExecute(Model ctx) {
76 ctx.moveAndActMotherNature(distanceToMove);
77 }
78
79 }