1 package nl.tudelft.goal.unreal.actions;
2
3 import cz.cuni.amis.utils.exception.PogamutException;
4
5 /**
6 * Basic class for actions executed by the {@link UT3BotBehavior}. Before
7 * actions are executed they are are queued up in the {@link ActionQueue}. To
8 * ensure the queue does not overflow the ActionQueue checks which actions can
9 * replace other actions in the queue and if this action would have any effect.
10 *
11 * Actions can be replaced when executing this action after them would have no
12 * effect. This is indicated by using the {@link #setReplaces(Class...)} method.
13 *
14 * Actions have no effect if there is an action in the queue which prevents this
15 * action from having any effect. this is indicated by using the
16 * {@link #setBlockedBy(Class...)} .
17 *
18 *
19 */
20 public abstract class Action {
21
22 @SuppressWarnings("unchecked")
23 private Class<? extends Action>[] replaces = new Class[0];
24 @SuppressWarnings("unchecked")
25 private Class<? extends Action>[] blocks = new Class[0];
26
27 public abstract void execute() throws PogamutException;
28
29 /**
30 * Sets which actions will have no effect if this action is executed after
31 * them.
32 *
33 * @param replaces
34 */
35 public void setReplaces(Class<? extends Action>... replaces) {
36 this.replaces = replaces;
37 }
38
39 /**
40 * Returns true if executing the argument action before this action will
41 * have no effect. This action overrides all effects of the argument action.
42 *
43 * @param action
44 * @return
45 */
46 public boolean replaces(Action action) {
47
48 for (Class<? extends Action> replace : replaces) {
49 // Check if the class of the action is a (sub)class of the actions
50 // this action replaces
51 if (replace.isAssignableFrom(action.getClass())) {
52 return true;
53 }
54 }
55
56 return false;
57
58 }
59
60 /**
61 * Sets which actions will prevent this action from having any effect if
62 * executed after them.
63 *
64 * @param blocks
65 */
66 public void setBlockedBy(Class<? extends Action>... blocks) {
67 this.blocks = blocks;
68 }
69
70 /**
71 * Returns true if executing the argument action does not impede the
72 * execution of this action. When false executing this action after the
73 * argument action will have no effect.
74 *
75 * @param action
76 * @return
77 */
78 public boolean hasEffect(Action action) {
79
80 for (Class<? extends Action> block : blocks) {
81 // Check if the class of the action is a (sub)class of the actions
82 // this action is blocked by.
83 if (block.isAssignableFrom(action.getClass())) {
84 return false;
85 }
86 }
87
88 return true;
89
90 }
91
92 }