1 package cz.cuni.amis.pogamut.ut2004.agent.module.logic;
2
3 import java.util.logging.Level;
4 import java.util.logging.Logger;
5
6 import com.google.inject.Inject;
7
8 import cz.cuni.amis.pogamut.base.agent.module.IAgentLogic;
9 import cz.cuni.amis.pogamut.base.communication.command.ICommandListener;
10 import cz.cuni.amis.pogamut.base.communication.worldview.object.IWorldObjectEvent;
11 import cz.cuni.amis.pogamut.base.communication.worldview.react.EventReact;
12 import cz.cuni.amis.pogamut.base.communication.worldview.react.ObjectEventReact;
13 import cz.cuni.amis.pogamut.base.component.controller.ComponentDependencies;
14 import cz.cuni.amis.pogamut.base.component.controller.ComponentDependencyType;
15 import cz.cuni.amis.pogamut.base3d.ILockableVisionWorldView;
16 import cz.cuni.amis.pogamut.ut2004.bot.impl.UT2004Bot;
17 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbcommands.Respawn;
18 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange;
19 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.EndMessage;
20
21 public class SyncUT2004BotLogic<BOT extends UT2004Bot<? extends ILockableVisionWorldView, ?, ?>> extends UT2004BotLogic<BOT> {
22
23 private ObjectEventReact<ConfigChange, ?> configChangeReaction;
24
25 private EventReact<EndMessage> endReactionAfterRespawn;
26 private int shouldExecuteLogicLatch = 0;
27
28 private ICommandListener<Respawn> respawnListener = new ICommandListener<Respawn>() {
29
30 @Override
31 public void notify(Respawn event) {
32 synchronized(respawnListener) {
33 endReactionAfterRespawn.enable();
34 shouldExecuteLogicLatch = 2;
35 }
36 }
37
38 };
39
40 @Inject
41 public SyncUT2004BotLogic(BOT agent, IAgentLogic logic) {
42 this(agent, logic, null, new ComponentDependencies(ComponentDependencyType.STARTS_AFTER).add(agent.getWorldView()));
43 }
44
45 public SyncUT2004BotLogic(BOT agent, IAgentLogic logic, Logger log) {
46 this(agent, logic, log, new ComponentDependencies(ComponentDependencyType.STARTS_AFTER).add(agent.getWorldView()));
47 }
48
49 public SyncUT2004BotLogic(BOT agent, IAgentLogic logic, Logger log, ComponentDependencies dependencies) {
50 super(agent, logic, log, dependencies);
51 endReactionAfterRespawn = new EventReact<EndMessage>(EndMessage.class, agent.getWorldView()) {
52 @Override
53 protected void react(EndMessage event) {
54 synchronized(respawnListener) {
55 if (shouldExecuteLogicLatch > 0) {
56 --shouldExecuteLogicLatch;
57 }
58 }
59 }
60 };
61 agent.getAct().addCommandListener(Respawn.class, respawnListener);
62
63 configChangeReaction = new ObjectEventReact<ConfigChange, IWorldObjectEvent<ConfigChange>>(ConfigChange.class, agent.getWorldView()) {
64 @Override
65 protected void react(IWorldObjectEvent<ConfigChange> event) {
66 setLogicFrequency(1 / (Math.max(0.05, event.getObject().getVisionTime() - 0.049)));
67 }
68 };
69 }
70
71 @Override
72 protected void beforeLogic(String threadName) {
73 super.beforeLogic(threadName);
74 if (log.isLoggable(Level.FINEST)) log.finest(threadName + ": Locking world view.");
75 agent.getWorldView().lock();
76 if (log.isLoggable(Level.FINER)) log.finer(threadName + ": World view locked.");
77 }
78
79 @Override
80 protected void afterLogic(String threadName) {
81 super.afterLogic(threadName);
82 if (log.isLoggable(Level.FINEST)) log.finest(threadName + ": Unlocking world view.");
83 agent.getWorldView().unlock();
84 if (log.isLoggable(Level.FINER)) log.finer(threadName + ": World view unlocked.");
85 }
86
87 @Override
88 protected void afterLogicException(String threadName, Throwable e) {
89 super.afterLogicException(threadName, e);
90 if (agent.getWorldView().isLocked()) {
91 if (log.isLoggable(Level.FINEST)) log.finest("Unlocking world view.");
92 agent.getWorldView().unlock();
93 if (log.isLoggable(Level.FINER)) log.finer("World view unlocked.");
94 }
95 }
96
97 @Override
98 protected boolean shouldExecuteLogic() {
99 synchronized(respawnListener) {
100 if (shouldExecuteLogicLatch != 0) {
101 if (log.isLoggable(Level.INFO)) log.info("Respawn command sensed - waiting for the bot respawn to execute logic with correct world view state.");
102 return false;
103 } else {
104 return true;
105 }
106 }
107 }
108
109 }