1
0
mirror of https://github.com/fazo96/AIrium.git synced 2025-01-10 09:34:20 +01:00

implemented saving and loading creatures

This commit is contained in:
Enrico Fasoli 2015-08-05 17:41:21 +02:00
parent 70089e4379
commit cae72163a4
9 changed files with 372 additions and 142 deletions

View File

@ -22,9 +22,8 @@ Visis the [releases page](https://github.com/fazo96/AIrium/releases) to download
### Controls
- __+__ and __-__ control the zoom of the camera
- __arrow keys__ allow you to move the camera
- The __Configuration__ page in the GUI will let you tweak more!
- The __Configuration__ page in the GUI will let you tweak many parameters and pause the simulation
- You can drag with the mouse to move the camera and zoom with the mouse wheel
## Development

View File

@ -3,6 +3,7 @@ package com.mygdx.game;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
@ -20,10 +21,60 @@ public class Game extends ApplicationAdapter {
private float cameraSpeed = 15;
private BitmapFont font;
private boolean paused = false;
private InputProcessor input;
@Override
public void create() {
game = this;
input = new InputProcessor() {
@Override
public boolean keyDown(int i) {
return true;
}
@Override
public boolean keyUp(int i) {
return true;
}
@Override
public boolean keyTyped(char c) {
return true;
}
@Override
public boolean touchDown(int i, int i1, int i2, int i3) {
return true;
}
@Override
public boolean touchUp(int i, int i1, int i2, int i3) {
return true;
}
@Override
public boolean touchDragged(int i, int i1, int i2) {
renderer.translate(Gdx.input.getDeltaX(), -Gdx.input.getDeltaY(), 0);
return true;
}
@Override
public boolean mouseMoved(int i, int i1) {
return true;
}
@Override
public boolean scrolled(int i) {
if (i>0) {
renderer.scale(0.5f, 0.5f, 1);
} else {
renderer.scale(1.5f, 1.5f, 1);
}
return true;
}
};
Gdx.input.setInputProcessor(input);
renderer = new ShapeRenderer();
renderer.setAutoShapeType(true);
overlayRenderer = new ShapeRenderer();
@ -45,47 +96,6 @@ public class Game extends ApplicationAdapter {
@Override
public void render() {
// Controls
if (Gdx.input.isKeyJustPressed(Input.Keys.SPACE)) {
world.launchNewGen();
}
if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) {
renderer.translate(-cameraSpeed, 0, 0);
}
if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
renderer.translate(cameraSpeed, 0, 0);
}
if (Gdx.input.isKeyPressed(Input.Keys.UP)) {
renderer.translate(0, -cameraSpeed, 0);
}
if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) {
renderer.translate(0, cameraSpeed, 0);
}
if (Gdx.input.isKeyJustPressed(Input.Keys.PLUS)) {
renderer.scale(0.5f, 0.5f, 1);
}
if (Gdx.input.isKeyJustPressed(Input.Keys.MINUS)) {
renderer.scale(1.5f, 1.5f, 1);
}
if (Gdx.input.isKeyJustPressed(Input.Keys.P)) {
paused = !paused;
}
if (Gdx.input.isKeyJustPressed(Input.Keys.L)) {
if (world.getFpsLimit() == 60) {
world.setFpsLimit(0);
} else {
world.setFpsLimit(60);
}
}
if (Gdx.input.isButtonPressed(Input.Buttons.RIGHT)) {
renderer.translate(Gdx.input.getDeltaX(), Gdx.input.getDeltaY() * -1, 0);
}
/*
// Broken for now
if(Gdx.input.isButtonPressed(Input.Buttons.LEFT)){
// TODO: project coordinates to world
world.selectCreatureAt(Gdx.input.getX(), Gdx.input.getY());
}*/
// Draw
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

View File

@ -28,6 +28,7 @@ public class Log {
for (LogListener l : logListeners) {
l.onLog(level, msg);
}
System.out.println(msg);
}
}

View File

@ -0,0 +1,111 @@
package com.mygdx.game;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Hangles File I/O for AIrium components.
*
* @author fazo
*/
public class Serializer {
public static void saveToFile(File f, String content) {
PrintWriter fw = null;
try {
fw = new PrintWriter(f);
} catch (IOException ex) {
Log.log(Log.ERROR, ex.getMessage());
}
fw.print(content);
fw.flush();
fw.close();
}
public static String loadFromFile(File f) {
String s, a = "";
try {
BufferedReader bf = new BufferedReader(new FileReader(f));
while ((s = bf.readLine()) != null) {
a += s+"\n";
}
} catch (Exception e) {
Log.log(Log.ERROR, e.getMessage());
System.out.println(e+"");
}
return a;
}
public static String serializeBrain(float brainMap[][][]) {
String s = "# Neural Map for use with AIrium.\n"
+ "# More information at http://github.com/fazo96/AIrium\n"
+ "Layers: " + (brainMap.length+1);
s += "\nInput Neurons: " + brainMap[0][0].length;
s += "\n# Layer 1 Skipped because it's the input layer.";
// layers (input layer not included in brain map)
for (int i = 0; i < brainMap.length; i++) {
s += "\nLayer " + (i + 2) + " has " + brainMap[i].length + " neurons";
for (int j = 0; j < brainMap[i].length; j++) { // neurons
s += "\nWeights for Layer " + (i + 2) + " Neuron " + (j + 1) + " = ";
for (int z = 0; z < brainMap[i][j].length; z++) { // connections
s += brainMap[i][j][z] + " ";
}
}
}
return s;
}
public static float[][][] loadBrain(String s) {
float brainMap[][][] = null;
Log.log(Log.INFO,"Loading brain from String with "+s.split("\n").length+" lines:\n"+s);
for (String l : s.split("\n")) {
l = l.trim();
if (l.isEmpty() || l.startsWith("#")) {
// Skip comment
} else if (l.startsWith("Layers: ")) {
// Set Layer number
int layers = Integer.parseInt(l.split(" ")[1]) - 1;
brainMap = new float[layers][][];
Log.log(Log.INFO, "Loaded NLayers: " + layers);
} else if (l.startsWith("Input Neurons")) {
int in = Integer.parseInt(l.split(" ")[2]);
brainMap[0] = new float[in][0];
Log.log(Log.INFO, "Loaded NInputNeurons: " + in);
} else if (l.startsWith("Layer ")) {
// Set neuron number for given layer
String ll[] = l.split(" ");
int layer = Integer.parseInt(ll[1]) - 2;
int n = Integer.parseInt(ll[3]);
brainMap[layer] = new float[n][];//[layer>0?brainMap[layer-1].length:0];
} else if (l.startsWith("Weights ")) {
// Set weights
String ll[] = l.split(" ");
int layer = Integer.parseInt(ll[3]) - 2;
int neuron = Integer.parseInt(ll[5]) - 1;
int nWeights = ll.length - 7;
brainMap[layer][neuron] = new float[nWeights];
if(layer == 0){
Log.log(Log.INFO, "This weightmap is for brains with "+(nWeights)+" input neurons.");
} else if (nWeights != brainMap[layer - 1].length) {
Log.log(Log.ERROR, "WRONG WEIGHT NUMBER: prev layer has "
+ brainMap[layer - 1].length + " neurons, but only "
+ (nWeights)
+ " weights are supplied to this neuron");
}
for (int i = 7; i < ll.length; i++) {
brainMap[layer][neuron][i - 7] = Float.parseFloat(ll[i]);
Log.log(Log.INFO,"Loading L"+layer+"N"+neuron+"W"+(i-7)+" = "+brainMap[layer][neuron][i-7]);
}
Log.log(Log.INFO, "Loaded " + (nWeights) + " Weights for Layer " + layer + " Neuron " + neuron);
}
}
return brainMap;
}
}

View File

@ -348,15 +348,15 @@ public class World implements Runnable {
}
}
private void spawnVegetable() {
public void spawnVegetable() {
spawn(false, null);
}
private Creature spawnCreature() {
public Creature spawnCreature() {
return (Creature) spawn(true, null);
}
private Creature spawnCreature(float[][][] b) {
public Creature spawnCreature(float[][][] b) {
return (Creature) spawn(true, b);
}

View File

@ -34,28 +34,13 @@ public class Brain {
initialize();
}
/**
* Create a new brain using given brain map (mind)
*
* @param brainMap the brain map (mind) to use
*/
public Brain(float[][][] brainMap) {
neurons = new Neuron[brainMap.length][];
for (int i = 0; i < brainMap.length; i++) { // for each layer
neurons[i] = new Neuron[brainMap[i].length];
for (int j = 0; j < brainMap[i].length; j++) { // for each neuron
neurons[i][j] = new Neuron(i, bias, this, brainMap[i][j]);
}
}
}
/**
* Apply a new brain map (mind) to this brain
*
* @param brainMap the new brain map to apply
*/
public void remap(float[][][] brainMap) {
for (int i = 0; i < brainMap.length; i++) { // for each layer
for (int i = 0; i < brainMap.length; i++) { // for each layer (skip input)
for (int j = 0; j < brainMap[i].length; j++) { // for each neuron
// skip input layer
if (neurons[i + 1][j] == null) {
@ -103,10 +88,12 @@ public class Brain {
float nr = neurons[i][j].compute();
// Draw neuron links
float[] links = neurons[i][j].getWeights();
if (links != null) {
for (int f = 0; f < links.length; f++) {
s.setColor(links[f] < 0 ? links[f] / 2 * -1 : 0, links[f] > 0 ? links[f] / 2 : 0, 0, 1);
s.line(i * sepX + offset, j * sepY + offset, (i - 1) * sepX + offset, f * sepY + offset);
}
}
// Draw neuron
s.setColor(1 - nr, nr, 0, 1);
s.circle(i * sepX + offset, j * sepY + offset, 15);

View File

@ -76,6 +76,7 @@ public class Neuron {
* @return the output of this neuron.
*/
public float compute() {
if(weights == null || weights.length == 0) isInputNeuron = true;
if (isInputNeuron) {
return output;
}

View File

@ -89,9 +89,6 @@
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[700, 700]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[700, 700]"/>
</Property>
</Properties>
<SyntheticProperties>
<SyntheticProperty name="menuBar" type="java.lang.String" value="menuBar"/>
@ -174,7 +171,7 @@
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Component id="jScrollPane1" pref="490" max="32767" attributes="0"/>
<Component id="jScrollPane1" pref="567" max="32767" attributes="0"/>
<EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="0"/>
@ -228,35 +225,6 @@
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JScrollPane" name="jScrollPane2">
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Creatures">
<Property name="tabTitle" type="java.lang.String" value="Creatures"/>
</JTabbedPaneConstraints>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JList" name="creatureList">
<Properties>
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.editors2.ListModelEditor">
<StringArray count="1">
<StringItem index="0" value="No creatures"/>
</StringArray>
</Property>
<Property name="selectionMode" type="int" value="0"/>
</Properties>
<Events>
<EventHandler event="valueChanged" listener="javax.swing.event.ListSelectionListener" parameters="javax.swing.event.ListSelectionEvent" handler="creatureListValueChanged"/>
</Events>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="jPanel1">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
@ -496,7 +464,7 @@
<Component id="drawViewCones" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="drawSightLines" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace pref="41" max="32767" attributes="0"/>
<EmptySpace pref="71" max="32767" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="pauseButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="jButton1" alignment="3" min="-2" max="-2" attributes="0"/>
@ -810,6 +778,83 @@
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="jPanel3">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Creatures">
<Property name="tabTitle" type="java.lang.String" value="Creatures"/>
</JTabbedPaneConstraints>
</Constraint>
</Constraints>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane2" alignment="0" max="32767" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="saveBrainBtn" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="loadBrainBtn" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="587" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Component id="jScrollPane2" pref="569" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="saveBrainBtn" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="loadBrainBtn" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Container class="javax.swing.JScrollPane" name="jScrollPane2">
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JList" name="creatureList">
<Properties>
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.editors2.ListModelEditor">
<StringArray count="1">
<StringItem index="0" value="No creatures"/>
</StringArray>
</Property>
<Property name="selectionMode" type="int" value="0"/>
</Properties>
<Events>
<EventHandler event="valueChanged" listener="javax.swing.event.ListSelectionListener" parameters="javax.swing.event.ListSelectionEvent" handler="creatureListValueChanged"/>
</Events>
</Component>
</SubComponents>
</Container>
<Component class="javax.swing.JButton" name="saveBrainBtn">
<Properties>
<Property name="text" type="java.lang.String" value="Save"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="saveBrainBtnActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="loadBrainBtn">
<Properties>
<Property name="text" type="java.lang.String" value="Load"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="loadBrainBtnActionPerformed"/>
</Events>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
<Component class="javax.swing.JLabel" name="status">

View File

@ -11,7 +11,9 @@ import com.mygdx.game.Game;
import com.mygdx.game.Listener;
import com.mygdx.game.Log;
import com.mygdx.game.Log.LogListener;
import com.mygdx.game.Serializer;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
@ -19,7 +21,10 @@ import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.stage.FileChooser;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import logic.Creature;
/**
*
@ -80,8 +85,6 @@ public class GUI extends javax.swing.JFrame implements LogListener, Listener {
logTextArea = new javax.swing.JTextArea();
jLabel1 = new javax.swing.JLabel();
logLevelBox = new javax.swing.JComboBox();
jScrollPane2 = new javax.swing.JScrollPane();
creatureList = new javax.swing.JList();
jPanel1 = new javax.swing.JPanel();
fpsLimitSlider = new javax.swing.JSlider();
jLabel3 = new javax.swing.JLabel();
@ -129,6 +132,11 @@ public class GUI extends javax.swing.JFrame implements LogListener, Listener {
jLabel12 = new javax.swing.JLabel();
nMutatedConnectionsSlider = new javax.swing.JSlider();
currentNMutatedConnections = new javax.swing.JLabel();
jPanel3 = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane();
creatureList = new javax.swing.JList();
saveBrainBtn = new javax.swing.JButton();
loadBrainBtn = new javax.swing.JButton();
status = new javax.swing.JLabel();
menuBar = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
@ -143,7 +151,6 @@ public class GUI extends javax.swing.JFrame implements LogListener, Listener {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("AIrium");
setMinimumSize(new java.awt.Dimension(700, 700));
setPreferredSize(new java.awt.Dimension(700, 700));
logTextArea.setEditable(false);
logTextArea.setColumns(20);
@ -178,7 +185,7 @@ public class GUI extends javax.swing.JFrame implements LogListener, Listener {
logPaneLayout.setVerticalGroup(
logPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(logPaneLayout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 490, Short.MAX_VALUE)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 567, Short.MAX_VALUE)
.addGap(10, 10, 10)
.addGroup(logPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
@ -188,21 +195,6 @@ public class GUI extends javax.swing.JFrame implements LogListener, Listener {
tabs.addTab("Log", logPane);
creatureList.setModel(new javax.swing.AbstractListModel() {
String[] strings = { "No creatures" };
public int getSize() { return strings.length; }
public Object getElementAt(int i) { return strings[i]; }
});
creatureList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
creatureList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
creatureListValueChanged(evt);
}
});
jScrollPane2.setViewportView(creatureList);
tabs.addTab("Creatures", jScrollPane2);
fpsLimitSlider.setMinimum(1);
fpsLimitSlider.setSnapToTicks(true);
fpsLimitSlider.setToolTipText("The maximum amount of ticks per second the simulation is allowed to compute");
@ -598,7 +590,7 @@ public class GUI extends javax.swing.JFrame implements LogListener, Listener {
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(drawViewCones)
.addComponent(drawSightLines))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 41, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 71, Short.MAX_VALUE)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(pauseButton)
.addComponent(jButton1))
@ -607,6 +599,58 @@ public class GUI extends javax.swing.JFrame implements LogListener, Listener {
tabs.addTab("Settings", jPanel1);
creatureList.setModel(new javax.swing.AbstractListModel() {
String[] strings = { "No creatures" };
public int getSize() { return strings.length; }
public Object getElementAt(int i) { return strings[i]; }
});
creatureList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
creatureList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
creatureListValueChanged(evt);
}
});
jScrollPane2.setViewportView(creatureList);
saveBrainBtn.setText("Save");
saveBrainBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
saveBrainBtnActionPerformed(evt);
}
});
loadBrainBtn.setText("Load");
loadBrainBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
loadBrainBtnActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane2)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addComponent(saveBrainBtn)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(loadBrainBtn)
.addContainerGap(587, Short.MAX_VALUE))
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 569, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(saveBrainBtn)
.addComponent(loadBrainBtn))
.addContainerGap())
);
tabs.addTab("Creatures", jPanel3);
status.setText("Simulation stopped");
javax.swing.GroupLayout containerLayout = new javax.swing.GroupLayout(container);
@ -837,20 +881,6 @@ public class GUI extends javax.swing.JFrame implements LogListener, Listener {
Log.setLogLevel(logLevelBox.getSelectedIndex());
}//GEN-LAST:event_logLevelBoxItemStateChanged
private void creatureListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_creatureListValueChanged
if (game == null) {
creatureList.setSelectedIndex(-1);
} else {
try {
if (creatureList.getSelectedIndex() >= 0) {
Game.get().getWorld().selectCreature(Game.get().getWorld().getCreatures().get(creatureList.getSelectedIndex()));
}
} catch (IndexOutOfBoundsException ex) {
JOptionPane.showMessageDialog(this, "This creature is not available");
}
}
}//GEN-LAST:event_creatureListValueChanged
private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed
Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null;
if (desktop != null) {
@ -957,6 +987,49 @@ public class GUI extends javax.swing.JFrame implements LogListener, Listener {
updateSettings();
}//GEN-LAST:event_nMutatedConnectionsSliderStateChanged
private void creatureListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_creatureListValueChanged
if (game == null) {
creatureList.setSelectedIndex(-1);
} else {
try {
if (creatureList.getSelectedIndex() >= 0) {
Game.get().getWorld().selectCreature(Game.get().getWorld().getCreatures().get(creatureList.getSelectedIndex()));
}
} catch (IndexOutOfBoundsException ex) {
JOptionPane.showMessageDialog(this, "This creature is not available");
}
}
}//GEN-LAST:event_creatureListValueChanged
private void saveBrainBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveBrainBtnActionPerformed
game.setPaused(true);
updateGUI();
if (game.getWorld().getSelectedCreature() == null) {
JOptionPane.showMessageDialog(this, "Please select a creature first");
return;
}
JFileChooser fc = new JFileChooser();
File f = null;
if (fc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
f = fc.getSelectedFile();
} else return;
Serializer.saveToFile(f, Serializer.serializeBrain(game.getWorld().getSelectedCreature().getBrain().getMap()));
}//GEN-LAST:event_saveBrainBtnActionPerformed
private void loadBrainBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loadBrainBtnActionPerformed
game.setPaused(true);
updateGUI();
JFileChooser fc = new JFileChooser();
File f = null;
if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
f = fc.getSelectedFile();
} else return;
float map[][][] = Serializer.loadBrain(Serializer.loadFromFile(f));
Creature c = (Creature) game.getWorld().spawnCreature(map);
game.getWorld().selectCreature(c);
updateGUI();
}//GEN-LAST:event_loadBrainBtnActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel container;
private javax.swing.JSlider corpseDecaySlider;
@ -1001,8 +1074,10 @@ public class GUI extends javax.swing.JFrame implements LogListener, Listener {
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItem2;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JButton loadBrainBtn;
private javax.swing.JComboBox logLevelBox;
private javax.swing.JPanel logPane;
private javax.swing.JTextArea logTextArea;
@ -1017,6 +1092,7 @@ public class GUI extends javax.swing.JFrame implements LogListener, Listener {
private javax.swing.JSlider nPlantsSlider;
private javax.swing.JToggleButton pauseButton;
private javax.swing.JMenuItem pauseMenuButton;
private javax.swing.JButton saveBrainBtn;
private javax.swing.JSlider sightRangeSlider;
private javax.swing.JMenuItem startButton;
private javax.swing.JLabel status;