1 | package com.takenoko.engine; | |
2 | ||
3 | import com.takenoko.actions.Action; | |
4 | import com.takenoko.actions.ActionResult; | |
5 | import com.takenoko.actions.DefaultAction; | |
6 | import com.takenoko.actions.actors.MoveGardenerAction; | |
7 | import com.takenoko.actions.actors.MovePandaAction; | |
8 | import com.takenoko.actions.annotations.ActionAnnotation; | |
9 | import com.takenoko.actions.annotations.ActionCanBePlayedMultipleTimesPerTurn; | |
10 | import com.takenoko.actions.annotations.ActionType; | |
11 | import com.takenoko.actions.improvement.ApplyImprovementFromInventoryAction; | |
12 | import com.takenoko.actions.irrigation.DrawIrrigationAction; | |
13 | import com.takenoko.actions.irrigation.PlaceIrrigationFromInventoryAction; | |
14 | import com.takenoko.actions.objective.DrawObjectiveAction; | |
15 | import com.takenoko.actions.objective.RedeemObjectiveAction; | |
16 | import com.takenoko.actions.tile.DrawTileAction; | |
17 | import com.takenoko.weather.Windy; | |
18 | import java.util.ArrayList; | |
19 | import java.util.List; | |
20 | import java.util.Objects; | |
21 | ||
22 | /** This class is used to manage the actions of a bot. */ | |
23 | public class ActionManager { | |
24 | private static final int DEFAULT_NUMBER_OF_ACTIONS = 2; | |
25 | ||
26 | private static final List<Class<? extends DefaultAction>> DEFAULT_AVAILABLE_ACTIONS = | |
27 | List.of( | |
28 | DrawObjectiveAction.class, | |
29 | DrawTileAction.class, | |
30 | DrawIrrigationAction.class, | |
31 | MoveGardenerAction.class, | |
32 | MovePandaAction.class, | |
33 | RedeemObjectiveAction.class, | |
34 | PlaceIrrigationFromInventoryAction.class, | |
35 | ApplyImprovementFromInventoryAction.class); | |
36 | ||
37 | private int numberOfActions; | |
38 | private List<Class<? extends Action>> availableActions; | |
39 | private List<Class<? extends Action>> alreadyDoneActions = new ArrayList<>(); | |
40 | ||
41 | public ActionManager() { | |
42 | this.numberOfActions = DEFAULT_NUMBER_OF_ACTIONS; | |
43 | this.availableActions = new ArrayList<>(); | |
44 | } | |
45 | ||
46 | public ActionManager(ActionManager actionManager) { | |
47 | this.numberOfActions = actionManager.numberOfActions; | |
48 | this.availableActions = new ArrayList<>(actionManager.availableActions); | |
49 | this.alreadyDoneActions = new ArrayList<>(actionManager.alreadyDoneActions); | |
50 | } | |
51 | ||
52 | public ActionManager(int numberOfActions, List<Class<? extends Action>> availableActions) { | |
53 | this.numberOfActions = numberOfActions; | |
54 | this.availableActions = availableActions; | |
55 | } | |
56 | ||
57 | /** | |
58 | * Set the number of actions the bot can do in a turn. | |
59 | * | |
60 | * @param numberOfActions | |
61 | */ | |
62 | public void setNumberOfActions(int numberOfActions) { | |
63 | this.numberOfActions = numberOfActions; | |
64 | } | |
65 | ||
66 | /** | |
67 | * @return number of actions the bot can do in a turn | |
68 | */ | |
69 | protected int getNumberOfActions() { | |
70 |
1
1. getNumberOfActions : replaced int return with 0 for com/takenoko/engine/ActionManager::getNumberOfActions → KILLED |
return numberOfActions; |
71 | } | |
72 | ||
73 | /** | |
74 | * Return the list of available actions. If actions of FORCED type are available, only these | |
75 | * actions are returned else all available actions are returned. | |
76 | * | |
77 | * @return the list of available actions | |
78 | */ | |
79 | public List<Class<? extends Action>> getAvailableActions() { | |
80 | List<Class<? extends Action>> forcedActions = | |
81 | availableActions.stream() | |
82 | .filter( | |
83 | action -> | |
84 |
2
1. lambda$getAvailableActions$0 : negated conditional → KILLED 2. lambda$getAvailableActions$0 : replaced boolean return with true for com/takenoko/engine/ActionManager::lambda$getAvailableActions$0 → KILLED |
action.getAnnotation(ActionAnnotation.class).value() |
85 | == ActionType.FORCED) | |
86 | .toList(); | |
87 | ||
88 |
1
1. getAvailableActions : negated conditional → KILLED |
if (forcedActions.isEmpty()) { |
89 |
1
1. getAvailableActions : replaced return value with Collections.emptyList for com/takenoko/engine/ActionManager::getAvailableActions → KILLED |
return availableActions; |
90 | } else { | |
91 |
1
1. getAvailableActions : replaced return value with Collections.emptyList for com/takenoko/engine/ActionManager::getAvailableActions → KILLED |
return forcedActions; |
92 | } | |
93 | } | |
94 | ||
95 | /** | |
96 | * add an action to the list of available actions | |
97 | * | |
98 | * @param action the action to add | |
99 | */ | |
100 | public void addAvailableAction(Class<? extends Action> action) { | |
101 | this.availableActions.add(action); | |
102 | } | |
103 | ||
104 | /** | |
105 | * add a list of actions to the list of available actions | |
106 | * | |
107 | * @param actions the list of actions to add | |
108 | */ | |
109 | public void addAvailableActions(List<Class<? extends Action>> actions) { | |
110 | this.availableActions.addAll(actions); | |
111 | } | |
112 | ||
113 | /** add an action to the number of actions to plau this turn */ | |
114 | public void addAction() { | |
115 |
1
1. addAction : Replaced integer addition with subtraction → TIMED_OUT |
numberOfActions++; |
116 | } | |
117 | ||
118 | /** clear the list of available actions of the FORCED type */ | |
119 | private void clearForcedActions() { | |
120 | availableActions.removeIf( | |
121 | action -> | |
122 |
2
1. lambda$clearForcedActions$1 : negated conditional → KILLED 2. lambda$clearForcedActions$1 : replaced boolean return with true for com/takenoko/engine/ActionManager::lambda$clearForcedActions$1 → KILLED |
action.getAnnotation(ActionAnnotation.class).value() == ActionType.FORCED); |
123 | } | |
124 | ||
125 | /** | |
126 | * update an action in available actions | |
127 | * | |
128 | * @param action the action to update | |
129 | * @param actionResult the result of the action | |
130 | */ | |
131 | public void updateAvailableActions(Action action, ActionResult actionResult) { | |
132 | this.availableActions.remove(action.getClass()); | |
133 | this.alreadyDoneActions.add(action.getClass()); | |
134 |
1
1. updateAvailableActions : removed call to com/takenoko/engine/ActionManager::clearForcedActions → KILLED |
this.clearForcedActions(); |
135 |
1
1. updateAvailableActions : removed call to com/takenoko/engine/ActionManager::addAvailableActions → TIMED_OUT |
this.addAvailableActions(actionResult.availableActions()); |
136 |
2
1. updateAvailableActions : Replaced integer subtraction with addition → TIMED_OUT 2. updateAvailableActions : removed call to com/takenoko/engine/ActionManager::setNumberOfActions → TIMED_OUT |
this.setNumberOfActions(this.getNumberOfActions() - actionResult.cost()); |
137 | } | |
138 | ||
139 | /** | |
140 | * update to the defaults actions | |
141 | * | |
142 | * @param board the board | |
143 | */ | |
144 | public void updateDefaultActions(Board board, BotState botState) { | |
145 | availableActions.removeIf( | |
146 | action -> | |
147 |
2
1. lambda$updateDefaultActions$2 : replaced boolean return with true for com/takenoko/engine/ActionManager::lambda$updateDefaultActions$2 → TIMED_OUT 2. lambda$updateDefaultActions$2 : negated conditional → KILLED |
action.getAnnotation(ActionAnnotation.class).value() == ActionType.DEFAULT); |
148 | DEFAULT_AVAILABLE_ACTIONS.stream() | |
149 | .filter( | |
150 | actionClass -> | |
151 |
2
1. lambda$updateDefaultActions$4 : negated conditional → KILLED 2. lambda$updateDefaultActions$4 : replaced boolean return with true for com/takenoko/engine/ActionManager::lambda$updateDefaultActions$4 → KILLED |
DefaultAction.canBePlayed(board, botState, actionClass) |
152 |
1
1. lambda$updateDefaultActions$4 : negated conditional → TIMED_OUT |
&& (actionClass.isAnnotationPresent( |
153 | ActionCanBePlayedMultipleTimesPerTurn.class) | |
154 |
1
1. lambda$updateDefaultActions$4 : negated conditional → KILLED |
|| !alreadyDoneActions.contains(actionClass) |
155 | || board.getWeather() | |
156 |
2
1. lambda$updateDefaultActions$3 : replaced Boolean return with False for com/takenoko/engine/ActionManager::lambda$updateDefaultActions$3 → TIMED_OUT 2. lambda$updateDefaultActions$3 : replaced Boolean return with True for com/takenoko/engine/ActionManager::lambda$updateDefaultActions$3 → TIMED_OUT |
.map(v -> v.getClass().equals(Windy.class)) |
157 |
1
1. lambda$updateDefaultActions$4 : negated conditional → TIMED_OUT |
.orElse(false))) |
158 |
1
1. updateDefaultActions : removed call to java/util/stream/Stream::forEach → KILLED |
.forEach(actionClass -> availableActions.add(actionClass)); |
159 | } | |
160 | ||
161 | /** | |
162 | * reset the available actions | |
163 | * | |
164 | * @param board the board | |
165 | */ | |
166 | public void resetAvailableActions(Board board, BotState botState) { | |
167 | this.availableActions = new ArrayList<>(DEFAULT_AVAILABLE_ACTIONS); | |
168 | this.alreadyDoneActions = new ArrayList<>(); | |
169 |
1
1. resetAvailableActions : removed call to com/takenoko/engine/ActionManager::updateDefaultActions → TIMED_OUT |
updateDefaultActions(board, botState); |
170 | } | |
171 | ||
172 | /** | |
173 | * get the list of already done actions | |
174 | * | |
175 | * @return the list of already done actions | |
176 | */ | |
177 | public List<Class<? extends Action>> getAlreadyDoneActions() { | |
178 |
1
1. getAlreadyDoneActions : replaced return value with Collections.emptyList for com/takenoko/engine/ActionManager::getAlreadyDoneActions → TIMED_OUT |
return new ArrayList<>(alreadyDoneActions); |
179 | } | |
180 | ||
181 | public void reset() { | |
182 | this.numberOfActions = DEFAULT_NUMBER_OF_ACTIONS; | |
183 | this.availableActions = new ArrayList<>(); | |
184 | this.alreadyDoneActions = new ArrayList<>(); | |
185 | } | |
186 | ||
187 | @Override | |
188 | public boolean equals(Object o) { | |
189 |
2
1. equals : negated conditional → SURVIVED 2. equals : replaced boolean return with false for com/takenoko/engine/ActionManager::equals → NO_COVERAGE |
if (this == o) return true; |
190 |
3
1. equals : replaced boolean return with true for com/takenoko/engine/ActionManager::equals → NO_COVERAGE 2. equals : negated conditional → KILLED 3. equals : negated conditional → KILLED |
if (o == null || getClass() != o.getClass()) return false; |
191 | ActionManager that = (ActionManager) o; | |
192 |
2
1. equals : replaced boolean return with true for com/takenoko/engine/ActionManager::equals → SURVIVED 2. equals : negated conditional → KILLED |
return numberOfActions == that.numberOfActions |
193 |
1
1. equals : negated conditional → KILLED |
&& Objects.equals(availableActions, that.availableActions) |
194 |
1
1. equals : negated conditional → KILLED |
&& Objects.equals(alreadyDoneActions, that.alreadyDoneActions); |
195 | } | |
196 | ||
197 | @Override | |
198 | public int hashCode() { | |
199 |
1
1. hashCode : replaced int return with 0 for com/takenoko/engine/ActionManager::hashCode → SURVIVED |
return Objects.hash(numberOfActions, availableActions, alreadyDoneActions); |
200 | } | |
201 | } | |
Mutations | ||
70 |
1.1 |
|
84 |
1.1 2.2 |
|
88 |
1.1 |
|
89 |
1.1 |
|
91 |
1.1 |
|
115 |
1.1 |
|
122 |
1.1 2.2 |
|
134 |
1.1 |
|
135 |
1.1 |
|
136 |
1.1 2.2 |
|
147 |
1.1 2.2 |
|
151 |
1.1 2.2 |
|
152 |
1.1 |
|
154 |
1.1 |
|
156 |
1.1 2.2 |
|
157 |
1.1 |
|
158 |
1.1 |
|
169 |
1.1 |
|
178 |
1.1 |
|
189 |
1.1 2.2 |
|
190 |
1.1 2.2 3.3 |
|
192 |
1.1 2.2 |
|
193 |
1.1 |
|
194 |
1.1 |
|
199 |
1.1 |