/*
* 作成日: 2008/06/12
*/
package jp.ac.fit.asura.nao.strategy.schedulers;
import java.util.HashMap;
import java.util.Map;
import jp.ac.fit.asura.nao.RobotContext;
import jp.ac.fit.asura.nao.strategy.GameState;
import jp.ac.fit.asura.nao.strategy.Role;
import jp.ac.fit.asura.nao.strategy.StrategyContext;
import jp.ac.fit.asura.nao.strategy.TaskManager;
/**
*
* RoboCup用のストラテジを実装しているスケジューラ.
*
* このスケジューラはStrategyTaskによって、Roleを切り替えています(Strategyパターン).
*
* ペナライズ時の処理、状態切り替え時の処理なども実装.
*
* @author $Author: sey $
*
* @version $Id: StrategySchedulerTask.java 709 2008-11-23 07:40:31Z sey $
*
*/
public class StrategySchedulerTask extends BasicSchedulerTask {
private Map<Role, StrategyTask> strategyTasks;
private StrategyTask currentStrategy;
private GameState currentState;
private boolean lastPenalized;
public String getName() {
return StrategySchedulerTask.class.getSimpleName();
}
/**
*
*/
public StrategySchedulerTask() {
strategyTasks = new HashMap<Role, StrategyTask>();
currentState = null;
lastPenalized = false;
}
public void init(RobotContext context) {
super.init(context);
TaskManager taskManager = context.getStrategy().getTaskManager();
strategyTasks.put(Role.Goalie, (StrategyTask) taskManager
.find("GoalieStrategyTask"));
strategyTasks.put(Role.Striker, (StrategyTask) taskManager
.find("StrikerStrategyTask"));
// strategyTasks.put(Role.Libero, (StrategyTask) taskManager
// .find("LiberoStrategyTask"));
strategyTasks.put(Role.Libero, (StrategyTask) taskManager
.find("StrikerStrategyTask"));
// strategyTasks.put(Role.Defender, (StrategyTask) taskManager
// .find("DefenderStrategyTask"));
strategyTasks.put(Role.Defender, (StrategyTask) taskManager
.find("DefenderStrategyTask"));
}
public void continueTask(StrategyContext context) {
// ストラテジを切り替える
if (currentStrategy != strategyTasks.get(context.getRole())) {
if (currentStrategy != null)
currentStrategy.leave(context);
currentStrategy = strategyTasks.get(context.getRole());
currentStrategy.enter(context);
}
if (currentState != context.getGameState()) {
// ゲームステートが変更された場合はタスクをすべてキャンセルして再スケジューリング
clearQueue();
setTTL(0);
currentState = context.getGameState();
}
// ペナライズ状態が変更された場合はキャンセルして再スケジューリング
if (lastPenalized != context.isPenalized())
context.getScheduler().abort();
lastPenalized = context.isPenalized();
super.continueTask(context);
}
protected void fillQueue(StrategyContext context) {
// RoboCup用のスケジュール動作
switch (currentState) {
case PLAYING: {
// PLAY中はStrategyTaskに処理を委譲
if (lastPenalized)
pushQueue(context.findTask("InitialTask"));
else
currentStrategy.fillQueue(context);
assert !queue.isEmpty();
break;
}
case SET:
// LookAroundがびみょーなのでオフに.
// pushQueue(context.findTask("LookAroundTask"));
pushQueue(context.findTask("InitialTask"));
break;
case READY:
// pushQueue(context.findTask("GotoReadyPositionTask"));
pushQueue(context.findTask("InitialTask"));
break;
default: {
pushQueue(context.findTask("InitialTask"));
break;
}
}
}
}