diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/IslandSimulationPavel.iml b/.idea/IslandSimulationPavel.iml
new file mode 100644
index 0000000..cca7441
--- /dev/null
+++ b/.idea/IslandSimulationPavel.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/intellij-javadocs-4.0.1.xml b/.idea/intellij-javadocs-4.0.1.xml
new file mode 100644
index 0000000..673e4c5
--- /dev/null
+++ b/.idea/intellij-javadocs-4.0.1.xml
@@ -0,0 +1,204 @@
+
+
+
+
+ UPDATE
+ false
+ true
+
+ TYPE
+ FIELD
+ METHOD
+
+
+ PROTECTED
+ PUBLIC
+ DEFAULT
+
+
+
+
+
+ ^.*(public|protected|private)*.+interface\s+\w+.*
+ /**\n
+ * The interface ${name}.\n
+<#if element.typeParameters?has_content> * \n
+</#if>
+<#list element.typeParameters as typeParameter>
+ * @param <${typeParameter.name}> the type parameter\n
+</#list>
+ */
+
+
+ ^.*(public|protected|private)*.+enum\s+\w+.*
+ /**\n
+ * The enum ${name}.\n
+ */
+
+
+ ^.*(public|protected|private)*.+class\s+\w+.*
+ /**\n
+ * The type ${name}.\n
+<#if element.typeParameters?has_content> * \n
+</#if>
+<#list element.typeParameters as typeParameter>
+ * @param <${typeParameter.name}> the type parameter\n
+</#list>
+ */
+
+
+ .+
+ /**\n
+ * The type ${name}.\n
+ */
+
+
+
+
+ .+
+ /**\n
+ * Instantiates a new ${name}.\n
+<#if element.parameterList.parameters?has_content>
+ *\n
+</#if>
+<#list element.parameterList.parameters as parameter>
+ * @param ${parameter.name} the ${paramNames[parameter.name]}\n
+</#list>
+<#if element.throwsList.referenceElements?has_content>
+ *\n
+</#if>
+<#list element.throwsList.referenceElements as exception>
+ * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
+</#list>
+ */
+
+
+
+
+ ^.*(public|protected|private)*\s*.*(\w(\s*<.+>)*)+\s+get\w+\s*\(.*\).+
+ /**\n
+ * Gets ${partName}.\n
+<#if element.typeParameters?has_content> * \n
+</#if>
+<#list element.typeParameters as typeParameter>
+ * @param <${typeParameter.name}> the type parameter\n
+</#list>
+<#if element.parameterList.parameters?has_content>
+ *\n
+</#if>
+<#list element.parameterList.parameters as parameter>
+ * @param ${parameter.name} the ${paramNames[parameter.name]}\n
+</#list>
+<#if isNotVoid>
+ *\n
+ * @return the ${partName}\n
+</#if>
+<#if element.throwsList.referenceElements?has_content>
+ *\n
+</#if>
+<#list element.throwsList.referenceElements as exception>
+ * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
+</#list>
+ */
+
+
+ ^.*(public|protected|private)*\s*.*(void|\w(\s*<.+>)*)+\s+set\w+\s*\(.*\).+
+ /**\n
+ * Sets ${partName}.\n
+<#if element.typeParameters?has_content> * \n
+</#if>
+<#list element.typeParameters as typeParameter>
+ * @param <${typeParameter.name}> the type parameter\n
+</#list>
+<#if element.parameterList.parameters?has_content>
+ *\n
+</#if>
+<#list element.parameterList.parameters as parameter>
+ * @param ${parameter.name} the ${paramNames[parameter.name]}\n
+</#list>
+<#if isNotVoid>
+ *\n
+ * @return the ${partName}\n
+</#if>
+<#if element.throwsList.referenceElements?has_content>
+ *\n
+</#if>
+<#list element.throwsList.referenceElements as exception>
+ * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
+</#list>
+ */
+
+
+ ^.*((public\s+static)|(static\s+public))\s+void\s+main\s*\(\s*String\s*(\[\s*\]|\.\.\.)\s+\w+\s*\).+
+ /**\n
+ * The entry point of application.\n
+
+ <#if element.parameterList.parameters?has_content>
+ *\n
+</#if>
+ * @param ${element.parameterList.parameters[0].name} the input arguments\n
+<#if element.throwsList.referenceElements?has_content>
+ *\n
+</#if>
+<#list element.throwsList.referenceElements as exception>
+ * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
+</#list>
+ */
+
+
+ .+
+ /**\n
+ * ${name}<#if isNotVoid> ${return}</#if>.\n
+<#if element.typeParameters?has_content> * \n
+</#if>
+<#list element.typeParameters as typeParameter>
+ * @param <${typeParameter.name}> the type parameter\n
+</#list>
+<#if element.parameterList.parameters?has_content>
+ *\n
+</#if>
+<#list element.parameterList.parameters as parameter>
+ * @param ${parameter.name} the ${paramNames[parameter.name]}\n
+</#list>
+<#if isNotVoid>
+ *\n
+ * @return the ${return}\n
+</#if>
+<#if element.throwsList.referenceElements?has_content>
+ *\n
+</#if>
+<#list element.throwsList.referenceElements as exception>
+ * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
+</#list>
+ */
+
+
+
+
+ ^.*(public|protected|private)*.+static.*(\w\s\w)+.+
+ /**\n
+ * The constant ${element.getName()}.\n
+ */
+
+
+ ^.*(public|protected|private)*.*(\w\s\w)+.+
+ /**\n
+ <#if element.parent.isInterface()>
+ * The constant ${element.getName()}.\n
+<#else>
+ * The ${name}.\n
+</#if> */
+
+
+ .+
+ /**\n
+ <#if element.parent.isEnum()>
+ *${name} ${typeName}.\n
+<#else>
+ * The ${name}.\n
+</#if>*/
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..d8c2faf
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..c7de264
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..b8b610a
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/island/IslandAbstractionDiagram.png b/island/IslandAbstractionDiagram.png
new file mode 100644
index 0000000..2581d21
Binary files /dev/null and b/island/IslandAbstractionDiagram.png differ
diff --git a/island/README.md b/island/README.md
index 90770d0..6e88e9d 100644
--- a/island/README.md
+++ b/island/README.md
@@ -53,7 +53,7 @@ Optional task components:
- Introduce other factors influencing the simulation:
- More animal species
- Different plant species
- - Custom behavior for animal groups (e.g., wolves hunting and moving in packs)
+ - Custom behavior for animal EOrganisms (e.g., wolves hunting and moving in packs)
- Terrain features, including rivers that restrict certain animal movements
About parameters (if you choose to implement):
diff --git a/island/src/main/java/org/island/Main.java b/island/src/main/java/org/island/Main.java
index ac08ae9..a6793b7 100644
--- a/island/src/main/java/org/island/Main.java
+++ b/island/src/main/java/org/island/Main.java
@@ -1,28 +1,16 @@
package org.island;
-import org.island.entity.Simulation;
-import org.island.location.Island;
-import org.island.repo.MapCreator;
-import org.island.repo.factory.EntityFactory;
-import org.island.repo.factory.Factory;
-import org.island.services.SimulationWorkerService;
-import org.island.settings.Config;
-import org.island.view.ConsoleView;
-import org.island.view.View;
-
+import org.island.initializer.Initializer;
+import org.island.simulation.Simulation;
public class Main {
public static void main(String[] args) {
- System.out.printf("Hello and Welcome to the Island Simulation!");
- Config config = Config.getConfig();
- Factory entityFactory = new EntityFactory();
- MapCreator mapCreator = new MapCreator(entityFactory);
- Island island = mapCreator.createIsland(config);
- View view = new ConsoleView(island, entityFactory);
- Simulation game = new Simulation(island, entityFactory, view);
- SimulationWorkerService gameWorker = new SimulationWorkerService(game);
- gameWorker.start();
+ System.out.println("Hello and Welcome to the Island Simulation!");
+
+ Initializer initializer = new Initializer();
+ Simulation simulation = initializer.initialize();
+ simulation.run();
}
}
\ No newline at end of file
diff --git a/island/src/main/java/org/island/abilities/Eatable.java b/island/src/main/java/org/island/abilities/Eatable.java
deleted file mode 100644
index e7d4174..0000000
--- a/island/src/main/java/org/island/abilities/Eatable.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.island.abilities;
-
-import org.island.location.Location;
-
-public interface Eatable {
- public void eat(Location location);
-}
diff --git a/island/src/main/java/org/island/abilities/Movable.java b/island/src/main/java/org/island/abilities/Movable.java
deleted file mode 100644
index d49f742..0000000
--- a/island/src/main/java/org/island/abilities/Movable.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.island.abilities;
-
-import org.island.location.Location;
-
-public interface Movable {
- public void move(Location location);
-}
diff --git a/island/src/main/java/org/island/abilities/Reproducible.java b/island/src/main/java/org/island/abilities/Reproducible.java
deleted file mode 100644
index 742a8af..0000000
--- a/island/src/main/java/org/island/abilities/Reproducible.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.island.abilities;
-
-import org.island.location.Location;
-
-public interface Reproducible {
- public void reproduce(Location location);
-}
diff --git a/island/src/main/java/org/island/animals/Animal.java b/island/src/main/java/org/island/animals/Animal.java
deleted file mode 100644
index 77df6d9..0000000
--- a/island/src/main/java/org/island/animals/Animal.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package org.island.animals;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import org.island.abilities.Eatable;
-import org.island.abilities.Movable;
-import org.island.entity.Organism;
-import org.island.exceptions.OrganismNotFound;
-import org.island.location.Location;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-import org.island.repo.maps.Ration;
-import org.island.repo.maps.Residents;
-import org.island.util.Randomizer;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-public abstract class Animal extends Organism implements Eatable, Movable {
-
- public Animal(OrganismInfo info, Limit limit) {
- super(info, limit);
- }
-
-
- public void move(Location currentLocation) {
- int speed = getSpeed();
- int countOfSteps = Randomizer.random(speed);
-
- Location destination = findDestinationLocation(countOfSteps, currentLocation);
-
- if (moveTo(destination)) {
- remove(currentLocation);
- }
- }
-
-
- public void eat(Location location) {
- location.getLock().lock();
-
- try {
- Ration ration = getRation();
- double currentWeight = getCurrentWeight();
- double deltaWeight = getMaxWeight() - currentWeight;
- Residents residents = location.getResidents();
- Organism prey = getTarget(ration, residents);
- String preyType = prey.getType();
-
- if (prey.isAlive()) {
- int chanceToKill = ration.get(preyType);
- int predatorTry = Randomizer.random(0, 100);
-
- if (predatorTry <= chanceToKill) {
- prey.getDead();
- } else return;
- }
-
- double currentTargetWeight = prey.getCurrentWeight();
- double predatorFinalWeight;
-
- if (deltaWeight > currentTargetWeight) {
- predatorFinalWeight = currentWeight + currentTargetWeight;
- prey.setCurrentWeight(0);
- } else {
- predatorFinalWeight = currentWeight + deltaWeight;
- prey.setCurrentWeight(currentTargetWeight - deltaWeight);
- }
-
- setCurrentWeight(predatorFinalWeight);
- } finally {
- location.getLock().unlock();
- }
- }
-
- public boolean findSomeFood(Ration ration, Residents residents) {
- return residents
- .entrySet()
- .stream()
- .filter(resident -> resident.getValue().size() > 0)
- .map(Map.Entry::getKey)
- .anyMatch(ration::containsKey);
- }
-
- private Organism getTarget(Ration ration, Residents residents) {
- Set preys = residents
- .entrySet()
- .stream()
- .filter(resident -> resident.getValue().size() > 0)
- .filter(resident -> ration.containsKey(resident.getKey()))
- .max(Comparator.comparingInt(resident -> ration.get(resident.getKey())))
- .orElseThrow(() -> new OrganismNotFound("target / prey not found"))
- .getValue();
-
- return preys
- .stream()
- .skip(Randomizer.random(0, preys.size()))
- .iterator()
- .next();
-
- }
-
- private List getAvailableDirections(Set visitedLocations, Location destination){
- return destination
- .getDirections()
- .stream()
- .filter(location -> !visitedLocations.contains(location))
- .collect(Collectors.toList());
- }
-
- private Location findDestinationLocation(int countOfSteps, Location location){
- Set visitedLocations = new HashSet<>();
- Location destination = location;
-
- while(countOfSteps > 0){
- visitedLocations.add(destination);
- List directions = getAvailableDirections(visitedLocations, destination);
- int countOfDirections = directions.size();
-
- if (countOfDirections > 0){
- int selectedDirection = Randomizer.random(0, countOfDirections);
- destination = directions.get(selectedDirection);
- }
- countOfSteps--;
- }
- return destination;
- }
-
- private boolean moveTo(Location destination){
- destination.getLock().lock();
-
- try{
- String type = getType();
- Residents residents = destination.getResidents();
- Set sameKindOrganisms = residents.get(type);
- int countOfSameKindOrganisms = sameKindOrganisms.size();
- int maxCount = getMaxPopulation();
- if (countOfSameKindOrganisms < maxCount){
- return sameKindOrganisms.add(this);
- } else return false;
- } finally {
- destination.getLock().unlock();
- }
- }
-
- private void remove(Location location){
- location.getLock().lock();
-
- try{
- Residents residents = location.getResidents();
- String type = getType();
- Set sameKindOrganisms = residents.get(type);
- if (organismStillAvailable(location)){
- sameKindOrganisms.remove(this);
- }
- } finally {
- location.getLock().unlock();
- }
- }
-
- private boolean organismStillAvailable(Location location){
- Residents residents = location.getResidents();
- String type = getType();
- Set organismStillAvailable = residents.get(type);
- return organismStillAvailable.contains(this);
- }
-
-
-
-}
diff --git a/island/src/main/java/org/island/animals/GrassEater.java b/island/src/main/java/org/island/animals/GrassEater.java
deleted file mode 100644
index ea83b25..0000000
--- a/island/src/main/java/org/island/animals/GrassEater.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.island.animals;
-
-import org.island.abilities.Eatable;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public abstract class GrassEater extends Animal {
- public GrassEater(OrganismInfo info, Limit limit){
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/animals/Predator.java b/island/src/main/java/org/island/animals/Predator.java
deleted file mode 100644
index 6086ded..0000000
--- a/island/src/main/java/org/island/animals/Predator.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.island.animals;
-
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public abstract class Predator extends Animal {
-
- public Predator(OrganismInfo info, Limit limit){
- super(info, limit);
- }
-
-}
-
diff --git a/island/src/main/java/org/island/animals/grasseaters/Boar.java b/island/src/main/java/org/island/animals/grasseaters/Boar.java
deleted file mode 100644
index b6f7c23..0000000
--- a/island/src/main/java/org/island/animals/grasseaters/Boar.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.animals.grasseaters;
-
-import org.island.animals.GrassEater;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Boar extends GrassEater {
-
- public Boar(OrganismInfo info, Limit limit) {
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/animals/grasseaters/Buffalo.java b/island/src/main/java/org/island/animals/grasseaters/Buffalo.java
deleted file mode 100644
index a0550b7..0000000
--- a/island/src/main/java/org/island/animals/grasseaters/Buffalo.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.animals.grasseaters;
-
-import org.island.animals.GrassEater;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Buffalo extends GrassEater {
-
- public Buffalo(OrganismInfo info, Limit limit){
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/animals/grasseaters/Caterpillar.java b/island/src/main/java/org/island/animals/grasseaters/Caterpillar.java
deleted file mode 100644
index 07b5600..0000000
--- a/island/src/main/java/org/island/animals/grasseaters/Caterpillar.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.island.animals.grasseaters;
-
-import org.island.animals.GrassEater;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Caterpillar extends GrassEater {
-
- public Caterpillar(OrganismInfo info, Limit limit){
- super(info, limit);
- }
-
-}
diff --git a/island/src/main/java/org/island/animals/grasseaters/Deer.java b/island/src/main/java/org/island/animals/grasseaters/Deer.java
deleted file mode 100644
index bdc79b6..0000000
--- a/island/src/main/java/org/island/animals/grasseaters/Deer.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.animals.grasseaters;
-
-import org.island.animals.GrassEater;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Deer extends GrassEater {
-
- public Deer(OrganismInfo info, Limit limit){
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/animals/grasseaters/Duck.java b/island/src/main/java/org/island/animals/grasseaters/Duck.java
deleted file mode 100644
index f6672ae..0000000
--- a/island/src/main/java/org/island/animals/grasseaters/Duck.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.animals.grasseaters;
-
-import org.island.animals.GrassEater;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Duck extends GrassEater {
-
- public Duck(OrganismInfo info, Limit limit) {
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/animals/grasseaters/Goat.java b/island/src/main/java/org/island/animals/grasseaters/Goat.java
deleted file mode 100644
index 9ff0f3a..0000000
--- a/island/src/main/java/org/island/animals/grasseaters/Goat.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.animals.grasseaters;
-
-import org.island.animals.GrassEater;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Goat extends GrassEater {
-
- public Goat(OrganismInfo info, Limit limit){
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/animals/grasseaters/Horse.java b/island/src/main/java/org/island/animals/grasseaters/Horse.java
deleted file mode 100644
index ee5026c..0000000
--- a/island/src/main/java/org/island/animals/grasseaters/Horse.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.island.animals.grasseaters;
-
-import org.island.animals.GrassEater;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Horse extends GrassEater {
-
- public Horse(OrganismInfo info, Limit limit) {
- super(info, limit);
- }
-}
-
diff --git a/island/src/main/java/org/island/animals/grasseaters/Mouse.java b/island/src/main/java/org/island/animals/grasseaters/Mouse.java
deleted file mode 100644
index 5c393bc..0000000
--- a/island/src/main/java/org/island/animals/grasseaters/Mouse.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.animals.grasseaters;
-
-import org.island.animals.GrassEater;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Mouse extends GrassEater {
-
- public Mouse(OrganismInfo info, Limit limit){
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/animals/grasseaters/Rabbit.java b/island/src/main/java/org/island/animals/grasseaters/Rabbit.java
deleted file mode 100644
index 6d74392..0000000
--- a/island/src/main/java/org/island/animals/grasseaters/Rabbit.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.island.animals.grasseaters;
-
-import org.island.animals.GrassEater;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Rabbit extends GrassEater {
-
- public Rabbit(OrganismInfo info, Limit limit){
- super(info, limit);
- }
-
-}
diff --git a/island/src/main/java/org/island/animals/grasseaters/Sheep.java b/island/src/main/java/org/island/animals/grasseaters/Sheep.java
deleted file mode 100644
index 2ea16b9..0000000
--- a/island/src/main/java/org/island/animals/grasseaters/Sheep.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.animals.grasseaters;
-
-import org.island.animals.GrassEater;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Sheep extends GrassEater {
-
- public Sheep(OrganismInfo info, Limit limit){
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/animals/predators/Bear.java b/island/src/main/java/org/island/animals/predators/Bear.java
deleted file mode 100644
index 720fcea..0000000
--- a/island/src/main/java/org/island/animals/predators/Bear.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.animals.predators;
-
-import org.island.animals.Predator;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Bear extends Predator {
-
- public Bear(OrganismInfo info, Limit limit){
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/animals/predators/Eagle.java b/island/src/main/java/org/island/animals/predators/Eagle.java
deleted file mode 100644
index aeb1aec..0000000
--- a/island/src/main/java/org/island/animals/predators/Eagle.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.animals.predators;
-
-import org.island.animals.Predator;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Eagle extends Predator {
-
- public Eagle(OrganismInfo info, Limit limit) {
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/animals/predators/Fox.java b/island/src/main/java/org/island/animals/predators/Fox.java
deleted file mode 100644
index 4823eb0..0000000
--- a/island/src/main/java/org/island/animals/predators/Fox.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.animals.predators;
-
-import org.island.animals.Predator;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Fox extends Predator {
-
- public Fox(OrganismInfo info, Limit limit) {
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/animals/predators/Python.java b/island/src/main/java/org/island/animals/predators/Python.java
deleted file mode 100644
index 9ad9582..0000000
--- a/island/src/main/java/org/island/animals/predators/Python.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.island.animals.predators;
-
-import org.island.abilities.Eatable;
-import org.island.abilities.Movable;
-import org.island.abilities.Reproducible;
-import org.island.animals.Predator;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Python extends Predator {
-
- public Python(OrganismInfo info, Limit limit) {
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/animals/predators/Wolf.java b/island/src/main/java/org/island/animals/predators/Wolf.java
deleted file mode 100644
index b2de8a2..0000000
--- a/island/src/main/java/org/island/animals/predators/Wolf.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.animals.predators;
-
-
-import org.island.animals.Predator;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Wolf extends Predator {
- public Wolf(OrganismInfo info, Limit limit){
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/entity/EOrganisms.java b/island/src/main/java/org/island/entity/EOrganisms.java
new file mode 100644
index 0000000..0f8f922
--- /dev/null
+++ b/island/src/main/java/org/island/entity/EOrganisms.java
@@ -0,0 +1,30 @@
+package org.island.entity;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+@Getter
+public enum EOrganisms {
+ WOLF("Wolf", 0, true),
+ PYTHON("Python", 1, true),
+ FOX("Fox", 2, true),
+ BEAR("Bear", 3, true),
+ EAGLE("Eagle", 4, true),
+ HORSE("Horse", 5, true),
+ DEER("Deer", 6, true),
+ RABBIT("Rabbit", 7, true),
+ MOUSE("Mouse", 8, true),
+ GOAT("Goat", 9, true),
+ SHEEP("Sheep", 10, true),
+ BOAR("Boar", 11, true),
+ BUFFALO("Buffalo", 12, true),
+ DUCK("Duck", 13, true),
+ CATERPILLAR("Caterpillar", 14, true),
+ HERB("Herb", 15, false);
+
+ private final String type;
+ private final int groupId;
+ private final boolean isAnimal;
+ //groupId -> group (plants, grasseaters, predators)
+}
diff --git a/island/src/main/java/org/island/entity/Group.java b/island/src/main/java/org/island/entity/Group.java
deleted file mode 100644
index 6fe9e01..0000000
--- a/island/src/main/java/org/island/entity/Group.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.island.entity;
-
-public enum Group {
- WOLF("Wolf", 0),
- PYTHON("Python", 1),
- FOX("Fox", 2),
- BEAR("Bear", 3),
- EAGLE("Eagle", 4),
- HORSE("Horse", 5),
- DEER("Deer", 6),
- RABBIT("Rabbit", 7),
- MOUSE("Mouse", 8),
- GOAT("Goat", 9),
- SHEEP("Sheep", 10),
- BOAR("Boar", 11),
- BUFFALO("Buffalo", 12),
- DUCK("Duck", 13),
- CATERPILLAR("Caterpillar", 14),
- HERB("Herb", 15);
-
- private final String type;
- private final int groupId;
-
- public int getGroupId(){
- return groupId;
- }
-
- public String getType(){
- return type;
- }
-
- Group(String type, int groupId){
- this.type = type;
- this.groupId = groupId;
- }
-
-
-}
diff --git a/island/src/main/java/org/island/entity/Organism.java b/island/src/main/java/org/island/entity/Organism.java
deleted file mode 100644
index e68ff8d..0000000
--- a/island/src/main/java/org/island/entity/Organism.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package org.island.entity;
-
-import lombok.Data;
-import org.island.abilities.Reproducible;
-import org.island.location.Location;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.EntityFactory;
-import org.island.repo.maps.Ration;
-import org.island.repo.maps.Residents;
-import org.island.util.Fullness;
-
-import java.util.Objects;
-import java.util.Set;
-
-@Data
-public abstract class Organism implements Reproducible {
- private final OrganismInfo info;
- private final Limit limit;
-
- public Organism(OrganismInfo info, Limit limit){
- this.info = info;
- this.limit = limit;
- }
-
- public String getType(){
- return info.getType();
- }
-
- public int getGroupId(){
- return info.getGroupId();
- }
-
- public boolean isAlive(){
- return info.isAlive();
- }
-
- public double getCurrentWeight(){
- return info.getCurrentWeight();
- }
-
- public void setCurrentWeight(double currentWeight){
- info.setCurrentWeight(currentWeight);
- }
-
- public String getIcon(){
- return info.getIcon();
- }
-
- public Fullness getFullness(){
- return info.getFullness();
- }
-
- public void setFullness(Fullness fullness){
- info.setFullness(fullness);
- }
-
- public Ration getRation(){
- return info.getRation();
- }
-
- public double getMaxWeight(){
- return limit.getMaxWeight();
- }
-
- public int getMaxPopulation(){
- return limit.getMaxPopulation();
- }
-
- public int getSpeed(){
- return limit.getSpeed();
- }
-
- public void getDead(){
- info.setAlive(false);
- }
-
- @Override
- public void reproduce(Location location) {
- location.getLock().lock();
- try {
- Residents residents = location.getResidents();
- String type = getType();
- Set sameOrganisms = residents.get(type);
- int maxLimit = getMaxPopulation();
-
- if(sameOrganisms.contains(this) && sameOrganisms.size() >= 2 && sameOrganisms.size() < maxLimit){
- Organism organism = EntityFactory.getFactory().create(type);
- sameOrganisms.add(organism);
- }
- } finally {
- location.getLock().unlock();
- }
- }
-
- public void killOrganism(Location location){
- location.getLock().lock();
- try{
- String type = getType();
- location.getResidents().get(type).remove(this);
- } finally {
- location.getLock().unlock();
- }
- }
-
- @Override
- public boolean equals(Object o){
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- Organism organism = (Organism) o;
- return Objects.equals(info, organism.info);
- }
-
- @Override
- public int hashCode(){
- return Objects.hash(info);
- }
-}
diff --git a/island/src/main/java/org/island/entity/OrganismDTO.java b/island/src/main/java/org/island/entity/OrganismDTO.java
new file mode 100644
index 0000000..82f45c2
--- /dev/null
+++ b/island/src/main/java/org/island/entity/OrganismDTO.java
@@ -0,0 +1,38 @@
+package org.island.entity;
+
+
+import lombok.*;
+
+import java.util.HashMap;
+import java.util.Objects;
+import java.util.UUID;
+
+@Builder
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode
+public class OrganismDTO {
+ private UUID uuid;
+ private String type;
+ private int groupId;
+ private int organismId;
+ private boolean isAlive;
+ private double currentWeight;
+ private String icon;
+ private HashMap ration;
+ private double maxWeight;
+ private int maxPopulation;
+ private int speed;
+
+ public EOrganisms getOrganismType() {
+ try {
+ return EOrganisms.valueOf(type.toUpperCase());
+ } catch (IllegalArgumentException e) {
+ return EOrganisms.HERB;
+ }
+ }
+
+
+}
diff --git a/island/src/main/java/org/island/entity/Simulation.java b/island/src/main/java/org/island/entity/Simulation.java
deleted file mode 100644
index 35861a5..0000000
--- a/island/src/main/java/org/island/entity/Simulation.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.island.entity;
-
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import org.island.location.Island;
-import org.island.repo.factory.Factory;
-import org.island.view.View;
-
-@Getter
-@RequiredArgsConstructor
-public class Simulation {
- private final Island island;
- private final Factory entityFactory;
- private final View view;
-}
diff --git a/island/src/main/java/org/island/exceptions/OrganismNotFound.java b/island/src/main/java/org/island/exceptions/OrganismNotFound.java
index 1476c7e..b96db36 100644
--- a/island/src/main/java/org/island/exceptions/OrganismNotFound.java
+++ b/island/src/main/java/org/island/exceptions/OrganismNotFound.java
@@ -1,7 +1,6 @@
package org.island.exceptions;
-public class OrganismNotFound extends RuntimeException {
-
+public class OrganismNotFound extends RuntimeException{
public OrganismNotFound(){}
public OrganismNotFound(String message){
diff --git a/island/src/main/java/org/island/exceptions/OrganismOperationFail.java b/island/src/main/java/org/island/exceptions/OrganismOperationFail.java
deleted file mode 100644
index 24c4533..0000000
--- a/island/src/main/java/org/island/exceptions/OrganismOperationFail.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.island.exceptions;
-
-@SuppressWarnings("unused")
-public class OrganismOperationFail extends RuntimeException{
-
- public OrganismOperationFail(){}
-
- public OrganismOperationFail(String message){
- super(message);
- }
-
- public OrganismOperationFail(String message, Throwable cause){
- super(message, cause);
- }
-
- public OrganismOperationFail(Throwable cause){
- super(cause);
- }
-}
diff --git a/island/src/main/java/org/island/factory/OrganismFactory.java b/island/src/main/java/org/island/factory/OrganismFactory.java
new file mode 100644
index 0000000..708ddc4
--- /dev/null
+++ b/island/src/main/java/org/island/factory/OrganismFactory.java
@@ -0,0 +1,34 @@
+package org.island.factory;
+
+import lombok.Getter;
+import org.island.entity.EOrganisms;
+import org.island.entity.OrganismDTO;
+import org.island.settings.Config;
+import org.island.settings.OrganismParameters;
+
+import java.util.UUID;
+
+
+@Getter
+public class OrganismFactory {
+ private static final OrganismParameters config;
+
+ static {
+ Config configuration = Config.initialize();
+ config = configuration.getOrganismParameters();
+ }
+
+ public static OrganismDTO createOrganism(EOrganisms organism) {
+ OrganismParameters.AnimalParams params = config.getLimits().get(organism.getType());
+
+ return OrganismDTO.builder()
+ .uuid(UUID.randomUUID())
+ .type(organism.getType())
+ .groupId(organism.getGroupId())
+ .icon(config.getIcons().get(organism.getType()))
+ .maxWeight(params.getMaxWeight())
+ .maxPopulation(params.getMaxPopulation())
+ .speed(params.getSpeed())
+ .build();
+ }
+}
diff --git a/island/src/main/java/org/island/initializer/Initializer.java b/island/src/main/java/org/island/initializer/Initializer.java
new file mode 100644
index 0000000..9d399cd
--- /dev/null
+++ b/island/src/main/java/org/island/initializer/Initializer.java
@@ -0,0 +1,63 @@
+package org.island.initializer;
+
+import org.island.factory.OrganismFactory;
+import org.island.model.Island;
+import org.island.services.*;
+import org.island.simulation.Simulation;
+import org.island.settings.Config;
+import org.island.view.ConsoleView;
+import org.island.view.View;
+
+public class Initializer {
+
+ public Simulation initialize() {
+ // Load configuration
+ Config config = loadConfig();
+
+ // Init island and factory
+ OrganismFactory factory = createFactory();
+
+ // Init map creator service
+ MapCreatorService mapCreatorService = new MapCreatorService(factory);
+
+ // Init island and populate
+ Island island = mapCreatorService.createIsland(config);
+
+ // Init view
+ View view = createView(island, factory);
+ view.showStatistics();
+ view.showMap();
+
+ // Initialize simulation
+ return createSimulation(config, island, view);
+ }
+
+ private Config loadConfig() {
+ return Config.initialize();
+ }
+
+ private OrganismFactory createFactory() {
+ return new OrganismFactory();
+ }
+
+ private View createView(Island island, OrganismFactory factory) {
+ return new ConsoleView(island, factory);
+ }
+
+ private Simulation createSimulation(Config config, Island island, View view) {
+ MovementService movementService = new AnimalMovementService();
+ MatingService matingService = new AnimalMatingService();
+ FeedingService feedingService = new AnimalFeedingService();
+ DeathService deathService = new AnimalDeathService();
+
+ return new Simulation(
+ view,
+ island,
+ config.getIslandSimulationConfig().getSimulation().getPeriod(),
+ movementService,
+ matingService,
+ feedingService,
+ deathService,
+ createFactory());
+ }
+}
\ No newline at end of file
diff --git a/island/src/main/java/org/island/location/Island.java b/island/src/main/java/org/island/location/Island.java
deleted file mode 100644
index 270923c..0000000
--- a/island/src/main/java/org/island/location/Island.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.island.location;
-
-import lombok.Data;
-/*
-06/15/2024:
-Island Class: Manages the entire island grid using a 2-dimensional array of Location objects.
-
-@Data: Lombok annotation that automatically generates getters, setters, equals(), hashCode(),
-and toString() methods for all fields in the class.
- */
-
-@Data
-public class Island {
- private Location[][] grid;
-
- public Island(int numRows, int numCols){
- this.grid = new Location[numRows] [numCols];
- }
-
- public Location[][] getIslandGrid(){
- return grid;
- }
-
-}
diff --git a/island/src/main/java/org/island/location/Location.java b/island/src/main/java/org/island/location/Location.java
deleted file mode 100644
index 8347b27..0000000
--- a/island/src/main/java/org/island/location/Location.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.island.location;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.Getter;
-import lombok.Setter;
-import org.island.animals.Animal;
-import org.island.plants.Plant;
-import org.island.repo.maps.Residents;
-
-import java.util.List;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-/*
-06/15/2024:
-Location Class: Represents a single cell on the island grid,
-encapsulating vegetation (same as plant) and animal information.
-
-@Data: Lombok annotation that automatically generates getters, setters, equals(), hashCode(),
-and toString() methods for all fields in the class.
-
-@AllArgsConstructor: Lombok annotation that automatically generates constructor with all
- arguments based on all fields in the class.
- */
-
-@Data
-@AllArgsConstructor
-public class Location {
- private final int row;
- private final int column;
-
- @Getter
- private List directions;
-
- @Setter
- private final Residents residents;
-
- @Getter
- private final Lock lock;
-
- public Location(int row, int column){
- this.row = row;
- this.column = column;
- this.residents = new Residents();
- this.lock = new ReentrantLock(true);
- }
-
- public void setDirection(List directions){
- this.directions = directions;
- }
-
- @Override
- public String toString(){
- return "Location" + "[" + row + "]" + "[" + column + "]";
- }
-
- private Plant plant;
- private Animal animal;
-}
diff --git a/island/src/main/java/org/island/model/Island.java b/island/src/main/java/org/island/model/Island.java
new file mode 100644
index 0000000..eee7982
--- /dev/null
+++ b/island/src/main/java/org/island/model/Island.java
@@ -0,0 +1,13 @@
+package org.island.model;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.ToString;
+import org.island.settings.Config;
+
+
+@Data
+@ToString
+public class Island {
+ private Location[][] GRID;
+}
\ No newline at end of file
diff --git a/island/src/main/java/org/island/model/Location.java b/island/src/main/java/org/island/model/Location.java
new file mode 100644
index 0000000..fd6b01a
--- /dev/null
+++ b/island/src/main/java/org/island/model/Location.java
@@ -0,0 +1,135 @@
+package org.island.model;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.island.entity.OrganismDTO;
+
+import java.util.*;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+@Data
+public class Location {
+ private final int row;
+ private final int column;
+ private List directions;
+ private Map> residents;
+ private final Lock lock = new ReentrantLock();
+
+ public Location(int row, int column) {
+ this.row = row;
+ this.column = column;
+ this.residents = new HashMap<>();
+ this.directions = new ArrayList<>();
+ }
+
+ public void addDirection(Location direction) {
+ this.directions.add(direction);
+ }
+
+ public void addResident(OrganismDTO resident) {
+ lock.lock();
+ try {
+ Set organismSet = residents.computeIfAbsent(resident.getType(), k -> new HashSet<>());
+ organismSet.add(resident);
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ public void removeResident(OrganismDTO resident) {
+ lock.lock();
+ try {
+ Set organismSet = residents.get(resident.getType());
+ if (organismSet != null) {
+ organismSet.remove(resident);
+ }
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ public boolean isFull(String type, int maxPopulation) {
+ lock.lock();
+ try {
+ Set organismSet = residents.get(type);
+ return organismSet != null && organismSet.size() >= maxPopulation;
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ public int getResidentCount(String type) {
+ lock.lock();
+ try {
+ Set organismSet = residents.get(type);
+ return organismSet != null ? organismSet.size() : 0;
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ public Set getResidentsOfType(String type) {
+ lock.lock();
+ try {
+ return new HashSet<>(residents.getOrDefault(type, Collections.emptySet()));
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "Location{" +
+ "row=" + row +
+ ", column=" + column +
+ ", directions=" + summarizeDirections() +
+ ", residents=" + summarizeResidents() +
+ '}';
+ }
+
+ private String summarizeDirections() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("[");
+ for (Location direction : directions) {
+ sb.append("Location{row=").append(direction.getRow()).append(", column=").append(direction.getColumn()).append("}, ");
+ }
+ if (sb.length() > 1) {
+ sb.setLength(sb.length() - 2);
+ }
+ sb.append("]");
+ return sb.toString();
+ }
+
+ private String summarizeResidents() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("{");
+ for (Map.Entry> entry : residents.entrySet()) {
+ sb.append(entry.getKey()).append("=").append(entry.getValue().size()).append(", ");
+ }
+ if (sb.length() > 1) {
+ sb.setLength(sb.length() - 2);
+ }
+ sb.append("}");
+ return sb.toString();
+ }
+
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof Location location)) return false;
+ return row == location.row && column == location.column && Objects.equals(directions, location.directions) && Objects.equals(residents, location.residents) && Objects.equals(lock, location.lock);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 17;
+ result = 31 * result + row;
+ result = 31 * result + column;
+ result = 31 * result + directions.size();
+ result = 31 * result + residents.hashCode();
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/island/src/main/java/org/island/model/Ration.java b/island/src/main/java/org/island/model/Ration.java
new file mode 100644
index 0000000..abb372c
--- /dev/null
+++ b/island/src/main/java/org/island/model/Ration.java
@@ -0,0 +1,6 @@
+package org.island.model;
+
+import java.util.HashMap;
+
+public class Ration extends HashMap {
+}
diff --git a/island/src/main/java/org/island/model/Residents.java b/island/src/main/java/org/island/model/Residents.java
new file mode 100644
index 0000000..6783fd5
--- /dev/null
+++ b/island/src/main/java/org/island/model/Residents.java
@@ -0,0 +1,9 @@
+package org.island.model;
+
+import org.island.entity.OrganismDTO;
+
+import java.util.HashMap;
+import java.util.Set;
+
+public class Residents extends HashMap> {
+}
diff --git a/island/src/main/java/org/island/plants/Growable.java b/island/src/main/java/org/island/plants/Growable.java
deleted file mode 100644
index 1b6d211..0000000
--- a/island/src/main/java/org/island/plants/Growable.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.island.plants;
-
-public interface Growable {
- public void grow();
-}
diff --git a/island/src/main/java/org/island/plants/Herb.java b/island/src/main/java/org/island/plants/Herb.java
deleted file mode 100644
index d20f7f8..0000000
--- a/island/src/main/java/org/island/plants/Herb.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.island.plants;
-
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public class Herb extends Plant {
-
- public Herb(OrganismInfo info, Limit limit) {
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/plants/Plant.java b/island/src/main/java/org/island/plants/Plant.java
deleted file mode 100644
index 7f45f3d..0000000
--- a/island/src/main/java/org/island/plants/Plant.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.island.plants;
-
-
-import org.island.entity.Organism;
-import org.island.repo.Limit;
-import org.island.repo.OrganismInfo;
-
-public abstract class Plant extends Organism {
-
- public Plant(OrganismInfo info, Limit limit){
- super(info, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/Limit.java b/island/src/main/java/org/island/repo/Limit.java
deleted file mode 100644
index 84ab5a6..0000000
--- a/island/src/main/java/org/island/repo/Limit.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.repo;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class Limit {
- private double maxWeight;
- private int maxPopulation;
- private int speed;
-}
diff --git a/island/src/main/java/org/island/repo/MapCreator.java b/island/src/main/java/org/island/repo/MapCreator.java
deleted file mode 100644
index 6402935..0000000
--- a/island/src/main/java/org/island/repo/MapCreator.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.island.repo;
-
-import org.island.entity.Organism;
-import org.island.location.Island;
-import org.island.location.Location;
-import org.island.repo.factory.Factory;
-import org.island.repo.maps.Residents;
-import org.island.settings.Config;
-import org.island.util.Randomizer;
-
-import java.util.*;
-
-public class MapCreator {
-
- private final Factory entityFactory;
- private int rows;
- private int columns;
-
- public MapCreator(Factory factory) {
- this.entityFactory = factory;
- }
-
- public Island createIsland(Config config) {
- this.rows = config.getRows();
- this.columns = config.getColumns();
-
- Island island = new Island(rows, columns);
-
- createEmptyGrid(island);
- populateIsland(island);
- findLocationNeighbors(island);
-
- return island;
- }
-
- private void createEmptyGrid(Island island) {
- Location[][] grid = island.getIslandGrid();
-
- for (int row = 0; row < grid.length; row++) {
- for (int column = 0; column < grid[row].length; column++) {
- grid[row][column] = new Location(row, column);
- }
- }
- }
-
- private void populateIsland(Island island) {
- Location[][] grid = island.getIslandGrid();
- Map prototypes = entityFactory.getPrototypes();
-
- for (Location[] value : grid) {
- for (Location location : value) {
- Residents residents = location.getResidents();
-
- for (Organism organism : prototypes.values()) {
- String type = organism.getType();
- int maxCount = organism.getMaxPopulation();
- int count = Randomizer.random(maxCount / 2, maxCount);
- Set organismSet = new HashSet<>();
-
- for (int i = 0; i < count; i++) {
- organismSet.add(entityFactory.create(type));
- }
- residents.put(type, organismSet);
- }
- }
- }
- }
-
- private void findLocationNeighbors(Island island) {
- Location[][] grid = island.getIslandGrid();
- for (int row = 0; row < grid.length; row++) {
- for (int col = 0; col < grid[row].length; col++) {
- Location location = grid[row][col];
- List neighbours = findNeighbors(row, col, grid);
- location.setDirection(neighbours);
- }
- }
- }
-
- private List findNeighbors(int row, int col, Location[][] grid) {
- List result = new ArrayList<>();
- if (row > 0) result.add(grid[row - 1][col]);
- if (col > 0) result.add(grid[row][col - 1]);
- if (row < rows - 1) result.add(grid[row + 1][col]);
- if (col < columns - 1) result.add(grid[row][col + 1]);
-
- return result;
- }
-}
diff --git a/island/src/main/java/org/island/repo/OrganismInfo.java b/island/src/main/java/org/island/repo/OrganismInfo.java
deleted file mode 100644
index db9d604..0000000
--- a/island/src/main/java/org/island/repo/OrganismInfo.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.island.repo;
-
-
-import lombok.*;
-import org.island.repo.maps.Ration;
-import org.island.util.Fullness;
-
-import java.util.Objects;
-
-@Builder
-@Getter
-@Setter
-@AllArgsConstructor
-@NoArgsConstructor
-public class OrganismInfo {
- private String type;
- private int groupId;
- private int organismId;
- private boolean isAlive;
- private double currentWeight;
- private String icon;
- private Fullness fullness;
- private Ration ration;
-
- @Override
- public boolean equals(Object o){
- if(this == o) return true;
- if(o ==null || getClass() != o.getClass()) return false;
- OrganismInfo that = (OrganismInfo) o;
- return groupId == that.groupId && organismId == that.organismId;
- }
-
- @Override
- public int hashCode(){
- return Objects.hash(groupId, organismId);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/EntityFactory.java b/island/src/main/java/org/island/repo/factory/EntityFactory.java
deleted file mode 100644
index bcb3e63..0000000
--- a/island/src/main/java/org/island/repo/factory/EntityFactory.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.island.repo.factory;
-
-import lombok.AllArgsConstructor;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.factory.animal_factories.grasseaters.*;
-import org.island.repo.factory.animal_factories.predators.*;
-import org.island.repo.factory.plant_factories.HerbFactory;
-
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-@AllArgsConstructor
-public class EntityFactory implements Factory{
- private static EntityFactory FACTORY;
-
- private final Map factoryMap;
- private final Map prototypes;
-
- public EntityFactory(){
- factoryMap = createFactoryMap();
- prototypes = createPrototypes();
- }
-
- public static EntityFactory getFactory(){
- if (FACTORY == null){
- FACTORY = new EntityFactory();
- }
- return FACTORY;
- }
-
- @Override
- public Map getPrototypes() {
- return prototypes;
- }
-
- @Override
- public Organism create(String type) {
- OrganismFactory factory = factoryMap.get(type);
- Organism organism = factory.create(type);
- if (organism != null){
- return organism;
- } else throw new IllegalArgumentException("Wrong type of creation - " + type);
- }
-
- private Map createFactoryMap(){
- Map factories = new LinkedHashMap<>(){{
- put(Group.WOLF.getType(), new WolfFactory());
- put(Group.PYTHON.getType(), new PythonFactory());
- put(Group.FOX.getType(), new FoxFactory());
- put(Group.BEAR.getType(), new BearFactory());
- put(Group.EAGLE.getType(), new EagleFactory());
- put(Group.HORSE.getType(), new HorseFactory());
- put(Group.DEER.getType(), new DeerFactory());
- put(Group.RABBIT.getType(), new RabbitFactory());
- put(Group.MOUSE.getType(), new MouseFactory());
- put(Group.GOAT.getType(), new GoatFactory());
- put(Group.SHEEP.getType(), new SheepFactory());
- put(Group.BOAR.getType(), new BoarFactory());
- put(Group.BUFFALO.getType(), new BuffaloFactory());
- put(Group.DUCK.getType(), new DuckFactory());
- put(Group.CATERPILLAR.getType(), new CaterpillarFactory());
- put(Group.HERB.getType(), new HerbFactory());
- }};
- return Collections.unmodifiableMap(factories);
- }
- private Map createPrototypes(){
- Map result = new LinkedHashMap<>();
-
- for (Map.Entry pair : factoryMap.entrySet()){
- String type = pair.getKey();
- Organism organism = pair.getValue().create(type);
- result.put(type, organism);
- }
- return Collections.unmodifiableMap(result);
- }
-
-}
diff --git a/island/src/main/java/org/island/repo/factory/Factory.java b/island/src/main/java/org/island/repo/factory/Factory.java
deleted file mode 100644
index a7d74a4..0000000
--- a/island/src/main/java/org/island/repo/factory/Factory.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.island.repo.factory;
-
-import org.island.entity.Organism;
-
-import java.util.Map;
-
-public interface Factory {
- Organism create(String type);
- Map getPrototypes();
-
-}
diff --git a/island/src/main/java/org/island/repo/factory/OrganismFactory.java b/island/src/main/java/org/island/repo/factory/OrganismFactory.java
deleted file mode 100644
index 7607fa0..0000000
--- a/island/src/main/java/org/island/repo/factory/OrganismFactory.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.island.repo.factory;
-
-import org.island.entity.Organism;
-import org.island.repo.Limit;
-import org.island.repo.maps.Ration;
-import org.island.settings.Config;
-import org.island.util.Fullness;
-
-import java.io.ObjectInputFilter;
-
-public abstract class OrganismFactory {
- protected int groupId;
- protected String type;
- protected Config config = Config.getConfig();
- protected boolean isAlive = true;
- protected double currentWeight;
- protected Fullness fullness = Fullness.ALL_RIGHT;
- protected Ration ration;
- protected Limit limit;
- protected String icon;
-
- public abstract Organism create(String type);
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/BoarFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/BoarFactory.java
deleted file mode 100644
index 23c2504..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/BoarFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.island.repo.factory.animal_factories.grasseaters;
-
-import org.island.animals.grasseaters.Boar;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class BoarFactory extends OrganismFactory {
-
- private static final AtomicInteger ID = new AtomicInteger(0);
-
- public BoarFactory() {
- groupId = Group.BOAR.getGroupId();
- type = Group.BOAR.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type) {
-
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Boar(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/BuffaloFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/BuffaloFactory.java
deleted file mode 100644
index 0436906..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/BuffaloFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.island.repo.factory.animal_factories.grasseaters;
-
-import org.island.animals.grasseaters.Boar;
-import org.island.animals.grasseaters.Buffalo;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class BuffaloFactory extends OrganismFactory {
-
- private static final AtomicInteger ID = new AtomicInteger(0);
-
- public BuffaloFactory(){
- groupId = Group.BUFFALO.getGroupId();
- type = Group.BUFFALO.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type){
-
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Buffalo(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/CaterpillarFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/CaterpillarFactory.java
deleted file mode 100644
index 3c950d0..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/CaterpillarFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.island.repo.factory.animal_factories.grasseaters;
-
-import org.island.animals.grasseaters.Caterpillar;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class CaterpillarFactory extends OrganismFactory {
-
- private static final AtomicInteger ID = new AtomicInteger(0);
-
- public CaterpillarFactory() {
- groupId = Group.CATERPILLAR.getGroupId();
- type = Group.CATERPILLAR.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type) {
-
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Caterpillar(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/DeerFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/DeerFactory.java
deleted file mode 100644
index e62e6c3..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/DeerFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.island.repo.factory.animal_factories.grasseaters;
-
-import org.island.animals.grasseaters.Deer;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class DeerFactory extends OrganismFactory {
-
- private static final AtomicInteger ID = new AtomicInteger(0);
-
- public DeerFactory() {
- groupId = Group.DEER.getGroupId();
- type = Group.DEER.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type) {
-
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Deer(organismInfo, limit);
- }
-}
-
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/DuckFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/DuckFactory.java
deleted file mode 100644
index d2850a5..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/DuckFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.island.repo.factory.animal_factories.grasseaters;
-
-import org.island.animals.grasseaters.Duck;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class DuckFactory extends OrganismFactory {
-
- private static final AtomicInteger ID = new AtomicInteger(0);
-
- public DuckFactory() {
- groupId = Group.DUCK.getGroupId();
- type = Group.DUCK.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type) {
-
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Duck(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/GoatFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/GoatFactory.java
deleted file mode 100644
index 183f448..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/GoatFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.island.repo.factory.animal_factories.grasseaters;
-
-import org.island.animals.grasseaters.Mouse;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class GoatFactory extends OrganismFactory {
-
- private static final AtomicInteger ID = new AtomicInteger(0);
-
- public GoatFactory(){
- groupId = Group.GOAT.getGroupId();
- type = Group.GOAT.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type){
-
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Mouse(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/HorseFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/HorseFactory.java
deleted file mode 100644
index 4d3afb7..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/HorseFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.island.repo.factory.animal_factories.grasseaters;
-
-import org.island.animals.grasseaters.Horse;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class HorseFactory extends OrganismFactory {
-
- public static final AtomicInteger ID = new AtomicInteger(0);
-
- public HorseFactory(){
- groupId = Group.HORSE.getGroupId();
- type = Group.HORSE.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type){
-
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Horse(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/MouseFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/MouseFactory.java
deleted file mode 100644
index 6f6369c..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/MouseFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.island.repo.factory.animal_factories.grasseaters;
-
-import org.island.animals.grasseaters.Mouse;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class MouseFactory extends OrganismFactory {
-
- private static final AtomicInteger ID = new AtomicInteger(0);
-
- public MouseFactory(){
- groupId = Group.MOUSE.getGroupId();
- type = Group.MOUSE.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type){
-
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Mouse(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/RabbitFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/RabbitFactory.java
deleted file mode 100644
index 9a46b3f..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/RabbitFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.island.repo.factory.animal_factories.grasseaters;
-
-import org.island.animals.grasseaters.Rabbit;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class RabbitFactory extends OrganismFactory {
-
- private static final AtomicInteger ID = new AtomicInteger(0);
-
- public RabbitFactory() {
- groupId = Group.RABBIT.getGroupId();
- type = Group.RABBIT.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type) {
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Rabbit(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/SheepFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/SheepFactory.java
deleted file mode 100644
index 8812093..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/grasseaters/SheepFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.island.repo.factory.animal_factories.grasseaters;
-
-import org.island.animals.grasseaters.Sheep;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class SheepFactory extends OrganismFactory {
-
- private static final AtomicInteger ID = new AtomicInteger(0);
-
- public SheepFactory() {
- groupId = Group.SHEEP.getGroupId();
- type = Group.SHEEP.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type) {
-
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Sheep(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/predators/BearFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/predators/BearFactory.java
deleted file mode 100644
index d93ca86..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/predators/BearFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.island.repo.factory.animal_factories.predators;
-
-import org.island.animals.predators.Bear;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class BearFactory extends OrganismFactory {
-
- private static final AtomicInteger ID = new AtomicInteger(0);
-
- public BearFactory(){
- groupId = Group.BEAR.getGroupId();
- type = Group.BEAR.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type){
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Bear(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/predators/EagleFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/predators/EagleFactory.java
deleted file mode 100644
index aac7467..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/predators/EagleFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.island.repo.factory.animal_factories.predators;
-
-import org.island.animals.predators.Eagle;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class EagleFactory extends OrganismFactory {
-
- private static final AtomicInteger ID = new AtomicInteger(0);
-
- public EagleFactory(){
- groupId = Group.EAGLE.getGroupId();
- type = Group.EAGLE.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type) {
-
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Eagle(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/predators/FoxFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/predators/FoxFactory.java
deleted file mode 100644
index b7485d4..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/predators/FoxFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.island.repo.factory.animal_factories.predators;
-
-import org.island.animals.predators.Fox;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class FoxFactory extends OrganismFactory {
-
- public static final AtomicInteger ID = new AtomicInteger(0);
-
- public FoxFactory() {
- groupId = Group.FOX.getGroupId();
- type = Group.FOX.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() *config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type) {
-
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Fox(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/predators/PythonFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/predators/PythonFactory.java
deleted file mode 100644
index a1200c4..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/predators/PythonFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.island.repo.factory.animal_factories.predators;
-
-import org.island.animals.predators.Python;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class PythonFactory extends OrganismFactory {
-
- private static final AtomicInteger ID = new AtomicInteger(0);
-
- public PythonFactory() {
- groupId = Group.PYTHON.getGroupId();
- type = Group.PYTHON.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type) {
-
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Python(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/animal_factories/predators/WolfFactory.java b/island/src/main/java/org/island/repo/factory/animal_factories/predators/WolfFactory.java
deleted file mode 100644
index 2beddb7..0000000
--- a/island/src/main/java/org/island/repo/factory/animal_factories/predators/WolfFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.island.repo.factory.animal_factories.predators;
-
-import org.island.animals.predators.Wolf;
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class WolfFactory extends OrganismFactory {
- private final static AtomicInteger ID = new AtomicInteger(0);
-
- public WolfFactory() {
- groupId = Group.WOLF.getGroupId();
- type = Group.WOLF.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type) {
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Wolf(organismInfo, limit);
-
- }
-}
diff --git a/island/src/main/java/org/island/repo/factory/plant_factories/HerbFactory.java b/island/src/main/java/org/island/repo/factory/plant_factories/HerbFactory.java
deleted file mode 100644
index c3903ef..0000000
--- a/island/src/main/java/org/island/repo/factory/plant_factories/HerbFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.island.repo.factory.plant_factories;
-
-import org.island.entity.Group;
-import org.island.entity.Organism;
-import org.island.plants.Herb;
-import org.island.repo.OrganismInfo;
-import org.island.repo.factory.OrganismFactory;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class HerbFactory extends OrganismFactory {
-
- private static final AtomicInteger ID = new AtomicInteger(0);
-
- public HerbFactory(){
- groupId = Group.HERB.getGroupId();
- type = Group.HERB.getType();
- limit = config.getLimit(type);
- currentWeight = limit.getMaxWeight() * config.getStartWeightFactor();
- ration = config.getRation(type);
- icon = config.getIcon(type);
- }
-
- @Override
- public Organism create(String type){
-
- int organismId = ID.getAndIncrement();
-
- OrganismInfo organismInfo = OrganismInfo.builder()
- .type(type)
- .groupId(groupId)
- .organismId(organismId)
- .isAlive(isAlive)
- .currentWeight(currentWeight)
- .icon(icon)
- .fullness(fullness)
- .ration(ration)
- .build();
-
- return new Herb(organismInfo, limit);
- }
-}
diff --git a/island/src/main/java/org/island/repo/maps/FoodMap.java b/island/src/main/java/org/island/repo/maps/FoodMap.java
deleted file mode 100644
index 21d2302..0000000
--- a/island/src/main/java/org/island/repo/maps/FoodMap.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.repo.maps;
-
-import java.util.HashMap;
-
-/*
-Map foodMap,contain:
- K - organism String type;
- V - organism ration with chanceToEat > 0 (Map).
-*/
-
-public class FoodMap extends HashMap {
-}
diff --git a/island/src/main/java/org/island/repo/maps/Ration.java b/island/src/main/java/org/island/repo/maps/Ration.java
deleted file mode 100644
index fd8b8eb..0000000
--- a/island/src/main/java/org/island/repo/maps/Ration.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.island.repo.maps;
-
-import java.util.HashMap;
-
-/*
-Map ration, contain:
- K - creature String type;
- V - chance to eat this creature
- */
-
-public class Ration extends HashMap {
-}
diff --git a/island/src/main/java/org/island/repo/maps/Residents.java b/island/src/main/java/org/island/repo/maps/Residents.java
deleted file mode 100644
index 19a2911..0000000
--- a/island/src/main/java/org/island/repo/maps/Residents.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.island.repo.maps;
-
-import org.island.entity.Organism;
-
-import java.util.HashMap;
-import java.util.Set;
-
-/*
-Map residents, contain:
- K - creature String type;
- V - set of these organisms.
-*/
-
-public class Residents extends HashMap> {
-}
diff --git a/island/src/main/java/org/island/services/AnimalDeathService.java b/island/src/main/java/org/island/services/AnimalDeathService.java
new file mode 100644
index 0000000..ed66df2
--- /dev/null
+++ b/island/src/main/java/org/island/services/AnimalDeathService.java
@@ -0,0 +1,40 @@
+package org.island.services;
+
+import org.island.entity.OrganismDTO;
+import org.island.model.Location;
+
+import java.util.UUID;
+
+public class AnimalDeathService implements DeathService {
+
+
+
+ @Override
+ public void die(OrganismDTO organism, Location location) {
+ location.getLock().lock();
+
+ try {
+ if (organism.isAlive()) {
+ organism.setAlive(false);
+ }
+
+ String type = organism.getType();
+ location.getResidents().get(type).remove(organism);
+ } finally {
+ location.getLock().unlock();
+ }
+ }
+
+
+ public void remove(UUID idOrganism, Location location) {
+ location.getLock().lock();
+
+ try {
+ location.getResidents().values().forEach(organisms ->
+ organisms.removeIf(organism -> organism.getUuid().equals(idOrganism))
+ );
+ } finally {
+ location.getLock().unlock();
+ }
+ }
+}
diff --git a/island/src/main/java/org/island/services/AnimalFeedingService.java b/island/src/main/java/org/island/services/AnimalFeedingService.java
new file mode 100644
index 0000000..fa251f8
--- /dev/null
+++ b/island/src/main/java/org/island/services/AnimalFeedingService.java
@@ -0,0 +1,40 @@
+package org.island.services;
+
+import org.island.entity.OrganismDTO;
+import org.island.model.Location;
+
+import java.util.Map;
+import java.util.Set;
+
+public class AnimalFeedingService implements FeedingService {
+
+ @Override
+ public void eat(OrganismDTO organism, Location location) {
+ location.getLock().lock();
+
+ try {
+ Map ration = organism.getRation();
+
+ for (Map.Entry entry : ration.entrySet()) {
+ String preyType = entry.getKey();
+ int probability = entry.getValue();
+
+ Set preySet = location.getResidents().get(preyType);
+
+ if (preySet != null && !preySet.isEmpty()) {
+ for (OrganismDTO prey : preySet) {
+ if (Math.random() * 100 < probability) {
+ organism.setCurrentWeight(Math.min(organism.getMaxWeight(),
+ organism.getCurrentWeight() + prey.getCurrentWeight()));
+ prey.setAlive(false);
+ location.getResidents().get(preyType).remove(prey);
+ break;
+ }
+ }
+ }
+ }
+ } finally {
+ location.getLock().unlock();
+ }
+ }
+}
diff --git a/island/src/main/java/org/island/services/AnimalMatingService.java b/island/src/main/java/org/island/services/AnimalMatingService.java
new file mode 100644
index 0000000..c7c2ff6
--- /dev/null
+++ b/island/src/main/java/org/island/services/AnimalMatingService.java
@@ -0,0 +1,51 @@
+package org.island.services;
+
+import org.island.entity.OrganismDTO;
+import org.island.model.Location;
+
+import java.util.HashMap;
+import java.util.Set;
+import java.util.UUID;
+
+public class AnimalMatingService implements MatingService {
+
+ @Override
+ public void findMate(OrganismDTO organism, Location location) {
+ location.getLock().lock();
+ try {
+ Set sameTypeOrganisms = getSameTypeOrganisms(organism, location);
+
+ if (canReproduce(organism, sameTypeOrganisms)) {
+ OrganismDTO newOrganism = createOffspring(organism);
+ sameTypeOrganisms.add(newOrganism);
+ }
+ } finally {
+ location.getLock().unlock();
+ }
+ }
+
+ private Set getSameTypeOrganisms(OrganismDTO organism, Location location) {
+ return location.getResidents().getOrDefault(organism.getType(), Set.of());
+ }
+
+ private boolean canReproduce(OrganismDTO organism, Set sameTypeOrganisms) {
+ int currentPopulation = sameTypeOrganisms.size();
+ return currentPopulation >= 2 && currentPopulation < organism.getMaxPopulation();
+ }
+
+ private OrganismDTO createOffspring(OrganismDTO parentOrganism) {
+ return OrganismDTO.builder()
+ .uuid(UUID.randomUUID())
+ .type(parentOrganism.getType())
+ .groupId(parentOrganism.getGroupId())
+ .isAlive(true)
+ .currentWeight(parentOrganism.getCurrentWeight() * 0.5)
+ .icon(parentOrganism.getIcon())
+ .ration(new HashMap<>(parentOrganism.getRation()))
+ .maxWeight(parentOrganism.getMaxWeight())
+ .maxPopulation(parentOrganism.getMaxPopulation())
+ .speed(parentOrganism.getSpeed())
+ .build();
+ }
+
+}
diff --git a/island/src/main/java/org/island/services/AnimalMovementService.java b/island/src/main/java/org/island/services/AnimalMovementService.java
new file mode 100644
index 0000000..c29bfcb
--- /dev/null
+++ b/island/src/main/java/org/island/services/AnimalMovementService.java
@@ -0,0 +1,92 @@
+package org.island.services;
+
+import org.island.entity.OrganismDTO;
+import org.island.model.Location;
+import org.island.util.Randomizer;
+
+import java.util.*;
+import java.util.concurrent.locks.Lock;
+import java.util.logging.Logger;
+
+public class AnimalMovementService implements MovementService {
+ Logger log = Logger.getLogger(this.getClass().getName());
+
+ private List getAvailableDirections(Set visitedLocations, Location destination) {
+ return destination.getDirections().stream()
+ .filter(location -> !visitedLocations.contains(location))
+ .toList();
+ }
+
+ private Location findDestinationLocation(int countOfSteps, Location location) {
+ Set visitedLocations = new HashSet<>();
+ Location destination = location;
+
+ while (countOfSteps > 0) {
+ visitedLocations.add(destination);
+ List directions = getAvailableDirections(visitedLocations, destination);
+ int countOfDirections = directions.size();
+
+ if (countOfDirections > 0) {
+ int selectedDirection = Randomizer.random(0, countOfDirections);
+ if (selectedDirection < directions.size()) {
+ destination = directions.get(selectedDirection);
+ countOfSteps--;
+ }
+ else {
+ break;
+ }
+ }
+ else {
+ break;
+ }
+ countOfSteps--;
+ }
+
+
+ return destination;
+ }
+
+ public void move(OrganismDTO animal, Location currentLocation) {
+ int speed = animal.getSpeed();
+ int countOfSteps = Randomizer.random(speed);
+ Location destination = findDestinationLocation(countOfSteps, currentLocation);
+
+ if (moveTo(animal, destination)) {
+ remove(animal, currentLocation);
+ }
+ }
+
+ private boolean moveTo(OrganismDTO animal, Location destination) {
+ Lock lock = destination.getLock();
+ lock.lock();
+ try {
+ String type = animal.getType();
+ Map> residents = destination.getResidents();
+ Set sameKindOrganisms = residents.computeIfAbsent(type, k -> new HashSet<>());
+
+ if (sameKindOrganisms.size() < animal.getMaxPopulation()) {
+ sameKindOrganisms.add(animal);
+ return true;
+ }
+ return false;
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ private void remove(OrganismDTO animal, Location location) {
+ Lock lock = location.getLock();
+ lock.lock();
+ try {
+ Map> residents = location.getResidents();
+ String type = animal.getType();
+ Set sameKindOrganisms = residents.get(type);
+
+ if (sameKindOrganisms != null && sameKindOrganisms.contains(animal)) {
+ sameKindOrganisms.remove(animal);
+ }
+ } finally {
+ lock.unlock();
+ }
+ }
+}
\ No newline at end of file
diff --git a/island/src/main/java/org/island/services/DeathService.java b/island/src/main/java/org/island/services/DeathService.java
new file mode 100644
index 0000000..29d5d9b
--- /dev/null
+++ b/island/src/main/java/org/island/services/DeathService.java
@@ -0,0 +1,9 @@
+package org.island.services;
+
+import org.island.entity.OrganismDTO;
+import org.island.model.Island;
+import org.island.model.Location;
+
+public interface DeathService {
+ void die(OrganismDTO organism, Location location);
+}
diff --git a/island/src/main/java/org/island/services/EatTaskService.java b/island/src/main/java/org/island/services/EatTaskService.java
deleted file mode 100644
index dda0504..0000000
--- a/island/src/main/java/org/island/services/EatTaskService.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.island.services;
-
-import org.island.animals.Animal;
-import org.island.entity.Organism;
-import org.island.location.Location;
-
-public class EatTaskService extends TaskService {
-
- public EatTaskService(Organism organism, Location location) {
- super(organism, location);
- }
-
- @Override
- public void run() {
- if (organism instanceof Animal) {
- Animal animal = (Animal) organism;
- animal.eat(location);
- }
- }
-}
diff --git a/island/src/main/java/org/island/services/FeedAnimalService.java b/island/src/main/java/org/island/services/FeedAnimalService.java
new file mode 100644
index 0000000..3e72fc4
--- /dev/null
+++ b/island/src/main/java/org/island/services/FeedAnimalService.java
@@ -0,0 +1,71 @@
+package org.island.services;
+
+import org.island.entity.OrganismDTO;
+import org.island.exceptions.OrganismNotFound;
+import org.island.model.Location;
+import org.island.model.Ration;
+import org.island.model.Residents;
+import org.island.util.Randomizer;
+
+import java.util.Comparator;
+import java.util.Set;
+
+public class FeedAnimalService implements FeedingService{
+
+
+ @Override
+ public void eat(OrganismDTO organism, Location location) {
+ location.getLock().lock();
+
+ try {
+ Ration ration = (Ration) organism.getRation();
+ double currentWeight = organism.getCurrentWeight();
+ double deltaWeight = organism.getMaxWeight() - currentWeight;
+ Residents residents = (Residents) location.getResidents();
+ OrganismDTO prey = getTarget(ration, residents);
+ String preyType = prey.getType();
+
+ if (prey.isAlive()) {
+ int chanceToKill = ration.get(preyType);
+ int predatorTry = Randomizer.random(0, 100);
+
+ if (predatorTry <= chanceToKill) {
+ prey.setAlive(false);
+ } else return;
+ }
+
+ double currentTargetWeight = prey.getCurrentWeight();
+ double predatorFinalWeight;
+
+ if (deltaWeight > currentTargetWeight) {
+ predatorFinalWeight = currentWeight + currentTargetWeight;
+ prey.setCurrentWeight(0);
+ } else {
+ predatorFinalWeight = currentWeight + deltaWeight;
+ prey.setCurrentWeight(currentTargetWeight - deltaWeight);
+ }
+
+ organism.setCurrentWeight(predatorFinalWeight);
+ } finally {
+ location.getLock().unlock();
+ }
+ }
+
+ private OrganismDTO getTarget(Ration ration, Residents residents) {
+ Set preys = residents
+ .entrySet()
+ .stream()
+ .filter(resident -> resident.getValue().size() > 0)
+ .filter(resident -> ration.containsKey(resident.getKey()))
+ .max(Comparator.comparingInt(resident -> ration.get(resident.getKey())))
+ .orElseThrow(() -> new OrganismNotFound("target / prey not found"))
+ .getValue();
+
+ return preys
+ .stream()
+ .skip(Randomizer.random(0, preys.size()))
+ .iterator()
+ .next();
+
+ }
+}
diff --git a/island/src/main/java/org/island/services/FeedingService.java b/island/src/main/java/org/island/services/FeedingService.java
new file mode 100644
index 0000000..092b907
--- /dev/null
+++ b/island/src/main/java/org/island/services/FeedingService.java
@@ -0,0 +1,9 @@
+package org.island.services;
+
+import org.island.entity.OrganismDTO;
+import org.island.model.Island;
+import org.island.model.Location;
+
+public interface FeedingService {
+ void eat(OrganismDTO organismDTO, Location location);
+}
diff --git a/island/src/main/java/org/island/services/HungryTaskService.java b/island/src/main/java/org/island/services/HungryTaskService.java
deleted file mode 100644
index 95e417d..0000000
--- a/island/src/main/java/org/island/services/HungryTaskService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.island.services;
-
-import org.island.animals.Animal;
-import org.island.entity.Organism;
-import org.island.location.Location;
-import org.island.settings.Config;
-import org.island.util.Fullness;
-
-public class HungryTaskService extends TaskService {
-
- private static final double WELL_FED = 0.75; //TODO need different logic
- private static final double ALL_RIGHT = WELL_FED - 0.2;
- public static final double HUNGRY = ALL_RIGHT - 0.4;
-
- public HungryTaskService(Organism organism, Location location) {
- super(organism, location);
- }
-
- @Override
- public void run() {
- double currentWeight = organism.getCurrentWeight();
- double maxWeight = organism.getMaxWeight();
- Config config = Config.getConfig();
- double weightNextDay = currentWeight - maxWeight * config.getWeightDecreaseFactor();
- double weightRatio = weightNextDay / maxWeight;
-
- if (organism instanceof Animal) {
- Animal animal = (Animal) organism;
- Fullness fullness = animal.getFullness();
-
- if (weightRatio >= WELL_FED && fullness != Fullness.WELL_FED) {
- animal.setFullness(Fullness.WELL_FED);
- } else if (weightRatio >= ALL_RIGHT && weightRatio < WELL_FED && fullness != Fullness.ALL_RIGHT) {
- animal.setFullness(Fullness.ALL_RIGHT);
- } else if (weightRatio >= HUNGRY && weightRatio < ALL_RIGHT && fullness != Fullness.HUNGRY) {
- animal.setFullness(Fullness.HUNGRY);
- } else if (weightRatio < HUNGRY && fullness != Fullness.WILL_BE_FINE) {
- animal.setFullness(Fullness.WILL_BE_FINE);
- }
- }
-
- double deathThreshold = config.getDeathThreshold();
- if (weightRatio < deathThreshold) {
- organism.killOrganism(location);
- } else {
- organism.setCurrentWeight(weightNextDay);
- }
- }
-}
diff --git a/island/src/main/java/org/island/services/KillTaskService.java b/island/src/main/java/org/island/services/KillTaskService.java
deleted file mode 100644
index 65bd9ee..0000000
--- a/island/src/main/java/org/island/services/KillTaskService.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.island.services;
-
-import org.island.entity.Organism;
-import org.island.location.Location;
-
-public class KillTaskService extends TaskService {
-
- public KillTaskService(Organism organism, Location location) {
- super(organism, location);
- }
-
- @Override
- public void run() {
- if (organism.isAlive()) {
- organism.getDead();
- }
- }
-}
diff --git a/island/src/main/java/org/island/services/MapCreatorService.java b/island/src/main/java/org/island/services/MapCreatorService.java
new file mode 100644
index 0000000..b206687
--- /dev/null
+++ b/island/src/main/java/org/island/services/MapCreatorService.java
@@ -0,0 +1,99 @@
+package org.island.services;
+
+
+import org.island.entity.EOrganisms;
+import org.island.entity.OrganismDTO;
+import org.island.factory.OrganismFactory;
+import org.island.model.Island;
+import org.island.model.Location;
+import org.island.settings.Config;
+import org.island.util.Randomizer;
+
+import java.util.*;
+
+public class MapCreatorService {
+
+ private final OrganismFactory organismFactory;
+ private int rows;
+ private int columns;
+
+ public MapCreatorService(OrganismFactory factory) {
+ this.organismFactory = factory;
+ }
+
+// public Island(Config config) {
+
+// this.GRID = new Location[rows][columns];
+// initializeGrid(rows, columns);
+// }
+
+ public Island createIsland(Config config) {
+ Island island = new Island();
+ initializeGrid(island, config);
+ populateIsland(island);
+ findLocationNeighbors(island);
+ return island;
+ }
+
+ private void initializeGrid(Island island, Config config) {
+ rows = config.getIslandSimulationConfig().getIslandSize().getRows();
+ columns = config.getIslandSimulationConfig().getIslandSize().getColumns();
+ island.setGRID(new Location[rows][columns]);
+ for (int i = 0; i < rows; i++) {
+ for (int j = 0; j < columns; j++) {
+ island.getGRID()[i][j] = new Location(i, j);
+ }
+ }
+ }
+
+
+ private void populateIsland(Island island) {
+ Location[][] grid = island.getGRID();
+
+ for (Location[] row : grid) {
+ for (Location location : row) {
+ for (EOrganisms organismType : EOrganisms.values()) {
+ OrganismDTO prototype = OrganismFactory.createOrganism(organismType);
+ int maxCount = prototype.getMaxPopulation();
+ System.out.println(maxCount);
+ int count = Randomizer.random(0, maxCount);
+
+ for (int i = 0; i < count; i++) {
+ location.addResident(OrganismFactory.createOrganism(organismType));
+ }
+ }
+// logLocationContent(location);// Метод проверки количества каждого вида на клетке
+ }
+ }
+ }
+
+ private void logLocationContent(Location location) {
+ StringBuilder log = new StringBuilder();
+ log.append("Location (").append(location.getRow()).append(", ").append(location.getColumn()).append("): ");
+ for (Map.Entry> entry : location.getResidents().entrySet()) {
+ log.append(entry.getKey()).append(" - ").append(entry.getValue().size()).append("; ");
+ }
+ System.out.println(log.toString());
+ }
+
+ private void findLocationNeighbors(Island island) {
+ Location[][] grid = island.getGRID();
+ for (int row = 0; row < grid.length; row++) {
+ for (int col = 0; col < grid[row].length; col++) {
+ Location location = grid[row][col];
+ List neighbours = findNeighbors(row, col, grid);
+ location.setDirections(neighbours);
+ }
+ }
+ }
+
+ private List findNeighbors(int row, int col, Location[][] grid) {
+ List result = new ArrayList<>();
+ if (row > 0) result.add(grid[row - 1][col]);
+ if (col > 0) result.add(grid[row][col - 1]);
+ if (row < rows - 1) result.add(grid[row + 1][col]);
+ if (col < columns - 1) result.add(grid[row][col + 1]);
+
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/island/src/main/java/org/island/services/MatingService.java b/island/src/main/java/org/island/services/MatingService.java
new file mode 100644
index 0000000..216e7e4
--- /dev/null
+++ b/island/src/main/java/org/island/services/MatingService.java
@@ -0,0 +1,11 @@
+package org.island.services;
+
+import org.island.entity.OrganismDTO;
+import org.island.model.Island;
+import org.island.model.Location;
+
+public interface MatingService {
+// void findMate(OrganismDTO organismDTO, Island island);
+
+ void findMate(OrganismDTO organismDTO, Location location);
+}
diff --git a/island/src/main/java/org/island/services/MoveTaskService.java b/island/src/main/java/org/island/services/MoveTaskService.java
deleted file mode 100644
index 55da14b..0000000
--- a/island/src/main/java/org/island/services/MoveTaskService.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.island.services;
-
-import org.island.animals.Animal;
-import org.island.entity.Organism;
-import org.island.location.Location;
-
-public class MoveTaskService extends TaskService {
-
- public MoveTaskService(Organism organism, Location location) {
- super(organism, location);
- }
-
- @Override
- public void run() {
- if (organism instanceof Animal) {
- Animal animal = (Animal) organism;
- int speed = animal.getSpeed();
-
- if (speed > 0) {
- animal.move(location);
- }
- }
- }
-}
diff --git a/island/src/main/java/org/island/services/MovementService.java b/island/src/main/java/org/island/services/MovementService.java
new file mode 100644
index 0000000..2b951ba
--- /dev/null
+++ b/island/src/main/java/org/island/services/MovementService.java
@@ -0,0 +1,9 @@
+package org.island.services;
+
+import org.island.entity.OrganismDTO;
+import org.island.model.Island;
+import org.island.model.Location;
+
+public interface MovementService {
+ void move(OrganismDTO organism, Location location);
+}
diff --git a/island/src/main/java/org/island/services/OrganismWorkerService.java b/island/src/main/java/org/island/services/OrganismWorkerService.java
deleted file mode 100644
index 4de4417..0000000
--- a/island/src/main/java/org/island/services/OrganismWorkerService.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package org.island.services;
-
-import org.island.animals.Animal;
-import org.island.entity.Organism;
-import org.island.exceptions.OrganismOperationFail;
-import org.island.location.Island;
-import org.island.location.Location;
-import org.island.repo.maps.Ration;
-import org.island.repo.maps.Residents;
-
-import java.util.Objects;
-import java.util.Queue;
-import java.util.Set;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.CountDownLatch;
-
-public class OrganismWorkerService implements Runnable {
- private final Organism organism;
- private final Island island;
- private final Queue tasks = new ConcurrentLinkedQueue<>();
- private final Queue hungryTasks = new ConcurrentLinkedQueue<>();
- private final CountDownLatch latch;
-
- public OrganismWorkerService(Organism organism, Island island, CountDownLatch latch) {
- this.organism = organism;
- this.island = island;
- this.latch = latch;
- }
-
- @Override
- public void run() {
- Location[][] grid = island.getIslandGrid();
- for (Location[] row : grid) {
- for (Location location : row) {
- try {
- processOneLocation(location);
- } catch (Exception e) {
- throw new OrganismOperationFail("Problem operation with creature - " + this.organism, e);
- }
- }
- }
- }
-
- private void processOneLocation(Location location) {
- String type = organism.getType();
- Residents residents = location.getResidents();
- Set organisms = residents.get(type);
-
- if (Objects.nonNull(organisms)) {
- location.getLock().lock();
- try {
- for (Organism organism : organisms) {
- TaskService task = chooseAction(organism, location, residents);
- tasks.add(task);
- TaskService hungry = new HungryTaskService(organism, location);
- hungryTasks.add(hungry);
- }
- } finally {
- location.getLock().unlock();
- }
- tasks.forEach(TaskService::run);
- tasks.clear();
- latch.countDown();
-
- hungryTasks.forEach(TaskService::run);
- hungryTasks.clear();
- latch.countDown();
- }
- }
-
- private TaskService chooseAction(Organism organism, Location location, Residents residents) {
- TaskService task = null;
-
- if (organism instanceof Animal) {
- Animal animal = (Animal) organism;
- task = switch (organism.getFullness()) {
- case WELL_FED -> new ReproduceTaskService(organism, location);
- case ALL_RIGHT -> new MoveTaskService(organism, location);
- case HUNGRY -> {
- Ration myRation = organism.getRation();
- boolean haveFoodHere = animal.findSomeFood(myRation, residents);
- yield haveFoodHere ? new EatTaskService(organism, location) : new MoveTaskService(organism, location);
- }
- case WILL_BE_FINE -> new KillTaskService(organism, location);
- };
- } else {
- task = new ReproduceTaskService(organism, location);
- }
- return task;
- }
-
-}
diff --git a/island/src/main/java/org/island/services/ReproduceTaskService.java b/island/src/main/java/org/island/services/ReproduceTaskService.java
deleted file mode 100644
index 12b1317..0000000
--- a/island/src/main/java/org/island/services/ReproduceTaskService.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.island.services;
-
-import org.island.entity.Organism;
-import org.island.location.Location;
-
-public class ReproduceTaskService extends TaskService {
-
- public ReproduceTaskService(Organism organism, Location location) {
- super(organism, location);
- }
-
- @Override
- public void run() {
- organism.reproduce(location);
- }
-}
diff --git a/island/src/main/java/org/island/services/SimulationWorkerService.java b/island/src/main/java/org/island/services/SimulationWorkerService.java
deleted file mode 100644
index 9cc9c99..0000000
--- a/island/src/main/java/org/island/services/SimulationWorkerService.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.island.services;
-
-import org.island.entity.Organism;
-import org.island.entity.Simulation;
-import org.island.settings.Config;
-import org.island.view.View;
-
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.*;
-import java.util.stream.Collectors;
-
-public class SimulationWorkerService extends Thread {
- private final Simulation simulation;
- private final int period;
-
- public SimulationWorkerService(Simulation simulation) {
- this.simulation = simulation;
- this.period = Config.getConfig().getPeriod();
- }
-
- @Override
- public void run() {
- View view = simulation.getView();
- view.showMap();
- view.showStatistics();
- ScheduledExecutorService mainPool = Executors.newScheduledThreadPool(1);
- Map prototypes = simulation.getEntityFactory().getPrototypes();
- CountDownLatch latch = new CountDownLatch(prototypes.size());
-
- List workers = prototypes
- .values()
- .stream()
- .map(organism -> new OrganismWorkerService(organism, simulation.getIsland(), latch))
- .collect(Collectors.toList());
-
- mainPool.scheduleWithFixedDelay(() -> {
- ExecutorService servicPool = Executors.newFixedThreadPool(4);
- workers.forEach(servicPool::submit);
- servicPool.shutdown();
- await(view, servicPool);
-
- }, period, period, TimeUnit.MILLISECONDS);
- }
-
- private void await(View view, ExecutorService servicePool) {
- try {
- if (servicePool.awaitTermination(3, TimeUnit.SECONDS)) {
- view.showMap();
- view.showStatistics();
- }
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
-
-
-}
diff --git a/island/src/main/java/org/island/services/TaskService.java b/island/src/main/java/org/island/services/TaskService.java
deleted file mode 100644
index 88a809a..0000000
--- a/island/src/main/java/org/island/services/TaskService.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.island.services;
-
-import lombok.RequiredArgsConstructor;
-import org.island.entity.Organism;
-import org.island.location.Location;
-
-@RequiredArgsConstructor
-public abstract class TaskService implements Runnable {
- protected final Organism organism;
- protected final Location location;
-
- public abstract void run();
-}
diff --git a/island/src/main/java/org/island/services/ViewMapService.java b/island/src/main/java/org/island/services/ViewMapService.java
new file mode 100644
index 0000000..764261c
--- /dev/null
+++ b/island/src/main/java/org/island/services/ViewMapService.java
@@ -0,0 +1,104 @@
+package org.island.services;
+
+import org.island.entity.EOrganisms;
+import org.island.entity.OrganismDTO;
+import org.island.factory.OrganismFactory;
+import org.island.model.Island;
+import org.island.model.Location;
+import org.island.settings.Config;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class ViewMapService {
+
+ private static final int HEIGHT_DIAGRAM = 10;
+ private static final int POPULATION_HIGH = 90;
+ private static final int POPULATION_AVERAGE = 50;
+
+ private final OrganismFactory factory;
+
+ public ViewMapService(OrganismFactory factory) {
+ this.factory = factory;
+ }
+
+ public void showMap(Island island) {
+ StringBuilder out = new StringBuilder("\n");
+ Location[][] grid = island.getGRID();
+ List organisms = createOrganismPrototypes();
+ Map currentPopulation = countOrganisms(organisms, grid);
+ drawPopulationDiagram(out, organisms, currentPopulation);
+ drawIcons(out, organisms);
+ System.out.println(out);
+ }
+
+ private List createOrganismPrototypes() {
+ return Arrays.stream(EOrganisms.values())
+ .map(OrganismFactory::createOrganism)
+ .collect(Collectors.toList());
+ }
+
+ private void drawPopulationDiagram(StringBuilder out, List organisms, Map currentPopulation) {
+ for (int row = 0; row < HEIGHT_DIAGRAM; row++) {
+ int percent = 100 - row * 10;
+ out.append(String.format("%-3d %%|", percent));
+
+ for (OrganismDTO organism : organisms) {
+ String residentString = getPopulationFill(row, organism, currentPopulation);
+ out.append(residentString);
+ }
+
+
+ out.append(Color.RESET).append("\n");
+ }
+ }
+
+ private void drawIcons(StringBuilder out, List organisms) {
+ out.append(" ".repeat(5));
+ organisms.forEach(organism -> out.append(organism.getIcon()).append(" "));
+ out.append("\n");
+ }
+
+ private Map countOrganisms(List organisms, Location[][] grid) {
+ Map result = new EnumMap<>(EOrganisms.class);
+ for (Location[] row : grid) {
+ for (Location location : row) {
+ location.getResidents().values().stream()
+ .flatMap(Set::stream)
+ .map(OrganismDTO::getOrganismType)
+ .forEach(type -> result.merge(type, 1, Integer::sum));
+ }
+ }
+ return result;
+ }
+
+ private String getPopulationFill(int row, OrganismDTO organism, Map currentPopulation) {
+ Config config = Config.initialize();
+ int totalCells = config.getIslandSimulationConfig().getIslandSize().getRows() *
+ config.getIslandSimulationConfig().getIslandSize().getColumns();
+ int maxCount = organism.getMaxPopulation() * totalCells;
+ int currentCount = currentPopulation.getOrDefault(organism.getOrganismType(), 0);
+ double ratioPercent = 100.0 * currentCount / maxCount;
+ double currentPercent = 100.0 - row * 10;
+ return ratioPercent >= currentPercent
+ ? chooseColorBasedOnPopulation(ratioPercent) + " "
+ : Color.RESET + " ";
+ }
+
+ private String chooseColorBasedOnPopulation(double ratioPercent) {
+ if (ratioPercent >= POPULATION_HIGH) {
+ return Color.FILL_GREEN;
+ } else if (ratioPercent >= POPULATION_AVERAGE) {
+ return Color.FILL_YELLOW;
+ } else {
+ return Color.FILL_RED;
+ }
+ }
+
+ private static class Color {
+ public static final String RESET = "\u001B[0m";
+ public static final String FILL_GREEN = "\u001B[42m";
+ public static final String FILL_YELLOW = "\u001B[43m";
+ public static final String FILL_RED = "\u001B[41m";
+ }
+}
diff --git a/island/src/main/java/org/island/services/ViewStatisticsService.java b/island/src/main/java/org/island/services/ViewStatisticsService.java
new file mode 100644
index 0000000..1079377
--- /dev/null
+++ b/island/src/main/java/org/island/services/ViewStatisticsService.java
@@ -0,0 +1,72 @@
+package org.island.services;
+
+import org.island.entity.EOrganisms;
+import org.island.entity.OrganismDTO;
+import org.island.model.Island;
+import org.island.model.Location;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+public class ViewStatisticsService {
+
+ public void showStatistics(Island island, int day) {
+ Map statsPredators = new HashMap<>();
+ Map statsGrassEaters = new HashMap<>();
+ Map statsPlants = new HashMap<>();
+
+ Location[][] grid = island.getGRID();
+ for (Location[] row : grid) {
+ for (Location location : row) {
+ Map> residents = location.getResidents();
+ if (Objects.nonNull(residents)) {
+ residents.values().stream()
+ .filter(set -> set.size() > 0)
+ .forEach(set -> {
+ OrganismDTO organism = set.stream().findAny().get();
+ EOrganisms organismType = organism.getOrganismType();
+ String name = organismType.getType();
+ String icon = Objects.nonNull(organism.getIcon()) ? organism.getIcon() : "";
+ String info = icon + name;
+
+ if (organismType.isAnimal()) {
+ if (organismType.getGroupId() <= 4) {
+ statsPredators.put(info, statsPredators.getOrDefault(info, 0) + set.size());
+ }
+ else {
+ statsGrassEaters.put(info, statsGrassEaters.getOrDefault(info, 0) + set.size());
+ }
+ }
+ else {
+ statsPlants.put(info, statsPlants.getOrDefault(info, 0) + set.size());
+ }
+ });
+ }
+ }
+ }
+
+ printStatistics(statsPredators, statsGrassEaters, statsPlants, day);
+ }
+
+ private void printStatistics(Map statsPredators, Map statsGrassEaters, Map statsPlants, int day) {
+ StringBuilder out = new StringBuilder("\n");
+ out.append(String.format("--------Island DAY %d--------%n", day));
+ out.append("Predators:\n");
+ out.append(mapToString(statsPredators));
+ out.append("GrassEaters:\n");
+ out.append(mapToString(statsGrassEaters));
+ out.append("Plants:\n");
+ out.append(mapToString(statsPlants));
+ out.append("----------------------------");
+
+ System.out.println(out);
+ }
+
+ private String mapToString(Map map) {
+ StringBuilder out = new StringBuilder();
+ map.forEach((key, value) -> out.append(String.format("%19s - %d%n", key, value)));
+ return out.toString();
+ }
+}
diff --git a/island/src/main/java/org/island/settings/Config.java b/island/src/main/java/org/island/settings/Config.java
index b4ce0a7..073aa3f 100644
--- a/island/src/main/java/org/island/settings/Config.java
+++ b/island/src/main/java/org/island/settings/Config.java
@@ -1,117 +1,41 @@
package org.island.settings;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import org.island.entity.Group;
-import org.island.repo.Limit;
-import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import lombok.SneakyThrows;
-import java.net.URL;
-import java.util.Map;
-import java.util.Objects;
-
-import org.island.repo.maps.FoodMap;
-import org.island.repo.maps.Ration;
-
-import java.util.Map;
+import java.io.InputStream;
@Getter
-@Setter(AccessLevel.PROTECTED)
+@Setter
public final class Config {
public static final String SETTING_YAML = "new_master_config.yaml";
- private static volatile Config CONFIG;
-
- private int rows;
- private int columns;
- private int period;
- private int[][] rationTable;
- private Map limits;
- private Map icons;
- private FoodMap foodMap;
- private double startWeightFactor;
- private double weightDecreaseFactor;
- private double deathThreshold;
-
- private Config() {
- loadDefaultSetting();
- updateFromFile();
- }
-
- public static Config getConfig() {
- Config result = CONFIG;
- if (result != null) {
- return result;
- }
-
- synchronized (Config.class) {
- if (CONFIG == null) {
- CONFIG = new Config();
- }
- }
- return CONFIG;
- }
- public Limit getLimit(String type) {
- return limits.get(type);
- }
-
- public String getIcon(String type) {
- return icons.get(type);
- }
+ private IslandSimulationConfig islandSimulationConfig;
+ private OrganismParameters organismParameters;
- public Ration getRation(String type) {
- return foodMap.get(type);
- }
-
- private FoodMap createFoodMap(int[][] rationTable) {
- FoodMap foodMap = new FoodMap();
- Group[] groups = Group.values();
- int countGroups = groups.length;
+ private static Config instance;
- for (int groupId = 0; groupId < countGroups; groupId++) {
- Group group = groups[groupId];
- String type = group.getType();
- Ration ration = new Ration();
+ private Config() {}
- for (int targetGroupId = 0; targetGroupId < countGroups; targetGroupId++) {
- Group targetGroup = groups[targetGroupId];
- String targetType = targetGroup.getType();
- int chanceToEat = rationTable[groupId][targetGroupId];
- if (chanceToEat > 0) {
- ration.put(targetType, chanceToEat);
- }
- }
- foodMap.put(type, ration);
+ public static synchronized Config initialize() {
+ if (instance == null) {
+ instance = loadConfig();
}
- return foodMap;
- }
-
- private void loadDefaultSetting() {
- rows = Default.ROWS;
- columns = Default.COLUMNS;
- period = Default.PERIOD;
- rationTable = Default.RATION_TABLE;
- limits = Default.LIMITS;
- icons = Default.ICONS;
- startWeightFactor = Default.START_WEIGHT_FACTOR;
- weightDecreaseFactor = Default.WEIGHT_DECREASE_FACTOR;
- deathThreshold = Default.DEATH_THRESHOLD;
-
- foodMap = createFoodMap(rationTable);
-
+ return instance;
}
@SneakyThrows
- private void updateFromFile() {
+ private static Config loadConfig() {
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
- ObjectReader readerForUpdating = mapper.readerForUpdating(this);
- URL resource = Config.class.getClassLoader().getResource(SETTING_YAML);
- if (Objects.nonNull(resource)) {
- readerForUpdating.readValue(resource.openStream());
+ try (InputStream inputStream = Config.class.getClassLoader().getResourceAsStream(SETTING_YAML)) {
+ if (inputStream != null) {
+ return mapper.readValue(inputStream, Config.class);
+ } else {
+ throw new IllegalStateException("Could not find the YAML configuration file.");
+ }
}
}
}
diff --git a/island/src/main/java/org/island/settings/Default.java b/island/src/main/java/org/island/settings/Default.java
deleted file mode 100644
index 43aacb9..0000000
--- a/island/src/main/java/org/island/settings/Default.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package org.island.settings;
-
-import org.island.repo.Limit;
-
-import java.util.Map;
-
-import static java.util.Map.entry;
-
-public final class Default {
-
- public static final int ROWS = 100;
- public static final int COLUMNS = 20;
- public static final int PERIOD = 500; //in milliseconds, period for one iteration
- public static final double START_WEIGHT_FACTOR = 0.75; //maxWeight for newly created/born organism
- public static final double WEIGHT_DECREASE_FACTOR = 0.02; // weight decreasing every iteration if organism not eat
- public static final double DEATH_THRESHOLD = 0.1; // ratio of organism current weight to it's max weight, when reached organism kills / die
-
- private Default() {
- }
-
- /*
- int[K1][K2] = V ,where:
- K1 - Creature groupId;
- K2 - Target groupId;
- V - chance to eat.
- */
-
- public static final int[][] RATION_TABLE = {
- {0, 0, 0, 0, 0, 10, 15, 60, 80, 60, 70, 15, 10, 40, 0, 0},
- {0, 0, 15, 0, 0, 0, 0, 20, 40, 0, 0, 0, 0, 10, 0, 0},
- {0, 0, 0, 0, 0, 0, 0, 70, 90, 0, 0, 0, 0, 60, 40, 0},
- {0, 80, 0, 0, 0, 40, 80, 80, 90, 70, 70, 50, 20, 10, 0, 0},
- {0, 0, 10, 0, 0, 0, 0, 90, 90, 0, 0, 0, 0, 80, 0, 0},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 100},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100},
- {0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 90, 100},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 100},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
- };
-
- /*
- Map LIMITS,where:
- K - organism String type;
- V - limits of this organism Limit(double maxWeight, int maxPopulation, int speed).
- */
- //TODO: needs to simplify it, maybe through reflection API
- public static final Map LIMITS = Map.ofEntries(
- entry("Wolf", new Limit(50, 30, 3)),
- entry("Python", new Limit(15, 30, 1)),
- entry("Fox", new Limit(8, 30, 2)),
- entry("Bear", new Limit(500, 5, 2)),
- entry("Eagle", new Limit(6, 20, 3)),
- entry("Horse", new Limit(400, 20, 4)),
- entry("Deer", new Limit(300, 20, 4)),
- entry("Rabbit", new Limit(2, 150, 2)),
- entry("Mouse", new Limit(0.05, 500, 1)),
- entry("Goat", new Limit(60, 140, 3)),
- entry("Sheep", new Limit(70, 140, 3)),
- entry("Boar", new Limit(400, 50, 2)),
- entry("Buffalo", new Limit(700, 10, 3)),
- entry("Duck", new Limit(1, 200, 4)),
- entry("Caterpillar", new Limit(0.01, 1000, 0)),
- entry("Herb", new Limit(10, 200, 0))
- );
-
- /*
- Map ICONS,where:
- K - organism String type;
- V - organism icon.
- */
- public static final Map ICONS = Map.ofEntries(
- entry("Wolf", "🐺"),
- entry("Python", "🐍"),
- entry("Fox", "🦊"),
- entry("Bear", "🐻"),
- entry("Eagle", "🦅"),
- entry("Horse", "🐎"),
- entry("Deer", "🦌"),
- entry("Rabbit", "🐇"),
- entry("Mouse", "🐁"),
- entry("Goat", "🦌"),
- entry("Sheep", "🐑"),
- entry("Boar", "🐗"),
- entry("Buffalo", "🐃"),
- entry("Duck", "🦆"),
- entry("Caterpillar", "🐛"),
- entry("Herb", "☘")
- );
-
-}
diff --git a/island/src/main/java/org/island/settings/IslandSimulationConfig.java b/island/src/main/java/org/island/settings/IslandSimulationConfig.java
new file mode 100644
index 0000000..41dfb46
--- /dev/null
+++ b/island/src/main/java/org/island/settings/IslandSimulationConfig.java
@@ -0,0 +1,28 @@
+package org.island.settings;
+
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public final class IslandSimulationConfig {
+ private IslandSize islandSize;
+ private SimulationParameters simulation;
+
+ @Getter
+ @Setter
+ public static class IslandSize {
+ private int rows;
+ private int columns;
+ }
+
+ @Getter
+ @Setter
+ public static class SimulationParameters {
+ private int period;
+ private double startWeightFactor;
+ private double weightDecreaseFactor;
+ private double deathThreshold;
+ }
+}
\ No newline at end of file
diff --git a/island/src/main/java/org/island/settings/OrganismParameters.java b/island/src/main/java/org/island/settings/OrganismParameters.java
new file mode 100644
index 0000000..fc1718e
--- /dev/null
+++ b/island/src/main/java/org/island/settings/OrganismParameters.java
@@ -0,0 +1,23 @@
+package org.island.settings;
+
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Map;
+
+@Getter
+@Setter
+public final class OrganismParameters {
+ private Map limits;
+ private Map icons;
+ private Map> foodMap;
+
+ @Getter
+ @Setter
+ public static class AnimalParams {
+ private double maxWeight;
+ private int maxPopulation;
+ private int speed;
+ }
+}
\ No newline at end of file
diff --git a/island/src/main/java/org/island/simulation/Simulation.java b/island/src/main/java/org/island/simulation/Simulation.java
new file mode 100644
index 0000000..64eacb5
--- /dev/null
+++ b/island/src/main/java/org/island/simulation/Simulation.java
@@ -0,0 +1,121 @@
+package org.island.simulation;
+
+import lombok.RequiredArgsConstructor;
+import org.island.entity.EOrganisms;
+import org.island.entity.OrganismDTO;
+import org.island.factory.OrganismFactory;
+import org.island.model.Island;
+import org.island.model.Location;
+import org.island.services.DeathService;
+import org.island.services.FeedingService;
+import org.island.services.MatingService;
+import org.island.services.MovementService;
+import org.island.util.Randomizer;
+import org.island.view.View;
+
+import java.util.*;
+
+@RequiredArgsConstructor
+public class Simulation implements SimulationEngine {
+ private final View view;
+ private final Island island;
+ private final int period;
+ private final MovementService movementService;
+ private final MatingService matingService;
+ private final FeedingService feedingService;
+ private final DeathService deathService;
+ private final OrganismFactory organismFactory;
+
+ public void populateIsland(Island island) {
+ Location[][] grid = island.getGRID();
+
+ for (Location[] locations : grid) {
+ for (Location location : locations) {
+ Map> residents = location.getResidents();
+
+ for (EOrganisms organismType : EOrganisms.values()) {
+ String type = organismType.getType();
+ int maxCount = organismFactory.createOrganism(organismType).getMaxPopulation();
+ int count = Randomizer.random(maxCount / 2, maxCount);
+ Set organismSet = new HashSet<>();
+
+ for (int i = 0; i < count; i++) {
+ // Создание нового экземпляра для каждого организма
+ organismSet.add(OrganismFactory.createOrganism(organismType));
+ }
+ residents.put(type, organismSet);
+ }
+ }
+ }
+ }
+
+ // TODO: Дописать сервисы
+ public void runCycle() {
+ Location[][] grid = island.getGRID();
+
+ for (int cycle = 0; cycle < period; cycle++) {
+ view.showMessage("Starting cycle " + (cycle + 1));
+
+ processLocations(grid);
+ updateView();
+
+ view.showMessage("Cycle " + (cycle + 1) + " completed");
+ }
+
+ view.showMessage("Simulation completed");
+ }
+
+ private void processLocations(Location[][] grid) {
+ for (Location[] locations : grid) {
+ for (Location location : locations) {
+ processLocation(location);
+ }
+ }
+ }
+
+ private void processLocation(Location location) {
+
+ moveOrganisms(location);
+ // feedOrganisms(location);
+ // handleDeaths(location);
+ // mateOrganisms(location);
+ }
+
+ private void moveOrganisms(Location location) {
+ Map> residents = location.getResidents();
+ List types = new ArrayList<>(residents.keySet());
+
+ types.forEach(type -> {
+ Set organisms = residents.get(type);
+ if (organisms != null) {
+ organisms.forEach(organism -> movementService.move(organism, location));
+ }
+ });
+ }
+
+// private void feedOrganisms(Location location) {
+// feedingService.eat(location);
+// }
+
+// private void mateOrganisms(Location location) {
+// matingService.findMate(location);
+// }
+
+// private void handleDeaths(Location location) {
+// deathService.die(location);
+// }
+
+ private void updateView() {
+ view.showStatistics();
+ view.showMap();
+ }
+
+
+ public void run() {
+ view.showMessage("Initializing island population...");
+ populateIsland(island);
+
+ view.showMessage("Starting simulation...");
+ runCycle();
+ }
+}
\ No newline at end of file
diff --git a/island/src/main/java/org/island/simulation/SimulationEngine.java b/island/src/main/java/org/island/simulation/SimulationEngine.java
new file mode 100644
index 0000000..4255a59
--- /dev/null
+++ b/island/src/main/java/org/island/simulation/SimulationEngine.java
@@ -0,0 +1,9 @@
+package org.island.simulation;
+
+import org.island.model.Island;
+
+public interface SimulationEngine {
+ void populateIsland(Island island);
+ void runCycle();
+ void run();
+}
\ No newline at end of file
diff --git a/island/src/main/java/org/island/util/Fullness.java b/island/src/main/java/org/island/util/Fullness.java
deleted file mode 100644
index 93c422b..0000000
--- a/island/src/main/java/org/island/util/Fullness.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.island.util;
-
-public enum Fullness {
- WELL_FED,
- ALL_RIGHT,
- HUNGRY,
- WILL_BE_FINE
-}
diff --git a/island/src/main/java/org/island/util/Randomizer.java b/island/src/main/java/org/island/util/Randomizer.java
index 7c8df5b..924d759 100644
--- a/island/src/main/java/org/island/util/Randomizer.java
+++ b/island/src/main/java/org/island/util/Randomizer.java
@@ -1,17 +1,20 @@
package org.island.util;
+import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
public class Randomizer {
+ private static final Random RANDOM = new Random();
+
private Randomizer(){}
public static int random(int maxValue){
return ThreadLocalRandom.current().nextInt(maxValue + 1);
}
- public static int random(int minValue, int maxValue){
- return ThreadLocalRandom.current().nextInt(minValue, maxValue);
+ public static int random(int min, int max) {
+ return RANDOM.nextInt(max - min + 1) + min;
}
}
diff --git a/island/src/main/java/org/island/view/ConsoleView.java b/island/src/main/java/org/island/view/ConsoleView.java
index 3cf6b2f..4c825bc 100644
--- a/island/src/main/java/org/island/view/ConsoleView.java
+++ b/island/src/main/java/org/island/view/ConsoleView.java
@@ -1,186 +1,38 @@
package org.island.view;
-import org.island.animals.GrassEater;
-import org.island.animals.Predator;
-import org.island.entity.Organism;
-import org.island.location.Island;
-import org.island.location.Location;
-import org.island.repo.factory.Factory;
-import org.island.repo.maps.Residents;
-import org.island.settings.Config;
-
-import java.util.*;
+import lombok.RequiredArgsConstructor;
+import org.island.factory.OrganismFactory;
+import org.island.model.Island;
+import org.island.services.ViewMapService;
+import org.island.services.ViewStatisticsService;
+@RequiredArgsConstructor
public class ConsoleView implements View {
-
- public static final int HEIGHT_DIAGRAM = 10;
- public static final int POPULATION_HIGH = 70; // int between 40 - 100
- public static final int POPULATION_AVERAGE = POPULATION_HIGH - 40;
-
private final Island island;
- private final Factory factory;
+ private final OrganismFactory factory;
+ private final ViewStatisticsService viewStatisticsService;
+ private final ViewMapService viewMapService;
private int day = 0;
- public ConsoleView(Island island, Factory factory) {
+ public ConsoleView(Island island, OrganismFactory factory) {
this.island = island;
this.factory = factory;
+ this.viewStatisticsService = new ViewStatisticsService();
+ this.viewMapService = new ViewMapService(factory);
}
@Override
public void showStatistics() {
- Map statsPredators = new HashMap<>();
- Map statsGrassEaters = new HashMap<>();
- Map statsPlants = new HashMap<>();
-
- Location[][] grid = island.getGrid();
-
- for (Location[] row : grid) {
- for (Location location : row) {
- var residents = location.getResidents();
- if (Objects.nonNull(residents)) {
- residents.values().stream()
- .filter(set -> set.size() > 0)
- .forEach(set -> {
- Organism organism = set.stream().findAny().get();
- String name = organism.getClass().getSimpleName();
- String icon = organism.getIcon();
- String info = icon + name;
-
- if (organism instanceof Predator) {
- statsPredators.put(info, statsPredators.getOrDefault(info, 0) + set.size());
- } else if (organism instanceof GrassEater) {
- statsGrassEaters.put(info, statsGrassEaters.getOrDefault(info, 0) + set.size());
- } else {
- statsPlants.put(info, statsPlants.getOrDefault(info, 0) + set.size());
- }
- });
- }
- }
- }
-
- printStatistics(statsPredators, statsGrassEaters, statsPlants);
+ viewStatisticsService.showStatistics(island, day++);
}
@Override
public void showMap() {
- StringBuilder out = new StringBuilder("\n");
- Map prototypes = factory.getPrototypes();
- List organisms = new ArrayList<>(prototypes.values());
- Location[][] grid = island.getGrid();
- int organismsCount = organisms.size();
- Map currentPopulation = countOrganisms(organisms, grid);
- drawDiagram(out, organisms, organismsCount, currentPopulation);
- out.append(" ".repeat(5)).append("|");
- drawIcons(out, organisms);
- System.out.println(out);
- }
-
- @SuppressWarnings("StringBufferReplaceableByString")
- private void printStatistics(Map statsPredators, Map statsGrassEaters, Map statsPlants) {
- StringBuilder out = new StringBuilder("\n");
- out.append(String.format("--------Island DAY %d--------%n", day++));
- out.append("Predators:\n");
- out.append(MapToString(statsPredators));
- out.append("GrassEaters:\n");
- out.append(MapToString(statsGrassEaters));
- out.append("Plants:\n");
- out.append(MapToString(statsPlants));
- out.append("----------------------------");
-
- System.out.println(out);
- }
-
- private String MapToString(Map map) {
- StringBuilder out = new StringBuilder();
- map.forEach((key, value) -> out.append(String.format("%19s - %d%n", key, value)));
- return out.toString();
- }
-
- private void drawDiagram(StringBuilder out, List organisms, int organismsCount, Map currentPopulation) {
- for (int row = 0; row < HEIGHT_DIAGRAM; row++) {
- int percent = 100;
- out.append(row == 0
- ? String.format("%-3s %%|", percent)
- : String.format(" %-2s %%|", percent - row * 10)
- );
-
- for (int col = 0; col < organismsCount; col++) {
- String residentString = fill(row, col, currentPopulation, organisms);
- int LocationWidth = 5;
- out.append(String.format("%-" + LocationWidth + "s", residentString));
- }
-
- out.append("\n");
- }
+ viewMapService.showMap(island);
}
- private void drawIcons(StringBuilder out, List organisms) {
- List skipList = List.of(3, 7, 10); // icons with different width, so will be offset in this position
-
- for (int i = 0; i < organisms.size(); i++) {
- String icon = organisms.get(i).getIcon();
- out.append(icon);
- if (!skipList.contains(i)) {
- out.append(" ");
- }
- }
- }
-
- private Map countOrganisms(List organisms, Location[][] grid) {
- Map result = new HashMap<>();
- for (Location[] row : grid) {
- for (Location location : row) {
- Residents residents = location.getResidents();
- if (Objects.nonNull(residents)) {
- organisms.forEach(organism -> {
- String type = organism.getType();
- result.put(type, result.getOrDefault(type, 0) + residents.get(type).size());
- });
- }
- }
- }
- return result;
- }
-
- private String fill(int row, int col, Map currentPopulation, List organisms) {
- Organism organism = organisms.get(col);
- String type = organism.getType();
- Config config = Config.getConfig();
- int mapRow = config.getRows();
- int mapCol = config.getColumns();
- int maxCount = organism.getMaxPopulation() * mapRow * mapCol;
- int currentCount = currentPopulation.get(type);
- double ratioPercent = 100.0 * currentCount / maxCount;
- double currentPercent = 100.0 - row * 10;
-
- String filler = choseFiller(ratioPercent, currentPercent);
- return "." + filler + Color.RESET + ".";
- }
-
- private String choseFiller(double ratioPercent, double currentPercent) {
- String filler = ".";
- String color = Color.RESET;
-
- if (currentPercent <= ratioPercent) {
- if (ratioPercent >= POPULATION_HIGH) {
- color = Color.FILL_GREEN;
- } else if (ratioPercent >= POPULATION_AVERAGE) {
- color = Color.FILL_YELLOW;
- } else {
- color = Color.FILL_RED;
- }
- filler = " ";
- }
-
- return color + filler;
- }
-
- private static class Color{
- public static final String RESET = "\u001B[0m";
- public static final String FILL_GREEN = "\u001B[42m";
- public static final String FILL_YELLOW = "\u001B[43m";
- public static final String FILL_RED = "\u001B[41m";
+ @Override
+ public void showMessage(String message) {
+ System.out.println(message);
}
-
-
-}
+}
\ No newline at end of file
diff --git a/island/src/main/java/org/island/view/View.java b/island/src/main/java/org/island/view/View.java
index aed297d..351eda9 100644
--- a/island/src/main/java/org/island/view/View.java
+++ b/island/src/main/java/org/island/view/View.java
@@ -3,4 +3,5 @@
public interface View {
void showStatistics();
void showMap();
+ void showMessage(String message);
}
diff --git a/island/src/main/resources/configuration/animals_initial_parameters_config.yaml b/island/src/main/resources/configuration/animals_initial_parameters_config.yaml
deleted file mode 100644
index 09502a5..0000000
--- a/island/src/main/resources/configuration/animals_initial_parameters_config.yaml
+++ /dev/null
@@ -1,68 +0,0 @@
-# Initial parameters for Organism's like Animal and Plant
-limits:
- Wolf:
- maxWeight: 50.0
- maxPopulation: 30
- speed: 3
- Python:
- maxWeight: 15.0
- maxPopulation: 30
- speed: 1
- Fox:
- maxWeight: 8.0
- maxPopulation: 30
- speed: 2
- Bear:
- maxWeight: 500.0
- maxPopulation: 5
- speed: 2
- Eagle:
- maxWeight: 6.0
- maxPopulation: 20
- speed: 3
- Horse:
- maxWeight: 400.0
- maxPopulation: 20
- speed: 4
- Deer:
- maxWeight: 300.0
- maxPopulation: 20
- speed: 4
- Rabbit:
- maxWeight: 2.0
- maxPopulation: 150
- speed: 2
- Mouse:
- maxWeight: 0.05
- maxPopulation: 500
- speed: 1
- Goat:
- maxWeight: 60.0
- maxPopulation: 140
- speed: 3
- Sheep:
- maxWeight: 70.0
- maxPopulation: 140
- speed: 3
- Boar:
- maxWeight: 400.0
- maxPopulation: 50
- speed: 2
- Buffalo:
- maxWeight: 700.0
- maxPopulation: 10
- speed: 3
- Duck:
- maxWeight: 1.0
- maxPopulation: 200
- speed: 4
- Caterpillar:
- maxWeight: 0.01
- maxPopulation: 1000
- speed: 0
- Plant:
- maxWeight: 10.0
- maxPopulation: 200
- speed: 0
-
-
diff --git a/island/src/main/resources/configuration/eat_chances_config.yaml b/island/src/main/resources/configuration/eat_chances_config.yaml
deleted file mode 100644
index 81e2e69..0000000
--- a/island/src/main/resources/configuration/eat_chances_config.yaml
+++ /dev/null
@@ -1,68 +0,0 @@
-# Chance of eating food
-foodMap:
- Wolf:
- Horse: 10
- Deer: 15
- Rabbit: 60
- Mouse: 80
- Goat: 60
- Sheep: 70
- Boar: 15
- Buffalo: 10
- Duck: 40
- Python:
- Fox: 15
- Rabbit: 20
- Mouse: 40
- Duck: 10
- Fox:
- Rabbit: 70
- Mouse: 90
- Duck: 60
- Caterpillar: 40
- Bear:
- Python: 80
- Horse: 40
- Deer: 80
- Rabbit: 80
- Mouse: 90
- Goat: 70
- Sheep: 70
- Boar: 50
- Buffalo: 20
- Eagle:
- Fox: 10
- Rabbit: 90
- Mouse: 90
- Duck: 80
- Horse:
- Plant: 100
- Deer:
- Plant: 100
- Rabbit:
- Plant: 100
- Mouse:
- Caterpillar: 90
- Plant: 100
- Goat:
- Plant: 100
- Sheep:
- Plant: 100
- Boar:
- Mouse: 50
- Caterpillar: 90
- Plant: 100
- Buffalo:
- Plant: 100
- Duck:
- Caterpillar: 90
- Plant: 100
- Caterpillar:
- Plant: 100
-
-
-
-
-
-
-
diff --git a/island/src/main/resources/configuration/icons_config.yaml b/island/src/main/resources/configuration/icons_config.yaml
deleted file mode 100644
index 3f7593f..0000000
--- a/island/src/main/resources/configuration/icons_config.yaml
+++ /dev/null
@@ -1,18 +0,0 @@
-# Icons of animals for displaying stats on a screen after each iteration
-icons:
- Wolf: "🐺"
- Python: "🐍"
- Fox: "🦊"
- Bear: "🐻"
- Eagle: "🦅"
- Horse: "🐎"
- Deer: "🦌"
- Rabbit: "🐇"
- Mouse: "🐁"
- Goat: "🦌"
- Sheep: "🐑"
- Boar: "🐗"
- Buffalo: "🐃"
- Duck: "🦆"
- Caterpillar: "🐛"
- Plant: "☘"
\ No newline at end of file
diff --git a/island/src/main/resources/configuration/island_config.yaml b/island/src/main/resources/configuration/island_config.yaml
deleted file mode 100644
index e4b8abf..0000000
--- a/island/src/main/resources/configuration/island_config.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-# Island parameters defined the location/area and iteration time (milliseconds)
-rows: 100
-columns: 20
-period: 500
\ No newline at end of file
diff --git a/island/src/main/resources/configuration/lifecycle_config.yaml b/island/src/main/resources/configuration/lifecycle_config.yaml
deleted file mode 100644
index bc92b14..0000000
--- a/island/src/main/resources/configuration/lifecycle_config.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-# Parameters of life cycle
-startWeightFactor: 0.70
-weightDecreaseFactor: 0.03
-deathThreshold: 0.1
\ No newline at end of file
diff --git a/island/src/main/resources/configuration/new_master_config.yaml b/island/src/main/resources/configuration/new_master_config.yaml
deleted file mode 100644
index 6ad8ce4..0000000
--- a/island/src/main/resources/configuration/new_master_config.yaml
+++ /dev/null
@@ -1,159 +0,0 @@
----
-# Island size parameters
-rows: 100
-columns: 20
-period: 500
-
-# Basic animal parameters
-limits:
- Wolf:
- maxWeight: 50.0
- maxPopulation: 30
- speed: 3
- Python:
- maxWeight: 15.0
- maxPopulation: 30
- speed: 1
- Fox:
- maxWeight: 8.0
- maxPopulation: 30
- speed: 2
- Bear:
- maxWeight: 500.0
- maxPopulation: 5
- speed: 2
- Eagle:
- maxWeight: 6.0
- maxPopulation: 20
- speed: 3
- Horse:
- maxWeight: 400.0
- maxPopulation: 20
- speed: 4
- Deer:
- maxWeight: 300.0
- maxPopulation: 20
- speed: 4
- Rabbit:
- maxWeight: 2.0
- maxPopulation: 150
- speed: 2
- Mouse:
- maxWeight: 0.05
- maxPopulation: 500
- speed: 1
- Goat:
- maxWeight: 60.0
- maxPopulation: 140
- speed: 3
- Sheep:
- maxWeight: 70.0
- maxPopulation: 140
- speed: 3
- Boar:
- maxWeight: 400.0
- maxPopulation: 50
- speed: 2
- Buffalo:
- maxWeight: 700.0
- maxPopulation: 10
- speed: 3
- Duck:
- maxWeight: 1.0
- maxPopulation: 200
- speed: 4
- Caterpillar:
- maxWeight: 0.01
- maxPopulation: 1000
- speed: 0
- Herb:
- maxWeight: 10.0
- maxPopulation: 200
- speed: 0
-
-
-# Icons of animals
-icons:
- Wolf: "🐺"
- Python: "🐍"
- Fox: "🦊"
- Bear: "🐻"
- Eagle: "🦅"
- Horse: "🐎"
- Deer: "🦌"
- Rabbit: "🐇"
- Mouse: "🐁"
- Goat: "🦌"
- Sheep: "🐑"
- Boar: "🐗"
- Buffalo: "🐃"
- Duck: "🦆"
- Caterpillar: "🐛"
- Herb: "☘"
-
-# Chance of eating food
-foodMap:
- Wolf:
- Horse: 10
- Deer: 15
- Rabbit: 60
- Mouse: 80
- Goat: 60
- Sheep: 70
- Boar: 15
- Buffalo: 10
- Duck: 40
- Python:
- Fox: 15
- Rabbit: 20
- Mouse: 40
- Duck: 10
- Fox:
- Rabbit: 70
- Mouse: 90
- Duck: 60
- Caterpillar: 40
- Bear:
- Python: 80
- Horse: 40
- Deer: 80
- Rabbit: 80
- Mouse: 90
- Goat: 70
- Sheep: 70
- Boar: 50
- Buffalo: 20
- Eagle:
- Fox: 10
- Rabbit: 90
- Mouse: 90
- Duck: 80
- Horse:
- Herb: 100
- Deer:
- Herb: 100
- Rabbit:
- Herb: 100
- Mouse:
- Caterpillar: 90
- Herb: 100
- Goat:
- Herb: 100
- Sheep:
- Herb: 100
- Boar:
- Mouse: 50
- Caterpillar: 90
- Herb: 100
- Buffalo:
- Herb: 100
- Duck:
- Caterpillar: 90
- Herb: 100
- Caterpillar:
- Herb: 100
-
-# Parameters of life cycle
-startWeightFactor: 0.70
-weightDecreaseFactor: 0.03
-deathThreshold: 0.1
\ No newline at end of file
diff --git a/island/src/main/resources/new_master_config.yaml b/island/src/main/resources/new_master_config.yaml
new file mode 100644
index 0000000..f553564
--- /dev/null
+++ b/island/src/main/resources/new_master_config.yaml
@@ -0,0 +1,185 @@
+islandSimulationConfig:
+ islandSize:
+ rows: 100
+ columns: 20
+ simulation:
+ period: 50
+ startWeightFactor: 0.70
+ weightDecreaseFactor: 0.03
+ deathThreshold: 0.1
+
+organismParameters:
+ limits:
+ Wolf:
+ maxWeight: 50.0
+ maxPopulation: 30
+ speed: 3
+
+ Python:
+ maxWeight: 15.0
+ maxPopulation: 30
+ speed: 1
+
+ Fox:
+ maxWeight: 8.0
+ maxPopulation: 30
+ speed: 2
+
+ Bear:
+ maxWeight: 500.0
+ maxPopulation: 5
+ speed: 2
+
+ Eagle:
+ maxWeight: 6.0
+ maxPopulation: 20
+ speed: 3
+
+ Horse:
+ maxWeight: 400.0
+ maxPopulation: 20
+ speed: 4
+
+ Deer:
+ maxWeight: 300.0
+ maxPopulation: 20
+ speed: 4
+
+ Rabbit:
+ maxWeight: 2.0
+ maxPopulation: 150
+ speed: 2
+
+ Mouse:
+ maxWeight: 0.05
+ maxPopulation: 500
+ speed: 1
+
+ Goat:
+ maxWeight: 60.0
+ maxPopulation: 140
+ speed: 3
+
+ Sheep:
+ maxWeight: 70.0
+ maxPopulation: 140
+ speed: 3
+
+ Boar:
+ maxWeight: 400.0
+ maxPopulation: 50
+ speed: 2
+
+ Buffalo:
+ maxWeight: 700.0
+ maxPopulation: 10
+ speed: 3
+
+ Duck:
+ maxWeight: 1.0
+ maxPopulation: 200
+ speed: 4
+
+ Caterpillar:
+ maxWeight: 0.01
+ maxPopulation: 1000
+ speed: 0
+
+ Herb:
+ maxWeight: 0.01
+ maxPopulation: 1000
+ speed: 0
+
+ icons:
+ Wolf: "🐺"
+ Python: "🐍"
+ Fox: "🦊"
+ Bear: "🐻"
+ Eagle: "🦅"
+ Horse: "🐎"
+ Deer: "🦌"
+ Rabbit: "🐇"
+ Mouse: "🐁"
+ Goat: "🦌"
+ Sheep: "🐑"
+ Boar: "🐗"
+ Buffalo: "🐃"
+ Duck: "🦆"
+ Caterpillar: "🐛"
+ Herb: "🌿"
+
+ foodMap:
+ Wolf:
+ Horse: 10
+ Deer: 15
+ Rabbit: 60
+ Mouse: 80
+ Goat: 60
+ Sheep: 70
+ Boar: 15
+ Buffalo: 10
+ Duck: 40
+
+ Python:
+ Fox: 15
+ Rabbit: 20
+ Mouse: 40
+ Duck: 10
+
+ Fox:
+ Rabbit: 70
+ Mouse: 90
+ Duck: 60
+ Caterpillar: 40
+
+ Bear:
+ Python: 80
+ Horse: 40
+ Deer: 80
+ Rabbit: 80
+ Mouse: 90
+ Goat: 70
+ Sheep: 70
+ Boar: 50
+ Buffalo: 20
+
+ Eagle:
+ Fox: 10
+ Rabbit: 90
+ Mouse: 90
+ Duck: 80
+
+ Horse:
+ Herb: 100
+
+ Deer:
+ Herb: 100
+
+ Rabbit:
+ Herb: 100
+
+ Mouse:
+ Caterpillar: 90
+ Herb: 100
+
+ Goat:
+ Herb: 100
+
+ Sheep:
+ Herb: 100
+
+ Boar:
+ Mouse: 50
+ Caterpillar: 90
+ Herb: 100
+
+ Buffalo:
+ Herb: 100
+
+ Duck:
+ Caterpillar: 90
+ Herb: 100
+
+ Caterpillar:
+ Herb: 100
+