/* * Copyright (C) 2010 Markus Echterhoff <tam@edu.uni-klu.ac.at> * * This file is part of EvoPaint. * * EvoPaint is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with EvoPaint. If not, see <http://www.gnu.org/licenses/>. */ package evopaint.pixel.rulebased.actions; import evopaint.Configuration; import evopaint.gui.util.AutoSelectOnFocusSpinner; import evopaint.interfaces.IRandomNumberGenerator; import evopaint.pixel.rulebased.Action; import evopaint.pixel.rulebased.RuleBasedPixel; import evopaint.util.mapping.RelativeCoordinate; import java.util.LinkedHashMap; import java.util.Map; import javax.swing.JComponent; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * * @author Markus Echterhoff <tam@edu.uni-klu.ac.at> */ public class ChangeEnergyAction extends Action { private int amount; public int getType() { return Action.CHANGE_ENERGY; } @Override public int countGenes() { return super.countGenes(); // amount is not mutable because it is an energy changing operation } /* amount is not mutable @Override public void mutate(int mutatedGene, IRandomNumberGenerator rng) { int numGenesSuper = super.countGenes(); if (mutatedGene < numGenesSuper) { super.mutate(mutatedGene, rng); return; } mutatedGene -= numGenesSuper; assert false; // we have an error in our mutatedGene calculation } */ @Override public void mixWith(Action theirAction, float theirShare, IRandomNumberGenerator rng) { super.mixWith(theirAction, theirShare, rng); if (rng.nextFloat() < theirShare) { amount = ((ChangeEnergyAction)theirAction).amount; } } public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; } public ChangeEnergyAction(int energyChange) { super(energyChange, null); } public ChangeEnergyAction() { } public ChangeEnergyAction(ChangeEnergyAction changeEnergyAction) { super(changeEnergyAction); this.amount = changeEnergyAction.amount; } public String getName() { return "change energy"; } public int execute(RuleBasedPixel actor, RelativeCoordinate direction, Configuration configuration) { RuleBasedPixel target = configuration.world.get(actor.getLocation(), direction); if (target == null) { return 0; } target.changeEnergy(amount); return energyChange; } @Override public Map<String, String>addParametersString(Map<String, String> parametersMap) { parametersMap = super.addParametersHTML(parametersMap); if (amount > 0) { parametersMap.put("target's reward", Integer.toString(amount)); } else if (amount < 0) { parametersMap.put("target's cost", Integer.toString((-1) * amount)); } return parametersMap; } @Override public Map<String, String>addParametersHTML(Map<String, String> parametersMap) { parametersMap = super.addParametersHTML(parametersMap); if (amount > 0) { parametersMap.put("target's reward", Integer.toString(amount)); } else if (amount < 0) { parametersMap.put("target's cost", Integer.toString((-1) * amount)); } return parametersMap; } @Override public LinkedHashMap<String,JComponent> addParametersGUI(LinkedHashMap<String, JComponent> parametersMap) { parametersMap = super.addParametersGUI(parametersMap); SpinnerNumberModel amountSpinnerModel = new SpinnerNumberModel(amount, Integer.MIN_VALUE, Integer.MAX_VALUE, 1); JSpinner amountSpinner = new AutoSelectOnFocusSpinner(amountSpinnerModel); amountSpinner.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { amount = (Integer)((JSpinner)e.getSource()).getValue(); } }); parametersMap.put("Target's Energy Change", amountSpinner); return parametersMap; } }