package de.urszeidler.shr5.runtime.ui.editor.pages; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Spinner; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.FluentIterable; import de.urszeidler.eclipse.shr5.AbstaktFernKampfwaffe; import de.urszeidler.eclipse.shr5.AbstraktGegenstand; import de.urszeidler.eclipse.shr5.Fertigkeit; import de.urszeidler.eclipse.shr5.FeuerModus; import de.urszeidler.eclipse.shr5.Feuerwaffe; import de.urszeidler.eclipse.shr5.Kleidung; import de.urszeidler.eclipse.shr5.Nahkampfwaffe; import de.urszeidler.eclipse.shr5.ShrList; 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.ComplexAction; import de.urszeidler.eclipse.shr5.gameplay.DamageTest; import de.urszeidler.eclipse.shr5.gameplay.DefensTestCmd; import de.urszeidler.eclipse.shr5.gameplay.ExecutionProtocol; import de.urszeidler.eclipse.shr5.gameplay.GameplayFactory; import de.urszeidler.eclipse.shr5.gameplay.Initative; import de.urszeidler.eclipse.shr5.gameplay.InitativePass; import de.urszeidler.eclipse.shr5.gameplay.MeeleAttackCmd; import de.urszeidler.eclipse.shr5.gameplay.RangedAttackCmd; import de.urszeidler.eclipse.shr5.gameplay.SimpleAction; import de.urszeidler.eclipse.shr5.gameplay.SkillTestCmd; import de.urszeidler.eclipse.shr5.gameplay.SubjectCommand; import de.urszeidler.eclipse.shr5.gameplay.util.CommandCallback; import de.urszeidler.eclipse.shr5.gameplay.util.GameplayTools; import de.urszeidler.eclipse.shr5.runtime.RuntimeCharacter; import de.urszeidler.eclipse.shr5.runtime.Team; import de.urszeidler.eclipse.shr5.runtime.Zustand; import de.urszeidler.eclipse.shr5.util.AdapterFactoryUtil; import de.urszeidler.eclipse.shr5.util.ShadowrunTools; import de.urszeidler.eclipse.shr5.util.ShadowrunTools.DamageCode; import de.urszeidler.eclipse.shr5Management.ManagedCharacter; import de.urszeidler.emf.commons.ui.util.EmfFormBuilder.ReferenceManager; import de.urszeidler.shr5.ecp.editor.pages.AbstractShr5Page; import de.urszeidler.shr5.ecp.service.CombatViewer; import de.urszeidler.shr5.ecp.service.ScriptService; import de.urszeidler.shr5.ecp.service.ScriptViewer; import de.urszeidler.shr5.scripting.Placement; import de.urszeidler.shr5.scripting.Script; import de.urszeidler.shr5.scripting.ScriptingFactory; import de.urszeidler.shr5.scripting.Scripts; public class PlacementSimulationPage extends AbstractShr5Page<Placement> { // private DataBindingContext m_bindingContext; private Placement object; private EditingDomain editingDomain; private Label lblNewLabel; private Text text; // private IObservableList printedProtocol; private Map<Object, CharacterMetrik> metric = new HashMap<Object, PlacementSimulationPage.CharacterMetrik>(); // private Map<Boolean, CharacterMetrik> playerMetric = new HashMap<Boolean, PlacementSimulationPage.CharacterMetrik>(); private Group grpType; private CCombo combo; private Composite composite; private Table table; // private Collection<CharacterMetrik> cm; // private WritableList list = new WritableList(); private TableViewer tableViewer; // private TableColumn tblclmnNewColumn; // private TableColumn tblclmnNewColumn_1; // private TableColumn tblclmnNewColumn_2; // private CharacterMetrik m; private TableColumn tblclmnName; private TableViewerColumn tableViewerColumn; private TableColumn tblclmnAttack; private TableViewerColumn tableViewerColumn_1; private TableColumn tblclmnDefense; private TableViewerColumn tableViewerColumn_2; private TableColumn tblclmnDamage; private TableViewerColumn tableViewerColumn_3; private TableColumn tblclmnIni; private TableViewerColumn tableViewerColumn_4; private Spinner spinner; private Composite composite_1; private Label lblRounds; private Label lblRuns; private ProgressBar progressBar; public class RCStatePredicate implements Predicate<RuntimeCharacter> { @Override public boolean apply(RuntimeCharacter input) { return input.getZustand() == Zustand.OK; } } public enum AttackType { melee, range1 } private class ScriptPlacementSimulator implements ScriptViewer, CombatViewer { private AttackType defaultAttacktype = AttackType.melee; private PlacementMetric pmetric = new PlacementMetric(); private CombatTurn combatTurn; private ScriptService scriptService; private CommandCallback simulationCallback; private List<RuntimeCharacter> enemies = new ArrayList<RuntimeCharacter>(); private List<RuntimeCharacter> player;// = new ArrayList<RuntimeCharacter>(); private Placement placement; private Script script; @Override public void setCombatTurn(CombatTurn kr) { // this.combatTurn = kr; doIniPass(kr.getCurrentTurn()); if (kr.getCurrentTurn() == null) { combatTurn = createCombatTurn(); if (!FluentIterable.from(enemies).filter(new RCStatePredicate()).isEmpty() && !FluentIterable.from(player).filter(new RCStatePredicate()).isEmpty()) scriptService.setCombatTurn(combatTurn); } } @Override public void setPlacement(Placement placement) { } @Override public void setScript(Script script) { } @Override public CommandCallback getCmdCallback() { return simulationCallback; } @Override public void sendMessage(RuntimeCharacter character, String message) { } /** * Initalize the simulation and start. * * @param count */ public void runSimulation(int count) { // checkConstrains(object); metric.clear(); progressBar.setMaximum(count-1); for (int i = 0; i < count; i++) { runOneSimulation(); progressBar.setSelection(i); } } public void checkConstrains(Placement placement2) { StringBuffer stringBuffer = new StringBuffer(); EList<Team> teams = placement2.getTeams(); for (Team team : teams) { for (RuntimeCharacter rc : team.getMembers()) { stringBuffer.append(checkConstrain(rc)); } } for (RuntimeCharacter rc : placement2.getScript().getPlayer().getMembers()) { stringBuffer.append(checkConstrain(rc)); } // getManagedForm().getForm().setHeadClient(); text.setText(stringBuffer.toString()); } private String checkConstrain(RuntimeCharacter rc) { StringBuffer stringBuffer = new StringBuffer(); AbstraktGegenstand rightHand = rc.getRightHand(); if (rightHand != null) { Fertigkeit fertigkeit = rightHand.getFertigkeit(); if (fertigkeit == null) stringBuffer.append(AdapterFactoryUtil.getInstance().getLabelProvider().getText(rc)).append(" right hand no skill\n"); } else stringBuffer.append(AdapterFactoryUtil.getInstance().getLabelProvider().getText(rc)).append(" Right hand unset\n"); if (rc.getLeftHand() != null) { if (rc.getLeftHand().getFertigkeit() == null) stringBuffer.append(AdapterFactoryUtil.getInstance().getLabelProvider().getText(rc)).append(" right hand no skill\n"); } else stringBuffer.append(AdapterFactoryUtil.getInstance().getLabelProvider().getText(rc)).append(" left hand unset\n"); return stringBuffer.toString(); } /** * Initalize the simulation and start. */ private void runOneSimulation() { enemies.clear(); scriptService = (ScriptService)getSite().getService(ScriptService.class); scriptService.registerScriptViewer(this); scriptService.registerCombatViewer(this); Script org_script = object.getScript(); Scripts scripts = (Scripts)org_script.eContainer(); int indexOfScript = scripts.getStories().indexOf(org_script); int placmentIndex = org_script.getPlacements().indexOf(object); EList<EObject> eResource = org_script.eResource().getContents(); Collection<EObject> all = EcoreUtil.copyAll(eResource); script = findScript(new ArrayList<EObject>(all), indexOfScript); if (script == null) return; placement = script.getPlacements().get(placmentIndex); script.setHistory(ScriptingFactory.eINSTANCE.createScriptHistory()); script.getHistory().setCommandStack(GameplayFactory.eINSTANCE.createExecutionStack()); script.getHistory().getCommandStack().setProtocol(GameplayFactory.eINSTANCE.createExecutionProtocol()); scriptService.setScript(script); //scriptService.setPlacement(placement);// object); placement.setActualDate(new Date(0L)); simulationCallback = new SimlationCallBack(); // scriptService.executeCommand(command); EList<Team> teams = placement.getTeams(); for (Team team : teams) { for (RuntimeCharacter rc : team.getMembers()) { fixCharater(rc); enemies.add(rc); } } for (RuntimeCharacter rc : script.getPlayer().getMembers()) { fixCharater(rc); } player = script.getPlayer().getMembers(); combatTurn = createCombatTurn(); scriptService.setCombatTurn(combatTurn); boolean allEnemiesDead = FluentIterable.from(enemies).filter(new RCStatePredicate()).isEmpty(); if (allEnemiesDead) pmetric.playerWins.incrementAndGet(); placement.setActualDate(null); buildMetric(0); buildMetric(1); pmetric.samples.incrementAndGet(); EList<Command> commands = script.getHistory().getCommandStack().getProtocol().getCommands(); for (Command command : commands) { if (command instanceof CombatTurn) { pmetric.combatRounds.incrementAndGet(); } } scriptService.setScript(null); } private void buildMetric(int type) { ExecutionProtocol protocol = script.getHistory().getCommandStack().getProtocol(); for (Iterator<EObject> iterator = protocol.eAllContents(); iterator.hasNext();) { EObject object = (EObject)iterator.next(); if (object instanceof InitativePass) { // InitativePass ini = (InitativePass)object; } else if (object instanceof MeeleAttackCmd || object instanceof RangedAttackCmd) { SkillTestCmd mc = (SkillTestCmd)object; CharacterMetrik metric2 = getMetric(mc, type); metric2.attacks.incrementAndGet(); if (mc.getNetHits() > 0) metric2.attacksHits.incrementAndGet(); else metric2.attacksMissed.incrementAndGet(); EList<Command> subCommands = mc.getSubCommands(); for (Command command : subCommands) { if (command instanceof DamageTest) { DamageTest dt = (DamageTest)command; DamageCode damageCode = ShadowrunTools.parseDamageCode(dt.getEffectiveDamage()); if (damageCode != null) metric2.attackDamage.addAndGet(damageCode.getPower()); } } } else if (object instanceof DefensTestCmd) { DefensTestCmd dt = (DefensTestCmd)object; CharacterMetrik metric2 = getMetric(dt, type); metric2.defense.incrementAndGet(); if (dt.getNetHits() < 0) metric2.defenseMissed.incrementAndGet(); else metric2.defenseHits.incrementAndGet(); } else if (object instanceof Initative) { Initative ini = (Initative)object; CharacterMetrik metric2 = getMetric(ini, type); metric2.iniSum += ini.getIni(); metric2.inits.incrementAndGet(); } else if (object instanceof DamageTest) { DamageTest dt = (DamageTest)object; CharacterMetrik metric2 = getMetric(dt, type); metric2.damage.incrementAndGet(); DamageCode damageCode = ShadowrunTools.parseDamageCode(dt.getEffectiveDamage()); if (damageCode != null) metric2.damageHits.addAndGet(damageCode.getPower()); else metric2.damageMissed.incrementAndGet(); } } } /** * Provides the orderd metric list from the map. * * @return */ private List<CharacterMetrik> getCalcedMetric() { Set<Entry<Object, CharacterMetrik>> entrySet = metric.entrySet(); ArrayList<Entry<Object, CharacterMetrik>> list = new ArrayList<Entry<Object, CharacterMetrik>>(entrySet); // final List<RuntimeCharacter> players = player; Collections.sort(list, new Comparator<Entry<Object, CharacterMetrik>>() { @Override public int compare(Entry<Object, CharacterMetrik> o1, Entry<Object, CharacterMetrik> o2) { int typeVal1 = 0; int typeVal2 = 0; if (o1.getKey() instanceof Boolean) { typeVal1 = 200; if ((Boolean)o1.getKey()) typeVal1++; } else if (o1.getKey() instanceof String) { typeVal1 = 100; if (((String)o1.getKey()).startsWith("player")) typeVal1++; } if (o2.getKey() instanceof Boolean) { typeVal2 = 200; if ((Boolean)o2.getKey()) typeVal2++; } else if (o2.getKey() instanceof String) { typeVal2 = 100; if (((String)o2.getKey()).startsWith("player")) typeVal2++; } return typeVal2 - typeVal1; } }); return FluentIterable.from(list).transform(new Function<Entry<Object, CharacterMetrik>, CharacterMetrik>() { @Override public CharacterMetrik apply(Entry<Object, CharacterMetrik> input) { return input.getValue(); } }).toList(); } /** * @param ini * @param type * @return */ private CharacterMetrik getMetric(SubjectCommand ini, int type) { RuntimeCharacter subject = ini.getSubject(); boolean player1 = player.contains(subject); String name = AdapterFactoryUtil.getInstance().getLabelProvider().getText(subject); name =( player1 ? "player " : "none player ")+ name; CharacterMetrik characterMetrik = null; switch (type) { case 0: characterMetrik = metric.get(name); if (characterMetrik == null) { characterMetrik = new CharacterMetrik(); characterMetrik.metrikName = name; metric.put(name, characterMetrik); } break; case 1: characterMetrik = metric.get(player1); if (characterMetrik == null) { characterMetrik = new CharacterMetrik(); characterMetrik.metrikName = player1 ? "player" : "none player";// AdapterFactoryUtil.getInstance().getLabelProvider().getText(subject); metric.put(player1, characterMetrik); } default: break; } return characterMetrik; } private Script findScript(List<EObject> all, final int indexOfScript) { for (Object object : all) { if (object instanceof ShrList) { ShrList sl = (ShrList)object; EList<EObject> entries = sl.getEntries(); for (EObject eObject : entries) { if (eObject instanceof Scripts) { Scripts s = (Scripts)eObject; return s.getStories().get(indexOfScript); } } } } return null;// (Script)all.get(0); } private void fixCharater(RuntimeCharacter rc) { rc.setMentalDamage(0); rc.setPhysicalDamage(0); rc.setZustand(Zustand.OK); rc.getExtendetData().clear(); ManagedCharacter character = rc.getCharacter(); rc.getInUse().addAll(character.getInventar()); if (rc.getArmor() == null) rc.setArmor(FluentIterable.from(character.getInventar()).filter(Kleidung.class).first().orNull()); if (rc.getLeftHand() == null) rc.setLeftHand(FluentIterable.from(character.getInventar()).filter(Nahkampfwaffe.class).first().orNull()); if (rc.getRightHand() == null) rc.setRightHand(FluentIterable.from(character.getInventar()).filter(Feuerwaffe.class).first().orNull()); } /** * Creates and initialize a combat turn. * * @return */ private CombatTurn createCombatTurn() { CombatTurn combatTurn = GameplayFactory.eINSTANCE.createCombatTurn(); combatTurn.setDate(placement.getActualDate()); combatTurn.setCmdCallback(simulationCallback); combatTurn.getCombatants().addAll(placement.getScript().getPlayer().getMembers()); EList<Team> teams = placement.getTeams(); for (Team team : teams) { combatTurn.getCombatants().addAll(team.getMembers()); } return combatTurn; } /** * Creates the action and execute it. */ private void doIniPass(InitativePass currentTurn) { if (currentTurn == null) return; RuntimeCharacter target = findTarget(currentTurn); RuntimeCharacter subject = currentTurn.getSubject(); CommandWrapper action = createIniAction(currentTurn, target, subject, defaultAttacktype); currentTurn.setAction(action); combatTurn.doTurn(); doIniPass(combatTurn.getCurrentTurn()); } /** * @param currentTurn * @param target * @param subject * @param attackType * @return */ private CommandWrapper createIniAction(InitativePass currentTurn, RuntimeCharacter target, RuntimeCharacter subject, AttackType attackType) { if (target == null) return null; switch (attackType) { case melee: Nahkampfwaffe meleeWeapon = GameplayTools.getMeleeWeapon(subject); if (subject != null && meleeWeapon != null && target != null) { ComplexAction action = GameplayTools.createMeleeAction(subject, target, meleeWeapon); return action; } break; case range1: AbstaktFernKampfwaffe rangedWeapon = GameplayTools.getRangedWeapon(subject); Feuerwaffe feuerwaffe = (Feuerwaffe)rangedWeapon; FeuerModus fireArmModus = GameplayTools.getFireArmModus(subject, feuerwaffe); SimpleAction createRangedAction = GameplayTools.createRangedAction(currentTurn, 1, rangedWeapon, fireArmModus, target, 10); if (createRangedAction == null) { return createIniAction(currentTurn, target, subject, AttackType.melee); } return currentTurn.getAction(); default: break; } return null; } private RuntimeCharacter findTarget(InitativePass currentTurn) { if (player.contains(currentTurn.getSubject())) return FluentIterable.from(enemies).filter(new RCStatePredicate()).first().orNull(); else return FluentIterable.from(player).filter(new RCStatePredicate()).first().orNull(); } } private class SimlationCallBack implements CommandCallback { @Override public boolean prepareCommand(Command cmd, EStructuralFeature... eStructuralFeatures) { return true; } @Override public void beforeExecute(Command cmd, EStructuralFeature... eStructuralFeatures) { } @Override public void beforeSubcommands(Command cmd, EStructuralFeature... eStructuralFeatures) { } @Override public void afterCommand(Command cmd, EStructuralFeature... eStructuralFeatures) { } } public class PlacementMetric { AtomicInteger samples = new AtomicInteger(); AtomicInteger combatRounds = new AtomicInteger(); AtomicInteger playerWins = new AtomicInteger(); } public class CharacterMetrik { String metrikName; AtomicInteger attacks = new AtomicInteger(); AtomicInteger attacksMissed = new AtomicInteger(); AtomicInteger attacksHits = new AtomicInteger(); AtomicInteger attackDamage = new AtomicInteger(); AtomicInteger rattacks = new AtomicInteger(); AtomicInteger rattacksMissed = new AtomicInteger(); AtomicInteger rattacksHits = new AtomicInteger(); AtomicInteger defense = new AtomicInteger(); AtomicInteger defenseMissed = new AtomicInteger(); AtomicInteger defenseHits = new AtomicInteger(); AtomicInteger damage = new AtomicInteger(); AtomicInteger damageMissed = new AtomicInteger(); AtomicInteger damageHits = new AtomicInteger(); AtomicInteger inits = new AtomicInteger(); int iniSum = 0; public String getMetrikName() { return metrikName; } } /** * Create the form page. * * @param id * @param title */ public PlacementSimulationPage(String id, String title) { super(id, title); } public PlacementSimulationPage(FormEditor editor, String id, String title, Placement object, EditingDomain editingDomain, ReferenceManager manager) { super(editor, id, title, manager); this.object = object; this.editingDomain = editingDomain; } /** * Create the form page. * * @param editor * @param id * @param title * @wbp.parser.constructor * @wbp.eval.method.parameter id "Some id" * @wbp.eval.method.parameter title "Some title" */ public PlacementSimulationPage(FormEditor editor, String id, String title) { super(editor, id, title); } /** * Create contents of the form. * * @param managedForm */ @Override protected void createFormContent(IManagedForm managedForm) { FormToolkit toolkit = managedForm.getToolkit(); ScrolledForm form = managedForm.getForm(); form.setText("simulation for " + AdapterFactoryUtil.getInstance().getLabelProvider().getText(object)); Composite body = form.getBody(); toolkit.decorateFormHeading(form.getForm()); toolkit.paintBordersFor(body); managedForm.getForm().getBody().setLayout(new GridLayout(3, false)); Group grpControll = new Group(managedForm.getForm().getBody(), SWT.NONE); grpControll.setText("Controll"); managedForm.getToolkit().adapt(grpControll); managedForm.getToolkit().paintBordersFor(grpControll); grpControll.setLayout(new GridLayout(2, false)); new Label(grpControll, SWT.NONE); final Button btnNewButton = new Button(grpControll, SWT.NONE); btnNewButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { btnNewButton.setEnabled(false); progressBar.setVisible(true); final ScriptPlacementSimulator scriptPlacementSimulator = new ScriptPlacementSimulator(); scriptPlacementSimulator.checkConstrains(object); int selectionIndex = combo.getSelectionIndex(); if (selectionIndex == 1) scriptPlacementSimulator.defaultAttacktype = AttackType.range1; Display.getCurrent().asyncExec(new Runnable() { @Override public void run() { try { scriptPlacementSimulator.runSimulation(spinner.getSelection()); printResult(scriptPlacementSimulator); tableViewer.setInput(scriptPlacementSimulator.getCalcedMetric()); } catch (Exception e2) { System.err.println(e2.fillInStackTrace()); text.setText("simulation not runable!!\n" + text.getText()); } btnNewButton.setEnabled(true); progressBar.setVisible(false); } }); } }); managedForm.getToolkit().adapt(btnNewButton, true, true); btnNewButton.setText("run simulation"); lblRuns = new Label(grpControll, SWT.NONE); managedForm.getToolkit().adapt(lblRuns, true, true); lblRuns.setText("runs"); spinner = new Spinner(grpControll, SWT.BORDER); spinner.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); spinner.setMaximum(1000); spinner.setSelection(100); managedForm.getToolkit().adapt(spinner); managedForm.getToolkit().paintBordersFor(spinner); grpType = new Group(managedForm.getForm().getBody(), SWT.NONE); grpType.setLayout(new GridLayout(1, false)); grpType.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 1)); grpType.setText("type"); managedForm.getToolkit().adapt(grpType); managedForm.getToolkit().paintBordersFor(grpType); combo = new CCombo(grpType, SWT.BORDER); combo.setItems(new String[]{ "melee", "ranged" }); combo.select(0); managedForm.getToolkit().adapt(combo); managedForm.getToolkit().paintBordersFor(combo); composite_1 = new Composite(managedForm.getForm().getBody(), SWT.NONE); composite_1.setLayout(new GridLayout(1, false)); composite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1)); managedForm.getToolkit().adapt(composite_1); managedForm.getToolkit().paintBordersFor(composite_1); lblNewLabel = new Label(composite_1, SWT.NONE); lblNewLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); managedForm.getToolkit().adapt(lblNewLabel, true, true); lblRounds = new Label(composite_1, SWT.NONE); lblRounds.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); managedForm.getToolkit().adapt(lblRounds, true, true); progressBar = new ProgressBar(composite_1, SWT.SMOOTH); progressBar.setMaximum(0); progressBar.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); progressBar.setVisible(false); managedForm.getToolkit().adapt(progressBar, true, true); composite = new Composite(managedForm.getForm().getBody(), SWT.NONE); composite.setLayout(new FillLayout(SWT.HORIZONTAL)); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 3, 1)); managedForm.getToolkit().adapt(composite); managedForm.getToolkit().paintBordersFor(composite); tableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION); table = tableViewer.getTable(); table.setHeaderVisible(true); managedForm.getToolkit().paintBordersFor(table); tableViewer.setContentProvider(new ArrayContentProvider()); tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE); tableViewerColumn.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { if (element instanceof CharacterMetrik) { CharacterMetrik cm = (CharacterMetrik)element; return cm.metrikName; } return super.getText(element); } }); tblclmnName = tableViewerColumn.getColumn(); tblclmnName.setWidth(200); tblclmnName.setText("name"); tableViewerColumn_1 = new TableViewerColumn(tableViewer, SWT.NONE); tblclmnAttack = tableViewerColumn_1.getColumn(); tblclmnAttack.setWidth(100); tblclmnAttack.setText("attack%"); tableViewerColumn_1.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { if (element instanceof CharacterMetrik) { CharacterMetrik cm = (CharacterMetrik)element; return String.format("%.2f", 100 * cm.attacksHits.floatValue() / cm.attacks.floatValue()); } return super.getText(element); } }); tableViewerColumn_2 = new TableViewerColumn(tableViewer, SWT.NONE); tableViewerColumn_2.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { if (element instanceof CharacterMetrik) { CharacterMetrik cm = (CharacterMetrik)element; return String.format("%.2f", 100 * cm.defenseHits.floatValue() / cm.defense.floatValue()); } return super.getText(element); } }); tblclmnDefense = tableViewerColumn_2.getColumn(); tblclmnDefense.setWidth(100); tblclmnDefense.setText("defense%"); tableViewerColumn_4 = new TableViewerColumn(tableViewer, SWT.NONE); tableViewerColumn_4.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { if (element instanceof CharacterMetrik) { CharacterMetrik cm = (CharacterMetrik)element; return String.format("%.2f", cm.iniSum / cm.inits.floatValue()); } return super.getText(element); } }); tblclmnIni = tableViewerColumn_4.getColumn(); tblclmnIni.setWidth(100); tblclmnIni.setText("ini"); tableViewerColumn_3 = new TableViewerColumn(tableViewer, SWT.NONE); tableViewerColumn_3.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { if (element instanceof CharacterMetrik) { CharacterMetrik cm = (CharacterMetrik)element; return String.format("%.2f", cm.attackDamage.floatValue() / cm.attacks.floatValue()); } return super.getText(element); } }); tblclmnDamage = tableViewerColumn_3.getColumn(); tblclmnDamage.setWidth(100); tblclmnDamage.setText("damage"); text = new Text(managedForm.getForm().getBody(), SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI); GridData gd_text = new GridData(SWT.FILL, SWT.FILL, true, false, 3, 1); gd_text.heightHint = 80; text.setLayoutData(gd_text); managedForm.getToolkit().adapt(text, true, true); // m_bindingContext = initDataBindings(); } private void printResult(ScriptPlacementSimulator scriptPlacementSimulator) { double wins = 100 * scriptPlacementSimulator.pmetric.playerWins.doubleValue() / scriptPlacementSimulator.pmetric.samples.doubleValue(); double crounds = scriptPlacementSimulator.pmetric.combatRounds.doubleValue() / scriptPlacementSimulator.pmetric.samples.doubleValue(); lblNewLabel.setText(String.format("player wins %.2f%%", wins)); lblRounds.setText(String.format("number of combat rounds %.2f", crounds)); } @Override protected EditingDomain getEditingDomain() { return editingDomain; } }