/** * */ package de.urszeidler.shr5.webserver.mgnt; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpSession; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.swt.widgets.Display; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.collect.Collections2; import de.urszeidler.eclipse.shr5.gameplay.CombatTurn; import de.urszeidler.eclipse.shr5.gameplay.Command; import de.urszeidler.eclipse.shr5.gameplay.CommandWrapper; import de.urszeidler.eclipse.shr5.gameplay.GameplayPackage; import de.urszeidler.eclipse.shr5.gameplay.Probe; import de.urszeidler.eclipse.shr5.gameplay.SemanticAction; import de.urszeidler.eclipse.shr5.gameplay.SimpleAction; import de.urszeidler.eclipse.shr5.gameplay.SubjectCommand; import de.urszeidler.eclipse.shr5.gameplay.util.CommandCallback; import de.urszeidler.eclipse.shr5.runtime.RuntimeCharacter; import de.urszeidler.shr5.ecp.service.ScriptViewer; import de.urszeidler.shr5.ecp.util.ShadowrunEditingTools; import de.urszeidler.shr5.scripting.Placement; import de.urszeidler.shr5.scripting.Script; import de.urszeidler.shr5.webserver.Activator; /** * @author urs */ public class ScriptViewerWrapper implements ScriptViewer { public final class PlayerManager2RuntimeCharacterTransformer implements Function<PlayerManager, RuntimeCharacter> { @Override public RuntimeCharacter apply(PlayerManager input) { return input.getCharacter(); } } private ScriptViewer sv; private Map<PlayerManager, HttpSession> playerSessions = new HashMap<PlayerManager, HttpSession>(); // private List<PlayerManager> registeredPlayers = new ArrayList<PlayerManager>(); // private List<HttpSession> sessionList = new ArrayList<HttpSession>(); public ScriptViewerWrapper(ScriptViewer sv) { super(); this.sv = sv; } /* * (non-Javadoc) * @see de.urszeidler.shr5.ecp.service.ScriptViewer#setPlacement(de.urszeidler.shr5.scripting.Placement) */ @Override public void setPlacement(Placement placement) { sv.setPlacement(placement); } /* * (non-Javadoc) * @see de.urszeidler.shr5.ecp.service.ScriptViewer#setScript(de.urszeidler.shr5.scripting.Script) */ @Override public void setScript(Script script) { sv.setScript(script); } @Override public void sendMessage(RuntimeCharacter character, String message) { PlayerManager playerManager = getPlayerManager(character); if (playerManager != null) { playerManager.createDialog("Message", message); } } /* * (non-Javadoc) * @see de.urszeidler.shr5.ecp.service.ScriptViewer#getCmdCallback() */ @Override public CommandCallback getCmdCallback() { CommandCallback commandCallback = new CommandCallback() { @Override public boolean prepareCommand(Command cmd, EStructuralFeature... eStructuralFeatures) { // if (cmd instanceof SimpleAction) { // type new_name = (type)commandCallback; // // } if (cmd instanceof CommandWrapper || cmd instanceof SemanticAction|| cmd instanceof SimpleAction) return false; if (cmd instanceof CombatTurn) { CombatTurn ct = (CombatTurn)cmd; EList<Command> subCommands = ct.getSubCommands(); List<PlayerManager> pml = new ArrayList<PlayerManager>(); for (Command command : subCommands) { PlayerManager playerManager = getPlayerManager(command); if (playerManager != null) { List<EStructuralFeature> eAllStructuralFeatures_1 = new ArrayList<EStructuralFeature>(); eAllStructuralFeatures_1.add(GameplayPackage.Literals.INITATIVE__INI); eAllStructuralFeatures_1.add(GameplayPackage.Literals.INITATIVE__SIZE_INITATIVE); createDialog(command, playerManager, eAllStructuralFeatures_1); pml.add(playerManager); playerManager.setInCombat(true); } } waitForPlayers(pml.toArray(new PlayerManager[]{})); sv.getCmdCallback().prepareCommand(cmd, eStructuralFeatures); return true; } PlayerManager playerManager = getPlayerManager(cmd); if (playerManager != null) { if (cmd.equals(playerManager.getIgnoreCommand())) { playerManager.setCommandToIgnore(null); } else createDefaultDialog(cmd, playerManager, eStructuralFeatures); } else sv.getCmdCallback().prepareCommand(cmd, eStructuralFeatures); return true; } @Override public void beforeSubcommands(Command cmd, EStructuralFeature... eStructuralFeatures) { sv.getCmdCallback().beforeSubcommands(cmd, eStructuralFeatures); } @Override public void beforeExecute(Command cmd, EStructuralFeature... eStructuralFeatures) { PlayerManager playerManager = getPlayerManager(cmd); if (playerManager != null) { if (cmd.equals(playerManager.getIgnoreCommand())) { playerManager.setCommandToIgnore(null); } else createDefaultDialog(cmd, playerManager, eStructuralFeatures); } else sv.getCmdCallback().beforeExecute(cmd, eStructuralFeatures); } @Override public void afterCommand(Command cmd, EStructuralFeature... eStructuralFeatures) { if (cmd instanceof CombatTurn) { CombatTurn ct = (CombatTurn)cmd; EList<RuntimeCharacter> combatants = ct.getCombatants(); for (RuntimeCharacter runtimeCharacter : combatants) { PlayerManager playerManager = getPlayerManager(runtimeCharacter); if (playerManager != null) playerManager.setInCombat(false); } } sv.getCmdCallback().afterCommand(cmd, eStructuralFeatures); } }; return commandCallback; } public Set<PlayerManager> getRegisteredPlayers() { return playerSessions.keySet(); } /** * @param cmd * @return */ protected PlayerManager getPlayerManager(Command cmd) { if (cmd instanceof SubjectCommand) { SubjectCommand sc = (SubjectCommand)cmd; RuntimeCharacter subject = sc.getSubject(); return getPlayerManager(subject); } return null; } /** * @param subject * @return */ private PlayerManager getPlayerManager(RuntimeCharacter subject) { for (PlayerManager pm : playerSessions.keySet()) { if (pm.getCharacter() == subject) return pm; } return null; } /** * Creates the player dialogs and wait for the end of the player dialog. * * @param cmd * @param playerManager * @param eStructuralFeatures */ private void createDefaultDialog(Command cmd, final PlayerManager playerManager, EStructuralFeature... eStructuralFeatures) { sv.getCmdCallback().prepareCommand(cmd, eStructuralFeatures); if (cmd.isHidden()) return; List<EStructuralFeature> eAllStructuralFeatures_1 = new ArrayList<EStructuralFeature>(); if (cmd instanceof Probe) { eAllStructuralFeatures_1.add(GameplayPackage.Literals.PROBE__SKIP_TEST); eAllStructuralFeatures_1.add(GameplayPackage.Literals.PROBE__SUCCESSES); eAllStructuralFeatures_1.add(GameplayPackage.Literals.PROBE__GLITCHES); if (playerManager.getCharacter().canUseEdge()) { eAllStructuralFeatures_1.add(GameplayPackage.Literals.PROBE__PUSH_THE_LIMIT); eAllStructuralFeatures_1.add(GameplayPackage.Literals.PROBE__SECOND_CHANCE); } } else if (cmd instanceof SemanticAction) { eAllStructuralFeatures_1.add(GameplayPackage.Literals.SEMANTIC_ACTION__MESSAGE); } createDialog(cmd, playerManager, eAllStructuralFeatures_1); waitForPlayers(playerManager); } /** * @param playerManager */ private void waitForPlayers(final PlayerManager... playerManager) { try { IRunnableWithProgress op = new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { Joiner on = Joiner.on(','); String allNames = on.join(Collections2.transform( Collections2.transform(Arrays.asList(playerManager), new PlayerManager2RuntimeCharacterTransformer()), ShadowrunEditingTools.eObject2StringTransformer())); monitor.setTaskName("Waiting for the players : " + allNames); while (!monitor.isCanceled()) { Thread.sleep(300); boolean allFinished = true; for (PlayerManager playerManager2 : playerManager) { allFinished = allFinished && playerManager2.getCurrentDialog() == null; } if (allFinished) return; } return; } }; new ProgressMonitorDialog(Display.getCurrent().getActiveShell()).run(true, true, op); } catch (InvocationTargetException e) { Activator.logError(e); } catch (InterruptedException e) { Activator.logError(e); } } /** * Creates the player dialogs and wait for the end of the player dialog. * * @param cmd * @param playerManager * @param eAllStructuralFeatures_1 */ private void createDialog(Command cmd, final PlayerManager playerManager, List<EStructuralFeature> eAllStructuralFeatures_1) { playerManager.createDialog(cmd, eAllStructuralFeatures_1.toArray(new EStructuralFeature[]{})); // new MessageBox(Display.getCurrent().getActiveShell()).open(); } public ScriptViewer getSv() { return sv; } public PlayerManager2RuntimeCharacterTransformer createPlayerManager2RuntimeCharacterTransformer() { return new PlayerManager2RuntimeCharacterTransformer(); } /** * Remove the player and it's session. * @param pm */ public void removePlayer(PlayerManager pm) { try { HttpSession session = playerSessions.get(pm); if (session != null){ session.invalidate(); } } catch (Exception e) { } playerSessions.remove(pm); } public void addSession(PlayerManager pm, HttpSession session) { playerSessions.put(pm, session); } public HttpSession getSessions(PlayerManager pm) { return playerSessions.get(pm); } }