From 713ed059c7198566b4630e9756c0932070df0359 Mon Sep 17 00:00:00 2001 From: sefanov Date: Tue, 21 Nov 2023 01:39:48 +0300 Subject: [PATCH 1/6] added animals hierarchy --- src/animal-settings.properties | 31 +++++++++++++++++++ src/efanov/Application.java | 7 +++++ src/efanov/actions/Action.java | 10 ++++++ src/efanov/actions/Directions.java | 8 +++++ src/efanov/entities/Entity.java | 17 ++++++++++ src/efanov/entities/animals/Animal.java | 18 +++++++++++ .../entities/animals/herbivores/Buffalo.java | 8 +++++ .../animals/herbivores/Caterpillar.java | 8 +++++ .../entities/animals/herbivores/Deer.java | 8 +++++ .../entities/animals/herbivores/Duck.java | 8 +++++ .../entities/animals/herbivores/Goat.java | 8 +++++ .../animals/herbivores/Herbivore.java | 10 ++++++ .../entities/animals/herbivores/Horse.java | 9 ++++++ .../entities/animals/herbivores/Mouse.java | 8 +++++ .../entities/animals/herbivores/Rabbit.java | 8 +++++ .../entities/animals/herbivores/Sheep.java | 8 +++++ .../entities/animals/herbivores/WildBoar.java | 8 +++++ .../entities/animals/predators/Bear.java | 10 ++++++ .../entities/animals/predators/Boa.java | 8 +++++ .../entities/animals/predators/Eagle.java | 8 +++++ .../entities/animals/predators/Fox.java | 8 +++++ .../entities/animals/predators/Predator.java | 10 ++++++ .../entities/animals/predators/Wolf.java | 8 +++++ src/efanov/entities/plants/Herb.java | 6 ++++ src/efanov/entities/plants/Plant.java | 7 +++++ .../properties_processing/Processor.java | 19 ++++++++++++ 26 files changed, 266 insertions(+) create mode 100644 src/animal-settings.properties create mode 100644 src/efanov/Application.java create mode 100644 src/efanov/actions/Action.java create mode 100644 src/efanov/actions/Directions.java create mode 100644 src/efanov/entities/Entity.java create mode 100644 src/efanov/entities/animals/Animal.java create mode 100644 src/efanov/entities/animals/herbivores/Buffalo.java create mode 100644 src/efanov/entities/animals/herbivores/Caterpillar.java create mode 100644 src/efanov/entities/animals/herbivores/Deer.java create mode 100644 src/efanov/entities/animals/herbivores/Duck.java create mode 100644 src/efanov/entities/animals/herbivores/Goat.java create mode 100644 src/efanov/entities/animals/herbivores/Herbivore.java create mode 100644 src/efanov/entities/animals/herbivores/Horse.java create mode 100644 src/efanov/entities/animals/herbivores/Mouse.java create mode 100644 src/efanov/entities/animals/herbivores/Rabbit.java create mode 100644 src/efanov/entities/animals/herbivores/Sheep.java create mode 100644 src/efanov/entities/animals/herbivores/WildBoar.java create mode 100644 src/efanov/entities/animals/predators/Bear.java create mode 100644 src/efanov/entities/animals/predators/Boa.java create mode 100644 src/efanov/entities/animals/predators/Eagle.java create mode 100644 src/efanov/entities/animals/predators/Fox.java create mode 100644 src/efanov/entities/animals/predators/Predator.java create mode 100644 src/efanov/entities/animals/predators/Wolf.java create mode 100644 src/efanov/entities/plants/Herb.java create mode 100644 src/efanov/entities/plants/Plant.java create mode 100644 src/efanov/properties_processing/Processor.java diff --git a/src/animal-settings.properties b/src/animal-settings.properties new file mode 100644 index 0000000..b964c19 --- /dev/null +++ b/src/animal-settings.properties @@ -0,0 +1,31 @@ +bear.emoji = \ud83d\udc3b +bear.weight = 500 +bear.maxCount = 5 +bear.speed = 2 +bear.saturation = 80 + +wolf.emoji = \ud83d\udc3a +wolf.weight = 50 +wolf.maxCount = 30 +wolf.speed = 3 +wolf.saturation = 8 + +boa.emoji = \ud83d\udc0d +boa.weight = 15 +boa.maxCount = 30 +boa.speed = 1 +boa.saturation = 3 + +fox.emoji = \uD83E\uDD8A +fox.weight = 8 +fox.maxCount = 30 +fox.speed = 2 +fox.saturation = 2 + +eagle.emoji = \uD83E\uDD85 +eagle.weight = 6 +eagle.maxCount = 20 +eagle.speed = 3 +eagle.saturation = 1 + + diff --git a/src/efanov/Application.java b/src/efanov/Application.java new file mode 100644 index 0000000..f55c8b2 --- /dev/null +++ b/src/efanov/Application.java @@ -0,0 +1,7 @@ +package efanov; + +public class Application { + public static void main(String[] args) { + + } +} diff --git a/src/efanov/actions/Action.java b/src/efanov/actions/Action.java new file mode 100644 index 0000000..ed24c9c --- /dev/null +++ b/src/efanov/actions/Action.java @@ -0,0 +1,10 @@ +package efanov.actions; + +import efanov.entities.Entity; + +public enum Action { + EAT, + REPRODUCE, + MOVE, + CHANGE_DIRECTION; +} diff --git a/src/efanov/actions/Directions.java b/src/efanov/actions/Directions.java new file mode 100644 index 0000000..3ed78ed --- /dev/null +++ b/src/efanov/actions/Directions.java @@ -0,0 +1,8 @@ +package efanov.actions; + +public enum Directions { + LEFT, + RIGHT, + UP, + DOWN +} diff --git a/src/efanov/entities/Entity.java b/src/efanov/entities/Entity.java new file mode 100644 index 0000000..95e8a12 --- /dev/null +++ b/src/efanov/entities/Entity.java @@ -0,0 +1,17 @@ +package efanov.entities; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public abstract class Entity { + private String emoji; + private double weight; + private int maxCountOnLocation; + +} diff --git a/src/efanov/entities/animals/Animal.java b/src/efanov/entities/animals/Animal.java new file mode 100644 index 0000000..a9ebff0 --- /dev/null +++ b/src/efanov/entities/animals/Animal.java @@ -0,0 +1,18 @@ +package efanov.entities.animals; + +import efanov.entities.Entity; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public abstract class Animal extends Entity { + private int speed; + private double saturation; + + public Animal(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation); + this.speed = speed; + this.saturation = saturation; + } +} diff --git a/src/efanov/entities/animals/herbivores/Buffalo.java b/src/efanov/entities/animals/herbivores/Buffalo.java new file mode 100644 index 0000000..88c7c49 --- /dev/null +++ b/src/efanov/entities/animals/herbivores/Buffalo.java @@ -0,0 +1,8 @@ +package efanov.entities.animals.herbivores; + +public class Buffalo extends Herbivore { + + public Buffalo(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/herbivores/Caterpillar.java b/src/efanov/entities/animals/herbivores/Caterpillar.java new file mode 100644 index 0000000..959f0e9 --- /dev/null +++ b/src/efanov/entities/animals/herbivores/Caterpillar.java @@ -0,0 +1,8 @@ +package efanov.entities.animals.herbivores; + +public class Caterpillar extends Herbivore { + + public Caterpillar(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/herbivores/Deer.java b/src/efanov/entities/animals/herbivores/Deer.java new file mode 100644 index 0000000..ff2be9f --- /dev/null +++ b/src/efanov/entities/animals/herbivores/Deer.java @@ -0,0 +1,8 @@ +package efanov.entities.animals.herbivores; + +public class Deer extends Herbivore { + + public Deer(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/herbivores/Duck.java b/src/efanov/entities/animals/herbivores/Duck.java new file mode 100644 index 0000000..a527ded --- /dev/null +++ b/src/efanov/entities/animals/herbivores/Duck.java @@ -0,0 +1,8 @@ +package efanov.entities.animals.herbivores; + +public class Duck extends Herbivore { + + public Duck(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/herbivores/Goat.java b/src/efanov/entities/animals/herbivores/Goat.java new file mode 100644 index 0000000..d7558f7 --- /dev/null +++ b/src/efanov/entities/animals/herbivores/Goat.java @@ -0,0 +1,8 @@ +package efanov.entities.animals.herbivores; + +public class Goat extends Herbivore { + + public Goat(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/herbivores/Herbivore.java b/src/efanov/entities/animals/herbivores/Herbivore.java new file mode 100644 index 0000000..e6720b8 --- /dev/null +++ b/src/efanov/entities/animals/herbivores/Herbivore.java @@ -0,0 +1,10 @@ +package efanov.entities.animals.herbivores; + +import efanov.entities.animals.Animal; + +public abstract class Herbivore extends Animal { + + public Herbivore(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/herbivores/Horse.java b/src/efanov/entities/animals/herbivores/Horse.java new file mode 100644 index 0000000..12e8717 --- /dev/null +++ b/src/efanov/entities/animals/herbivores/Horse.java @@ -0,0 +1,9 @@ +package efanov.entities.animals.herbivores; + +public class Horse extends Herbivore { + + + public Horse(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/herbivores/Mouse.java b/src/efanov/entities/animals/herbivores/Mouse.java new file mode 100644 index 0000000..58232a8 --- /dev/null +++ b/src/efanov/entities/animals/herbivores/Mouse.java @@ -0,0 +1,8 @@ +package efanov.entities.animals.herbivores; + +public class Mouse extends Herbivore { + + public Mouse(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/herbivores/Rabbit.java b/src/efanov/entities/animals/herbivores/Rabbit.java new file mode 100644 index 0000000..0584555 --- /dev/null +++ b/src/efanov/entities/animals/herbivores/Rabbit.java @@ -0,0 +1,8 @@ +package efanov.entities.animals.herbivores; + +public class Rabbit extends Herbivore { + + public Rabbit(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/herbivores/Sheep.java b/src/efanov/entities/animals/herbivores/Sheep.java new file mode 100644 index 0000000..eab1b5d --- /dev/null +++ b/src/efanov/entities/animals/herbivores/Sheep.java @@ -0,0 +1,8 @@ +package efanov.entities.animals.herbivores; + +public class Sheep extends Herbivore { + + public Sheep(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/herbivores/WildBoar.java b/src/efanov/entities/animals/herbivores/WildBoar.java new file mode 100644 index 0000000..0803351 --- /dev/null +++ b/src/efanov/entities/animals/herbivores/WildBoar.java @@ -0,0 +1,8 @@ +package efanov.entities.animals.herbivores; + +public class WildBoar extends Herbivore { + + public WildBoar(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/predators/Bear.java b/src/efanov/entities/animals/predators/Bear.java new file mode 100644 index 0000000..271b18b --- /dev/null +++ b/src/efanov/entities/animals/predators/Bear.java @@ -0,0 +1,10 @@ +package efanov.entities.animals.predators; + +public class Bear extends Predator { + + + public Bear(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } + +} diff --git a/src/efanov/entities/animals/predators/Boa.java b/src/efanov/entities/animals/predators/Boa.java new file mode 100644 index 0000000..211ff1a --- /dev/null +++ b/src/efanov/entities/animals/predators/Boa.java @@ -0,0 +1,8 @@ +package efanov.entities.animals.predators; + +public class Boa extends Predator { + + public Boa(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/predators/Eagle.java b/src/efanov/entities/animals/predators/Eagle.java new file mode 100644 index 0000000..3ad24ea --- /dev/null +++ b/src/efanov/entities/animals/predators/Eagle.java @@ -0,0 +1,8 @@ +package efanov.entities.animals.predators; + +public class Eagle extends Predator { + + public Eagle(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/predators/Fox.java b/src/efanov/entities/animals/predators/Fox.java new file mode 100644 index 0000000..ef29da8 --- /dev/null +++ b/src/efanov/entities/animals/predators/Fox.java @@ -0,0 +1,8 @@ +package efanov.entities.animals.predators; + +public class Fox extends Predator { + + public Fox(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/predators/Predator.java b/src/efanov/entities/animals/predators/Predator.java new file mode 100644 index 0000000..231fd66 --- /dev/null +++ b/src/efanov/entities/animals/predators/Predator.java @@ -0,0 +1,10 @@ +package efanov.entities.animals.predators; + +import efanov.entities.animals.Animal; + +public abstract class Predator extends Animal { + + public Predator(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/animals/predators/Wolf.java b/src/efanov/entities/animals/predators/Wolf.java new file mode 100644 index 0000000..feee041 --- /dev/null +++ b/src/efanov/entities/animals/predators/Wolf.java @@ -0,0 +1,8 @@ +package efanov.entities.animals.predators; + +public class Wolf extends Predator { + + public Wolf(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + super(emoji, weight, maxCountOnLocation, speed, saturation); + } +} diff --git a/src/efanov/entities/plants/Herb.java b/src/efanov/entities/plants/Herb.java new file mode 100644 index 0000000..751b0f9 --- /dev/null +++ b/src/efanov/entities/plants/Herb.java @@ -0,0 +1,6 @@ +package efanov.entities.plants; + +import efanov.entities.Entity; + +public class Herb extends Plant { +} diff --git a/src/efanov/entities/plants/Plant.java b/src/efanov/entities/plants/Plant.java new file mode 100644 index 0000000..a1da164 --- /dev/null +++ b/src/efanov/entities/plants/Plant.java @@ -0,0 +1,7 @@ +package efanov.entities.plants; + +import efanov.entities.Entity; + +public abstract class Plant extends Entity { + +} diff --git a/src/efanov/properties_processing/Processor.java b/src/efanov/properties_processing/Processor.java new file mode 100644 index 0000000..8a3cf74 --- /dev/null +++ b/src/efanov/properties_processing/Processor.java @@ -0,0 +1,19 @@ +package efanov.properties_processing; + +import java.io.FileReader; +import java.io.IOException; +import java.util.Properties; + +public class Processor { + + + public String getFieldsFromFile(String param) { + try (FileReader reader = new FileReader("/Users/effgang/dev/Island/src/animal-settings.properties")) { + Properties properties = new Properties(); + properties.load(reader); + return properties.getProperty(param); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} From 53e7fab77b2c797bb630f37e681b2ee32e243a87 Mon Sep 17 00:00:00 2001 From: sefanov Date: Sun, 26 Nov 2023 23:30:03 +0300 Subject: [PATCH 2/6] added basic logic and system files --- src/animal-settings.properties | 31 --- src/efanov/Application.java | 6 +- src/efanov/actions/Action.java | 10 - src/efanov/actions/Directions.java | 8 - src/efanov/entities/EntitiesFactory.java | 30 +++ src/efanov/entities/EntityType.java | 26 ++ src/efanov/entities/animals/Action.java | 14 + src/efanov/entities/animals/Animal.java | 54 +++- src/efanov/entities/animals/Direction.java | 13 + src/efanov/entities/animals/EatingMap.java | 11 + .../entities/animals/herbivores/Buffalo.java | 10 + .../animals/herbivores/Caterpillar.java | 10 + .../entities/animals/herbivores/Deer.java | 10 + .../entities/animals/herbivores/Duck.java | 10 + .../entities/animals/herbivores/Goat.java | 10 + .../animals/herbivores/Herbivore.java | 8 + .../entities/animals/herbivores/Horse.java | 10 + .../entities/animals/herbivores/Mouse.java | 10 + .../entities/animals/herbivores/Rabbit.java | 10 + .../entities/animals/herbivores/Sheep.java | 10 + .../entities/animals/herbivores/WildBoar.java | 10 + .../entities/animals/predators/Bear.java | 11 +- .../entities/animals/predators/Boa.java | 10 + .../entities/animals/predators/Eagle.java | 10 + .../entities/animals/predators/Fox.java | 10 + .../entities/animals/predators/Predator.java | 9 + .../entities/animals/predators/Wolf.java | 10 + src/efanov/entities/plants/Herb.java | 6 - src/efanov/entities/plants/Plant.java | 20 +- src/efanov/island/IslandController.java | 20 ++ src/efanov/island/IslandMap.java | 53 ++++ src/efanov/island/Location.java | 70 +++++ .../properties_processing/Processor.java | 53 +++- .../resources/animal-settings.properties | 94 +++++++ src/efanov/resources/probability.yaml | 255 ++++++++++++++++++ src/efanov/simulation/SimulationSettings.java | 12 + src/efanov/simulation/SimulationStarter.java | 23 ++ 37 files changed, 915 insertions(+), 62 deletions(-) delete mode 100644 src/animal-settings.properties delete mode 100644 src/efanov/actions/Action.java delete mode 100644 src/efanov/actions/Directions.java create mode 100644 src/efanov/entities/EntitiesFactory.java create mode 100644 src/efanov/entities/EntityType.java create mode 100644 src/efanov/entities/animals/Action.java create mode 100644 src/efanov/entities/animals/Direction.java create mode 100644 src/efanov/entities/animals/EatingMap.java delete mode 100644 src/efanov/entities/plants/Herb.java create mode 100644 src/efanov/island/IslandController.java create mode 100644 src/efanov/island/IslandMap.java create mode 100644 src/efanov/island/Location.java create mode 100644 src/efanov/resources/animal-settings.properties create mode 100644 src/efanov/resources/probability.yaml create mode 100644 src/efanov/simulation/SimulationSettings.java create mode 100644 src/efanov/simulation/SimulationStarter.java diff --git a/src/animal-settings.properties b/src/animal-settings.properties deleted file mode 100644 index b964c19..0000000 --- a/src/animal-settings.properties +++ /dev/null @@ -1,31 +0,0 @@ -bear.emoji = \ud83d\udc3b -bear.weight = 500 -bear.maxCount = 5 -bear.speed = 2 -bear.saturation = 80 - -wolf.emoji = \ud83d\udc3a -wolf.weight = 50 -wolf.maxCount = 30 -wolf.speed = 3 -wolf.saturation = 8 - -boa.emoji = \ud83d\udc0d -boa.weight = 15 -boa.maxCount = 30 -boa.speed = 1 -boa.saturation = 3 - -fox.emoji = \uD83E\uDD8A -fox.weight = 8 -fox.maxCount = 30 -fox.speed = 2 -fox.saturation = 2 - -eagle.emoji = \uD83E\uDD85 -eagle.weight = 6 -eagle.maxCount = 20 -eagle.speed = 3 -eagle.saturation = 1 - - diff --git a/src/efanov/Application.java b/src/efanov/Application.java index f55c8b2..25d9054 100644 --- a/src/efanov/Application.java +++ b/src/efanov/Application.java @@ -1,7 +1,11 @@ package efanov; + +import efanov.simulation.SimulationStarter; + public class Application { public static void main(String[] args) { - + SimulationStarter simulationStarter = new SimulationStarter(); + simulationStarter.start(); } } diff --git a/src/efanov/actions/Action.java b/src/efanov/actions/Action.java deleted file mode 100644 index ed24c9c..0000000 --- a/src/efanov/actions/Action.java +++ /dev/null @@ -1,10 +0,0 @@ -package efanov.actions; - -import efanov.entities.Entity; - -public enum Action { - EAT, - REPRODUCE, - MOVE, - CHANGE_DIRECTION; -} diff --git a/src/efanov/actions/Directions.java b/src/efanov/actions/Directions.java deleted file mode 100644 index 3ed78ed..0000000 --- a/src/efanov/actions/Directions.java +++ /dev/null @@ -1,8 +0,0 @@ -package efanov.actions; - -public enum Directions { - LEFT, - RIGHT, - UP, - DOWN -} diff --git a/src/efanov/entities/EntitiesFactory.java b/src/efanov/entities/EntitiesFactory.java new file mode 100644 index 0000000..e717852 --- /dev/null +++ b/src/efanov/entities/EntitiesFactory.java @@ -0,0 +1,30 @@ +package efanov.entities; + +import efanov.entities.animals.herbivores.*; +import efanov.entities.animals.predators.*; +import efanov.entities.plants.Plant; +import efanov.properties_processing.Processor; + +public class EntitiesFactory { + Processor processor = new Processor(); + public Entity createEntity(EntityType entityType) { + return switch (entityType) { + case WOLF -> new Wolf(); + case BEAR -> new Bear(); + case BOA -> new Boa(); + case FOX -> new Fox(); + case EAGLE -> new Eagle(); + case HORSE -> new Horse(); + case GOAT -> new Goat(); + case SHEEP -> new Sheep(); + case MOUSE -> new Mouse(); + case RABBIT -> new Rabbit(); + case DEER -> new Deer(); + case WILD_BOAR -> new WildBoar(); + case DUCK -> new Duck(); + case BUFFALO -> new Buffalo(); + case CATERPILLAR -> new Caterpillar(); + case PLANT -> new Plant(processor.getEmojiFromFile("plant"), processor.getWeightFromFile("plant"), processor.getMaxCountFromFile("plant") ); + }; + } +} diff --git a/src/efanov/entities/EntityType.java b/src/efanov/entities/EntityType.java new file mode 100644 index 0000000..e7eef9c --- /dev/null +++ b/src/efanov/entities/EntityType.java @@ -0,0 +1,26 @@ +package efanov.entities; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum EntityType { + WOLF, + BOA, + FOX, + BEAR, + EAGLE, + HORSE, + DEER, + RABBIT, + MOUSE, + GOAT, + SHEEP, + WILD_BOAR, + BUFFALO, + DUCK, + CATERPILLAR, + PLANT + +} diff --git a/src/efanov/entities/animals/Action.java b/src/efanov/entities/animals/Action.java new file mode 100644 index 0000000..f00993f --- /dev/null +++ b/src/efanov/entities/animals/Action.java @@ -0,0 +1,14 @@ +package efanov.entities.animals; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum Action { + EAT(90), + REPRODUCE(60), + MOVE(100); + + private final int actionChance; +} diff --git a/src/efanov/entities/animals/Animal.java b/src/efanov/entities/animals/Animal.java index a9ebff0..d5511fa 100644 --- a/src/efanov/entities/animals/Animal.java +++ b/src/efanov/entities/animals/Animal.java @@ -1,18 +1,70 @@ package efanov.entities.animals; import efanov.entities.Entity; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; +import java.util.concurrent.ThreadLocalRandom; + @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor public abstract class Animal extends Entity { + private static final int BOUND = 100; + private String emoji; + private double weight; + private int maxCountOnLocation; private int speed; private double saturation; + private double health; public Animal(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { - super(emoji, weight, maxCountOnLocation); + this.emoji = emoji; + this.weight = weight; + this.maxCountOnLocation = maxCountOnLocation; this.speed = speed; this.saturation = saturation; + this.health = saturation; + } + + + public abstract Animal reproduce(); + + public void eat(Entity food) { + if (food.getWeight() >= this.getSaturation()) { + this.setHealth(this.getSaturation()); + } else { + double saturationAfterEating = this.getHealth() + food.getWeight(); + this.setHealth(saturationAfterEating); + } + } + + public Direction chooseDirection() { + return Direction.values()[ThreadLocalRandom.current().nextInt(Direction.values().length)]; + } + + public Action chooseAction() { + var action = Action.values()[ThreadLocalRandom.current().nextInt(Action.values().length)]; + var isActiveAction = ThreadLocalRandom.current().nextInt(BOUND) < action.getActionChance(); + return isActiveAction ? action : Action.MOVE; + } + + @Override + public String getEmoji() { + return emoji; + } + + @Override + public double getWeight() { + return weight; + } + + @Override + public int getMaxCountOnLocation() { + return maxCountOnLocation; } + } diff --git a/src/efanov/entities/animals/Direction.java b/src/efanov/entities/animals/Direction.java new file mode 100644 index 0000000..982be73 --- /dev/null +++ b/src/efanov/entities/animals/Direction.java @@ -0,0 +1,13 @@ +package efanov.entities.animals; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum Direction { + LEFT, + RIGHT, + UP, + DOWN +} diff --git a/src/efanov/entities/animals/EatingMap.java b/src/efanov/entities/animals/EatingMap.java new file mode 100644 index 0000000..7c812e6 --- /dev/null +++ b/src/efanov/entities/animals/EatingMap.java @@ -0,0 +1,11 @@ +package efanov.entities.animals; + +import lombok.Getter; + +import java.util.Map; +@Getter +public class EatingMap { + + Map> eatingProbability; + +} \ No newline at end of file diff --git a/src/efanov/entities/animals/herbivores/Buffalo.java b/src/efanov/entities/animals/herbivores/Buffalo.java index 88c7c49..c4f6f16 100644 --- a/src/efanov/entities/animals/herbivores/Buffalo.java +++ b/src/efanov/entities/animals/herbivores/Buffalo.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Buffalo extends Herbivore { public Buffalo(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Buffalo() { + } + + @Override + public Animal reproduce() { + return new Buffalo(); + } } diff --git a/src/efanov/entities/animals/herbivores/Caterpillar.java b/src/efanov/entities/animals/herbivores/Caterpillar.java index 959f0e9..51885b9 100644 --- a/src/efanov/entities/animals/herbivores/Caterpillar.java +++ b/src/efanov/entities/animals/herbivores/Caterpillar.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Caterpillar extends Herbivore { public Caterpillar(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Caterpillar() { + } + + @Override + public Animal reproduce() { + return new Caterpillar(); + } } diff --git a/src/efanov/entities/animals/herbivores/Deer.java b/src/efanov/entities/animals/herbivores/Deer.java index ff2be9f..1d48515 100644 --- a/src/efanov/entities/animals/herbivores/Deer.java +++ b/src/efanov/entities/animals/herbivores/Deer.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Deer extends Herbivore { public Deer(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Deer() { + } + + @Override + public Animal reproduce() { + return new Deer(); + } } diff --git a/src/efanov/entities/animals/herbivores/Duck.java b/src/efanov/entities/animals/herbivores/Duck.java index a527ded..1af8d9f 100644 --- a/src/efanov/entities/animals/herbivores/Duck.java +++ b/src/efanov/entities/animals/herbivores/Duck.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Duck extends Herbivore { public Duck(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Duck() { + } + + @Override + public Animal reproduce() { + return new Duck(); + } } diff --git a/src/efanov/entities/animals/herbivores/Goat.java b/src/efanov/entities/animals/herbivores/Goat.java index d7558f7..426e9f9 100644 --- a/src/efanov/entities/animals/herbivores/Goat.java +++ b/src/efanov/entities/animals/herbivores/Goat.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Goat extends Herbivore { public Goat(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Goat() { + } + + @Override + public Animal reproduce() { + return new Goat(); + } } diff --git a/src/efanov/entities/animals/herbivores/Herbivore.java b/src/efanov/entities/animals/herbivores/Herbivore.java index e6720b8..c1de20e 100644 --- a/src/efanov/entities/animals/herbivores/Herbivore.java +++ b/src/efanov/entities/animals/herbivores/Herbivore.java @@ -1,10 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.Entity; import efanov.entities.animals.Animal; +import lombok.NoArgsConstructor; +@NoArgsConstructor public abstract class Herbivore extends Animal { public Herbivore(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + @Override + public void eat(Entity entity) { + + } } diff --git a/src/efanov/entities/animals/herbivores/Horse.java b/src/efanov/entities/animals/herbivores/Horse.java index 12e8717..c617e80 100644 --- a/src/efanov/entities/animals/herbivores/Horse.java +++ b/src/efanov/entities/animals/herbivores/Horse.java @@ -1,9 +1,19 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Horse extends Herbivore { public Horse(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Horse() { + } + + @Override + public Animal reproduce() { + return new Horse(); + } } diff --git a/src/efanov/entities/animals/herbivores/Mouse.java b/src/efanov/entities/animals/herbivores/Mouse.java index 58232a8..0036653 100644 --- a/src/efanov/entities/animals/herbivores/Mouse.java +++ b/src/efanov/entities/animals/herbivores/Mouse.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Mouse extends Herbivore { public Mouse(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Mouse() { + } + + @Override + public Animal reproduce() { + return new Mouse(); + } } diff --git a/src/efanov/entities/animals/herbivores/Rabbit.java b/src/efanov/entities/animals/herbivores/Rabbit.java index 0584555..8dc57e9 100644 --- a/src/efanov/entities/animals/herbivores/Rabbit.java +++ b/src/efanov/entities/animals/herbivores/Rabbit.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Rabbit extends Herbivore { public Rabbit(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Rabbit() { + } + + @Override + public Animal reproduce() { + return new Rabbit(); + } } diff --git a/src/efanov/entities/animals/herbivores/Sheep.java b/src/efanov/entities/animals/herbivores/Sheep.java index eab1b5d..84010a7 100644 --- a/src/efanov/entities/animals/herbivores/Sheep.java +++ b/src/efanov/entities/animals/herbivores/Sheep.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Sheep extends Herbivore { public Sheep(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Sheep() { + } + + @Override + public Animal reproduce() { + return new Sheep(); + } } diff --git a/src/efanov/entities/animals/herbivores/WildBoar.java b/src/efanov/entities/animals/herbivores/WildBoar.java index 0803351..23a2bd1 100644 --- a/src/efanov/entities/animals/herbivores/WildBoar.java +++ b/src/efanov/entities/animals/herbivores/WildBoar.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class WildBoar extends Herbivore { public WildBoar(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public WildBoar() { + } + + @Override + public Animal reproduce() { + return new WildBoar(); + } } diff --git a/src/efanov/entities/animals/predators/Bear.java b/src/efanov/entities/animals/predators/Bear.java index 271b18b..3fdc33d 100644 --- a/src/efanov/entities/animals/predators/Bear.java +++ b/src/efanov/entities/animals/predators/Bear.java @@ -1,10 +1,19 @@ package efanov.entities.animals.predators; -public class Bear extends Predator { +import efanov.entities.animals.Animal; +public class Bear extends Predator { public Bear(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); + } + public Bear() { + } + + @Override + public Animal reproduce() { + return new Bear(); + } } diff --git a/src/efanov/entities/animals/predators/Boa.java b/src/efanov/entities/animals/predators/Boa.java index 211ff1a..a886ad9 100644 --- a/src/efanov/entities/animals/predators/Boa.java +++ b/src/efanov/entities/animals/predators/Boa.java @@ -1,8 +1,18 @@ package efanov.entities.animals.predators; +import efanov.entities.animals.Animal; + public class Boa extends Predator { public Boa(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Boa() { + } + + @Override + public Animal reproduce() { + return new Boa(); + } } diff --git a/src/efanov/entities/animals/predators/Eagle.java b/src/efanov/entities/animals/predators/Eagle.java index 3ad24ea..600bc3b 100644 --- a/src/efanov/entities/animals/predators/Eagle.java +++ b/src/efanov/entities/animals/predators/Eagle.java @@ -1,8 +1,18 @@ package efanov.entities.animals.predators; +import efanov.entities.animals.Animal; + public class Eagle extends Predator { public Eagle(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Eagle() { + } + + @Override + public Animal reproduce() { + return new Eagle(); + } } diff --git a/src/efanov/entities/animals/predators/Fox.java b/src/efanov/entities/animals/predators/Fox.java index ef29da8..454ecbb 100644 --- a/src/efanov/entities/animals/predators/Fox.java +++ b/src/efanov/entities/animals/predators/Fox.java @@ -1,8 +1,18 @@ package efanov.entities.animals.predators; +import efanov.entities.animals.Animal; + public class Fox extends Predator { public Fox(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Fox() { + } + + @Override + public Animal reproduce() { + return new Fox(); + } } diff --git a/src/efanov/entities/animals/predators/Predator.java b/src/efanov/entities/animals/predators/Predator.java index 231fd66..f974af8 100644 --- a/src/efanov/entities/animals/predators/Predator.java +++ b/src/efanov/entities/animals/predators/Predator.java @@ -1,10 +1,19 @@ package efanov.entities.animals.predators; +import efanov.entities.Entity; import efanov.entities.animals.Animal; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +@NoArgsConstructor public abstract class Predator extends Animal { public Predator(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + @Override + public void eat(Entity entity) { + + } } diff --git a/src/efanov/entities/animals/predators/Wolf.java b/src/efanov/entities/animals/predators/Wolf.java index feee041..92a9c4b 100644 --- a/src/efanov/entities/animals/predators/Wolf.java +++ b/src/efanov/entities/animals/predators/Wolf.java @@ -1,8 +1,18 @@ package efanov.entities.animals.predators; +import efanov.entities.animals.Animal; + public class Wolf extends Predator { public Wolf(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Wolf() { + } + + @Override + public Animal reproduce() { + return new Wolf(); + } } diff --git a/src/efanov/entities/plants/Herb.java b/src/efanov/entities/plants/Herb.java deleted file mode 100644 index 751b0f9..0000000 --- a/src/efanov/entities/plants/Herb.java +++ /dev/null @@ -1,6 +0,0 @@ -package efanov.entities.plants; - -import efanov.entities.Entity; - -public class Herb extends Plant { -} diff --git a/src/efanov/entities/plants/Plant.java b/src/efanov/entities/plants/Plant.java index a1da164..7958b5e 100644 --- a/src/efanov/entities/plants/Plant.java +++ b/src/efanov/entities/plants/Plant.java @@ -2,6 +2,24 @@ import efanov.entities.Entity; -public abstract class Plant extends Entity { +public class Plant extends Entity { + public Plant(String emoji, double weight, int maxCountOnLocation) { + super(emoji, weight, maxCountOnLocation); + } + + @Override + public String getEmoji() { + return super.getEmoji(); + } + + @Override + public double getWeight() { + return super.getWeight(); + } + + @Override + public int getMaxCountOnLocation() { + return super.getMaxCountOnLocation(); + } } diff --git a/src/efanov/island/IslandController.java b/src/efanov/island/IslandController.java new file mode 100644 index 0000000..7902b15 --- /dev/null +++ b/src/efanov/island/IslandController.java @@ -0,0 +1,20 @@ +package efanov.island; + +import efanov.entities.animals.EatingMap; +import efanov.simulation.SimulationSettings; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class IslandController { + private final IslandMap map; + private final EatingMap eatingMap; + private final SimulationSettings simulationSettings; + + public IslandController(IslandMap map, EatingMap eatingMap, SimulationSettings simulationSettings) { + this.map = map; + this.eatingMap = eatingMap; + this.simulationSettings = simulationSettings; + } +} diff --git a/src/efanov/island/IslandMap.java b/src/efanov/island/IslandMap.java new file mode 100644 index 0000000..d8a8b3c --- /dev/null +++ b/src/efanov/island/IslandMap.java @@ -0,0 +1,53 @@ +package efanov.island; + +import efanov.entities.EntitiesFactory; +import efanov.entities.Entity; +import efanov.entities.EntityType; +import lombok.Getter; +import lombok.Setter; + +import java.util.concurrent.ThreadLocalRandom; +@Getter +@Setter +public class IslandMap { + private final EntitiesFactory entitiesFactory; + private final int x, y; + private Location[][] locations; + + public IslandMap(int x, int y) { + this.entitiesFactory = new EntitiesFactory(); + this.x = x; + this.y = y; + this.locations = new Location[x][y]; + } + + public void init() { + for (int coordX = 0; coordX < x; coordX++) { + for (int coordY = 0; coordY < y; coordY++) { + locations[coordX][coordY] = new Location(coordX, coordY); + } + } + } + + public void fillIsland(int maxCount) { + for (int coordX = 0; coordX < x; coordX++) { + for (int coordY = 0; coordY < y; coordY++) { + for (int i = 0; i <= maxCount; i++) { + Entity entity = getRandom(); + var entityAsString = entity.getClass().getSimpleName(); + var entityCountOnLocation = locations[coordX][coordY].getEntitiesCountStatistic().getOrDefault(entityAsString, 0); + if (entityCountOnLocation > maxCount) { + continue; + } + locations[coordX][coordY].addEntity(entity); + } + } + } + } + + private Entity getRandom() { + var entityTypes = EntityType.values(); + var entityType = entityTypes[ThreadLocalRandom.current().nextInt(entityTypes.length)]; + return entitiesFactory.createEntity(entityType); + } +} diff --git a/src/efanov/island/Location.java b/src/efanov/island/Location.java new file mode 100644 index 0000000..93f9f74 --- /dev/null +++ b/src/efanov/island/Location.java @@ -0,0 +1,70 @@ +package efanov.island; + +import efanov.entities.Entity; +import efanov.entities.animals.Animal; +import efanov.entities.plants.Plant; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Getter +public class Location { + private int x; + private int y; + private List entities; + private Map entitiesCountStatistic; + + public Location(int x, int y) { + this.x = x; + this.y = y; + this.entities = new ArrayList<>(); + this.entitiesCountStatistic = new HashMap<>(); + } + + public void addEntity(Entity entity) { + entities.add(entity); + addToStatistic(entity); + } + + public void removeEntity(Entity entity) { + entities.remove(entity); + removeFromStatistic(entity); + } + + public List getAnimals() { + return entities.stream() + .filter(e -> e instanceof Animal) + .map(e -> (Animal) e) + .toList(); + } + + public List getPlants() { + return entities.stream() + .filter(e -> e instanceof Plant) + .map(e -> (Plant) e) + .toList(); + } + + private void addToStatistic(Entity entity) { + var entityAsString = getSimpleName(entity); + entitiesCountStatistic.merge(entityAsString, 1, (oldValue, newValue) -> oldValue + 1); + } + + private void removeFromStatistic(Entity entity) { + var entityAsString = getSimpleName(entity); + entitiesCountStatistic.merge(entityAsString, 1, (oldValue, newValue) -> { + int tempCount = oldValue - 1; + if (tempCount <= 0) { + return null; + } + return tempCount; + }); + } + + private String getSimpleName(Entity entity) { + return entity.getClass().getSimpleName(); + } +} diff --git a/src/efanov/properties_processing/Processor.java b/src/efanov/properties_processing/Processor.java index 8a3cf74..15e2f34 100644 --- a/src/efanov/properties_processing/Processor.java +++ b/src/efanov/properties_processing/Processor.java @@ -1,5 +1,7 @@ package efanov.properties_processing; +import org.yaml.snakeyaml.Yaml; + import java.io.FileReader; import java.io.IOException; import java.util.Properties; @@ -7,13 +9,58 @@ public class Processor { - public String getFieldsFromFile(String param) { - try (FileReader reader = new FileReader("/Users/effgang/dev/Island/src/animal-settings.properties")) { + public static final String ANIMAL_SETTINGS_PROPERTIES = "/Users/effgang/dev/Island/src/efanov/resources/animal-settings.properties"; + + public String getEmojiFromFile(String param) { + try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { + Properties properties = new Properties(); + properties.load(reader); + return properties.getProperty(param.toLowerCase() + ".emoji"); + } catch (IOException e) { + throw new RuntimeException(e); + } + + } + + public double getWeightFromFile(String param) { + try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { + Properties properties = new Properties(); + properties.load(reader); + return Double.parseDouble(properties.getProperty(param.toLowerCase() + ".weight")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public int getMaxCountFromFile(String param) { + try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { Properties properties = new Properties(); properties.load(reader); - return properties.getProperty(param); + return Integer.parseInt(properties.getProperty(param.toLowerCase() + ".maxCount")); } catch (IOException e) { throw new RuntimeException(e); } } + + public int getSpeedFromFile(String param) { + try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { + Properties properties = new Properties(); + properties.load(reader); + return Integer.parseInt(properties.getProperty(param.toLowerCase() + ".speed")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public double getSaturationFromFile(String param) { + try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { + Properties properties = new Properties(); + properties.load(reader); + return Double.parseDouble(properties.getProperty(param.toLowerCase() + ".saturation")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + } diff --git a/src/efanov/resources/animal-settings.properties b/src/efanov/resources/animal-settings.properties new file mode 100644 index 0000000..a109962 --- /dev/null +++ b/src/efanov/resources/animal-settings.properties @@ -0,0 +1,94 @@ +bear.emoji = \ud83d\udc3b +bear.weight = 500 +bear.maxCount = 5 +bear.speed = 2 +bear.saturation = 80 + +wolf.emoji = \ud83d\udc3a +wolf.weight = 50 +wolf.maxCount = 30 +wolf.speed = 3 +wolf.saturation = 8 + +boa.emoji = \ud83d\udc0d +boa.weight = 15 +boa.maxCount = 30 +boa.speed = 1 +boa.saturation = 3 + +fox.emoji = \uD83E\uDD8A +fox.weight = 8 +fox.maxCount = 30 +fox.speed = 2 +fox.saturation = 2 + +eagle.emoji = \uD83E\uDD85 +eagle.weight = 6 +eagle.maxCount = 20 +eagle.speed = 3 +eagle.saturation = 1 + +horse.emoji = \uD83D\uDC34 +horse.weight = 400 +horse.maxCount = 20 +horse.speed = 4 +horse.saturation = 60 + +deer.emoji = \uD83E\uDD8C +deer.weight = 300 +deer.maxCount = 20 +deer.speed = 4 +deer.saturation = 50 + +rabbit.emoji = \uD83D\uDC30 +rabbit.weight = 2 +rabbit.maxCount = 150 +rabbit.speed = 2 +rabbit.saturation = 0.45 + +mouse.emoji = \uD83D\uDC2D +mouse.weight = 0.05 +mouse.maxCount = 500 +mouse.speed = 1 +mouse.saturation = 0.01 + +goat.emoji = \uD83D\uDC10 +goat.weight = 60 +goat.maxCount = 140 +goat.speed = 3 +goat.saturation = 10 + +sheep.emoji = \uD83D\uDC11 +sheep.weight = 70 +sheep.maxCount = 140 +sheep.speed = 3 +sheep.saturation = 15 + +wildboar.emoji = \uD83D\uDC17 +wildboar.weight = 400 +wildboar.maxCount = 50 +wildboar.speed = 2 +wildboar.saturation = 50 + +buffalo.emoji = \uD83D\uDC02 +buffalo.weight = 700 +buffalo.maxCount = 10 +buffalo.speed = 3 +buffalo.saturation = 100 + +duck.emoji = \uD83E\uDD86 +duck.weight = 1 +duck.maxCount = 200 +duck.speed = 4 +duck.saturation = 0.15 + +caterpillar.emoji = \uD83D\uDC1B +caterpillar.weight = 0.01 +caterpillar.maxCount = 1000 +caterpillar.speed = 0 +caterpillar.saturation = 0 + +plant.emoji = \uD83C\uDF3F +plant.weight = 1 +plant.maxCount = 200 + diff --git a/src/efanov/resources/probability.yaml b/src/efanov/resources/probability.yaml new file mode 100644 index 0000000..30d2faa --- /dev/null +++ b/src/efanov/resources/probability.yaml @@ -0,0 +1,255 @@ +eatingProbability: + Wolf: + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 10 + Deer: 15 + Rabbit: 60 + Mouse: 80 + Goat: 60 + Sheep: 70 + WildBoar: 15 + Buffalo: 10 + Duck: 40 + Caterpillar: 0 + Herb: 0 + + Boa: + Wolf: 0 + Fox: 15 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 20 + Mouse: 40 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 10 + Caterpillar: 0 + Herb: 0 + + Fox: + Wolf: 0 + Boa: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 70 + Mouse: 90 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 60 + Caterpillar: 40 + Herb: 0 + + Bear: + Wolf: 0 + Boa: 80 + Fox: 0 + Eagle: 0 + Horse: 40 + Deer: 80 + Rabbit: 80 + Mouse: 90 + Goat: 70 + Sheep: 70 + WildBoar: 50 + Buffalo: 20 + Duck: 10 + Caterpillar: 0 + Herb: 0 + + Eagle: + Wolf: 0 + Boa: 0 + Fox: 10 + Bear: 0 + Horse: 0 + Deer: 0 + Rabbit: 90 + Mouse: 90 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 80 + Caterpillar: 0 + Herb: 0 + + Horse: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 + + Deer: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 + + Rabbit: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Mouse: 0 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 + + Mouse: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 90 + Herb: 100 + + Goat: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 + + Sheep: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 + + WildBoar: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 50 + Goat: 0 + Sheep: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 90 + Herb: 100 + + Buffalo: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + WildBoar: 0 + Sheep: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 + + Duck: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + WildBoar: 0 + Sheep: 0 + Buffalo: 0 + Caterpillar: 90 + Herb: 100 + + Caterpillar: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + WildBoar: 0 + Sheep: 0 + Buffalo: 0 + Duck: 0 + Herb: 100 \ No newline at end of file diff --git a/src/efanov/simulation/SimulationSettings.java b/src/efanov/simulation/SimulationSettings.java new file mode 100644 index 0000000..1e9ff66 --- /dev/null +++ b/src/efanov/simulation/SimulationSettings.java @@ -0,0 +1,12 @@ +package efanov.simulation; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SimulationSettings { + private int width = 100; + private int height = 20; + private int entityCountOnCage = 100; +} diff --git a/src/efanov/simulation/SimulationStarter.java b/src/efanov/simulation/SimulationStarter.java new file mode 100644 index 0000000..8affb57 --- /dev/null +++ b/src/efanov/simulation/SimulationStarter.java @@ -0,0 +1,23 @@ +package efanov.simulation; + + +import efanov.island.IslandController; +import efanov.island.IslandMap; + +public class SimulationStarter { + private final IslandMap islandMap; + private final SimulationSettings simulationSettings; + private final IslandController controller; + + public SimulationStarter() { + this.simulationSettings = new SimulationSettings(); + this.islandMap = new IslandMap(simulationSettings.getWidth(), simulationSettings.getHeight()); + this.controller = new IslandController(islandMap,null,simulationSettings); + } + + public void start() { + controller.getMap().init(); + controller.getMap().fillIsland(simulationSettings.getEntityCountOnCage()); + System.out.println(); + } +} From 1f635b2f6c42e2840c9945b56c514298009d54bf Mon Sep 17 00:00:00 2001 From: sefanov Date: Sun, 26 Nov 2023 23:30:03 +0300 Subject: [PATCH 3/6] added basic logic and system files --- src/animal-settings.properties | 31 --- src/efanov/Application.java | 6 +- src/efanov/actions/Action.java | 10 - src/efanov/actions/Directions.java | 8 - src/efanov/entities/EntitiesFactory.java | 30 +++ src/efanov/entities/EntityType.java | 26 ++ src/efanov/entities/animals/Action.java | 14 + src/efanov/entities/animals/Animal.java | 54 +++- src/efanov/entities/animals/Direction.java | 13 + src/efanov/entities/animals/EatingMap.java | 11 + .../entities/animals/herbivores/Buffalo.java | 10 + .../animals/herbivores/Caterpillar.java | 10 + .../entities/animals/herbivores/Deer.java | 10 + .../entities/animals/herbivores/Duck.java | 10 + .../entities/animals/herbivores/Goat.java | 10 + .../animals/herbivores/Herbivore.java | 8 + .../entities/animals/herbivores/Horse.java | 10 + .../entities/animals/herbivores/Mouse.java | 10 + .../entities/animals/herbivores/Rabbit.java | 10 + .../entities/animals/herbivores/Sheep.java | 10 + .../entities/animals/herbivores/WildBoar.java | 10 + .../entities/animals/predators/Bear.java | 11 +- .../entities/animals/predators/Boa.java | 10 + .../entities/animals/predators/Eagle.java | 10 + .../entities/animals/predators/Fox.java | 10 + .../entities/animals/predators/Predator.java | 9 + .../entities/animals/predators/Wolf.java | 10 + src/efanov/entities/plants/Herb.java | 6 - src/efanov/entities/plants/Plant.java | 20 +- src/efanov/island/IslandController.java | 20 ++ src/efanov/island/IslandMap.java | 53 ++++ src/efanov/island/Location.java | 70 +++++ .../properties_processing/Processor.java | 53 +++- .../resources/animal-settings.properties | 94 +++++++ src/efanov/resources/probability.yaml | 255 ++++++++++++++++++ src/efanov/simulation/SimulationSettings.java | 12 + src/efanov/simulation/SimulationStarter.java | 23 ++ 37 files changed, 915 insertions(+), 62 deletions(-) delete mode 100644 src/animal-settings.properties delete mode 100644 src/efanov/actions/Action.java delete mode 100644 src/efanov/actions/Directions.java create mode 100644 src/efanov/entities/EntitiesFactory.java create mode 100644 src/efanov/entities/EntityType.java create mode 100644 src/efanov/entities/animals/Action.java create mode 100644 src/efanov/entities/animals/Direction.java create mode 100644 src/efanov/entities/animals/EatingMap.java delete mode 100644 src/efanov/entities/plants/Herb.java create mode 100644 src/efanov/island/IslandController.java create mode 100644 src/efanov/island/IslandMap.java create mode 100644 src/efanov/island/Location.java create mode 100644 src/efanov/resources/animal-settings.properties create mode 100644 src/efanov/resources/probability.yaml create mode 100644 src/efanov/simulation/SimulationSettings.java create mode 100644 src/efanov/simulation/SimulationStarter.java diff --git a/src/animal-settings.properties b/src/animal-settings.properties deleted file mode 100644 index b964c19..0000000 --- a/src/animal-settings.properties +++ /dev/null @@ -1,31 +0,0 @@ -bear.emoji = \ud83d\udc3b -bear.weight = 500 -bear.maxCount = 5 -bear.speed = 2 -bear.saturation = 80 - -wolf.emoji = \ud83d\udc3a -wolf.weight = 50 -wolf.maxCount = 30 -wolf.speed = 3 -wolf.saturation = 8 - -boa.emoji = \ud83d\udc0d -boa.weight = 15 -boa.maxCount = 30 -boa.speed = 1 -boa.saturation = 3 - -fox.emoji = \uD83E\uDD8A -fox.weight = 8 -fox.maxCount = 30 -fox.speed = 2 -fox.saturation = 2 - -eagle.emoji = \uD83E\uDD85 -eagle.weight = 6 -eagle.maxCount = 20 -eagle.speed = 3 -eagle.saturation = 1 - - diff --git a/src/efanov/Application.java b/src/efanov/Application.java index f55c8b2..25d9054 100644 --- a/src/efanov/Application.java +++ b/src/efanov/Application.java @@ -1,7 +1,11 @@ package efanov; + +import efanov.simulation.SimulationStarter; + public class Application { public static void main(String[] args) { - + SimulationStarter simulationStarter = new SimulationStarter(); + simulationStarter.start(); } } diff --git a/src/efanov/actions/Action.java b/src/efanov/actions/Action.java deleted file mode 100644 index ed24c9c..0000000 --- a/src/efanov/actions/Action.java +++ /dev/null @@ -1,10 +0,0 @@ -package efanov.actions; - -import efanov.entities.Entity; - -public enum Action { - EAT, - REPRODUCE, - MOVE, - CHANGE_DIRECTION; -} diff --git a/src/efanov/actions/Directions.java b/src/efanov/actions/Directions.java deleted file mode 100644 index 3ed78ed..0000000 --- a/src/efanov/actions/Directions.java +++ /dev/null @@ -1,8 +0,0 @@ -package efanov.actions; - -public enum Directions { - LEFT, - RIGHT, - UP, - DOWN -} diff --git a/src/efanov/entities/EntitiesFactory.java b/src/efanov/entities/EntitiesFactory.java new file mode 100644 index 0000000..e717852 --- /dev/null +++ b/src/efanov/entities/EntitiesFactory.java @@ -0,0 +1,30 @@ +package efanov.entities; + +import efanov.entities.animals.herbivores.*; +import efanov.entities.animals.predators.*; +import efanov.entities.plants.Plant; +import efanov.properties_processing.Processor; + +public class EntitiesFactory { + Processor processor = new Processor(); + public Entity createEntity(EntityType entityType) { + return switch (entityType) { + case WOLF -> new Wolf(); + case BEAR -> new Bear(); + case BOA -> new Boa(); + case FOX -> new Fox(); + case EAGLE -> new Eagle(); + case HORSE -> new Horse(); + case GOAT -> new Goat(); + case SHEEP -> new Sheep(); + case MOUSE -> new Mouse(); + case RABBIT -> new Rabbit(); + case DEER -> new Deer(); + case WILD_BOAR -> new WildBoar(); + case DUCK -> new Duck(); + case BUFFALO -> new Buffalo(); + case CATERPILLAR -> new Caterpillar(); + case PLANT -> new Plant(processor.getEmojiFromFile("plant"), processor.getWeightFromFile("plant"), processor.getMaxCountFromFile("plant") ); + }; + } +} diff --git a/src/efanov/entities/EntityType.java b/src/efanov/entities/EntityType.java new file mode 100644 index 0000000..e7eef9c --- /dev/null +++ b/src/efanov/entities/EntityType.java @@ -0,0 +1,26 @@ +package efanov.entities; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum EntityType { + WOLF, + BOA, + FOX, + BEAR, + EAGLE, + HORSE, + DEER, + RABBIT, + MOUSE, + GOAT, + SHEEP, + WILD_BOAR, + BUFFALO, + DUCK, + CATERPILLAR, + PLANT + +} diff --git a/src/efanov/entities/animals/Action.java b/src/efanov/entities/animals/Action.java new file mode 100644 index 0000000..f00993f --- /dev/null +++ b/src/efanov/entities/animals/Action.java @@ -0,0 +1,14 @@ +package efanov.entities.animals; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum Action { + EAT(90), + REPRODUCE(60), + MOVE(100); + + private final int actionChance; +} diff --git a/src/efanov/entities/animals/Animal.java b/src/efanov/entities/animals/Animal.java index a9ebff0..d5511fa 100644 --- a/src/efanov/entities/animals/Animal.java +++ b/src/efanov/entities/animals/Animal.java @@ -1,18 +1,70 @@ package efanov.entities.animals; import efanov.entities.Entity; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; +import java.util.concurrent.ThreadLocalRandom; + @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor public abstract class Animal extends Entity { + private static final int BOUND = 100; + private String emoji; + private double weight; + private int maxCountOnLocation; private int speed; private double saturation; + private double health; public Animal(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { - super(emoji, weight, maxCountOnLocation); + this.emoji = emoji; + this.weight = weight; + this.maxCountOnLocation = maxCountOnLocation; this.speed = speed; this.saturation = saturation; + this.health = saturation; + } + + + public abstract Animal reproduce(); + + public void eat(Entity food) { + if (food.getWeight() >= this.getSaturation()) { + this.setHealth(this.getSaturation()); + } else { + double saturationAfterEating = this.getHealth() + food.getWeight(); + this.setHealth(saturationAfterEating); + } + } + + public Direction chooseDirection() { + return Direction.values()[ThreadLocalRandom.current().nextInt(Direction.values().length)]; + } + + public Action chooseAction() { + var action = Action.values()[ThreadLocalRandom.current().nextInt(Action.values().length)]; + var isActiveAction = ThreadLocalRandom.current().nextInt(BOUND) < action.getActionChance(); + return isActiveAction ? action : Action.MOVE; + } + + @Override + public String getEmoji() { + return emoji; + } + + @Override + public double getWeight() { + return weight; + } + + @Override + public int getMaxCountOnLocation() { + return maxCountOnLocation; } + } diff --git a/src/efanov/entities/animals/Direction.java b/src/efanov/entities/animals/Direction.java new file mode 100644 index 0000000..982be73 --- /dev/null +++ b/src/efanov/entities/animals/Direction.java @@ -0,0 +1,13 @@ +package efanov.entities.animals; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum Direction { + LEFT, + RIGHT, + UP, + DOWN +} diff --git a/src/efanov/entities/animals/EatingMap.java b/src/efanov/entities/animals/EatingMap.java new file mode 100644 index 0000000..7c812e6 --- /dev/null +++ b/src/efanov/entities/animals/EatingMap.java @@ -0,0 +1,11 @@ +package efanov.entities.animals; + +import lombok.Getter; + +import java.util.Map; +@Getter +public class EatingMap { + + Map> eatingProbability; + +} \ No newline at end of file diff --git a/src/efanov/entities/animals/herbivores/Buffalo.java b/src/efanov/entities/animals/herbivores/Buffalo.java index 88c7c49..c4f6f16 100644 --- a/src/efanov/entities/animals/herbivores/Buffalo.java +++ b/src/efanov/entities/animals/herbivores/Buffalo.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Buffalo extends Herbivore { public Buffalo(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Buffalo() { + } + + @Override + public Animal reproduce() { + return new Buffalo(); + } } diff --git a/src/efanov/entities/animals/herbivores/Caterpillar.java b/src/efanov/entities/animals/herbivores/Caterpillar.java index 959f0e9..51885b9 100644 --- a/src/efanov/entities/animals/herbivores/Caterpillar.java +++ b/src/efanov/entities/animals/herbivores/Caterpillar.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Caterpillar extends Herbivore { public Caterpillar(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Caterpillar() { + } + + @Override + public Animal reproduce() { + return new Caterpillar(); + } } diff --git a/src/efanov/entities/animals/herbivores/Deer.java b/src/efanov/entities/animals/herbivores/Deer.java index ff2be9f..1d48515 100644 --- a/src/efanov/entities/animals/herbivores/Deer.java +++ b/src/efanov/entities/animals/herbivores/Deer.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Deer extends Herbivore { public Deer(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Deer() { + } + + @Override + public Animal reproduce() { + return new Deer(); + } } diff --git a/src/efanov/entities/animals/herbivores/Duck.java b/src/efanov/entities/animals/herbivores/Duck.java index a527ded..1af8d9f 100644 --- a/src/efanov/entities/animals/herbivores/Duck.java +++ b/src/efanov/entities/animals/herbivores/Duck.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Duck extends Herbivore { public Duck(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Duck() { + } + + @Override + public Animal reproduce() { + return new Duck(); + } } diff --git a/src/efanov/entities/animals/herbivores/Goat.java b/src/efanov/entities/animals/herbivores/Goat.java index d7558f7..426e9f9 100644 --- a/src/efanov/entities/animals/herbivores/Goat.java +++ b/src/efanov/entities/animals/herbivores/Goat.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Goat extends Herbivore { public Goat(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Goat() { + } + + @Override + public Animal reproduce() { + return new Goat(); + } } diff --git a/src/efanov/entities/animals/herbivores/Herbivore.java b/src/efanov/entities/animals/herbivores/Herbivore.java index e6720b8..c1de20e 100644 --- a/src/efanov/entities/animals/herbivores/Herbivore.java +++ b/src/efanov/entities/animals/herbivores/Herbivore.java @@ -1,10 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.Entity; import efanov.entities.animals.Animal; +import lombok.NoArgsConstructor; +@NoArgsConstructor public abstract class Herbivore extends Animal { public Herbivore(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + @Override + public void eat(Entity entity) { + + } } diff --git a/src/efanov/entities/animals/herbivores/Horse.java b/src/efanov/entities/animals/herbivores/Horse.java index 12e8717..c617e80 100644 --- a/src/efanov/entities/animals/herbivores/Horse.java +++ b/src/efanov/entities/animals/herbivores/Horse.java @@ -1,9 +1,19 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Horse extends Herbivore { public Horse(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Horse() { + } + + @Override + public Animal reproduce() { + return new Horse(); + } } diff --git a/src/efanov/entities/animals/herbivores/Mouse.java b/src/efanov/entities/animals/herbivores/Mouse.java index 58232a8..0036653 100644 --- a/src/efanov/entities/animals/herbivores/Mouse.java +++ b/src/efanov/entities/animals/herbivores/Mouse.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Mouse extends Herbivore { public Mouse(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Mouse() { + } + + @Override + public Animal reproduce() { + return new Mouse(); + } } diff --git a/src/efanov/entities/animals/herbivores/Rabbit.java b/src/efanov/entities/animals/herbivores/Rabbit.java index 0584555..8dc57e9 100644 --- a/src/efanov/entities/animals/herbivores/Rabbit.java +++ b/src/efanov/entities/animals/herbivores/Rabbit.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Rabbit extends Herbivore { public Rabbit(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Rabbit() { + } + + @Override + public Animal reproduce() { + return new Rabbit(); + } } diff --git a/src/efanov/entities/animals/herbivores/Sheep.java b/src/efanov/entities/animals/herbivores/Sheep.java index eab1b5d..84010a7 100644 --- a/src/efanov/entities/animals/herbivores/Sheep.java +++ b/src/efanov/entities/animals/herbivores/Sheep.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class Sheep extends Herbivore { public Sheep(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Sheep() { + } + + @Override + public Animal reproduce() { + return new Sheep(); + } } diff --git a/src/efanov/entities/animals/herbivores/WildBoar.java b/src/efanov/entities/animals/herbivores/WildBoar.java index 0803351..23a2bd1 100644 --- a/src/efanov/entities/animals/herbivores/WildBoar.java +++ b/src/efanov/entities/animals/herbivores/WildBoar.java @@ -1,8 +1,18 @@ package efanov.entities.animals.herbivores; +import efanov.entities.animals.Animal; + public class WildBoar extends Herbivore { public WildBoar(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public WildBoar() { + } + + @Override + public Animal reproduce() { + return new WildBoar(); + } } diff --git a/src/efanov/entities/animals/predators/Bear.java b/src/efanov/entities/animals/predators/Bear.java index 271b18b..3fdc33d 100644 --- a/src/efanov/entities/animals/predators/Bear.java +++ b/src/efanov/entities/animals/predators/Bear.java @@ -1,10 +1,19 @@ package efanov.entities.animals.predators; -public class Bear extends Predator { +import efanov.entities.animals.Animal; +public class Bear extends Predator { public Bear(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); + } + public Bear() { + } + + @Override + public Animal reproduce() { + return new Bear(); + } } diff --git a/src/efanov/entities/animals/predators/Boa.java b/src/efanov/entities/animals/predators/Boa.java index 211ff1a..a886ad9 100644 --- a/src/efanov/entities/animals/predators/Boa.java +++ b/src/efanov/entities/animals/predators/Boa.java @@ -1,8 +1,18 @@ package efanov.entities.animals.predators; +import efanov.entities.animals.Animal; + public class Boa extends Predator { public Boa(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Boa() { + } + + @Override + public Animal reproduce() { + return new Boa(); + } } diff --git a/src/efanov/entities/animals/predators/Eagle.java b/src/efanov/entities/animals/predators/Eagle.java index 3ad24ea..600bc3b 100644 --- a/src/efanov/entities/animals/predators/Eagle.java +++ b/src/efanov/entities/animals/predators/Eagle.java @@ -1,8 +1,18 @@ package efanov.entities.animals.predators; +import efanov.entities.animals.Animal; + public class Eagle extends Predator { public Eagle(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Eagle() { + } + + @Override + public Animal reproduce() { + return new Eagle(); + } } diff --git a/src/efanov/entities/animals/predators/Fox.java b/src/efanov/entities/animals/predators/Fox.java index ef29da8..454ecbb 100644 --- a/src/efanov/entities/animals/predators/Fox.java +++ b/src/efanov/entities/animals/predators/Fox.java @@ -1,8 +1,18 @@ package efanov.entities.animals.predators; +import efanov.entities.animals.Animal; + public class Fox extends Predator { public Fox(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Fox() { + } + + @Override + public Animal reproduce() { + return new Fox(); + } } diff --git a/src/efanov/entities/animals/predators/Predator.java b/src/efanov/entities/animals/predators/Predator.java index 231fd66..f974af8 100644 --- a/src/efanov/entities/animals/predators/Predator.java +++ b/src/efanov/entities/animals/predators/Predator.java @@ -1,10 +1,19 @@ package efanov.entities.animals.predators; +import efanov.entities.Entity; import efanov.entities.animals.Animal; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +@NoArgsConstructor public abstract class Predator extends Animal { public Predator(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + @Override + public void eat(Entity entity) { + + } } diff --git a/src/efanov/entities/animals/predators/Wolf.java b/src/efanov/entities/animals/predators/Wolf.java index feee041..92a9c4b 100644 --- a/src/efanov/entities/animals/predators/Wolf.java +++ b/src/efanov/entities/animals/predators/Wolf.java @@ -1,8 +1,18 @@ package efanov.entities.animals.predators; +import efanov.entities.animals.Animal; + public class Wolf extends Predator { public Wolf(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } + + public Wolf() { + } + + @Override + public Animal reproduce() { + return new Wolf(); + } } diff --git a/src/efanov/entities/plants/Herb.java b/src/efanov/entities/plants/Herb.java deleted file mode 100644 index 751b0f9..0000000 --- a/src/efanov/entities/plants/Herb.java +++ /dev/null @@ -1,6 +0,0 @@ -package efanov.entities.plants; - -import efanov.entities.Entity; - -public class Herb extends Plant { -} diff --git a/src/efanov/entities/plants/Plant.java b/src/efanov/entities/plants/Plant.java index a1da164..7958b5e 100644 --- a/src/efanov/entities/plants/Plant.java +++ b/src/efanov/entities/plants/Plant.java @@ -2,6 +2,24 @@ import efanov.entities.Entity; -public abstract class Plant extends Entity { +public class Plant extends Entity { + public Plant(String emoji, double weight, int maxCountOnLocation) { + super(emoji, weight, maxCountOnLocation); + } + + @Override + public String getEmoji() { + return super.getEmoji(); + } + + @Override + public double getWeight() { + return super.getWeight(); + } + + @Override + public int getMaxCountOnLocation() { + return super.getMaxCountOnLocation(); + } } diff --git a/src/efanov/island/IslandController.java b/src/efanov/island/IslandController.java new file mode 100644 index 0000000..7902b15 --- /dev/null +++ b/src/efanov/island/IslandController.java @@ -0,0 +1,20 @@ +package efanov.island; + +import efanov.entities.animals.EatingMap; +import efanov.simulation.SimulationSettings; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class IslandController { + private final IslandMap map; + private final EatingMap eatingMap; + private final SimulationSettings simulationSettings; + + public IslandController(IslandMap map, EatingMap eatingMap, SimulationSettings simulationSettings) { + this.map = map; + this.eatingMap = eatingMap; + this.simulationSettings = simulationSettings; + } +} diff --git a/src/efanov/island/IslandMap.java b/src/efanov/island/IslandMap.java new file mode 100644 index 0000000..d8a8b3c --- /dev/null +++ b/src/efanov/island/IslandMap.java @@ -0,0 +1,53 @@ +package efanov.island; + +import efanov.entities.EntitiesFactory; +import efanov.entities.Entity; +import efanov.entities.EntityType; +import lombok.Getter; +import lombok.Setter; + +import java.util.concurrent.ThreadLocalRandom; +@Getter +@Setter +public class IslandMap { + private final EntitiesFactory entitiesFactory; + private final int x, y; + private Location[][] locations; + + public IslandMap(int x, int y) { + this.entitiesFactory = new EntitiesFactory(); + this.x = x; + this.y = y; + this.locations = new Location[x][y]; + } + + public void init() { + for (int coordX = 0; coordX < x; coordX++) { + for (int coordY = 0; coordY < y; coordY++) { + locations[coordX][coordY] = new Location(coordX, coordY); + } + } + } + + public void fillIsland(int maxCount) { + for (int coordX = 0; coordX < x; coordX++) { + for (int coordY = 0; coordY < y; coordY++) { + for (int i = 0; i <= maxCount; i++) { + Entity entity = getRandom(); + var entityAsString = entity.getClass().getSimpleName(); + var entityCountOnLocation = locations[coordX][coordY].getEntitiesCountStatistic().getOrDefault(entityAsString, 0); + if (entityCountOnLocation > maxCount) { + continue; + } + locations[coordX][coordY].addEntity(entity); + } + } + } + } + + private Entity getRandom() { + var entityTypes = EntityType.values(); + var entityType = entityTypes[ThreadLocalRandom.current().nextInt(entityTypes.length)]; + return entitiesFactory.createEntity(entityType); + } +} diff --git a/src/efanov/island/Location.java b/src/efanov/island/Location.java new file mode 100644 index 0000000..93f9f74 --- /dev/null +++ b/src/efanov/island/Location.java @@ -0,0 +1,70 @@ +package efanov.island; + +import efanov.entities.Entity; +import efanov.entities.animals.Animal; +import efanov.entities.plants.Plant; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Getter +public class Location { + private int x; + private int y; + private List entities; + private Map entitiesCountStatistic; + + public Location(int x, int y) { + this.x = x; + this.y = y; + this.entities = new ArrayList<>(); + this.entitiesCountStatistic = new HashMap<>(); + } + + public void addEntity(Entity entity) { + entities.add(entity); + addToStatistic(entity); + } + + public void removeEntity(Entity entity) { + entities.remove(entity); + removeFromStatistic(entity); + } + + public List getAnimals() { + return entities.stream() + .filter(e -> e instanceof Animal) + .map(e -> (Animal) e) + .toList(); + } + + public List getPlants() { + return entities.stream() + .filter(e -> e instanceof Plant) + .map(e -> (Plant) e) + .toList(); + } + + private void addToStatistic(Entity entity) { + var entityAsString = getSimpleName(entity); + entitiesCountStatistic.merge(entityAsString, 1, (oldValue, newValue) -> oldValue + 1); + } + + private void removeFromStatistic(Entity entity) { + var entityAsString = getSimpleName(entity); + entitiesCountStatistic.merge(entityAsString, 1, (oldValue, newValue) -> { + int tempCount = oldValue - 1; + if (tempCount <= 0) { + return null; + } + return tempCount; + }); + } + + private String getSimpleName(Entity entity) { + return entity.getClass().getSimpleName(); + } +} diff --git a/src/efanov/properties_processing/Processor.java b/src/efanov/properties_processing/Processor.java index 8a3cf74..15e2f34 100644 --- a/src/efanov/properties_processing/Processor.java +++ b/src/efanov/properties_processing/Processor.java @@ -1,5 +1,7 @@ package efanov.properties_processing; +import org.yaml.snakeyaml.Yaml; + import java.io.FileReader; import java.io.IOException; import java.util.Properties; @@ -7,13 +9,58 @@ public class Processor { - public String getFieldsFromFile(String param) { - try (FileReader reader = new FileReader("/Users/effgang/dev/Island/src/animal-settings.properties")) { + public static final String ANIMAL_SETTINGS_PROPERTIES = "/Users/effgang/dev/Island/src/efanov/resources/animal-settings.properties"; + + public String getEmojiFromFile(String param) { + try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { + Properties properties = new Properties(); + properties.load(reader); + return properties.getProperty(param.toLowerCase() + ".emoji"); + } catch (IOException e) { + throw new RuntimeException(e); + } + + } + + public double getWeightFromFile(String param) { + try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { + Properties properties = new Properties(); + properties.load(reader); + return Double.parseDouble(properties.getProperty(param.toLowerCase() + ".weight")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public int getMaxCountFromFile(String param) { + try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { Properties properties = new Properties(); properties.load(reader); - return properties.getProperty(param); + return Integer.parseInt(properties.getProperty(param.toLowerCase() + ".maxCount")); } catch (IOException e) { throw new RuntimeException(e); } } + + public int getSpeedFromFile(String param) { + try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { + Properties properties = new Properties(); + properties.load(reader); + return Integer.parseInt(properties.getProperty(param.toLowerCase() + ".speed")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public double getSaturationFromFile(String param) { + try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { + Properties properties = new Properties(); + properties.load(reader); + return Double.parseDouble(properties.getProperty(param.toLowerCase() + ".saturation")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + } diff --git a/src/efanov/resources/animal-settings.properties b/src/efanov/resources/animal-settings.properties new file mode 100644 index 0000000..a109962 --- /dev/null +++ b/src/efanov/resources/animal-settings.properties @@ -0,0 +1,94 @@ +bear.emoji = \ud83d\udc3b +bear.weight = 500 +bear.maxCount = 5 +bear.speed = 2 +bear.saturation = 80 + +wolf.emoji = \ud83d\udc3a +wolf.weight = 50 +wolf.maxCount = 30 +wolf.speed = 3 +wolf.saturation = 8 + +boa.emoji = \ud83d\udc0d +boa.weight = 15 +boa.maxCount = 30 +boa.speed = 1 +boa.saturation = 3 + +fox.emoji = \uD83E\uDD8A +fox.weight = 8 +fox.maxCount = 30 +fox.speed = 2 +fox.saturation = 2 + +eagle.emoji = \uD83E\uDD85 +eagle.weight = 6 +eagle.maxCount = 20 +eagle.speed = 3 +eagle.saturation = 1 + +horse.emoji = \uD83D\uDC34 +horse.weight = 400 +horse.maxCount = 20 +horse.speed = 4 +horse.saturation = 60 + +deer.emoji = \uD83E\uDD8C +deer.weight = 300 +deer.maxCount = 20 +deer.speed = 4 +deer.saturation = 50 + +rabbit.emoji = \uD83D\uDC30 +rabbit.weight = 2 +rabbit.maxCount = 150 +rabbit.speed = 2 +rabbit.saturation = 0.45 + +mouse.emoji = \uD83D\uDC2D +mouse.weight = 0.05 +mouse.maxCount = 500 +mouse.speed = 1 +mouse.saturation = 0.01 + +goat.emoji = \uD83D\uDC10 +goat.weight = 60 +goat.maxCount = 140 +goat.speed = 3 +goat.saturation = 10 + +sheep.emoji = \uD83D\uDC11 +sheep.weight = 70 +sheep.maxCount = 140 +sheep.speed = 3 +sheep.saturation = 15 + +wildboar.emoji = \uD83D\uDC17 +wildboar.weight = 400 +wildboar.maxCount = 50 +wildboar.speed = 2 +wildboar.saturation = 50 + +buffalo.emoji = \uD83D\uDC02 +buffalo.weight = 700 +buffalo.maxCount = 10 +buffalo.speed = 3 +buffalo.saturation = 100 + +duck.emoji = \uD83E\uDD86 +duck.weight = 1 +duck.maxCount = 200 +duck.speed = 4 +duck.saturation = 0.15 + +caterpillar.emoji = \uD83D\uDC1B +caterpillar.weight = 0.01 +caterpillar.maxCount = 1000 +caterpillar.speed = 0 +caterpillar.saturation = 0 + +plant.emoji = \uD83C\uDF3F +plant.weight = 1 +plant.maxCount = 200 + diff --git a/src/efanov/resources/probability.yaml b/src/efanov/resources/probability.yaml new file mode 100644 index 0000000..30d2faa --- /dev/null +++ b/src/efanov/resources/probability.yaml @@ -0,0 +1,255 @@ +eatingProbability: + Wolf: + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 10 + Deer: 15 + Rabbit: 60 + Mouse: 80 + Goat: 60 + Sheep: 70 + WildBoar: 15 + Buffalo: 10 + Duck: 40 + Caterpillar: 0 + Herb: 0 + + Boa: + Wolf: 0 + Fox: 15 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 20 + Mouse: 40 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 10 + Caterpillar: 0 + Herb: 0 + + Fox: + Wolf: 0 + Boa: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 70 + Mouse: 90 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 60 + Caterpillar: 40 + Herb: 0 + + Bear: + Wolf: 0 + Boa: 80 + Fox: 0 + Eagle: 0 + Horse: 40 + Deer: 80 + Rabbit: 80 + Mouse: 90 + Goat: 70 + Sheep: 70 + WildBoar: 50 + Buffalo: 20 + Duck: 10 + Caterpillar: 0 + Herb: 0 + + Eagle: + Wolf: 0 + Boa: 0 + Fox: 10 + Bear: 0 + Horse: 0 + Deer: 0 + Rabbit: 90 + Mouse: 90 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 80 + Caterpillar: 0 + Herb: 0 + + Horse: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 + + Deer: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 + + Rabbit: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Mouse: 0 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 + + Mouse: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 90 + Herb: 100 + + Goat: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 + + Sheep: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 + + WildBoar: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 50 + Goat: 0 + Sheep: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 90 + Herb: 100 + + Buffalo: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + WildBoar: 0 + Sheep: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 + + Duck: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + WildBoar: 0 + Sheep: 0 + Buffalo: 0 + Caterpillar: 90 + Herb: 100 + + Caterpillar: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + WildBoar: 0 + Sheep: 0 + Buffalo: 0 + Duck: 0 + Herb: 100 \ No newline at end of file diff --git a/src/efanov/simulation/SimulationSettings.java b/src/efanov/simulation/SimulationSettings.java new file mode 100644 index 0000000..1e9ff66 --- /dev/null +++ b/src/efanov/simulation/SimulationSettings.java @@ -0,0 +1,12 @@ +package efanov.simulation; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SimulationSettings { + private int width = 100; + private int height = 20; + private int entityCountOnCage = 100; +} diff --git a/src/efanov/simulation/SimulationStarter.java b/src/efanov/simulation/SimulationStarter.java new file mode 100644 index 0000000..8affb57 --- /dev/null +++ b/src/efanov/simulation/SimulationStarter.java @@ -0,0 +1,23 @@ +package efanov.simulation; + + +import efanov.island.IslandController; +import efanov.island.IslandMap; + +public class SimulationStarter { + private final IslandMap islandMap; + private final SimulationSettings simulationSettings; + private final IslandController controller; + + public SimulationStarter() { + this.simulationSettings = new SimulationSettings(); + this.islandMap = new IslandMap(simulationSettings.getWidth(), simulationSettings.getHeight()); + this.controller = new IslandController(islandMap,null,simulationSettings); + } + + public void start() { + controller.getMap().init(); + controller.getMap().fillIsland(simulationSettings.getEntityCountOnCage()); + System.out.println(); + } +} From a7f3db598e9ab33fbf1012706925bc7399364c08 Mon Sep 17 00:00:00 2001 From: sefanov Date: Mon, 27 Nov 2023 16:57:07 +0300 Subject: [PATCH 4/6] added changes into logic --- src/efanov/entities/EntitiesFactory.java | 59 +++++++++++++------ src/efanov/entities/Entity.java | 5 +- src/efanov/entities/EntityType.java | 2 +- src/efanov/entities/animals/Animal.java | 37 +++--------- .../entities/animals/herbivores/Buffalo.java | 11 +--- .../animals/herbivores/Caterpillar.java | 11 +--- .../entities/animals/herbivores/Deer.java | 11 +--- .../entities/animals/herbivores/Duck.java | 12 +--- .../entities/animals/herbivores/Goat.java | 11 +--- .../animals/herbivores/Herbivore.java | 4 +- .../entities/animals/herbivores/Horse.java | 11 +--- .../entities/animals/herbivores/Mouse.java | 11 +--- .../entities/animals/herbivores/Rabbit.java | 11 +--- .../entities/animals/herbivores/Sheep.java | 11 +--- .../entities/animals/herbivores/WildBoar.java | 11 +--- .../entities/animals/predators/Bear.java | 12 +--- .../entities/animals/predators/Boa.java | 11 +--- .../entities/animals/predators/Eagle.java | 11 +--- .../entities/animals/predators/Fox.java | 11 +--- .../entities/animals/predators/Predator.java | 11 +--- .../entities/animals/predators/Wolf.java | 11 +--- .../processing}/Processor.java | 4 +- 22 files changed, 100 insertions(+), 189 deletions(-) rename src/efanov/{properties_processing => properties/processing}/Processor.java (96%) diff --git a/src/efanov/entities/EntitiesFactory.java b/src/efanov/entities/EntitiesFactory.java index e717852..2c09175 100644 --- a/src/efanov/entities/EntitiesFactory.java +++ b/src/efanov/entities/EntitiesFactory.java @@ -1,30 +1,55 @@ package efanov.entities; +import efanov.entities.animals.Animal; import efanov.entities.animals.herbivores.*; import efanov.entities.animals.predators.*; import efanov.entities.plants.Plant; -import efanov.properties_processing.Processor; +import efanov.properties.processing.Processor; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; public class EntitiesFactory { Processor processor = new Processor(); + public Entity createEntity(EntityType entityType) { return switch (entityType) { - case WOLF -> new Wolf(); - case BEAR -> new Bear(); - case BOA -> new Boa(); - case FOX -> new Fox(); - case EAGLE -> new Eagle(); - case HORSE -> new Horse(); - case GOAT -> new Goat(); - case SHEEP -> new Sheep(); - case MOUSE -> new Mouse(); - case RABBIT -> new Rabbit(); - case DEER -> new Deer(); - case WILD_BOAR -> new WildBoar(); - case DUCK -> new Duck(); - case BUFFALO -> new Buffalo(); - case CATERPILLAR -> new Caterpillar(); - case PLANT -> new Plant(processor.getEmojiFromFile("plant"), processor.getWeightFromFile("plant"), processor.getMaxCountFromFile("plant") ); + case WOLF -> (Wolf) getAnimal(entityType, Wolf.class); + case BEAR -> (Bear) getAnimal(entityType,Bear.class); + case BOA -> (Boa) getAnimal(entityType, Boa.class); + case FOX -> (Fox) getAnimal(entityType, Fox.class); + case EAGLE -> (Eagle) getAnimal(entityType, Eagle.class); + case HORSE -> (Horse) getAnimal(entityType, Horse.class); + case GOAT -> (Goat) getAnimal(entityType, Goat.class); + case SHEEP -> (Sheep) getAnimal(entityType, Sheep.class); + case MOUSE -> (Mouse) getAnimal(entityType, Mouse.class); + case RABBIT -> (Rabbit) getAnimal(entityType, Rabbit.class); + case DEER -> (Deer) getAnimal(entityType, Deer.class); + case WILDBOAR -> (WildBoar) getAnimal(entityType, WildBoar.class); + case DUCK -> (Duck) getAnimal(entityType, Duck.class); + case BUFFALO -> (Buffalo) getAnimal(entityType, Buffalo.class); + case CATERPILLAR -> (Caterpillar) getAnimal(entityType, Caterpillar.class); + case PLANT -> new Plant(processor.getEmojiFromFile(entityType.name()), + processor.getWeightFromFile(entityType.name()), + processor.getMaxCountFromFile(entityType.name())); }; } + + private Animal getAnimal(EntityType entityType, Class clazz) { + Constructor constructor; + try { + + constructor = clazz.getDeclaredConstructor(String.class, Double.class, Integer.class, Integer.class, Double.class); + + return constructor.newInstance(processor.getEmojiFromFile(entityType.name()), + processor.getWeightFromFile(entityType.name()), + processor.getMaxCountFromFile(entityType.name()), + processor.getSpeedFromFile(entityType.name()), + processor.getSaturationFromFile(entityType.name())); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | + NoSuchMethodException e) { + throw new RuntimeException(e); + } + + } } diff --git a/src/efanov/entities/Entity.java b/src/efanov/entities/Entity.java index 95e8a12..8da6827 100644 --- a/src/efanov/entities/Entity.java +++ b/src/efanov/entities/Entity.java @@ -1,14 +1,13 @@ package efanov.entities; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter -@AllArgsConstructor -@NoArgsConstructor +@AllArgsConstructor(access = AccessLevel.PROTECTED) public abstract class Entity { private String emoji; private double weight; diff --git a/src/efanov/entities/EntityType.java b/src/efanov/entities/EntityType.java index e7eef9c..ab99d95 100644 --- a/src/efanov/entities/EntityType.java +++ b/src/efanov/entities/EntityType.java @@ -17,7 +17,7 @@ public enum EntityType { MOUSE, GOAT, SHEEP, - WILD_BOAR, + WILDBOAR, BUFFALO, DUCK, CATERPILLAR, diff --git a/src/efanov/entities/animals/Animal.java b/src/efanov/entities/animals/Animal.java index d5511fa..54ea68b 100644 --- a/src/efanov/entities/animals/Animal.java +++ b/src/efanov/entities/animals/Animal.java @@ -1,40 +1,32 @@ package efanov.entities.animals; import efanov.entities.Entity; -import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; import java.util.concurrent.ThreadLocalRandom; @Getter @Setter -@AllArgsConstructor -@NoArgsConstructor -public abstract class Animal extends Entity { +public class Animal extends Entity { private static final int BOUND = 100; - private String emoji; - private double weight; - private int maxCountOnLocation; private int speed; private double saturation; private double health; - public Animal(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { - this.emoji = emoji; - this.weight = weight; - this.maxCountOnLocation = maxCountOnLocation; + public Animal(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { + super(emoji, weight, maxCountOnLocation); this.speed = speed; this.saturation = saturation; this.health = saturation; } - - public abstract Animal reproduce(); + public Animal reproduce() { + return new Animal(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); + } public void eat(Entity food) { - if (food.getWeight() >= this.getSaturation()) { + if (food.getWeight() + this.getHealth() >= this.getSaturation()) { this.setHealth(this.getSaturation()); } else { double saturationAfterEating = this.getHealth() + food.getWeight(); @@ -52,19 +44,4 @@ public Action chooseAction() { return isActiveAction ? action : Action.MOVE; } - @Override - public String getEmoji() { - return emoji; - } - - @Override - public double getWeight() { - return weight; - } - - @Override - public int getMaxCountOnLocation() { - return maxCountOnLocation; - } - } diff --git a/src/efanov/entities/animals/herbivores/Buffalo.java b/src/efanov/entities/animals/herbivores/Buffalo.java index c4f6f16..2d66652 100644 --- a/src/efanov/entities/animals/herbivores/Buffalo.java +++ b/src/efanov/entities/animals/herbivores/Buffalo.java @@ -1,18 +1,13 @@ package efanov.entities.animals.herbivores; -import efanov.entities.animals.Animal; - public class Buffalo extends Herbivore { - public Buffalo(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Buffalo(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public Buffalo() { - } - @Override - public Animal reproduce() { - return new Buffalo(); + public Buffalo reproduce() { + return (Buffalo) super.reproduce(); } } diff --git a/src/efanov/entities/animals/herbivores/Caterpillar.java b/src/efanov/entities/animals/herbivores/Caterpillar.java index 51885b9..bd2b297 100644 --- a/src/efanov/entities/animals/herbivores/Caterpillar.java +++ b/src/efanov/entities/animals/herbivores/Caterpillar.java @@ -1,18 +1,13 @@ package efanov.entities.animals.herbivores; -import efanov.entities.animals.Animal; - public class Caterpillar extends Herbivore { - public Caterpillar(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Caterpillar(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public Caterpillar() { - } - @Override - public Animal reproduce() { - return new Caterpillar(); + public Caterpillar reproduce() { + return (Caterpillar) super.reproduce(); } } diff --git a/src/efanov/entities/animals/herbivores/Deer.java b/src/efanov/entities/animals/herbivores/Deer.java index 1d48515..e15881f 100644 --- a/src/efanov/entities/animals/herbivores/Deer.java +++ b/src/efanov/entities/animals/herbivores/Deer.java @@ -1,18 +1,13 @@ package efanov.entities.animals.herbivores; -import efanov.entities.animals.Animal; - public class Deer extends Herbivore { - public Deer(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Deer(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public Deer() { - } - @Override - public Animal reproduce() { - return new Deer(); + public Deer reproduce() { + return (Deer) super.reproduce(); } } diff --git a/src/efanov/entities/animals/herbivores/Duck.java b/src/efanov/entities/animals/herbivores/Duck.java index 1af8d9f..0718403 100644 --- a/src/efanov/entities/animals/herbivores/Duck.java +++ b/src/efanov/entities/animals/herbivores/Duck.java @@ -1,18 +1,12 @@ package efanov.entities.animals.herbivores; -import efanov.entities.animals.Animal; - public class Duck extends Herbivore { - - public Duck(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Duck(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public Duck() { - } - @Override - public Animal reproduce() { - return new Duck(); + public Duck reproduce() { + return (Duck) super.reproduce(); } } diff --git a/src/efanov/entities/animals/herbivores/Goat.java b/src/efanov/entities/animals/herbivores/Goat.java index 426e9f9..a2b8728 100644 --- a/src/efanov/entities/animals/herbivores/Goat.java +++ b/src/efanov/entities/animals/herbivores/Goat.java @@ -1,18 +1,13 @@ package efanov.entities.animals.herbivores; -import efanov.entities.animals.Animal; - public class Goat extends Herbivore { - public Goat(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Goat(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public Goat() { - } - @Override - public Animal reproduce() { - return new Goat(); + public Goat reproduce() { + return (Goat) super.reproduce(); } } diff --git a/src/efanov/entities/animals/herbivores/Herbivore.java b/src/efanov/entities/animals/herbivores/Herbivore.java index c1de20e..816d3c5 100644 --- a/src/efanov/entities/animals/herbivores/Herbivore.java +++ b/src/efanov/entities/animals/herbivores/Herbivore.java @@ -2,12 +2,10 @@ import efanov.entities.Entity; import efanov.entities.animals.Animal; -import lombok.NoArgsConstructor; -@NoArgsConstructor public abstract class Herbivore extends Animal { - public Herbivore(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Herbivore(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } diff --git a/src/efanov/entities/animals/herbivores/Horse.java b/src/efanov/entities/animals/herbivores/Horse.java index c617e80..75941eb 100644 --- a/src/efanov/entities/animals/herbivores/Horse.java +++ b/src/efanov/entities/animals/herbivores/Horse.java @@ -1,19 +1,14 @@ package efanov.entities.animals.herbivores; -import efanov.entities.animals.Animal; - public class Horse extends Herbivore { - public Horse(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Horse(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public Horse() { - } - @Override - public Animal reproduce() { - return new Horse(); + public Horse reproduce() { + return (Horse) super.reproduce(); } } diff --git a/src/efanov/entities/animals/herbivores/Mouse.java b/src/efanov/entities/animals/herbivores/Mouse.java index 0036653..a117b61 100644 --- a/src/efanov/entities/animals/herbivores/Mouse.java +++ b/src/efanov/entities/animals/herbivores/Mouse.java @@ -1,18 +1,13 @@ package efanov.entities.animals.herbivores; -import efanov.entities.animals.Animal; - public class Mouse extends Herbivore { - public Mouse(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Mouse(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public Mouse() { - } - @Override - public Animal reproduce() { - return new Mouse(); + public Mouse reproduce() { + return (Mouse) super.reproduce(); } } diff --git a/src/efanov/entities/animals/herbivores/Rabbit.java b/src/efanov/entities/animals/herbivores/Rabbit.java index 8dc57e9..194a0dc 100644 --- a/src/efanov/entities/animals/herbivores/Rabbit.java +++ b/src/efanov/entities/animals/herbivores/Rabbit.java @@ -1,18 +1,13 @@ package efanov.entities.animals.herbivores; -import efanov.entities.animals.Animal; - public class Rabbit extends Herbivore { - public Rabbit(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Rabbit(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public Rabbit() { - } - @Override - public Animal reproduce() { - return new Rabbit(); + public Rabbit reproduce() { + return (Rabbit) super.reproduce(); } } diff --git a/src/efanov/entities/animals/herbivores/Sheep.java b/src/efanov/entities/animals/herbivores/Sheep.java index 84010a7..d7118d7 100644 --- a/src/efanov/entities/animals/herbivores/Sheep.java +++ b/src/efanov/entities/animals/herbivores/Sheep.java @@ -1,18 +1,13 @@ package efanov.entities.animals.herbivores; -import efanov.entities.animals.Animal; - public class Sheep extends Herbivore { - public Sheep(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Sheep(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public Sheep() { - } - @Override - public Animal reproduce() { - return new Sheep(); + public Sheep reproduce() { + return (Sheep) super.reproduce(); } } diff --git a/src/efanov/entities/animals/herbivores/WildBoar.java b/src/efanov/entities/animals/herbivores/WildBoar.java index 23a2bd1..bbe4d94 100644 --- a/src/efanov/entities/animals/herbivores/WildBoar.java +++ b/src/efanov/entities/animals/herbivores/WildBoar.java @@ -1,18 +1,13 @@ package efanov.entities.animals.herbivores; -import efanov.entities.animals.Animal; - public class WildBoar extends Herbivore { - public WildBoar(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public WildBoar(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public WildBoar() { - } - @Override - public Animal reproduce() { - return new WildBoar(); + public WildBoar reproduce() { + return (WildBoar) super.reproduce(); } } diff --git a/src/efanov/entities/animals/predators/Bear.java b/src/efanov/entities/animals/predators/Bear.java index 3fdc33d..eeb1472 100644 --- a/src/efanov/entities/animals/predators/Bear.java +++ b/src/efanov/entities/animals/predators/Bear.java @@ -1,19 +1,13 @@ package efanov.entities.animals.predators; -import efanov.entities.animals.Animal; - public class Bear extends Predator { - public Bear(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Bear(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); - - } - - public Bear() { } @Override - public Animal reproduce() { - return new Bear(); + public Bear reproduce() { + return (Bear) super.reproduce(); } } diff --git a/src/efanov/entities/animals/predators/Boa.java b/src/efanov/entities/animals/predators/Boa.java index a886ad9..d160502 100644 --- a/src/efanov/entities/animals/predators/Boa.java +++ b/src/efanov/entities/animals/predators/Boa.java @@ -1,18 +1,13 @@ package efanov.entities.animals.predators; -import efanov.entities.animals.Animal; - public class Boa extends Predator { - public Boa(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Boa(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public Boa() { - } - @Override - public Animal reproduce() { - return new Boa(); + public Boa reproduce() { + return (Boa) super.reproduce(); } } diff --git a/src/efanov/entities/animals/predators/Eagle.java b/src/efanov/entities/animals/predators/Eagle.java index 600bc3b..c8bb84e 100644 --- a/src/efanov/entities/animals/predators/Eagle.java +++ b/src/efanov/entities/animals/predators/Eagle.java @@ -1,18 +1,13 @@ package efanov.entities.animals.predators; -import efanov.entities.animals.Animal; - public class Eagle extends Predator { - public Eagle(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Eagle(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public Eagle() { - } - @Override - public Animal reproduce() { - return new Eagle(); + public Eagle reproduce() { + return (Eagle) super.reproduce(); } } diff --git a/src/efanov/entities/animals/predators/Fox.java b/src/efanov/entities/animals/predators/Fox.java index 454ecbb..96b3e57 100644 --- a/src/efanov/entities/animals/predators/Fox.java +++ b/src/efanov/entities/animals/predators/Fox.java @@ -1,18 +1,13 @@ package efanov.entities.animals.predators; -import efanov.entities.animals.Animal; - public class Fox extends Predator { - public Fox(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Fox(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public Fox() { - } - @Override - public Animal reproduce() { - return new Fox(); + public Fox reproduce() { + return (Fox) super.reproduce(); } } diff --git a/src/efanov/entities/animals/predators/Predator.java b/src/efanov/entities/animals/predators/Predator.java index f974af8..d4d6b15 100644 --- a/src/efanov/entities/animals/predators/Predator.java +++ b/src/efanov/entities/animals/predators/Predator.java @@ -1,19 +1,10 @@ package efanov.entities.animals.predators; -import efanov.entities.Entity; import efanov.entities.animals.Animal; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -@NoArgsConstructor public abstract class Predator extends Animal { - public Predator(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Predator(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - - @Override - public void eat(Entity entity) { - - } } diff --git a/src/efanov/entities/animals/predators/Wolf.java b/src/efanov/entities/animals/predators/Wolf.java index 92a9c4b..d987a0b 100644 --- a/src/efanov/entities/animals/predators/Wolf.java +++ b/src/efanov/entities/animals/predators/Wolf.java @@ -1,18 +1,13 @@ package efanov.entities.animals.predators; -import efanov.entities.animals.Animal; - public class Wolf extends Predator { - public Wolf(String emoji, double weight, int maxCountOnLocation, int speed, double saturation) { + public Wolf(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); } - public Wolf() { - } - @Override - public Animal reproduce() { - return new Wolf(); + public Wolf reproduce() { + return (Wolf) super.reproduce(); } } diff --git a/src/efanov/properties_processing/Processor.java b/src/efanov/properties/processing/Processor.java similarity index 96% rename from src/efanov/properties_processing/Processor.java rename to src/efanov/properties/processing/Processor.java index 15e2f34..eca9baf 100644 --- a/src/efanov/properties_processing/Processor.java +++ b/src/efanov/properties/processing/Processor.java @@ -1,6 +1,4 @@ -package efanov.properties_processing; - -import org.yaml.snakeyaml.Yaml; +package efanov.properties.processing; import java.io.FileReader; import java.io.IOException; From 8c2311acc88e5240ae5dce463fc43c0fe7567628 Mon Sep 17 00:00:00 2001 From: sefanov Date: Wed, 13 Dec 2023 23:32:07 +0300 Subject: [PATCH 5/6] added a lot of edits to the logic of the program, added the application, statistics output and the README was edited --- README.md | 22 + img.png | Bin 0 -> 95525 bytes src/efanov/constants/Constant.java | 42 ++ src/efanov/dialog/UserDialog.java | 103 ++++ src/efanov/entities/EntitiesFactory.java | 34 +- src/efanov/entities/Entity.java | 6 +- src/efanov/entities/animals/Action.java | 7 +- src/efanov/entities/animals/Animal.java | 14 +- src/efanov/entities/animals/EatingMap.java | 20 +- .../entities/animals/herbivores/Buffalo.java | 2 +- .../animals/herbivores/Caterpillar.java | 3 +- .../entities/animals/herbivores/Deer.java | 2 +- .../entities/animals/herbivores/Duck.java | 3 +- .../entities/animals/herbivores/Goat.java | 2 +- .../entities/animals/herbivores/Horse.java | 2 +- .../entities/animals/herbivores/Mouse.java | 2 +- .../entities/animals/herbivores/Rabbit.java | 2 +- .../entities/animals/herbivores/Sheep.java | 2 +- .../entities/animals/herbivores/WildBoar.java | 2 +- .../entities/animals/predators/Bear.java | 2 +- .../entities/animals/predators/Boa.java | 2 +- .../entities/animals/predators/Eagle.java | 2 +- .../entities/animals/predators/Fox.java | 2 +- .../entities/animals/predators/Wolf.java | 2 +- src/efanov/entities/plants/Herb.java | 13 + src/efanov/entities/plants/Plant.java | 25 - src/efanov/island/IslandController.java | 61 ++- src/efanov/island/IslandMap.java | 65 ++- src/efanov/island/Location.java | 18 +- src/efanov/island/service/ActionService.java | 16 + src/efanov/island/service/StepService.java | 15 + .../service/impl/ActionServiceImpl.java | 120 +++++ .../island/service/impl/StepServiceImpl.java | 76 +++ .../properties/processing/Processor.java | 15 +- .../resources/animal-settings.properties | 186 +++---- src/efanov/resources/probability.yaml | 481 +++++++++--------- src/efanov/simulation/SimulationSettings.java | 11 +- src/efanov/simulation/SimulationStarter.java | 26 +- src/efanov/statistic/Statistic.java | 40 ++ 39 files changed, 998 insertions(+), 450 deletions(-) create mode 100644 img.png create mode 100644 src/efanov/constants/Constant.java create mode 100644 src/efanov/dialog/UserDialog.java create mode 100644 src/efanov/entities/plants/Herb.java delete mode 100644 src/efanov/entities/plants/Plant.java create mode 100644 src/efanov/island/service/ActionService.java create mode 100644 src/efanov/island/service/StepService.java create mode 100644 src/efanov/island/service/impl/ActionServiceImpl.java create mode 100644 src/efanov/island/service/impl/StepServiceImpl.java create mode 100644 src/efanov/statistic/Statistic.java diff --git a/README.md b/README.md index cac387b..c2a8ab2 100644 --- a/README.md +++ b/README.md @@ -1 +1,23 @@ # Island +## Description + +This program is a model of an island with variable parameters, consisting of an array of locations (for example, 100x20 cells). The locations will be filled with plants and animals. Animals can: + +- There are plants and/or other animals (if there is suitable food in their location), + +- Move around (to neighboring locations), + +- Reproduce (if there is a pair in their location), + +- Starve to death or be eaten. + +## Menu +![Снимок экрана 2023-12-13 в 22.41.16.png](https://sun9-75.userapi.com/impf/flMZlZqf4zfSCd7SJ1_XWsEHyqQmOkGPdNni2Q/Wn8UBRtEaWU.jpg?size=1280x610&quality=96&sign=6abd3609550508af513ed3c207f6b1eb&type=album) +You can very flexibly change the simulation settings in the provided menu + +![Снимок экрана 2023-12-13 в 22.41.51.png](https://sun9-10.userapi.com/impf/4MxG-31Cp3Hy0Fvf-gsVYJ2YH-fogGtDgL4nSg/DBnGgaffTfc.jpg?size=1280x734&quality=96&sign=6e817330e3712257a28aa9753b3fb3eb&type=album) + +Also you can watch the simulation in the console + +![Снимок экрана 2023-12-13 в 22.42.32.png](https://sun9-61.userapi.com/impf/jKHTOeM3SLnVWsS_oQKfMWBzJ2JLzp42fa0HVA/K3o5_Qn_a94.jpg?size=570x844&quality=96&sign=b8d9b0ad383710e33a61ba243b08d232&type=album) +![Снимок экрана 2023-12-13 в 22.42.46.png](https://sun9-19.userapi.com/impf/Hz_evDk2xinAjGoaViAjm-LG39Efdz0ioA45cw/M8qe7KBb0js.jpg?size=570x844&quality=96&sign=f13bd777dcde69fed47b86f4edaacf17&type=album) diff --git a/img.png b/img.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc5230a47845c130fb5f82faa604293b91a88c7 GIT binary patch literal 95525 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%0AAQ%U1MYQ z)$Wyar}4mO|NQ#Y7LbN9-`FjdT^W|N4!EFH$&XIt4D7(YWJ0`YQg~Ry1mNOJl*gk3 zN=|y!CqKpj7No7I*nEa<;L=seuMHKAaSg3gx)9#EG{$%8Jo(-1UT;~7?NS?!G?_M38I zPhCns6#5+4J}1WnrmjHJuzr!CE7V%aw6qGQ-V?WMh+)!r2LyMp+8(j+{wr1Z6JD1) zE01aRn4FrX(7$1qWTRJ#` zr4l=EUpQoV=d&P!NOJPQt9o3dbkq#CN~lZS(>T;4V+`S)FGXbQDoFUcGl0b+94ft2 zq04)qHTbZd?~EA4rArfrX*_3$VX`OE*v{y9`#n8(o*5j2WBUN6V_+eir>Zp?{l+!w z%RE{EP8{`Yje?_DGCOWO!Bm$6>YQpKEPr^v2@89Wo%vdYQVg&&uJW@8B`x)^VOzg~ z6Tb1jlsIOHvU5&!C0eu_3OId2}yuVb@R zeflUUIPrZ|2HjGqn%4xgEVx&gQBh=wpODX5u#S~4nnb@(2?L!Ml0S;) zJVsrO0$;fcuk8xzoOp$e0T67UjUNZ>J^OUM+R2amHf$h$?1f4t$aO5%resRL+4ZEW zbnlb#2e>n;R(C97iD@{I%%^Ivn7~5?(0Y9bs7DqqpceA5A(ir@`D_Gy!OHZGyB!09 zep^OIpon=Ku8&J4pccduXFe!~s-*vok-}CCr$qc7UnDwGBcn=;u{zGmcH{27hM(%}ClJ$3X^Zpn#2|OCz;*~Ak*v6e{p1h}7SkLMF-5|G>}a)L+sc`0+OQOg}e zMR^6ShM-)#{tf+>JR?WdJzBDRwDhp&6|}st0YNm}_|#e6{+>|jg`x@x-Uq%nba@d% z8Y0JGB~yCkW*cjQ{jFnGo;ZmoTNau{)t--)PRzJmJ7D2}sLLh5DY-WpUV1tVTV$A5 z0mZqZ4go=VLLf{M`)d+}V!JlcP;EPYK%2(yk*q5)2K0Dx{%qG88Oh0#j?gQ-@vjk!=1CS^K#;G zd-%w2WK=i_xMM;tI2TZ$>d_+ksxj%eO$DReijG2?-uJ1ziFd1tq4EBfTXOC+^`y8* zzbp1Y;Ya|-a73`Tmn(Hexgbmc)IO1Jk#yC(L`hw>&sNnzTa= zt-FF={!-$rHAp&9NgyOU1fsvfQ3HN5Ib7Qe3$2QI#5-OP*%ob zcv*zt!;OCqW|dG~OLa9VmRY2-VfpTBRNi7qnTe|t4f9k=((RWaqb$ttP3UZo2c^fO=CX6$H=Szt zJ9gFItZ5vRIm}c^RjOn)%OZN<*5=#+>f9@1)k%M~$-F^I-r$RlS-ap&yWkG>;I5Z( zLEnP{zu$J~ygl95vFu~n@$$*N&i;M(I_`ho**SiEXUD^Yu?I3{RVAAKWqq~J-K(rQ zS=>h@EV;9;=Y1}=^AbLo(2-AsEps4aX7rkFaln_^M?W`DN+vn$vW}`n91Kraj~szb z#S300U7UlynLloJAuoJ&IODg&)8JS9#NF3|IDvcIWg*MUIq(h&yQw5X{IO1bP3lQ) z=M_FIx?$;XH#A2>&-H7?h+n#1!+V8mLGMCCrtJgizYciLeK_Fxx9QmfPu;4vj<@th zt7jd5t{!r88tGrYZj&vn-#1yI{QB#1=9?>KMLvNNSF*2lUshY0oA7KKZtu81n3DO~ z`re%Vd6`c8b22~Pd^=g|c1Kt*uuwR76BF2eJHE5CPf}IG^g8Kxgxa+>9kt6#?>s*~ z)b#uobG;*J%qyqR%`0mrprMabSgr4@#>PQ4@A06(&YM1FHrzSqD#WxtpABs?4E(gR zvtuH% zsRb3!ac^JBlc%JsKI=-_9`4q1dPb|AY@o5Q#}Vj>FKxJFyI^x zOyk#S{r68&pcY(XKmB^e>Y7I5r{qfe`p-kJy_2%Eykdn9hG)GwH_IFNcfp9VEGm#~ z8LyxmDN;?&4I0)DEc(JWps3oyeIjV+Rj1Zp5$!#X#+*I}`TzJ3=TW==u}QB?drFkf zuKP+~2j+2@b=$Yx9 zAO3881${!XVJgWq=+5@rq3Kq%J~2Jk`TlXzi@Hx@L2aEBl3tPuYhKtr&C!QF*2Nt( z*<|I-eC46@nd|F|8rk{uMPup|Wiy>fi^KM%D$Rwp_Y}gjX!F{xt>5GCDXnT1 z8nO@c`f~$6;R3&m_6TtLKWEYTk-c9yxc5=2$3pK=I7^E8OmV2C2n+a+W%5-2=&fv> zAA@c$bpKAjU{r_XoWWR&c7$p~{(8H1U zf{Z)=nRfw6#@uwfzws!=9FKYqE8ZE@?t2})ZemlWVOjRmS<^p3^Unq|CFV%N`UB;V zCz|UU9+dlq?VUavy63xu8b0KzoQu^A96#~+g|V)Gm&i)3@S$sI!i0}~>U$o9_x=8_ zHg`V9A77sF-2bl3nZB)!YY$(zeyif_-652=wO^!~CE4C5KA}tGc#BJ{Xx@QcJz2XY z0=0Y(i9ep8EW5UMOl#<#GZU@r&%M^f`|J~?e?~CNQh~Vbvk(@zbcH+T9?M}rv$ubb z1b#TMnlnaM?G}st@{Up~Kbbv73ro?YBo0zC+vimyYiG@HrB zrqNhGYE7-DKF*>a4oF-Ie8@eCT?SX4oi}`W+eTaDDiqIomn^Qs7e+ip}E@ z_lPV1c?V8CDejbdoUGcYie6wQ-xS-%09z-?kYIdpwmPY3>2b@aiTd((GR@(z0@X~qXp?H>o0ch!45&>TpNE2Xwn zXiPr$&J*v|(ae7=+WR5wjaYo9Qo2n#;r38$2oY%C`PpVhtU+nzKBC%}FL5(*iiNde=L#H)1J#9N5UZIjO*< z0@lvY13v=H>L|K_H<)g`p{&VIX6n(_{R4;igR|U}@;#E@%+l#iKYWC)rShiy7IP}a)@Z$EacdY>#?=OQMa zv*I7}-WDT?A!zyg=61cyN|t^f#mvOY%!cO_^GI2_IU#`K6*|=Sfh24oSie8Lui~+P z`Z}fmJ+~d9N?G})i%Xv7qS9*i&Wb!=v)c2?%r~wp;5%xF%I#uaQKPmT*p{RKj8^!xG&%bv`?3-5*67yN94?KR4_gED=icKXdvSC@`^A0wP1@#^a zB(Z5^7qf6`M8_q)Zr17S$jpoMN;ZDr_4Q?LJ;3eRtLHTGI$1qfeNEw>S2VY9_zy?j zAJc9-8~rF=&!>wQ-SQ((!PtYRyZy3F`m|P!zV9iAQ-NxJc(d&#BeI?yO}4+_J?D+b z965x7oNe0B5JV}P6z5;J=?|s8h8dRynNG}g=^ohPIQ_yaTGrrg$S;cFy}XNcdk9Wf zr^jVysF#M?6fU4ki=v|05^9cYSfGs+v0Sv zPwe{iA4;Z)f8a)wv|5McezWn>(ISVPj)%(kpFeWURm$hcF$bQ~>#n2Nf%1zBPc*Wa z%tc(yYDZ<%Jcq1&Tit(u;%d0*dhcgnATt)Icdf5|WfRuP*2%8#9)Hv`#uTR8bhIxc zc-?!=d&6(5`m-c_{|CNl@~bPXNe)l=a;yC6f5!EQ`Yz)}49F)})hlAa z;Ig@3h{nk3W7+lN%R!s_q6IU@Djj}pEKd863{O8UF^`*{Lt_W8cWOP5<DstMzH6rg)1%Q?3g^JCDpKx2_Xf=*!l+gpy4mr0;347Sidf)>Gpm_9PvZ~K zx&>Hp*waFX<}PzES+^V_Wcnma?XB8i;uaUH@_bmJJbdJapV37}j!Dx?77O2zogMEV zTiComwtDcxgRa~hE{RTYQwI?ZkwXXQmV!(Om}sAIt-Cru-UFi+-yy-(=-8)pc|fVt z8H1`vB4F%-c)hRvPBf@r7Lg(#2m*?vNl^eny}44$p{HW8 zO8Wg$8YQ?q(sa-#-SiLu3Rq5ub6qE;MuSeXBae4PeB(f5w>|vDu@&d=we7Fi@tlVU zwYgEKQ8_kYDhnf#vCErq%;jQ1MQpJmUu`_TJKuAM$q|>)Gdnx}sLiVfcUOpB&wF1S zTI_0R&j#)bmPb>PSw<>8$KTd%pM9>U*S6y5&ioO4^-O2gm0ADq zd+_KmUs|Oy zHrl{)Imu1LSu1zaVMIg8q#^90)=LF>aixrPjWP~Jz=lQFO+Z1RH!}egSc4lVwUB@G zt;)0Bbnu&EX%AwSvbS4O+JVIOVG4JP<8iqfRF2Glsay%nKHx30ZJ=)oEJL^S9?)60BFrMO) zIV`-vWWN)K3mGO~>mBMD{oMb&Qi4k&Nn(CB+*49DOg-HH7x(a=$>EjFj(mhvq4E9e z^UA7g(+7`hpz{~t9f{LLK_E3Qp&j0queV$rhHn~;bk;{+tIY49-&MKgcux;TBzSu{ zM*G0Z=IzGHHdfqa;VyZ(K@7Q63)H%@12Z!JD1n4QXV`0*>oBKrhX(XXnw&^6FK%=W zRg1U7)vAQbj6xn|dp2#VfVYFY^kp0^8Lw3A6O zcK!&pl-r92^{v!tDpN#gGkkk-4pTML@#@O#oVC(-nNR^@J`?$-z#}GNC64PY<6#{? z2B`!;o6iU5w&ObIm~`D~%TC%^dK#;%f@4Y!87Ga$0&$i~gq5a6{V*=D z*%=x6`6M+b%Cd8x%}JFP^I5*8n%{?R2_48%TiLc01h01C@vSQcGgr<*ks_(OsngUF z5w0HQH+PhJv`==?_rpG*<1+Kj=Fv*IE^7hLfg&biM4-e>V(^NQ$Ap8Gv|r<1?AalJtT56t)e&*qi7O3e zRo5pGuW7p&ZnzMRkg7gWPWFfp9I!$xW=DjCg7SC1J8a=AMLcv7CG05~zV_C?Ddeu~ zBh8<`$F-Rws|X7@f&K?3xf>K!rf$e6a*1?icjW!R6foXM^%|Qmc~6ZF^6gwK@5c)bM+-1~!&zSxs#`Wm#^_>FDZ zkr%z;*%{f}j**QAqz19NUe zap~wwd6a-Uaf`_lMm>APQ+0)GBlnXaGCkrVjOKCGs$Ae92#vmG#$j=|QjgI(R$n3+ z$9$TNaL7@aU#1r=7Hd#c~f``Ym^?0IlP+eavardA6<7 zd{5tLiT(LjLrcV>m&-jxJ1gIGZ~aWH9}YzN=4!hYobF#(km^eh9_f#TP0*ljQx+vH z?^O@=Sg z>ZC8fmwc+D6~2~|P1Eqd_TlW+_S4kIqUrVKUu7tbPkIbv_fv(Xl}tX3)m8)_9@*%% z2oJq>(#HS$qm}XQnV#zZF270k5}91wxE$I<`?7Q)1~u^=OIUQ)+LsoMYJs!*Ahqok z))seh7fvW&cPFVF!6G}b)^_-ip7N`j5Dv%u$9|rj?2)HDQ)s z{~Kz(U!(de^XCmc!#7sgg!(@kCyzbZ8(y?0#qhWw_EwF7BEEkYF<(V@qj!*U+jm}_ zyZdqE8xGMhp1_hTY@n1Gt=oZKB9yhNRt{yB2jzRxH_LTTt z3`xSea!4jr++qX^Au0_6gyp(!?NeXfb+?k%V`Ro}`WS{OO>cwToe(Wp-`(9i>GNRy zaWKu>-|T~*X!`rDzsrV}y527z+&uZ_l7v~XIVYI2t)8-D*Eo55BukH57@WpkB#c6S z4}8ksko8HiJ1}1}p-VY^d7q`R|KxoP!u`l+^8DU}uMXr?^ShCCNrksM?55QxOdRpDj@KL4hd;gOn0m6B z<&ol^6PUj5#acNA12C9_+ty1*ph+#eJK)p!EurxApRaeRN7P*+uz`@_gP)^OPSBu% zzzf(CX&49sZc4lSXpa+P<+#+Btqp_ez5@XVCzH>f>k^`6Zps`EPmSxqb(X13WGN`F zK6)Q|X!yyYM)F^WGl3FZl#v20a7>dL4DS|7jhQb{FWI`x!ruyl)fwuZ%)AiptihK=I)SfA2MK(R9#Q)2|o9?cl44- zk{%PNc4F=)PhEo-DF|?~>qxRX-V-}~oT@jn-KV$S)7am$IoU5c?CsuJVx2E(PjN`@ zGwS`NbCz3r;IsWe21~}zmjRK=7pT{g;*{cb%*qvUi0I5^$URf{MxhWZO^D?ONJmgV zuF_~U8s)=wT_U8iySNaVP;g_TszPKB?m!9amnFwtHEC0`caE=OU$Nw>LTb8EeZ7O> z*~#1N*``QY?#NOTRUZD?_Y9tex_BE0m9(WVcYeWp=}%^O>l)-Z&lfxEsEehd$duDWt4|{hm zs)aX6h6lGtnOyeqp)g-ao&V_Du&iU2&aX8awL%tZLN}LHiu(d=-Dx3Tbkux*@V>bA zWlTIvDY8otDL50|5?1fCaN2u06q@vhyVukJs>kvWHe6{w5Ysw7@qdWA%BZNqwR?s} zI;2|!q`Nz$rKLk@kP;Mz9Hj&$6zLXe>24IIdkAR|7&?a<@;iF(UEdFui?y6}hW9-0 zlY8$+eDP)=?#>f4qF^x^2XIeArAXLs3ZDB@-zd?i>M!&LmZV!OR0_yEnSQAKIp#h* zY{S-S2l#d&DNmPSTIwz~1ZQ6oq!W z;6a{J0KAQyR<+ld`+Sa_7{2 z$+5w2FFtWlUC zZy!@}=(N(8rW=dyqDPsrMbD1>!RkO>J;&THaW$6 zkDgh^>FJ4kz5Pc>0o!kWB6wY?J7Tijk8#c8ba&d`K$P7@@KzcJlq+Bb;^hIEE@lNL zHxf_&cmQS~`2_q2@*OB0d*^E7S;N1}tta`B0$Ke2dlz9(!Cb+!k~Qs!#C5nsG^m288t|my4Q-f!M;voJlSbXO-MpZM8xbP$4Npy<0d;^cfPifDz z7+PfKs-byy5BgOmx2BfWTOda4ea>L?@*u?Q%Rs>dWLZ$E^~E@rR8~Jk{sE4K;G4Rs zDA@8R!@4O*>3f5R@KV=LY?kRdY?*|#2-`H_Ow9)c(DX)2G1;t$6aEK5e=fX`g*%k# zB=BT$K;D+y<&$0K2@_M$UpSLFFghBfD0Gf{UTCx;>&qz|_|F>kZ~#${#nxriMz#kC z&bMJgh*qJpf++ZS{5AkyVa_}^a8zmJmdym-B+duhUEsX*t*QZE z$3?b9YHbxhcWi|AE+8YG7U1QFNX!;sB=Ln(k%e0!72i{~Oi#eb~leOnan zuqWwi#gjt+J}aGB4=ERfuT~EtlV#FgNhuoa*B|=6;&g+6p#a3QX6#oe0y+0SWVt*x z;N!f!KA-`Aid5%&o)?8s52@eR8H!-kR{##>VPr6Q79yNl2xildz;HiCClf}Uv$&i; zyJK8~ohx`l(MGOA1u;X9yRot#Zu9233tdtXTS`sDbc13iYanHWkzUOcb47!z?o7C3mTj=g%z;#aT} zVFuz|L53g^F#1)BgvRs5iq{u^6^MLZ|0c+~qbmgfR9G;+7am|)Yv}yo+cMnuiDK6 zfiYl!+6W95)x$yViHrA>fgH{v=Pam7lKp0MvD2BUi|CC7SgheU6lJ{8(Fhxu9k-Ln z+F$zol`C`+OWganzW34>BSas&s90(MiC&19f>0YS$e+tu0X2Uv<7+YH^R_o7fn}eN zc#z}e8FeXGj9X&~_;sUowyL=D0Ni3H`xn_|M;57R6hxU(s1I7aBkAnnNF{hK>ZK%o z$9RMG67e+A5VCATQ!EkoD4flL5q??VCDWvpCJlM>Ib)++Z000=epFo%(9y{+e;e~! znk1&CX)2-)H5FL+)j>QhbVC2YNJDH$Tjlo}&r~AP zuUkmJDdAzAFsxzU+Zg#bJC_APTWN5E#gi!jy%P=qcHjkA&&taFP63V+gm<5Yv&{|s z^%IgH5z#1BPTjpF{YnoD7`+3D2)blDiS<9)O8Rm}8$WGz`^d^LkJ~W3(xXWlJTLJH zYN7`lnQ#5bgAS`j`>j}vNS*4ymZC} z)?NyawR3}Ew&Z~%aL8XEx!|w`*l?K%6C2%;rMXt%oRgiW_HV*IPD1|w+tLGE6HZvMT{kRl@b1xmBlW|-h`0K1izn}ql1og=( zBcy6TPGK_GA(5-`2K**0oVkokobEnFb1jbgaqtWy^EcLWy|fO@Dd8)Ai_PNn`Wys^ zIA?*7dCH|$mMy(T8Edmaq6X%0)N`|?%SIjxhJN#M_GBp12;k8E=inZK2=$s6=0*3h zy<|+F=7qg~eVHLHaQmFg^jo}9i4{qr9%recLklLD@_}%_8(b_fyDN#+fWRiAsg0Sj z0I;*Jm3@l|=Fm1d2B1($$yZD!bf6$0f?I1&dwrcR*|A^<<>tP?;w)HzoGN}~D z_G+y5$$iEiA>#2c&2pn8VJz(w$ftP2RrpQJF-{-YtpE3rG72ENoy~*>kglCIDlyi! z^e8%R?>1^qw^-llc7+>O&8Z9Qp%$34hKkKc08R)64b;0Z!LBX`vwiLj#ysflZ z5)(v)gGNW3sLh$TVFm&NHSH+}yh(oj%`)x(_Zbf1ElyTz^j%RPL&)Eh3UClM?p}mu zmPAVgm?eg$;@b4q_Xgv(A~Y0K49`ZN`M8YZkm%lv?IRzYaH z#Hdr47eS=4F**LVYu2B;$-TL?UWvHRr{!!3CcPmLq_#vLf64 z&6WUwoW{LE{ojd805%^{e|+vALprZf$c2ALE&yaCqrtv~T_x(1ZBcIPbmU`NN(JR{ z8CZ4% zdDqY10<@s=UNJY|bS~1#22>`#F!*JzJ6$K9S@;xw^%FX(8@npKRIByAWTbG_NX{We z_A~oFUU{4nT~A=(KoIArg3MZ#@eLkTk^F;D0HiB;@cpwH4h%r2z!I>#78uF~#WghT zZtc-JQT6(5-A~J>O@(Z2_3kG!)KIaEei78Luj4}pa0wb+{=LL-2&@Hk;{cdc$L3Oj zYKEp!x$1hD7C+aj$DapdzA`U~I1Pk;MOv6;OYck{pRQAWI!Lkm7GmCA&GBQ8^7lr; zNm)4=>9@F^CExw|qf(E%H0K?Cz$70SRr&V-9#DwZP^6(; zlheFB#cf^6#PDY*92z`1{qcUix$4ui>QBi#1to4oG0a20m6{3Pgv2eAr_`tN)?bE5 zqw)tHWwXYy%9+I(Ej9Se9s5oqkkU^KbT;ZAop%jsPV1brt9Ny=(vN5+O>ayF8@S1h z-<0oV|JJ!}tGt;#dV5oJAXMn_SxQtJ#&_ z*l)q+MGH@ZC2W9##>?nmR$vB>=h1W@f}F>q0sU04-?m-%2=M%sr4~B?ZATUT>?IB5 z`P8l~vWre=DsE}metJQLO6psOB4bOc3ZGp zK^a_Zz(?j0zyaoVl=Pq?972c18}TfalK@}%zbOgIHT~6(`QPWrXK#ecTe1QMw)9UFt z4a;aQRD`qDlf;^oZf3s1XKuk}xnf_>2NUL2Ti34B{Ae>G9v-`!upNKflj81L+8m05 z=g)bh=pff#tN5d?p!3P>I%0##r~&C`vJ3+e!qUUertyUtOP;$b%@M0HSNI*8C1>V- zO%`(W$yb9=OUJ)i185J^lpwd|=nN`d@GlsY1EBUAC};+9d_l8s0poH1BsO5F*NJmk z)_>b3+f}AWa{i{DEm6+}k|Q{`1az{4uN~}h>b?3*2vj|TX{ARl=r#eBgGS{hTP21v zd1iQ>)%pIe7W9p0Eu3TkZ@sTksN1@KXql5oV^Ann zzZcD)K#9Hd9yplOooU-7?;0ETb>~(*$0xXk*^IYfO%Uk zxTagae_NS_M{VMZ2Ic#r!v=NbC2_WsbB+Xco*MQiI7$?r?oQy$1zFh}_7IT(+OObR;JSOqH%D7dT5k-m16HBIqzhjO_I7 zeckd3Xyvi$hEAQ4A!m;p>``PDQvn4k)ROD@z`>EB&31ehKqtycXi;O#+zM?T05P__I->!f+6 zzcYlx&|!cNwTRw`OlmqJkQh*r)Jka3a#t#F?w8`{b2Z)c1&7qDuf^YnIV*MGPLF8p z%tcD0rkpR!DrGD-hC3zplBA(TZ9!#RU~XE92D1X)*Wr`=zjmyQ3Hpl-6UERG12E42 zYJ7<3o||T6n?$FfraCAPU;2W=hA*t77P^@GWw^q9zj@oAM1v`s0`OOAy2EPHAU6=150JLvnT72Zk%e|hU{ zwwP^}*1adT-*VyhlJVIbFVSE}z0Nmbo{H&svGR28(mTT6Jw7rG^Xh9x0|qz<_A6`S zuA@(L@z9Cm<6X@?s+x<2XlUz#)Gx2%^_i4%-r?jB#uuvY*53v?BKz4CI1?vJAUT}K zWJR(A<$v!cAAogR)PJqILZA$30B*l|3laA!YIlguM5gPIle0@*bc|ZJIiy}eDvI`#Yz-?X9|0x>qHC?}Ht3^MmzonkrR$518oI*XJ(0z?WzojD+E=K1l zzzB~>s%s8z>F*bEr7m$Yvu-BA0P4RD@4cY_6Ry7+;0+J{`2c+|=ORJ!*Y~bLHw{by zPd-Rzm?SXoW9-5yyjySA?);E({^^vURwPo_6dI1W3Il^vQ2%T_pZ3REafaE)V01W& zi6qy^t}FY}!N(r=(f6BZNR@qJ|BDI;I1B3p2eO?19t6_kdTdMd0jiGPr{$%CRCs`` za{j=ou=0YBF&ds=kXp=+NbFU8=xR!&P70gc0r_htnetH7mo@(s?D9D1iewqibWfm{ z9NEJSvCmTt4DOWhi!*HGVLo44xv1NKLj{;kX@dms3G;sjJ4Obk)d`>g%`Fw+8G{Ma ztACk@Y=4L9WRY1FOvT`+ zwBzgrKRTzILyr|`qjjI;%NxY1wQ4ecZCt$qwy z=XLcT%3s>oC4(>pP;7E^A_%GYFXH->f=Fes0~sTC5708Pdu)K$Y3aI+we~^#Lyf2Z zS+nxxc(YNdn!A)fvf z7>Eqqs!4JjI_F77x|pr@Z`P3ofMqEtnp;0Q|NdVpqYE5zPyo95l9$6q^?xkkCb$j7 z=4h*&9h+3A+g_Z_)&j#4iDRzpyn;w_;N>p_Z;#UdzHM(9DAe`w2wBMu#!R1hOjtS& zuxm+?{!wF6^Gmh5y^k&<1Q`BHss}CgQXga^f`Wv$QRWaZ&hEU(*GS}g+H5Ox-wWQ_ zqU22T>@A|IdU{7bOIpwNz<5f}4-f=)K9a zsExjB_$wMjA#~=*>-?L@>Vc_a%$OSEPq#1W=lNcPWls!e(>}_8I+% zaO{wr(muG`kxR>F@c)21;)@l;rVsu?FE@34V%#%xI>L{Aw~sF+JwW$r`#vJ9rb4LD zO8Q5JoKtj@-KLiJ%;5|o;t}3Z?_5&)Gk9|9n6LEyncI)H^uY;iGFXaTPtORm8ncc1 za!#zhO<)R2px*Hc2Z6WVDq0p3V9nq)#|LzzkCdmu8O)?W zP0<&Jnk~#K+&|LJ@eGrLvX_{iNJHICBf{gUB^LexyIzC!)x!MVX2PMzzZct;Sfm_t8ImV z_jlAr3fZk+#>{!klE57*JKG1@e%E$0ND|5DAbXV>H0afHy?A}0D(5rMaSXbiz52Pu z-O5$G%*CTv-&Ay>>u~6F)`6Hu$n@1vVaK6JsYe>)_3kvHa>?BDVhKLTtV$%zZp}Yv zA>t5A{d$Mgc%N-}Zgbh@_(mrM*SmQAd8QQB@rC}(*V<|AFBGtLJfI4U;bW9v_(2Vi zPVW(!X}e(ol?V_K&RL4NENh-hm{mJE|AK3}s>XOus#?TK!nQx&!b+$b%|!%khT)!v zM?!b5l6!Rt*`Il=6kUB{t-#hStykB*x`k6b97V7rA z!=wGQ%p=ufW^Wg)-4Wi|cdh2PF&=?k1vlR$t`EB`83OiE49Lav_UTq+=7F$B(2n_# zI(w#5aKP_p2yGAlJc;vpZytO)o3q6$Tf_&rj>z53Dq~u5>)J!as1o7pxuEHmbK!uX z%{)XK<24a-GAP77_~jYD$zWp3du!TabyT8z3;0o$PIftLH9c>;&9Hd@(@5-&vj105mji%X(G1`ofQ z8PubI>g5_{DxmS^oC&*D3C(N3E&I@=X~44LVy4S z_ORg%8@jbX#liI#%Jk&j>QX3*%j%g`OV7?A?b5|#BzQtItvi+n zf*@{4HS;KBaWOxk{W!5g9I10cfFu|f(>Eo)2)W~H0!K=}Jvt835AK$+39)WFvaf$$ zUvFHcqkn56Bd7DzNyvFhV?GdtLvusR3&auY_+M3TO z-|i)L%3mu-uoDUg+nrr4o)7xABk8fRtZU^DkK#h+-*j391dZ7z$1j1={ejr}bRQyEHOh9!3tS${y=YYgC@I-*yEaCu9rW)q!_b zDEsCc>IY@JQ+vh_bOl8;oC*3v^y%?KC0B&p?NQuN+_&J1F2+>G-_Y6*_`yp-=R!-j zXTJ0P6SMNmN0SvnLxEcZ)&kbo``-#9{CVshN}kk(fzI)Q)4D6C`=XRagXtv#)K zZXOLCd)f$*il8zmYQXwg2(sLvFq0d9w=z$PH}Jz|O5kP}qljbHt0dD#&)k+Xa|i?r zhRxuYL;82;#@}{ej8#-U1Z-Dm;4uB`&*1%qSwfh0r~xC#FNmF;?j?`*!y(3KsT()f z2p!+%xfd;E@OqK9PTqhwp>OERNcLNi!{v-O`FugeB7Mo}#{0J#$Zg}c+1A;&knfPx zLb$6{`f%Qnk7>#D?D|BsyzhdCnmH*B$Kvf-LkmUtxrtEl($(U@{S8`&}J8+ zi}8u_2wvdt=!l79`Ag6PxPv}mduupLxnO@h=;8q)l<_)#VB?1I0tP(@SlajyJmPz> zRgaAIZHKoGxg(eEZrt3j?i|j+KIE&4fY5~znZW_;BaNDY@|GsvH}tRP`{--jtaY&= zK1DCP2sDTid;!a}%q%+Ha9s4FP?V$Ko-fA;q`#hJN^6u@MYE&?A8TwofOhKkyQs z{n`@8`f@yZ$hiI32w7JVv=F%Pihh*-X4;ZW_7z{?Ez;Vv3@iKMXNZaTMLcxrYRTho z%uQ=(UFSg%c=(0R*v84spY>)q&sF&S;>vg(vd*>FYTSZ4wQrG%&z*{~^j(Z zFYVfT*pfzRDgeA_Scu&>8S{8uS*v~HN205hDLHBR9-Oh^07i9SI-6n}y`4B&YRm<8 z_9(!u3N#%aRx>Q2h-ao?({)R$yZ_su3Acfvxuv#bp)z{k`56&g z4-b{U$b;&rmLeRq`laB2X-;{BdVvNJTKnnJ-NGxPU2qxOetG(SyE-FrSDWmGf^TG& z4<w9h~_ln*-EmrJ+9zJtCUEfuK!_N&R-zatf1wC%aV4O|X-8SBIQc(@oi zSG!2(8gSoFOXOWqcD5O{)y=lC6w?fJgEEzJ+%;5cck?VHlHS*6xq9IYx3_nSsCm`5 zr?)OX{)inh;=Fd0bA8af!|PjSBaysq1WGUp^!%HcjtKyjE2}>D6_NW9{Q#_x2N)%r z6w@+)-n~%Mt<~zAIq7diDRQ$?IOq{ez5L<*zJt2d-u3gERXksf^m<<(OQ4V5?KM|t z{ait}2Z1+xKyt?bZ%ayY+phio{$*lCV4~3XuTddH0qj}ANO-24$m!i&$4xr4rcIMw z-tTH|ao=ho;5_S~TmfxiC`1_Z?cMdromLjX1-`=f4T}NbbR}d3&)QSxETIp6tuwcN zlD1sPEx+4#&Q7PRYYaKvG02*bTu!?=4~&C?8QosmO>tB9S>ze&7hl2Zp`zpUg*mMX z53AkvD^%?LI$d3F(IoFjjKJur^5b_AbegSh;LeMG^$_S~IY1d;7C7RW7$^iKeKlP; zbYafOe{~mJgjz@?8`MK*PtC)AQm+w-?vxRkFnF*RKT-KX1rCB~*ppWRtr=2ulANru z<9|xlo&FR|5hk_x=9uq>HB^tZRPiGc2fl&OsEYgm$!+>o-Ne zL!0nNP?O*mDXqSYfr)&zGM~Udta5ZpKNsNl+|2Ac!pD0E8?7%poWNv_SM%MT=(~r@ zI=_&Ssp1CEp5GwT&XGsMnJp&XD4%vEc5JWA-W@z|;$lbyk-0yNIsCx7BN*L(*#8gI z^&WB2Ef=w$22RKQ4;PNd9Fm7~l|Pq!cc#kz+(q9UG!OkJB7hlZ$&1|m{zIc!)uCDL8(alqh2kAH)G0&hjDuR_w1o# zpPzQmroYVIv?@1ww#YNQ+&ph6qjll?HRQ!_MajsK)gaBBLV*(!%^b3N99fcUloaYZ89!7md{4pE-u$@^T<|{~`&wLQ6Nh(7 zBjWM_i-2bA)*tPj%T)DaoDxIkkw$&{XCdVDHo3J^n9@8yws%dZJx1l<@!(1032gM4 zwl*oj-d{DE#Bm)-T#qmZJb<3e7dW~;z$YLeBO_FK{5Ub}3MCYIg%Z#1A%T?BFMBoq zj+42rcbki%0k8;YVH4j>4X8Zc2i28bl^CrG<3ye^%7jGujbW`F*-)6ih3bacCQ7STlyr2oeqM2UEI2iF zBpW|mF6eAS056ySNY-C8n3o~D+wkH@#3!!vkuFv|O6Ngus)nc1j=bO<^(e+r7^kPG zAq2jKa@Jbv(?ucA@SD$lj%1*84>K$7{n_AEuG@a4i4pC+#CoS`#xo=eJ`8lr{h86qzFzo?j2PW{IlCS&b>OADM#l1!j4KT-8zB6FWK?69Gj;;Ff zfqpzRliEGGJ2EajpfTitmx3pVmcaZ>*|>tl(;zmilm*>=o34?odZoB8tVQzuS>Z?f zA4&>yoRS4YZzH8?8T#qee42a~O{%5+oVvTx2SZ~6wqE`W_Ap{-omgG|wXxZw@FjmW z&B6>WOTPynr;;UO%C*%;&(!f`o{S40jMrXP*nrCtVaDV$;6+83>#b47C2LM^jGJ83 z`N#zk?hS;B#XQOlK;E>S%*0>Xk=5Ff8Lo|)U}6ZM4%y@nzg%g)s?|O}o7jMhuWmLu zTlf>|NG>V;T19%*bE9P({jg)*)JIo{ssdgb$i8{ZK&=p!st_JKCQH4bv@I0N6dKGB zp=DTRbw$bY%Ze}ZP6DlyY^74odmy7MDE9q{c*yXx*X|>(OYJgd^)5V$XJ~{p!sLla z3y~2L^pB5=o@UDDMd0Ln=h6qvo%Z5w1k}0@d1H&?FfGqZFDb2E{u1t>&|4Y#F&uO^ zzq%C3j!9#aN$zyG{GCeBhXYj5<8-)N4XQ5=M+L@`AASg>Q(1m3AME}F@2~|sjbzQU zF*`d{=FaToTLzMn9xw6zuS{8QRv0_*rxz1cL7Jtb6{8pnOTtj0>vNhc$$#hKIScFI zxDl$GnQ!twTK*nteN#TS8-fS?{yB5&ZE6BywYb;Y3_*~N$qdj*FWvGdNZ3P;c$h)m zGa>G6i(oo80ja&D^m^){9kb(+@yFg{M^j1ZiPU&vIyLoHQ#GjhmnZCcBdjFDVHxEg zi*T8!SjcPRhR@laC0@lRyD@!ag(PkFB*3aYpRf|iGIDw|Oe86yK}fCN5GEhfJ;Wb0iaK%*#j&ZdvQrY8^bw+lDtmMN!>_3=<%k&OR zUwGH%5YOiH*}<2|BncwkN!SVH;-%gT!cpZu4hHqw=(Zicmm7CL%xYgeG~1#=GvqX? zV&9L<$zj64GMzgRmmX1pnw32<{EZBgwHO=8YIEZac4Z9G{AlI$`AjSH?SeAiM!}TOkkd?Idr{L zP7%9-oFfLsn)B&Z1dfy|!unlwqM87cc!{+Ut6=uy ztc7`*9DP@t`ipxb8B3efHI95IJ4@Ds`6CAVge)T&ZQfa3ApmrzzSwtlb@kVKe{s8! zvOrP4Wy+h)Q%Sw5k@)WkXKJmD&$Ar~*P?@rKe8-yKnn52!#iK0a}PhQ2}TrQsB&Le zWQE69*spGfq-M0>kUx)5*eB#q`|!&f&*WKzEB3`hr72S^TMa8|a#~u)Ol^L_67es@ zOwGit`GVpkRJClC#Rd(*UfW%_ju)Edjh-vEnvmbJ$%`I*6FU97Dpy|rd&?5QXVHLX z!K4m+n<10^{@3HPV*8T7H3W&)sA?Fre>J8qK@EYe8_@NYMJzoRIQfU(|FX8CvwYMC1p`l z32opJq#3&q((1gYa2{VG6uvRM;*Uk_A^4Fu$GZ(z(ByYMYi(d=!?0wQa<+=?sEC=_ zj!EZM6Ydl7G^X~*kG~{!!Y)uPm5~QS&jQ{u#)|SE9{R2b%!^#p375a&QI$uxUfoOJ z{c-aLx_PBpH`N=e_}h;}d-=eq?(zTvo6IV=pq?z5CZ|UupcP@(X%Lb0*$s2&b&roP ztYEHKdU2%WsYb<;hl}NZ`uGllE&v+or%why=dbe~$0?ZkOO6W(eoRe$$o)VF?o!Jq zBZKbjyhSC%Mv$i(N5O}x8s3pZD=sdkk_~K3naj3D`~3McE4P3^)n`+=x!9Rlq-1KA zLaP{)eWTwSUBPrJuJBm)_sMuiEoc|?=oyMO@hbUR&R8s`9LSL4b0Jf~ z;P!yHnI$Y(fN#}{^#CWhJ+bs8^^d&7B2yD&m}j+L6>Ff5G4sF}Cy^0)?QnMKoShHQ-1UuO zJ|STa%(sR>FUfKVQ_w{AjMLcR{`Z7^ENG?a?{)OC)K=hTXswREK4dN0lzz2rIGcs* zMqCzJAWzAkkQJKKn}Ka452=L+ZQjCjaZ~QOE#p@^kAf~k^eZswaxIB@h_{N?*l&b^ zF;QZPecGg5VTxDlKF2^$Cz+>d?AX{G@WZ?SrjZvKH->fxvk8k(WnrtAigIQ=VHC$v zB2$Yu&{zMhN``O8#3h9-(PS&&9w>W^#N*G+A;t_R(-ZglR2h}PmTa=Zx+tbc$CraV zW+%4^yv0}>t6S|}XBP9Nd-?L^uas2NndjGI7-SE&tcr^tY_)f(uaOBTzq__M*_vaN z@joMFVWhqv8efTXfsNI*yF-*2hpSQdG?3Alh)2^LEP;@$V;4j)mmz<*U-iidNU$ zoC`Qb+Nrwn)8(UuCI=Pyb)qDKzdSFqqE0N(o#vkj^QOM!U+cF!dhzmss^sQO?E|oZ z6Q(cqHpcG>^9dVWL}wvJm>=r${s z6uUkukvh|)HqiTHvljmYl}JSE70KEVyY1m923qX*&4mWW=JU-Mr?>Hk@0>6qA9u!e z{#0hE5KHOHJAb29%v@mw@zwDVZ}A`X^$b^{bgcE=eEZZ*D#vu7-f28TxkFD#+Mt3N zgcKB6lu_JBU&O#V%8&0JaJd4N3i8k{SlhchGH^dabbf2{9VJ+LX}oW_*;uNsMuXW8 zEGn0t3B(UXDCIIASV&|jdy7k(I_0y5VF34nL??W-@@WV>p!cF!Qw8r^l^FW@5k)j? z@H1y{_gh(^udIxbxtCXY?vP?k^S<%)#t&<8Wu4DZTtV2pO*WvCZVvxmmWRumS?B3> zqT0aQ?lXv=%*$p5ueSx}>A5`*v^L;W`@#{WdEv3nE3#wB=tYRek>y;TueHEaJ0Cj5t~_Gp z&hO7h&L?PjbX@{*awZNxRU7j?q6lbsUUd*Hx+j%upC0QpRYDI%xs6t;Yfd~Et1##g zaG7+2xrprK+`|pY=M*{2{*+3x7xE{nInejCpY`Q{C@KI$D>e9^M@H`EeTEs5y}SY+0NDhr2FL*;&s!x z=28!%xN&)K8@Tp-_jB@)_?|9Y;bc+G-q-}V)gOOa;ccAJkowA4NRCTfrke5x6xwEyHK763c0G0F8 zxcok63oI1!*^M*n7ON^c_mkMW9_u4O22`r zJvC+e(cFXwbaa_xb?LMg^KHxf55tuUSe@XCWkS*KfcMqbHt*iu3yU{VRsO{i-FhN^ zJk@f(8=8fI(RO)8`D3y0j){b4`BnBUIxaa@j&U}GCAxFNTbWrdq6T<^1)jma6ziLMl#{7kO3bG?58e=j zPH<)Yte3)d;5+u;qC2;G`sUSxvD0nsX*T(CYF@={jRU(P!#>@sC$Jyv*!mu%nj`!1 zpFI7ckGsrg--mevGfW(bQ7m>9~zDl24ta3%U+8t(#Eq3O!Rn2mWru`TR3=2-sb(6Df{>LW`X zv)H<#!YWdxRV0teDDF$PDi-gDM}A%C9@diA zA#NtV!G)n=#gP+B&XUkkK?~Tv5CK_Yw#T2-^VE?^PGikHQO>HQMy}*J?`ujAt7qoU zSdUKG4$O1M@NjIrL{V6s$i$( zJ{co;?4CBT<(->Q#b;-DVc*wO@7NqTCf1I)L@*3?k2JSTTYFc1BbBDzF&?cQ`7RTO zs0w?y-M@Q0WR|C}N>MadN$oPtMR7NKs#o^Z(y&;MHnDW-r$M5`hIM!_LkQ1-^(-jO z9T!Q&c)RVp;BZF{>?(lEOLA&w-lLYP{?j~tL7t&5&q~v4>^F$%utKtJ_NbV?uP^$iMyNE)pDet;z340+ zjX3nDn1H}@jxsU4f0I)wI?B`XAC4D%55-tA&t{&* zYEsi(my5~@dAoVDp&qH+fKEyMk}x~_BOWBQ;Qf@m9u?K#uVCrb>{nRww@n;qh;aeI zrANAv$0G1wBN~s1e}sq2uDo9^-@YrHo%ZWD=f(Ke-*zIB{Rk5nVt@d+E>e-ho4=d5 zn&XrA*8V^!!7Z?SPcVyczRD^JTTyi4jjORMEr^KPu$wJC@4n5nI$~iX>@BJNCv|+gFXofWDPKyl-s9;`FmR z9+=g6=Qswhp~Q%p?+`_EIpD6VZDC~sELhsBZ;Nt}PS6EKJ4#%~WRGPF?AtBhjhuDt zhz3}IJdN9R2;@xh*0=1xeKrE%#UIzZCg~xoYfW_Ej)aQ&K3QuKNc1mb`Zsy**-%r z=|>EY6?@7Ch)cKp7g}vAVO6TeIN5~qK2mQCj;6Z!fL)Q)FRSuCWSdY#J00`d%LjOp zI>SO)u%ENBy$R7P4_2MI1(Vz&Bfo1~~nP;Fm#dZ%h z66Ta~q`6MNfpp?#_Q4&1WgMUoTrj{v4Fu*K34HJQ2^T<%(5eUj1^Tw3hxGDpeb3eL&ies6vfC1DNI=U*2^a7*bUIhrd zDJ+J-pT+?>&kUsh#%4i4+JFvHWJRmvjRC{E%R=CEF6ltPcHC0%RoR7{?cLSzSqMm8 z+5L5W@ZTQVXK3=(wu62M^QeVxy=SZ?_uE8KgBpj9USN ziklSrft%s?P8u7K?quqk_TmF61#7>R29LeP!f7aKtE+gHK8726iszS^un!he6y#q8 z8gQeimqtv-7?w=4nnwpE!NMA4S5d!dlDFhnBTHLZRgM&0I@@eL zN9_7B1xe=`=cR#T}!RAsx3S<_r4H?Yl^g)U@=A*dP1*AG>yqcv5m^-hb zF9Ir#EZ-5J!WY03hgYjUWYPnioOR}+XQV(r4v)!Lc6)z}f&a7L`^*OZTmqK`!RtFY z@Yi>#!EK@mWx?Rk)3&P_%RlmobH}`d#04jQ zU+xhMYT-moV;{#9_qz_+5G&p~_e4g&%PRKez?!6Uo9JrhNA`xtcX(fRhGa!_v~pfX zsfI&IWkwN3tU>Eb<7-`sqc1v}JIjG8ETdqsM9YBtYwu&4Pafwe94mmFT{OK%Hm=P4hC zt1_T@m_x#mzV%E4pTjkr+ zdNtWyTpR)0wEt>z8Zcv-JR5UZ75KN@O&sg=a8xVzgk~TO6nIIC0#8aTtUznU9(a1O zJUtWw1%qZVbq{njmh+3#4pe_B!^p7x5a0YNiKig%AQ>z>^q;VipfVC0l0eGaBR=*otXH$8A<3 z2{)}KK8kHodA#gIHR+l_7p+i zjZ&~Bg$G}Z67l567d!FGJ8~DDTnxwbTtsw=s~fLdDSEKM7gsdx*huc$@{Qk%ha6VOx6GWz`48UdG0-Kx%rmfE=VX|dgZrYj6K+<;z!YGsO!r|w7N!PQ~!V{DKJ(~ zJl{)X08u&vGE)aE7dj-f5`_=vN17Ipp!zJH5t|691XAwi4D>dm+$I8ayT4F_4amE| zb%OFQhZ-Df;m2W41zea&)IVE{z;RHN`Qi%-*_byEf4(ceTX%p6r<7Nyi_0Yak*9KM z1HIV!`BCGIu?<~Bx&MMA7$GQ0-Ydw=9FARun-O4&wbX(px!C?Ag;hCU8M0)H$hLuU zUa1Y5q@EzE-=sVOK7&qO7x4&lh9+&r4?gEY!_$L!9Qxz@R-faQTTU-V4SK+XrfTgQ z!`?hAW#Xprpy}h5XXpONSQ9LayP82M7xWf+82m;rkzZLP==TjSSX_zvOOCNf)1#D_ zsjjDZylnIQ2rcREccB+3L0^jg7ncg;R@9AbZFhN~citJH^YOfd;FuYNF--=9av}Q(jds9G39F?okf+4usj(2v-w`Q53kA>= z&^g4~U_TR5Z&F%W;v9Uc!#^C(MhgIO?$rgz`xbm)0~5X%Q$Q6Hz=>i1){s`z5cBtl zaPV*##RaC|=a<0|1C(;ayEMvE7aUl`1beDkQs^cjuc$CosmKIutIq`f@58V7*JS;= zPox3j*7Zl#|3tUXR1RqsYw5yA3IQj+(%V(v92 zwB^W2c~1p*L2)bjM)omKc)ST|}U zm;&ywl4fQUUQKtn?jxgSB$7iD9pA2Mg#4srv~iXHqI6P(c$_7v@MB@s^tLKMhQ58X z?H)qgC|X32;{-RrFH}IsZj|4tC1gFAK^t!`AKqchE?QFKkDVRNe6YbeCx>S5RM)~4 zEY=cg|IB95UbhvGKa)RC{a|1Dw=wiOhkQbEcQgwJvf~{}1$g~sL+bi;)emd8Q}an@ zv))u;Xz@i(Lx+~wipHx*W_eO|hf|{{1$%b<*S@Ga?L8z=RD7Zh{-oFJDQ&zPeJ|8P zG*Y?C_EhwaM#*<-(w`<7HkDUL3QTUAAdjHWCOq&By2L9A0_j0u>yV}OASJYvOtFMr zKNFnMC`wNCIi8~IswMPyvARgvR<34>pNW1WvIKy*c<8P_O5B8(IKzgStHJmFA9o|l z#7l&UUR8!?T745qR3K59_-3|70qV^zPy#maUJN^;04|L4gCY`aD=`&dn_oY?z1EF= zQSBTL@nnif2%N`%+pN(ZRj=|(GqoWGZQuMbjf~6B<{Sl|d}q|$*7NI6u6n2${09s9 zpAq?Z6s`{Ojh2NUP{UF=fINJA>IGf@^*rEX%N!y=Nk8mBhKB;=nAJ#7p)6@mO#tQf ziGDg*)t>C4kOxNQBsl~&5Sg!Me5eq&O1#)|nt?lfLFX_g2#>FnL>Mx|%lNk@v+F~Q z+9mbd5Q$wQW8zg+A5q@v(iG}Hh-l2n&RS;sz6kh3%(0b=&BLe9 zrAe#K|5i8(!@I^*e5=s@5f$J2x6nlfW-i#v`NE%h{sHtNy8eu5%ZC+&1MK&U?)*&K zPd+2lRDHzMHy({#*2sONEad61^W8R&s(|$FY}ErFdEeg`ZoqP#e*kE}4Mrj2YN75f z%mm3wpM+h|#Le}ehZqe(Vd<1{j|B1ceai$NqMD6^$OG6u!yD4*tld#ra_qG#;7yKo zhCxYpwq9p8Juuu1=BCuCjRCp(4@G-2+}oe#_;(9$zT+F-#pP2FY*^YuZof5!Dn?7+ zn*WAk0rc%W^hJza&Yi#hj9JXm92&N-0uW%_lPgEGAps?$Up9mv9M}^rO<{oPYLEmI z*d{k+Mq!JJCe8LvGCdz3YN>0}@;|z+m)e}zFJQ;^hzf@%zpEt^Qi4Yg+TFRC z{HQD4$W?;09W4i4ewwng!9|(w~lnKm#k41{_QTRl-9PMjYUk*D>AFX#u2awmznQ!Sg2QAf;mQz zYMpPAk|b$NN2sWbwdTVak{{6K^A~9H0p?wgWX zA<^G{UC5#!(`@0l<4c`cVBtmNN2^K7-&$uGfPKW`<{lrYC1TRz&aEaYfu##*jK}ly z;2!W49Qfs{?F0v9M$QxULKeH!Sg}b;&o`qL@vGqV-)n9z!4A{9O9P_?TQ{|$h;07c zFm)kxs7tkW@{7+`1_hF{FEgx-xJ@K%W3sB&Gp!lBvU$#vK_n{%zZMUx1z!Ui*MG-WeX=>d7vVj8LOHlajWL&(Y?$P+x=ZjI%xy?UC@O zoW@)jXGC=TP}eUXM{cx7V;BtZovmvA7bs2;l?RErI*Zq%q?Ge{i-2MTaBvonKNdXF zF|6XI`oU6EPW3H3b&K^#_ufDawX6^Qlm~6g$;G1J9&OLV=l!ww2M-NU>bSh7bCM)> zA;df?3dO+3d?^>{Z}o?Lo<08>|Ck~My*ia{O#W)HCfYOeb(gf?1u|@kpxFnL>ab8z zz^Dh_w_``{zlhvsR+{VM|~-a8Nb3mt?_ewP20qVzB?-b2A9Zobyn7Fuu%!^ddE-=a0z zeM>+hzSe$Cq$M+y+CC+lK(+b){v((`H@SQG;OC12KlDJHQ*H&8 z2VlnUXj={MOVLQ)IolHrt0k0QXgc?Njpu?C*uIDz(d;6|A=PPM>iAC&hF?CA0##Zc zEKGs(a7|_4GP9V)GXOBcF~!GJVZ>zYFUYX!Q?iG|;C;6*TaFU=e;azdu%915 z>{BCJxi9qnXV`T019-i4FDU+=telTtask_iI(vmz3;WnQm%SNgP)N z{f<_qK$QfA&DNW^4Y|w%)J5v7*qX3UNKQxooRsLp=U3Mh;{K>`?I0NJLSLopspO^% zsVWM;6i)mD#R?iDI+-7L84A4a5PMD_(NBFQ=wG|p)hgVl_ywHw zbH0Y_W;i>ws?a&>vtI~QLGoX@i@T%krBW+m}jXB6x; zMCw0@tTWO=hSDzYwAS923Xf7oJ#;WSLL~FnoR5-Hq?009vBj;fq~-jD$J~FfVc+{u z@Lod%-|upJ=Z>qa3Oic+M#05{&M1C+F4<9yFGo3>r}}SDn)65DJ}B&b7(~MJTTg3EanT)vY}Zy7RuLIOz);*B z!D_ua*Kh6%eEofOGaSX*-bcBLSyVGDbUy%_gq0OX%-SAfIdj_5{y50!e&;leRw;BeEv-KQL9fWFS3 z4J#3%c(})l@XgnrA>Ma1 zy5g)vit_iz^< zm9?)vuRv6`GV^)&YiiTI&>QX5UBa0oh0`d6&r>9P$6jHAzscmD5x;a^MWR@rM^%0E;P+^DV%2+Qu}yZPqr7!V$i`taF}w2UZ>|~P09Ai7 zZt$M4e|{wN5p{WpFQe$pbfOFock{_suX>4e@y!+SrZ_PCNe3j{1Yg*J6dg$9CQ;{d zK@=zk)n8`?Z%v_zK?IOtW3DH{3I-q`F+!aTlu^vpHvm9K2G;7q#e(|fw_$WfkTcn3 zMbzfuGZAgb5C-c*oVJ=O9AN933}EiZf&L#qGeALNoTPl(s@#JStNP3WEn#8Qu2Xp~ ztibD&Y0=Y4Sq*9ynCZLQmLa8zf3ul`2_r~wNSp+7ztP}46RcpX??c#>R5LHGuTKZ- zHu<@9Yh0fZmcWR8c^M41wL~YL(Sz>-a9fW9&ATH9!Mw)*)1W|i(3uz%R4y@c-|hh5 zP*@BlIOLh?tRMF=Zt%We#aFpH{8lVSsVX)x1M%U-muSqkan!+cjTs^}!ax5Sf1Xi( zDSy==<8I5bG=;AX^ZngF!G=Pqm;`y|nfx{k&I&!N5XYvesT|17?`#v&VzqC0Hz5$c z${nBB?=gH~pRJN|IwO-$^#L2%OEJAIR9~Uqcl&*g2F)CXOnEw~*40N5k=x-uC~0Ta zN9W4bLl!P+Q)k7G@%aphK9IWmDX!Nt>ge9r7}d@J8R)E}ZTGzjHq!H5ch-)fi~d$B zclrByblqk}mc88|sYY?XhR}ef*r6a%~I=4djyq7#efN|Wnxn>kjF123 znKQTUd^mPc1UpD?oF|D}aJ9@Vc}fP(NIHNg#2AKZ%D$d=b3N(nJMYB5dh(fP8m^Ai zGE7vvhxZ~#RLHMIVfvoOZ9;gteiC`f2hD|=J5rZd?o)p^j}3DedCXd_Jv$&#Fxn-v znqI{idgD%^)1NE*tc?hgp^*ZkiL0xbUzkZc>ak1p)#+&jc5f#P_PzO*UE9l1$)Y(f z!4wSFx8rg<_2oU*7X*IO$2DaqOT1{|`iLj^%x~7M6*-@MQ-$ITtdgAJ@f8|35!d#w zg_&YC52K>>dn_VfPOYSyZllljgwavi;F)hShsIGb*tD$X{9=9fmA=&{Pw&bJnp*z_ zQaWgb{W$_gMuJZc>;L{VE%+N0GG}bymu7I;cPh@j4-;GB!Og2Nn-W)3m=?q_=aAA| zfQrsKXgPPysu7iOCp5B!i6c#RQHA=ub#jjaPyb3eZ@SAsdpZo8xWugk;TpHz3R;7G zBzP|aMv&?%C>mR%uLgUj(6*pM2n7sb@^wLjjk^4d9=U0qQ0%sppU2IKtt)v_0f^Nu zS70kn3ao}Z{b1DKQ8C+Q9(rf|O?GzH?S4wY{3z^>)LsDqUsF_w|ELIlrzzCHtqo5~ z4U%7cfp$b4KPHjDc5Gf&-4X!-uQz^LXs)+2;`sNC)JO&>Ax~-%>?|Dn!W7KaGPH6Vk~uX9X99n5@HfA zJ=RGaNQf%294+(wJ;gRtHa$1^Mw)X{RxiqiwL{{JecVU2CF}PVuaJ`v`Vvd=VLt_u zB3^G6_MA0Mo{gO<=;w^0^ZiS!jFe_o>~>y-DAp%wdNWRfA^KLu{K0k|^*_fd4$;;V zp7d0+$J~9PH7p(&ANW>C0K12)vVrx!b$!#Z@;F=l-)V#Ty5CjuU(VKU2LAnY)2t>; zZn^0r6P3+mwA1KTTS9>ULT$i-{d8yN_K!`DG4CaAS+2%ZF+Cpp)A;;Kf?&nQeW0CLF$gcD4kNxH>okb zoT&u`VR3&HC<{>(`m8cE5AVuf{-eGm7DV1XGah;0W2+vnhr*1O9hziWPZNldiKn=gOHsJhVxs2gpMiw9$qA`yY9Z7)G?vWdmmVF7xGXUT9rSorz zL3iPRAC3dYH?JY?kpM%7Z9#QeFlP>qe_-%;*%0r6F{BMK!487$M5H@h{1tE8x*X`SCQO=1x*%*b6=9m;t0|JJ zG;y0ynLXyaFZ+eFF7bnKLdC`r3HtO@@Zg>>xBcORlaSpq`IWWe!;1MiE>~4UTlJMN zqf`I*MO>YwyS@6Z)$X%kjpF2RiTFlMCQ7akKMD;b%}xYVFfxuA0cv~W5|R(j^ty8K zl#cK52&&Pr*mMUL+o_(+ot9F)3im~d_opWa)d??@4bRtjno~^Mf%KuI-R33qn~@^# zJYo1pxOyn;KhKJnAB^y;yU<{vM?k3#0MsKe+yxs-&*0#W(L6;WJ1}~)J#iJ_(7XWJ z22%r0QfPmz2M=@ymMGo;@-cuby@h~o4O8G5@r4xx;!|?J#<54zRyp=fQG&buNqOl4 zz)eXpAs+MgcDcwPEB=D5_|f9lcMmw^hdB3pfek>%NCa!63!MR5DF|b~1(lZ%|GJ_R z8uqv;%--?{bPr;+ob*tC$7*(5c8Kj~(8+*lqC&;|ER^FjF-MAR&IL&8=H z5xbQ-TM&AP1e=emZK8hMo8_?!m*CIhRoVeIJhhP$bkn%ly7C2r%AM_ll)XTw6`}gd zWBAN?7^%%>U1IscOxsFb*|~I|Z0E%E+T9Z-N3}z) zR}!=8Els2n^>sWF7;i?XoKd*UDkag$=5}@}i9;l%(aNwPgZi2s$&oN0R*x;^*uOTL z+7^!*yPkjIm17aXl9fCJVLU(^ft>`|nQvhgOt1-103*T5kmC4G9GgN4dRzZ$e+hB`~CvcxVfrOkl$ z{Ea>U@|`4l@83U&u;TtNQkF^sX}%Eaq^Dk%<^b0ad{`0k`$mntZ$t{h>S~1e-ZM=x zfq}FjO}?E7(*;;=rs%m}OLhdkx{A2^`7?uP$%kUwKi}C7JfMFl+x&U}nGqy{ zWt<9}fqiW(6dspfc`UfSF&}(n+bvXoqM+5H`u=pEUUkYF#&KX>>QKEip2xHOZS(3; z$n0&`u>cyI^@a!!y1Sjs5zp?-;1R+`*8j}k=XhB8DG$c#KHQ$1V0W4&>+*p~g5kG> z^Q8SRA(i@N=OllAQsYm8aN}|fEg00K&SjE7(6=fATz?_U@F5rue4$(3&3$bV8XH(a z&1$M0jto#Er~%%-uon)lc`}ysEF-bStoe1YFvvsDG7%qKmvXng2SW|4NT3R%ZPVj! z2GJreoQ$wTEyKVHqdJ6tguv>>X~5KP+$k&2F4c%lL8wB1M^jJgPIxvsI^%{X{%Gg% z@ujftGivZ8bNv6)dSX-{eF?McYvr`t;eKX1ed z>wNJDPERBa7_kwC;p+oj>yho~X+hHg7!qa5E0a3dP zx<+Q<%?`}A>pi3264fHyO1TFi(vQ-IYVM}g4+td3!7MHyb_*>zRq7NNcQ+)3^-#7^ zEsQFEOEErRhCm%lo7*xvyV23BLN4jCbLogQs^I?G7oir9Po*_f>Ht?Ps}2Jt{9r@T z|C~e(L=r*(`Qa_G`u#!BUxNVGpgd%C^Bz)=HhM9gnMB?5NC0d}?f&OPsV2KeNt_Jv4!PRA;2^os!Obnv{jCal~T>ykbeBznV0bN7Y zaCIS3p!}CdYKX6ikg5?gd$RIpQ{>Nuqq}4Vt$KFjyG&zM4~8%V;x+clMX?B_H$mMe!WkOVSHXWQs7jYb`Q9>Q9`-`gK9Mb!Z#AQn9sw)^ci5kK} z({31{DJDH2uYugA(MoI2$2P+;8PI~4^O1)U>(47umix#`)>UO`vV-fm$M@fDFUQ)< z*G->#{W%HcY{E0p+8nXP_7Vkekev3W&E*Ns3vFQzA21Uq1^-Z!RT0-oCdB#cVxjWk zApJouzcE&<)L`lNiyuzz4wJ`qRgH;UESnjx)o{-;M)uSuyl8FK>#;@wcX2NHuFdaw zJlZ=#S1JhmBq2Wg;t-N zjs-jR3j$nBf!x9&dJL>4ZFO%LM-44gts%_Po)pj$-+d+`(G`Ql5+b1Msk!&w%h zTG$p5+8=@7Pb_~RvPJ}1jRR0pvvu@|j%AhtD=8(pA`OTS9z zxxP!1(|AUI^-e?h-8x#k$pezH+Ebu9yG=9Fa4c@xc%-;2j$s>GF7K$<>07L28CfjJ zw9%V6+A%)=w59czr&=GvIarFGaF&>+*hHIk6PW||gbZ@rNbZ?@fgZ{#ewRB>!>9`O z=Xz0TJ`8II)t8r)5IU|0AiYeH>KqD~2>>gz&QV`KZ&WU|6^ZRt*kyV!7bUyE1(c8b z1iKRgHy^O@i8#U;n{ zdAI2&v1P;z6n7RB6wrTr!=|s#75VLE>Ef?U>z4V}Sd1La_8l0`I;p$$Kdr|9C{>kB z!Fd{3iCSjne~8W>0mK}8Z~Yg}sq~e<-#J|OP2_h=s>tu;?9b^a>bW1G?IQ={wgK9& zi9T!C@ulE>fkupKOXLDdgP&WslRu(}ev>C0_%L4Va6W(AuK#TWJ;ykS3E%XCX)3Su z%2jUeB<_KoRjyf{>BW=gYuuQEavnSdJ3k2l#m%XiMz4FykGk&QF&0RFYH$>gUmxE` zm($uA+`F(xV5!*I)^U~hW!u`6kM>B#V;g*XVd%L~mQA~@`)KD~TtL3?R!%)W*GkTF zneU+AEBz90^Q_ON@cOx(*{isU#5pV#WkCLC?pdF3+&sTV+cCeZLNNKP&k8I+Ag4j6 zGf{t^$5uE9PYoT%>6TXvauplHT)X%!dc;)gHy-YVxp5A&$`iNsSq!J;m(A80LhR0& zu+7{rxtZ3tnKQUgf+s`EYO(VU9mSrzRv||N!e)C57D@S%CYe5K>_K z_DzH}??uAW6UHQ-{M4%VUaUEn(F~Nrc0b?VJ~~+|_gd^owjnfrBHRWQ&l}GFTmC~+ z?0F^XMgggc)9{!S=$;gfIH6Ia0shVAx=4@mpQ>k#=*RFuIwKK+lqm zU0rQn<(2_bs8D)VdTdr2(2gZ*&a}DdvLD?fLa(cZ47uEhU~k^up@@m!WJA+aV&Fi{ zNAl9pM+4(T{iX7SQ-RFNjU^dZ#WRvd)exA?(27UO-DWwxFvbVqpo=bTo2T*K#-%YI zC{~<%urWVsqpl~SZ=tVX8+$-VB3b(FA*??3XqnkRhu>H}l&7w5iov#GE8^$mtlsE) z6K>Q(g{V?`Tu)xq<&hDmI)z)#P)l%+4t3gEkepuWo-W-!ndGQ&+A?vS4Wh3*;KXrk zg(YQm?#^~^k9$Q$S& zxjNNu5LcI7ml=nw7%jhL9-XU`cN0N&ayVzN_S{P7?OBi}Z|{fTEBBlSJ|@@1*uaOs zs5Jd5|4bixa8&!VJSb5X0sqmKh*>3`|0DO%Frv?6KbZ3Ag*#d_6E+QwZt35h`>SZa z26fGSkX3)Rr_-`6l~uiM-t(dk=}}Lln8B}JeQ#FBy{2}==@GWg#{516MIfV#jt0Ev zl;MQa{q}x7t+cGPxOtIQ9ZE<*%CWdBY;W6wyqC%)u?zw?K95FK5JrfJO;rDQ!d4@W z62tfZSHp{8hv?v>gmMe$rJ#D3ADf+lpp0facNb82^5T=iw`Dq8^mu3z#Svkzj1kAW zy#1WXV-Pf3XuP`pH8SEz+zdK!TYM z;#lFI6_L!vYVo10RqPR@4w4iN5GqX1MRU>$VGPtk*@5*}zDPu{q?Lf}mS)EaL zwXp2Xpv<`fB)RxZ=kkzTC1KyqRUR*(svJn+qBfpv)HIf`p+sv>Y<4&b+mo$7I3PDW zJy9~#0TrG<6$MKi3!Ju^%_=-8;z!o9lo`q(xB(LVTvl74a0uAEgHorviq?$$h4?a&12p!&|32`@2OfBw!!jsN@Z^*-%NLYn+XjQzblJ7p>p# z?KHzrS@f7~UtCtHqm*7z6Wx@y`%b;YWY`?_ZAj{p3d491L)zsKLEZcJif0R;QB{Fm z<@7*H^E(oX6Qz!1cszjFmZZMU7H{{aSV~faiK6&Y+T-*@6NO_|!?pJ<53(*{M3~F0 z6YonjrO2tCFmlLxbY?0Y*e{l8jbRQhq*#9qU(EEFi_H$$Y5kimAMl$zr^%N_xYxSv z+a8P8?>~N4wP7T6bezq@<9n+C7Z_1|e5*sn!en&pQFdCf{0buRfEOlk<0eJHD_hTn z^GR3wIu_cmR)idTb1M0-%MAfyHo!Ul|C(|PH@K4BP(x%Bh1gtYwKA)NI7n}$W*nH`T7^4JXjE|0hpguI*}d9tWX?;zX| z_asLsE{;P-T@vg}-;}!i;L^e)Cx^Dz&yk7ibZUvw^}%WuskmYPhk$`St4}E-- zidSR`3dvcQqT;lh`yf2@;!egEUY^~=WpUdK0^8low!rI(EeAc!fTQHVvq|R z8BGr^LgC%^_iPTyfN`a++(Q^X^0Z}?6P74~e3;CA&JDB(#5}Gz)hdy_Y#%5;D%aQ)N64~DfNL=5-sI7W7IEDU=2~)GuC|1>NWee&tUbR zb_A`@mUtV-{Mhoh>f*!@KuG}Nd0Fl2W%s)dqRb}7wvObUOoT(o4AN1}8c&&doDyr}xmISv0bz^nO3c?hZ zt5WbgR_4ug`5Bh>ggV2!ouWL@UZ=w4&~9DL6S)<3#0HH3s-{i5%+Jb085BsR`-?|y zlMK6?-<5x0DO_8h^2%!TBvmE)D~VeR?0j`2#SY!^m>)Y{lMh^`Jjkh!Yh@{$$J3zu z>khqsr`)bdJu}vBv5Io2QuX~MOKa5_O}G~gt?8ILJW;1o!#jCp1k*;ONMz3 z5n7#n3-EZtXC4pARAT33fEQtz3kKE+HUgl=e^0h?{3D5o$Q$I&Vd?C1{r$Bey_YaF zIwoEp2l*GJXJ;p_S4Q)fNcxPp_V8Oag%QfbX2;LO0e(a(xG?O7qr@C>_`iCdcsR&z zkW>@-#B!kKavuf)+-KXII1X&rlL91Ne#)_`%->G>emDHcZm7R5;GC&MFpWouA0oV~$i9?BQD1RE;W3ZN%wFlQM(&N7*%QP^p z=WuUAdH-5g(#s{~rM^I#){bjJ67H8rKAhgV_G0h&pnI%hf^8eHpz@6CUEHIyS^5qk z1e^tn>%V-m^6kR4HiB0h$yc44)ho8}TvD5=5wtFCbFfAgPwurD0yl@OyYP-$%!f(; zx#UCDjtRLL0T9TMm={bcAiX%P$g z5nt9E8M}Mm61?JRd??9Hs|vP1k3tL({sFEZPoBG6p!Lv{7i)AO6bgkPCEn;aesiG8ZACTIe~5}pmg3bEL~ zMx|v}d!0nkxyM8cT)05_0CCIe{F*s+R}&L6KA#fg&5L|Dl0G>2d9w@S&IxeMA7{HE z{T1_^-e_=jzJEo*)(4EMG6gWRv1#pEqP%oL*JM^mM_OU6*NgP~TCmBqY~lnrTEaWV zyPNqOqqy%6bCWCTX``>SwRfmz2;y*IiPAZ5TbV}r=Sd#DujXC{aQEI7YyQyYAJyi^ z`^gu6T}#oocidRbRnxx#5%4iK{g!fg{U4oM0bTtHue45IQv4)5ycO`yc<7yGXcNT` zEk|F&N#mh%z0M?>+(dt02_F>ihMa<7*>@h{ofmc{vL3cGJuUTOIrvNQAA34>ux;Di z%<_Sd@nhoUT1Pm1KY?6OWh&fa*2_NHhq2$D2J}7emvO<(DK`%mk>2!%Q*$XD ziM@WG<2QD0Zn6z`#NTXy4haoGu``G7e)UiKAtKq}%49`y>!{^a(!mfI{DiCt|Lyiu@eddpu(JT4KJSNG3Wio_~0UujDajSTUlO=F-dlwZ(*U=_U-)v}m(v*6hjSD#_a>QUa*Rwz2`t5K1duzHr%x^2W4X}zM}UTa^L zVYfsR{HxywFT+S2CS=f|?l;ET7-6t-7Jc43@0E()*c!Yfup#^_?8n0=nj_KaHHIQ4 z#v}2Sl|emy5(R~|T9>@ntfz0xlg4Zvp*`Avh5!6->?%t~2SNHHz z?g3e2)7hgHMJr_~%oB|?SJo7htT^Vr3f~~24T(cu;tXRwgJ)vqfjqyh=#f3_Y}c%^ z&dui+vZh&>NWa&%o8(V;v0^e_nbd2-}zgPF~(1(wR2@~N9yN*YvBSC)2(k3dqie<%pl;ZA~#OlvhvKeOA&o#ToYfl>IW7k*eC^BGC|) zIulH1gE=nICsG0V6Rvg>^qH*{U2U|>nMMs8b4<3JN70+w-)aQeBh`Rh6@dMBuEJEh z8{xRH_EaXKFewnvWRRv3T&EdwW-}>vnuvR4LSv!l>&!h`>@kxta39V6G$Th?!C?Ht zBbN89Rv(K!nl<_?^}OARJTY+<)+2vMlLZ zHRes3<4@FS(n@&$EQs;2t6$1Ri|_=sF?4R&ha%KrKvBTpeI!*(V-_f=H6ph&!O!)Nhh+E~?M3`Ogn?)!cP)1jbSyHUoEglh>huKkCzzb!i7x{z2NZYCaJa>vOMf1KlX zK(exObq36OCx533-1<=MxwLIJk3YNwAUVBQeP{?hnmPO(LbREW4@pU>X&uI$q`QbY z3Jrt>p2MGi2cVP3$jn5yww;&(d= zMSWLG=AJA8*nGl~$PY!`+iS1$WQx;rLcFWt0T$0Z>%vflGCnotQmI)GMPcn5;qdX? zUwxA)VXeg)N*V^mC+TUWbPv*13p91}Dc!EhUKX1esJN%GQ^oewN0+geHC^SEhIq5? zAeP;r;fmnk%G5?0Ur`X7$&VXt1G0%7RjZHRQ;ar|!*6(>+z>6@H^};S`-;d?O0azc z3);VZpIr!sjS0uvsxNwyz*r~^2M#)Zo9T5;)2)q2y;_mo^GnyYnM%HozIet-8XlSS zrM$>kDJXlXu~q~+A6>_yoKtJIxdr->6Dbt;?%f$6>LncXia+`3xnuJIVlq$NIGQ%> z&}l*nmaG)Me9wt8F)1QqtaSN095W5@a<&3`J#2t0o{-S2QQ^=U5i>+we<@eU!Uo{% zs)jM>333tGcWQ+*1xkNn;;ZWsOc9{_oS@@G$^)*%iQCrI=H-(j z3D|5CxS+^9P?eHwr1i*@g7S*x>QUXmU^P~1LL4(wG?kzbkD|<_SnNGWny+I9+xI-V}N|NO!&O4V&OAoJt?vivE1JCDuUMtRouh!(Y&IyW69cgzI@OB zBzDr={f*S;wAu<;X^9ltuSq&ExNhGUAyK{OQ}rrsz~|GlSki!M3dgs<96{F?oEOFY z4hyY|59KM?bEb4sB2_asuil}cbj@BM)Vsw{Gl#v&J#^sM=(eEld5g-tq1iGMRa+Z0 zEOR-rk!VHeLuKElZi>5g6f0CzQAMc`6traKfm?YL$I4@CP!{gzHa$&Z`+t~v>#r!| z?fv_vySuwvx`z%)gKiX1q`QaiM!Hc+2|;NXO1eQ11{gx=Mw*#t&N-j&TF)OazudFe ze($)h*N$Xp#v`4DyA6DsBFy`ZBcK%Cr{>;xa?;QB9cdIfmeem+6^3-9ytzWWnll^V z@xyZD{ZUr2bl~*0Qur)n#qn#=>O*U3)5(y8!)J##6bsvdFb4mJn6%CwOeW7|I2_)l z^gv4zO4sC#iCtQn*) zgz+E%#1aiHLIp-e&H4qs$M=}F-!-PJx%pD@EfA^&z|P43Rx$)B!}pF$kk>-p8;@?j zodS^mBqctR{}xRBWPlXfnG^syeR-&pYiuf_Yd2zN-t$3?wf&+|kH_`95KA&p>Ysuh zww@3epF9YSXF0i7ug{1MoB9^bKzuJc9UfE_sB{{4OPr-qrbf9C_+5gu-p5s_ z^4O|yXDC?hDz7*7Z6Lz{R_k}6#A{!_2br*w+|bE2QSgt|&QhhwYwG61Kuk=G zq3JvrYI(kUji^duMIU^_BBu~rT&wXy8@GF%X-S#Yz-R;WV;^b(0A|SjwHIvii&=bG zZ6ukHTc?(Nk8XwxpvD2bouPQ(U-hT^@SB+i40-ob4S~ zlBA*mU7_^A%zvx{B$}O6ou3B7tS3169 zDMNL=tu^`w%f}n2_Co@#SkV#1ofm7P^*I`Yof@b;JcV+J3XT{i%T!+B@ z?wu4d@e8QGEKSZGE?!9oTLdnlQ4j5&izpDU{&B!yG>ARK`TNcs&q$De=N>hJf-jY~ zjbrXO@ru6lB;XRW3bn;&oOoX5H#3dXs4svF( z?KnJB0!g8wx^DeUHjhh5Q8Nofxxjm$o@1O`z7?32BVPKcjnp(RKvVn8`L3o?ureT@;#YriRK}1aHxxh?sr^4We3Sx8 zMe|u^m(>DI^tWu5DeOgY%JK$HG;Z1_3+Bi9lL}dP4gXReAC+s3sF_Q*t6x&8Yo0mk zcIxHLU-CnCS{x^#;>m>)-PtT)yuZ}E*=_m7t5sT!i!Cl}A;rZOT?vW-!Sv=HhTFas(cen>`LJ#N`4LcUZyu*G-1V0337x*;YQ@&fE6H6_%J&u;dg|G_ z?RD1le!ux2JNyxfdpu4b!swQ>`l~&_c11^6b=4_D)_|+Y26U{NIu~tqEc18&R(-#% z^ABZ~#P#-I{AHVmXbk;d`UBd017!e-bxr<|kkyY19pxW7Ua;HA{#D*sW%8=d`szaM zcJ0kol1~2zzy6aIa5B2pyG{6=1AnzZ+WW6*Rg(tP#%0ZJ*d&s|!iIbA5R-@ea3XZ6 z{i2g$0zJx5%=M(Ie0hUw!UmYPq3wh3=i?j7p~ zp?-r$Qui!swi2+9U@j5ONdGPh(`Ow&K01N_E#!49`|Ep2<2g7_PR2fRbQ?{am~}6K zGexu|&%a`itVxYP-3KSd!@|OytByrW{3nIQyY(&>!IC=l-PWy2%7@CSzv5Y*@|`*z zonR87m{`$~YHI{s35yKrMX+i6*y(pct_sA%D#M?5vlLnnFAx1z?@e!YcOs+{A%Z2M zwBx>#Sraoo_=lEzOH#A-?lxnMk%H3UkO%^=djW5q0)x2*<^4Fur}4ljb`8SPE=tAxT7T{NNw|2}R#7CH+DhuWjVt=FKRRV{@sPz=EC9&W4q`XBa=pYZk55hX+a zYpIaaMeBHZVt;aAc~lM;(EfbUgkqy->q!-vZvTemZJ*<&goiLWG5T3ZIxE-tuk`0s zO0Ck#Q>U9(-O#E1+lLc!x%le2(TF3xKVIfCmHSjKa;{H=(!s6H){Sk>C?;ul-Io%f zlRuntn1sLLaZUe5bww;?w9$-wKUqYl{dHHwZ3X11V ziomRQAMz~m;JYwi1U^8?$hWcYx=w7c343bi$`@^;V~zwhFC;MLk-e1LBWg$NT}Ve! zO|i;_kqfXTN_qUGtJEu0d;YvY6Om)QnBo76xuO)6X6U0PPn~M8LLcZIL(O}-5snRx z)&l}Jgw3bFA8ky(kVbB~qm%}?&^>$NjYjkIL_GV5@*J1VNDLjwCYUX5V4InpX_uH2 zG28e5dPu*KxS*&woyLrdkm_t66aK;W4W;njanq3*#vfh?)HMZVsLEPjSyegPmX&Di z!k#I`Q;PDbU#0TRNY)Q7WZ-PeFP;Y2Q38bzmQ(Vf7swzBohj73l_N&X+@4seJ`5o>{o5WRt1p)B&Tx-tdZJ&2%2og(24SnC~e7wSZ#(YCy5DxQ@HMZ46Q?6 z`BvQzfycaPD2@bD7*CNS^k)w=jMS|7f-%uSnUTZo6+%>9ZhT<<0-W!^%C4EcKhIaViQ3+bc zAd=lZmwgPJuGk|4r6l%q>*!1jOd2(t>Sk2x%V*3=MPzL~U1vp3zMpPTZMl&FFkghL z6l|7oZ2(?#Y;I@AL{?NQzckGZ(M4Lyo}qs2!ND<;(GZdANuv0Sfg3?|Qrp0KYe@X4 zBakmF_IYTz&*GwYhUCRbW_p2kO0Ei^orq-Qkz0qKgMDG!v42H)=^PVkhAmZ06wkCB@%+E zZ@Zp)MjkvZ1%M;p_U0f+|6A=cgds1=r0shE5Swo{MqgqxpzYa~+xe>u&Gtr_?%(3P zj9a@y&n;M{d4frx*GHb6`e=z#@q`WS0wuQKX0$?@<=U0qV-sv_e7%@RCUkC-rS_F| z1_xY9_pjWq*tk0TQp1R3`@qR16(O4;+tY9Srf;O9r>otpYM0s`N`f3Z<^5qxi61Z` zn;PNX3L*iEBquG@!(=##>*4GsbVa8^!Bk7Sx&+q;qIa?##)k+Sg^6gtj zNWO^;2$-_&LPEox79_soQ8$0B&uq(V-fepP<1kUb*U0`F+5MD?uh@E?UCOe5+Q7qx z`3665mT1)fX7(??oSu}nz_M|_Ktzh7pY$uPcC0?FO8Cwr=uQs8P6$ey+Daw9D!Hu& zFRK~oZB3IQ@TX~og{y}kZM17DFR~V|$QrLotG%*qKoL`AZ;^=w*~$~-Nq^_AKl)^U zsv4jxL@UcB(o+?g02yoghh}jT2D$IXa{o_CGpVaZ2Rcm!B4@E>akAs1tiSvkaB9W_ zg!2W;DNE~n2!}OytXTo#A+TFlxV{41L=4TH5_|~sz^`RD@7t*$ts4vjzwvU^7(ixb z9mFc|C-(!S7*z?Tg{;*pnH48t+biaXum2YyOh~@M_L?!UJZ%HOW&xyER>Z9Pd%N^mj4msTP+wjw)q;}tIY;-4mE&bo z3)4L{M8NF&G}(fCXQ%AfsnuQhePRA?LYVJ$IZpV?*(+Kasvk`zmtM}Dt5idAh4+4r zBqm2{vhwYI7*yA$(vy=wfAjeonab4IP)|gEK!yM@P%uo}$Os z{q zu zcoQ^~xP`MY5@QwqGtP`geC1*@TB(XQBgy z`nLa>-Q5;@007o_sE{Hp07|R`DNfpmAX}qJWXW=?F-|4eQ|h4)z|(`Q+(SQ{1ySt; zipbaf>|5MCn&|awMKr(s8zD{C=`V;G4A8_M(Bm9**=7#j6jQ^qHO4ZV&Q2sq+({TE ziO#(6@d{C3zP^;~Q`|=sM;`8rPYG-CmED?)%@D5#h1N?^_M<%w`Dr%=;U? zRT_Yy3f`&1eEr$)@9$LuOV+{+rO`mrC?E_Jkhtd{ z=sq=l5qr2_94ct{S4eJAfdL)AK@~PYjuic~B^gNqZH_pfE(d=T3VOGkfP}vB74qC! zwLNr)J{58-lie;(Vs$E?hC-)=8}U%W;<4-mo?(y|5*XzFDwA-Fs{>TRbxz4e;Q}?r zB677#x|hPZd@F{pen;p3(h~ETtSAe4f&VDlZWlAxA4xEanBS~#HCg-X8Y{bVW?9~i z^fNtM@I(YpeW202;@~A{;jDE>$aE7r)M8|2W@6*FrAS(bP=tkEo6-lKt94!eGQT~V z*FXQag!F#6^>ScKC2Vu)CA0&`yM^G>l%lAc*I^b!*s6}kt;DkMNnxPs74LbTJ{rJC zpdTJO_x}qZ#Am=p(XN3IjF)$fH1FqGKnJPxrxPbq33@>M>El@iMLS*XaVZS9A+xGIvN2u$G!XCP&EVmJ9A8O%p_Ec& zMj529V$oyuE~V;fH$KS!f;Qge<<;?S5?brLmsv>xMw_tVKFl@Zrt!n(`El#e!jJjD z6x|g;GlddhZ=b*M%76Op|TxS&;c zAAR7&#Y>o(Urp?v^UQi>ga?f9dO8CBS-oA_p2Nw<+&nxa6vvL!#gV7q4>czzhIS^( zt3v%;jv?Q5hfm#=K8q`B>6v_4P_7p50|7QxYv5?OKL3Q7>oym$Az2p99>V_5Uuq|@_iE@tVul#>%4t^gptXww@%Gm&jlDD5WC z<9~)Sk7n7(7b{2{kd>81Xyuj|{ig;_>c$DbMeU~&6tpulF(IZBp2kDQQl%Hg{4;`| zXvrvVKJJLs_DQ`)&f7y*8EQLhF#KOvpE%mMK}`8jImJhe!)aeVOKH z7SHiW_CdMTb=3HaPgBuWL$opb;uSl~j!Ec*?2nH$&<~I)_h^OKqV5z|FZcQID2^xv~uB6Z%=hBIPrs{2ut92J-gdek#wj_PdEw>3DTHI+$DpB`Ki3GsQBW-2}H z>{=zmvy>uJoQHm{5ww>2d1PYZ@U-T5*+OL;c~0VCI8jm*Q?_2m?b}%F#W$)C?JFHA z@Bj?E3o~M3^5pAlU$O5kti3I$(SKf(i;qAtz(;dte~tO^776uZwB^79XI{t zv47ujm}Kz6Ow5PxujQpA-&ynfR*4}ed`EDfnLPnvv!X^R8jx=kc0tjJYp4ZR9|lP}(UbxBc>*5VW5bO-tjQ=M~GQYvB{u9T!V391o+>@AZs!zcqJiQWI&=sz<3WGijN zLS-FqT>St!-DOolQz=}N9~4HzrDDJ6$!jx>4YF`=+TtvdCB4b}ZOW|`WqDQfL-xon zgK-LQmy|!b=BnJ@y@aIhOKo#}WMyMRD+#&4vGTv(P@@EQV)P)^gQS9Qg?sK+Eb;vx z2XXu@&q*^;i=;v*E2k}0N0JRtP#z0x&mG5ajM zSotFdG;!U^pq{w1voA+BQXlX33@R1HRbPuq>oR_bNgQr-E}R{u^44or1Sb^A$Vy5_ zN5uXTKc~Kg{s`4?De>yOFL$M5cwXyNU_Mm!A=1WMAg?8Wji!ds*x_KGdnzscBW|OJ>@w_h_ z9Bo%))wf;U!5{2iOTU1=^NQ6hd-)-RXlaVbfck?|Q3kVEH7$Fu9wD6vp}LWiZPlgUnj2esZ?Hpq z3)gz{(Px|}USIl(=r)?yMcZ$9-vlln!nq1NusxwNd@?~AY5K$&8O5oc=ldr(L97*N zY1F9~HQK1*(tB+`z$vd6u-v`Et4MC2H$w)7k)zhLfE#IBY#1ja3TtQI!=F;G(FdpP zr4LU4R*~e_$@r#o5&Y{G*xV@r7DdCyqxeHnPMn4U zZU$oEkF4vV$U)2nPAdK_g}fg*mwxdeO#~n1xLg9Fl;F3C7b zmEn0zVET;wfQ#n8S%o$S@dAL@9R(oXMR5U*k(-IXx2Ld5MNNg-B;$T>?Z`z5N_*?A zd2aq{iJ|ZHz~iNS&-gQ^vtK}ZM%uZ&(bheHVt(hgl7jspUpJ{%Lb$6d#>4Y5l6;>1 zR*ok*n_k{+dQk1XV6j3@W%cLdm4I*gLFKF^k&bMI5^eJjg@z`=jk%p%l=<`R%_!P* zermzY?}_~X%5vz(*l**wx1FU9!@0Q2>^JSCPV!2Bc*&#cW9gLZ-ubo)e zFSMaR-b6-sV!IxJ6VY|2Tu=m+ZEP&2_;-fQ|md0<{nq8%P0FC7q9eES-5A{iH+1sV($XpBL^cTS%Q0HINhfn z1QF1vJUl;RkUI4j>7e3kY#Ie%a6LSr^z?FYhn*7#RSYvz6Cp~DoSLt$uDJi1e19MMFvC)>=ZZH1@P zfIySTAzU`=7A@iZKU+`yAgE9=M&Xbae)u@Wv0yQ`lQ}ts=SrxHF+_DG|K;!g_72OI zJ&D#I0*t%6cOmK>r<7{a380v$*`zKHLEvxrHwG8YUges4rKWry## zN5|=pvoO22B9^{;GxwGP;o;#s2Gg*|=raJ!~X>nr7;OqqW9+j+NGEGIzQbWW4_7R8 zsC5?PU{q$xx&w2=86_?*LCM8lHv2XDM@rY`4bn;c!ix>B$6!60!0Rcd4a&n<;4B9} zd<64DN91&S-XZp$NPP)xKZz^n4Z6;vQ(f(+(?;zH%#jV1=4d|nKUAl7n47;p^|NSY zZ;Uqp3^p9G|JZ$hF@C$<`$PwSJVm4!TLVWViWXjJq8NX6 zgxe-b3)}X^@P47gCzflJ*J$UPF3Yv6tK6sx2-kSo#&BJf{SzCC2+*2lT51SJrh64 z_8Xnrhlydn@AUqRAIo`6)1v(3jGvPy{l)}}p{hS-;+E1qKB026+!ge7ZQ5Ra42=O! z_}pxzmN8KE5JZAJ=}QvfNm~v&(-Y-Mssa^N`0)WlErJw_PdNJlBfRx0hCZUS<|}F0 z*_^6zmIp)QRyz>UrWSsZ%=P6WK@m!z^{M$*Xgtd#y>_ICu2f{z#=Q+9ijEXUWHqTZ zDnATw@iN1DoGu-aSe4N4zjUuswXgwPtw*=5t&bp!Gu(cT24air4i?7CYvjQJnCux* ziqhbk+$*uv3TKOWoNA00Y<_EAMD$lwK>6jjAXi3Ia2%6rGfpJ9Q#xXrEwMMKx2@{s z+l@h31Uf3*}BiC|0wCN7~WJZCVDHPKo-cAUiUg}&CNM`n-N3@ zVQ(zwQg=Q4GWS2Z>7_cqD1k>wZup}yg`Yr9ze80RB!e2#na@x|_2D71!_}(xMvVC6pf2}hOAQ!3TuPBOEZ1?mj0>!3*3#feld(>TN ze!DGKyyL7IpEGIXyMdGhGZ$7>X)arrswozOufJF z)Ot3;&$Ww{uC}5e71#1UMhKz?Ye*5*u2|-EBbHV^!80$N&RY- z*6l5bafpR$p3^4E<7IcIC5s{_q(po2{P3Okt%xl$IC-}9;ij57V&`P zrUV9gl2ElU?>t+lE%iT_$lUyV%6&vu|BJz0a%LV`rgXpU^o*AgM{|K$i>>87Wh8#( z6&`=aD3H!7RI7DkLyH%LAI%4R9IxO0Q&Jg07ON&cFYw^z$j;mf6?8RsfODow2$E8U(zp@Qt|eC33Lk zQK)Z-VO~4+Uzu;qPoGaGq5q~xj+^FHcOa2W%_1ZI4snvO^-2^4PBy`7$4@dky830E zl^SnQZ)NLek#CfE8tKtrr0(&|u_WUb(N~1we{I_3yGOhpbYqE3K}X9XsNn4_iD~>j z{S$;tbV+Y7(iBUAv9`J(hYr9Qgn^^zUAG-A%*3sHHyXpLuuycT=y^&9=$HXinh7s`LQ z5{e(=RlO_L*!@H!zV@OexmHBjh13TNLv85xXh7xm49SHPTE7kR*qQ7d)`$&_)VF>L z>be@<*s?}!GM!!Hg{7{1d$Byi()`?~&WmL`g}A!g)y09T_0kOw#h%#)aPJJeaiI(d zo$8tDM*Sh|YBB^KOE47If7~t&*#O5(B_?c+Z1uzH@CQf*o;g1V%SrG--|LCABOdKk z9e0>zM3AOZ92$&|BVV0BK3-U3e7x?WV&uEiCBq_~)ll89O-(d`6*xx2yje1ApU}~s zeWV=Ud8GQJ%|EhWVno+i*9>wstq55q2biBBiw9@db1E-s;=*{>08A=}HxdheQ_MWg zw6h-VZ3Sr>4@*&FUu?x%k}Im6abHhXaDUyW*#5WVt5fP?gQ4OTsKdvQmTO_KEKyo| z%;SQuSa3yimFG>^Zq9PEy+nOX%~+&t9>f*zqbSq)F!Nh73Eo6AA;{NM_l$UuMx>=w z)#xo*|F$S`dRq8$i(Eu1s@Uv|8 z;_EAJ19Qt{`;Cx9s^TZM;-{sszDsn}hAyOTCiGAs7`|V5!V{6oL?w@=S16YZE+r=E z>tne+sBLiHonlBg^>4uh52b}+A)BZ$f&Ugj|5;G>#{6+a16Q7%QlU3WoqjEObA$pQ z{O`8DFOh-g^HRMww{B_(IJqah&$*fkS{v;9POS9P&yr~9spnUP-&s(+^ZuTRb+T!C z=Wmnynl#a8WM5jeTf_UMS5rYRR`a}kRcZ|Sd!;{vkSxZ?Oqr|}txdAuxTj|h^zDTz zdfwzJ&77oyT;wa_b>D(oPHhg?iAIEKhnjnz6i1H{@>T&SNIzj>SgNA@rM~~=-Nx3W zA_8q)_KJQgIEWVGcXZl}qthgviKV0Dw9CRqqQY^Zgd@p(W}KH|psPk}+YcPGy)BJl zThk4aJQRU;xZxV_3Ws`2LoUg@LaJQL4V@3PTV&1Y<_3`$F-k3|qarnp zw)tS!2zUdVS!~=p8Ln~kVBSN_SL#@l?|N5cABf4wVu?MM3`sVzdwuXE2l|m(pv0>q zIr5K23BQTGw4F6?MM-FjqEm7(avx9k330BB;N! zq#6QCy2WfJ3iS{Vg+uAUD3E44SST7~J=7ofU*>;B6xTs_YDkg*<~5(3+Cxr~Mi8o; z8TN<|@Skv#0m$MFax5a1x+z|=OJx2M*D;ea5>XLx@kq$6+~w4%HEHQ+)O7W?I;P~p zSu^$|LsbGp_o9-(Hb%#wr7Ya!Cr|GwYE7|!)Yi|++N`6awrCbo4-6DtL8nPH-8=Wg zMn~+zbd6HTfANEjUHrA$f%4KBy8;{*(seP{?0-5*<$haX?0%b>>VCC~7ni8@v;SLo zsVx>ARARCMGlS2HZTECXOkDacS8MuwV7lsup{^K=X0n$pVHJV0*~kN^wQ|YlwCW?r zlG-{W3@=%OG!rgp2;OVz$nF?N}5#kGtsgZ#$mr38tY6we<#OHSee%hhf^nH(s zI>1H}C`%eogTWq(+$gyy**nu^WRQ;jvmR<9 zqR-wb&b|1So}Zt1b*22~?MD{bX7qDEG7q*rPS^D~rK=(xcE{HhU)(6yULf_`lwv#+ zPH6=*tfFN(DIqZ+8&l+=H<*+Q86K59@$_>uJly}y=0^2S=mQ@K=dIZz!CoybKgvrEfxjbP zYsC#n0Cxe%?H+do_NVpWV{y6XTZp4xI3N6Rc=zm}OvNAZbaTF#W1YYc*_%KK&BGk>A<>gW(PIKkxE2`m4}06=|eCPTYOJp zGYNYVAN$4g6oH93NBuNmJz7iZPtzxCB8O~-&diS10^+4Q!du4nC@j8Dur= z8E`Gy$E9?>en&Z5{;VRKk*~nGBB9tVb6-S?ukRMOs3INX3ST!)Lihk{g{|4ZaveTH$aa;>k+PD9_&3k7w2zi?<^8x> zA6v_-KH*^8{TZ2@P%$!-n4>{|agqMfG-_f&M|C4bN!3K|1UkxMSg&TdOU+C5irZ|i z9GudcG4+~G34&eJDVsDyLsTe}LJ6+h9H}B|?ur=}9OUe(9DrnKc zzOoV0a6h0ZOs-@*i=CXHal1yY%JGSe`n6KcoK0eAtt((cCC}2PTU>x7MCRug%&x5o z901;CMI)X#Fw5NGwOs08RXfDdX=tot=p~&TBG&Qj84R%c)VNsy zEmGM%5sa)1tx1{PCBS`mv&tYifj=$+!3)@k(GvYf58wKS3duZYSwCGSJJxVRkRs!a z*_uB<4>(z!Xl2^98!`p(T$(>dRjR#(2)Dx-$<~(4X7of@w`e4h9=X!%0Zt zEM}>5hYou`qAY5Bm&(4Cu4+Q18K%om-P<+twzov+jO#8(f`9r{X?+T~mhFDaz`4q4 z1xa>MY1N7Ip}jJg$p|RM@%kH&4~o#kwxdPd*x4GUr?vXG^h&pf!LJv#lt~ZeR|3L zaXNur?xrd>rD{a-5+6(lx~7uCX(Rz}U4C14fAVBq-4Q-PrRAc|HcIL!=g=i$4@t&6 zj6Wl_?^RvQx#B%AA|fNz9u(04ebiSLW+>9}rBh?>Zy==YP*c=`a|-F0oVU~_!x% z8H)!0zWrOsSJnR)%F(17 zT=E7U*K6vX#G~rT$d`(Y_BE$>n!n(R z|5*{ka=Va1D*Emgc~{U2TD^e=kLYgAAupCSOo#7!I<@WH0Tj(L^&;-2v97H%9ojBR z6!D=&FH*HXqeQbqIXvYrvR{o*7b)p&Fte@%rY$Riqsm!#{(fRU`Sp4b(^}O?nLC3u zBF%S|2%aOzD#MH4H!Fgzt)t?p&s08^?|#3aHb^+doIEJ6QLgfJB}tp~>Ag($`wmO} z;YEi=+u5d+Ki_qANSCkjjYQhmsg4n3qy#_zvX{T;{?>sxx=(|Rjl(f}8BwzFT6Ksc zApp2=rk!0_4?ilT7kNBIanwUU6UCKHy=UOgaTVZn5J8^efV3>=wV zjy;pC3VXHaP}IzTDSzUlGsPdz5dh%5prxwxN+&$ho6z68_iRK8irt+&gCsO*xhe>V zm(Yh{XpbMv&WVKAhpQ!Ev@|t0yjRoGV(@%+nU~_-a?6mhu04Xl^@(=NI1x`@T&bdlp z&C|UQu96VJZ=@vYhUL!8ktmTSzP>-I%I=ybfz*f9`}R$q##oT(7f_A+9O}gn$>o+cp#B|FPY$!J%-fa&mnt@DZjND#&thdtVkFDL zc0Rb=PAs!o^{#Q7ZD<^#XeevW_6v0(R;a?Lv78OZ)th7@wah@nu%9xrk>cIto5wW8~luj zsnTv3r-O#9L3U0YJ8F0mw>7)k-FCA|?AgCqx6KJjjk8H)dWl@x7^GTK*;Grp#l>+P znUQl%7Gy@wiL3E&S>Q!bbP(j_*JtHxFi6@^ysykp&vul^`9yR8SLeA;u6ah9rg(W{ z8@1ob&kUGl^vxeUbf70L<+-Z57DvK?`ONa1_KBPlzN**Ntw*6;5Tlaq=H9_cOgcOa zw}OVxO#W{cZ4xPPMGAPQ-L_6YpY5pwb*d&Se54UoujGF7YPP-B#cBBKh(G#zoU*2- zRR4hMw$YvdJEudOFCylz5-FU6WZ>m{&r@1&qN%d7YNEFs;v>@no{qTR5;d`(r<*S% zUDa59x|(A3&`x-R3VwV`kiQ=$uLk-hEAyOChLTIaa5(x>K`P{eUyoi^4{&D;UC;4Y zdmu$^2xN(49^RNHG7f3j>_D=pBV36Kqgaxzh4>!{UFRgW<~>Ea*#~|-VJ!!Wp+PE8 zNbyAg9UYzW`uY=F1_%@?S4Ua=eHv3d-q%qB>v1o*_j-&^`B6<2g3N;-bF6-1opuY& zA(%pMNfhp`yn?UJx!4~y)G)!r)-Zg?pYfL7a3xg!&<~;zM&Qv8E&P9pFMt(!*y>?} z0$^kyc5;&gS6B0(prrnh z51Y7+q1)J*!sVRvL`9#tlpTAuo@>{lr%L&LhTro!-i%pZMAD$9 zch+!40}Gx2$E*`yyhg|-Lsn&MIj=1JXBw7~ly>dS*ozi}q}ERry)uMcJ&(lGkJo;= zhofqq-q_`?m}O$3wDEmh>GXf2YjyzCXb=?VT&Zf>qwwL{%R=UwfH2)T_$E`|qq_?K z99^o3PbMn4f!V_KaMx)-Bv~o}8{*pFWm5Ae0P?8Egk`uH%8#u4v^7uQ5b8FoW29+dY zcb-Id+QQ@T2|xy5rigkh;xs78TUBbyzMRC5i zSO8^Gs($I0FGlz)^Q-fGJ*)f+hxI;tK7mQeDa<5LydpU03}j z=Tow$ub8%vcwW$7Hs;x5Z%+H#gDXmQOJMCp=PIUZAkbJ3LSv$riBe&w9G(tfVHYg{Vxz1b)M0zi`lT`ITUfOml&i-g zq8AA!+&)xvIAVX5A3z7pNMA9;Xs8b!d7pcnv%9v!e9rL&i==U_OOT5vK$8=wa(33R zwN0mn-yjclNCo`G?+Ol1&o4y(s!otxJZSxOfWIAK`k8k78OMFjTc^z{1ZjJiOy#k6 zC|5G!h*Xd=^WuyIc&~F5n=rXN4zkvXGcqhK0RueAk4RvXzm1^?b=s30taC2S4mG-wJRwGXB58K z`NGL8A%i>Xx8;QBgqdu3qCuvt0nh|iBObt3VUNx$?&S1=+~uFWy*;YulAp7+gTt5f zk9j-^Pw?A^jYJt>mJW8etHyu~nlof5X599sw&Gwb$OfZZt@m_B3Nw%$zO2+MYpK)m z7J95kwze3k^u?&~w*Ol~=#v9-11}4a{1PydU*hWTi}i+T0PTzWkeKyEXnZ1>3bw!z{3E)mNqki`JAn4m)wYTU!>8TQ`++bY2i>z=ORnA$bTsMg#6PAi zDo=GBM84UxvGwRzQl@Yzlfnc?uZcGLAe$qs_$pzCZkQw(Zf~Ior%ma3pr2w0#iHuD zqlRm2479VkK@g8ixA*g@9_O9^yespJZvc{nN*ay%)x||qQ-@sd%6D1!)Z)r7FmqMYlkq)Ehcj8F zSA=OL{7~b;eES}s)Cs>P*`%dj>7DuTUKf44+UvFeSxO~IR@H|veiV>dU_CLSw6uV` z;k^nX7e6wS_X@w>=0i;QP)d_2MgB^Rf!T}5uEO9qpWm{I3Sdb?1sY3n_9@mz_KMUF zk}Loa{2QeJI%r;<3zL(Qn4u`n%dr7=!J$|v?L)|wS~U3CYuEkXm|E1mW#3xkVH`HW z;P+Z%5>-fMI(g(lxwqKsoziDQ6r+9>*x95rvT`y1iXPf-&>BNddvfueCconWJN>$x zqA@WV28O259ruBTSdi@-uSJC=Bo3O#6CyEMwtMLdgf#V<_FUeaneUit6 zTK|X1R&?yHyT1kghsS>Iw!&=*SDCt0lSE|Kf54`nf_;Un<+d9JyQ=Yl*F~`PG<Q3lSHVfhXo&np8KJ z8tX&VLJFz@TWZ{tHD_x<)7$-;!F0-dSEM!B_jrBvqi8SfgIV$~k25!zKW8JpqK40D*Oi0r|J(BsCu!VPe z<1Ed8Be8rP+n*qlByc#ZC@}O*HD+u~dvI_N`-Um>5;It+zW@~=@Y}k2vj1`gl7>S-o2xF+1yNBT&TRUgCAJAJ0st!b7CFi@tN`^ zy0vH^-=`EG?m9tlf=Ol(aUvF5KWu=NLwHMr7zvj#*-$_TNGY{+(~o+i1r&Tj!US3> z%J*;rub0Lz?b%#o)|vYhqrx7B!@O@WZzDSiVc%66wr2PmV6P*>{Wg#|mC%0#$n{5b zg+}TYy;5Rot7Hn(6JgKNqiQ+}+SLXv#aTl%a)A3Ts?r_teK=I_|1~XGV2#M=C9kKJ zZ4VS1BGfh-un>Ci`PM7W&QIs(=fnA|%c4?bkdFr(crT#E8O&k+xE_8LBz~f#WmY*P z0R{B#-lWPAZm^DCrr@by4Ujvd6?-db5TjR_T@c)czvmGCBPsmofzuGj6uQFjxa-*)Ko za`N^`SPG5ea$k^J^bP*H`6fF$Df1f;b`*$O3)~eYjJnxZa>VxtW!}?f4cx7ROc7v1s|)a;;`}vaYUfbbF@PQsa9eN^T{p@)k5aSNw;f9hc8g z7m17TTTMxwy$wP%S#heNtEZ?>L`$^>Xjk|RclO(2BHiwP5NA(FCgapA| z#PjmYK{j~j6M6{GYUD%7*2U-NQXvQIDf9|S-4ECHlE@tSP`~jrPoHUXtAeZTdWYsD z^irNN_z6w0@uhlUqN7P>#||^TPlxmBC*{h0SQY^ZrnuKqP}>b9 z{oR&&A#&mR-LLw}D>X@ZEjbQS)JFH6fPkQ|?d9YqkNvOv#J!L&p}17Agk1TZ>~EX@KqAD5v1U_@81g>rNy%sU&C$=ndsxToV8>We9Fvl>v zyMSztG>2g0XCyQ_p>&_v#+kPKUjCRlL?oV%qxosD=fpZpIMI*NoW>s-73T#9#lX2aB)d~g&&gTe~4==c1>mMcg)#(_ZP$GxKsT~ zOv2Il=AbXRzSF+N{Xx%gy6$gxR5?+1Mi*Oro$}u>i@uVIcY4HRoT?ow7o@MVz62?# zw{^6QBabAJ$Ho_FSH??Q-^<%BcetVO+VqWEpmqlmKw&p?f_Ni>^gv{YN1g6WnvOrp zDg+K{9Ux01@R;ohSzkHxGmLjr_~PDYle!RGx~Hgnvvob$(m}l5XLh*MPZi^c2&;v3 z;_~z|#(=U;*yZBqr{!3FVB4;p6+Iwck=+}Mg^OO7T$mLox3%N|L{%%z89D>RK8%yl z?Y8Qsi+G_9yu$Oix!6h(bH)xO*p1Q|(qC?AYYzFNn)cOjM{TosZL!P{<796FOr4(h zj7SiLXLh(;c50V4Vvw;Haiu&(d7yv~&ogb|F?~lL9laSCOetIGBxC%7eiVoO<%9S( zGcqz&`pBPKL=>Y<&?`5a7-yoPc%GsMiTQF2el`Satg%un(bBK!MX@PgW-$o5ap}m# zXzgbN{?zM?|00GKV$1xpl^uI^+^f5Ur_ycxMV@?&LR)QVLYpPN0Lzf{&2HsuUMnH4 zy#blO`EG2}6;zV*l2JH4wG3|N0{Df1)6(EGgC=MFtTdw*uNsHDEIwOwvpP0{Wfv9ri z%cQKZU*-i)8X?hq=aM~lq69D9uZd#Ww~T$ST3T@!91BmDC>`rhXeG3rj3oVzbm#7F zI1Ky`(75KkU_k|33~fJfcLW^UAJ>R;XpY7IV3Mmu>0@VC)H<3=`Vz9ssUQEbnp6($ z_bW{H=bn1JXM2yOJgvFh$sA;r7If?oi1y(Xl-eXh0An|)}z)-fu%M9Gz`DX-|TEW%<}!m{pS{Uwq9 zmI_h}gqt(f<*xKFW`)>IAU@f6l)z+vp{0=?PwKs=uT z$@=#yDhnk1pMnyTL8K(`S=<=?!M1cCH;whYuQWY?HJFqgnn_H=v(!cjsmj{3wJ7d{ zEo zW6HVwHeJ7w?p^do#X!t=Csga6T->H5eb6a=6EfY!oAS&TJ7;6~=MSY-9J?)3t(?v;1PC1ph9NUzSY!pO7dIoH3U> zi9XfF^Diy-?0HlM?~to}?E1WfYM7cfmu8WdB~4Emg&S+6wkCt zGw*htq+%xxomPUd*i3i;b5G^@67R0$d+Z)HV|c`|uG89}TvCZswXdV_(>nW3UQ*3A z?d4CLz@je_+Io2=I!_eewmN1tyr~6%MWomsYYuR7c#jgm+CR5>Mm82!XoOU}=D)7z zT|kb}AKvLlO5Re^7ZQ$qS9)-=Ir_l&>Z~*VYv)LbhvN^s8EpI6TJ39Q&8Rl}Cil%; z6d8GW`5JYo;vh22XO~6uZ~GDk&{of-h5~eP&^JBr7k~Yh10ZB z_51!8Mp*+!bzHQ!S0~bA^7OfStE_LOX%4)f@;*C*XD2ilPmS<#c- zX$b9vOKF;b-1CCi&52TKR{ZVQS1c>fUgi=Cx{!p*yUOo`;*GSasJL3sP;gT7!;|jp zc|G4fdXhN~b>>57GVh~!$bEr2Gtg}|)!3jImlb0z>&@u?-uQboWyl0hXpWey;xi|&B2WQd7%^BL^zsh;u)nkiUI z#L~?Le8f<8^71EAW5fTnz6$>H zyZHuhb>pk^t}&|*#Y@(JKp#07DWgINOortWG=p1jM6MwRj!BYTZU=Bk-gkqD;cdaw zzx2rP^93)JMW$2;%mZV0UKEAM_u6bJyM6OlO$j!@Iod3T^CD9W4eUgsFqS_wl553% zd;99#1|~JVpMd21+7WIbflv0&Ep-M9r)%~aF?Z2D`D920cZS5$OO|cOx=EQGEM3u; zxP9JR2)XDQZ5%T`uig7ppO(Acqv{4+Z034h3}k_H^3WI!WGDJNqkX9ByHVoP#aqIR zacR##g?A}@wcN8M8{KF7k?L1&av!^6Mt+$3;%<%;SIeJwi^=T!kd&-Tr&8!b0vep{;E(O#|VEakkr zX1zw9T$qY9``OjCZM2!dS73JbBZ9PZSuHKrjaraHcz;qBfln_Xv*=@a7kH_trq*qw z{ZZUyyB-_RbzYsdNEdfQ!8qUVY#-bBaYJC(5Wt+Q{Xr|e?E|S5qACt9oG#%>W~F^m z@47C+Wz-Nlw!yu!8KEWQb%TmeFCN<26T5Typg?VP{7bcvuTIOxoM*bYzcl9tG03xs zK29!Q>TuyQZVBah{LrY$6I%Cop}kXq;8Q(4JLGYIWOLYc)CL>i$HCH_;ZSE- zQj^!bRowUvebFW2@N%`sYfWM@HOu$(McnxLsh}}ZGqP9*vG`3w&J77EGi;0aSb#A1 z@a$4ea{s)i{rdx@pyPbII4Kofp~a&Afs`>40mPTfXjyOJ(+D{cS`DX7;N@uWg1USRNNvYUi5< zg>Dua2`aW^ozt2Cg@3c9xMlAU!6@vf+yB`{Qz9TdsVZ5qQWwM90Pr143L|h+jd;eI zDOy@m33(heAn+SLyEw|M5MOOiP5k+%X-B>DyRl}LyPJZ#LrMR0@8;XE#ib172OR&K zz5S7c7LSpy7Fzs{2VeclR9CMkCL0p`Ztg_)b7QcvgJuQ0)0Z=d#A`)!6izz=oqa3p zW=)=?^P)s`pUcb*nub%3;q>ucnMIh{{(8Pvni_C2&D-cGsicT@wTRsvfAyY3vhD8d#KIh zs3L5pd~P8m-WAiOfS6MyStou#vjU)wMo2f_EX3eUJ4fb_Ec~oJt^UCE=dvuu%d&^{ zEqSj5!>k;KpAUbwBU!W8I@V*G`y2uNU6=FFpW`VX-^*rB9B+>`Gj%2We&wTzf_EIT zdy63%mkrZ~=}}_}?kl^a;?s2{nAaZ3EAKpcC0hJ&lVkVWKaH&mxn!d%^ee}weF})4 zD5+rgMXR;UV-jbf+!@nMXz=5lELWOfKHlS+4xbxz>qWeY+l{W7PDqP5RT}Lb`W@*@ zUbdP-{6I9ns~~Ut_;QRjrboG_jWiuujtekNugT@4K8SBEIP81eB4Lj{)aq z*iExo5((+{8_6^zB2zLX}0{mto^38RSmh)|*O-NwSGtu}?RI9=KU) z37sTPze!;kYJ=Kd1kLk$CLtgcqT$l&KfHsl;|HSmfi0z>gZ1eb`S-U ztH+4qi{+lI@kM{Xo7Fh~vGeGSBt&(OP&w_?R2&kHxXHZ}RY+P*%I)_p$TaVHdY6H4 z5tcmkzP*+_IoY=8f96B7y3Qoh@q zAM^MeNEseyQ47mX-R0)wxJgatKJPk4u6C=BVXnSy`Eoybd*2K5jGvVP;0Q1qqn^RxUSOYiH2xL^t(m z({bUJB)Qx`%XBHVY_Ga|>kZX1;Gb3JusC@R>Fpbm1*`5#;K3(>SOWNGNGt~Yk5}#c z44w99T8Q`gb_6=TUwEzZiM@X9^Aa-7(KlFG%qRkmlLi&0r;AWY? zAD)FgBLAUL9udA7^~pwfq6IAH+KZsH$=l@UBmn%J4LexD25>2c406V#N3Q@;Bj@Q? zXBgQxGe5kRJJ4?9_E)k`is3q;vKB1iU&M)i9@b(e=Z* z6TDC%8BN9eir}z`l~dJ2XSFCwubP=7G?P|@k>7><%1Uuc;yM)p1 z&}|*=87eW&nHUFQ6kE16*>Ts}%@;dPcB(+4qEsqeHq^u!;{Reeoffy!#M2t6(@4f@ zmuQ|$ka4C8$a!o3w%Qo`6O)$R*P}X;#Q!o*o8jG5YwlliI0Pp2c*)W4TL0$mylu)C zdUdiD7xCcH)|jQ6FBRR%B5bLX&{00x#_;>h_ILG5(ZFbp06t5g-}j8DJit2UNw z8w%ivZ_4ayt#aD^;-Q1&4KB5SefJ4vHDS#|I=&oo)Ba6HiiJ8HFOU82j(kloZ!^c=IbqAPKvf}$HS>e4m3K6E3m07eOLaFUhiPP z&eswqR1y*=#ifj^exUZPGp0p*zDTRa&#cZ8@lt6L*;&*9g{;NVds!3Z| zcZ{U`N7kW{Dhpd$pppIXd}q;kQQ$(b?UK{)x@qyN$G+bt?Wk@XIoz#RIv{V*w!d7$ z12Z9q;3OS1EX4RMyC^Wcbz6kDsv8uB1#$NW#@I*jA$H0Zd{&0BWEYKa-zrvXEY=sP z!QvZS%iA&fy>nG~ee5MfS&5-~IOL|g;QfG5$p&hrFy5sU&q5Kq&3P73xcEzsNu<&pZ7(>qhrz%TDfFHU_;YY7Exw9QKHcI zQVcG}urxu3O#m(h_eP1P7Sve;I})yTzdHbf$p?2B?_RY*s08f3L#1{m?MGT=AF*6X zG@@n8_Ncv^%~R@i`> zefKd~CYm~-k(JikcFMG~I|k$k$h)7Bk(RyJc>Vfhg&zoOv{dN-UFWbmxW(5<0MAo; zF#1*2+m{;*{WM3((@)BF#%<@C2Fbsh{2qc0*q>e^Tb04S&NP%xYrX1(!d97HVibnn z&o@iZH8piYzS9E<*KnNZo1y0WHCAJ>gTkI;&)7yU?Opcs6reoDf#jH8z>_{7xEPbHHK zZl`Z*+9u8BuTH0%g&%y;Yc_7z@ihkAai1(U>BeQj7t1ec%T-l6$BVQ^zNuJ^BM)Tf zZ;-sUAdQ*dW}0Fst?v2n+PzV*S=`B0^xJyMysGV6s(W+81Olt_fUhvk}6g5b~!p*pTdwg?wCv8ban}Qbzngl1l!Oe zf8}fxqd*VMiKm{%SI0K=oaP85%Rr@=n|R_cffAnh*uwhf-(M%kj1TD(wlO~F5_M-1 z_oZc3OZ^T76w>r*sKdSud|n1AB#rWyf6!srhm?md8qD|)n(KTdC+(+$gV#tNvX*y5 zYL`?#b;HvsRg;~ab+wzT-}1!loyWyUi%ccN&!K>HC$i)UNtCOuUb$>xHB>9UGmTaSzB~EVWbtWC9V?Wxc`kTBH zrTQ4uf*W8dc_cX-1-3&5L{7a}Z&t}WVF{3dZBc+=DpY};_G*S0P6lx=TiNMYHd#-M zOyls4trGXv=JaFjj?N11MT@EwV#FKJ#(bSniMFK|GM%CyIk?yK@=dJ*cISgUYXLE;Fc-o$StH+2c!gB1L!(;mfS|odFod7(-n}heAO-(^s6R!JkcC{dXD*t&?&BPFx;$sc|g~E`G|io$~b01PmXQ6hF;V? zdF%N0BddD%qg?qdYINrpu+HMze%>9=w%~H(YJkC?nk14^XBt;!aQ3dnJ8R`8B(X!Dgv=_7Rp6 z2an4c&B>M^CfEX9`kbzX*RSJk-uDHV5SRl{HH5MB*}l|le86!cjHJ9$2EBBj-T5Yk zx?+PScWv6YogBa`T;3a+v4?{jr#Izkk-~m$M9l$hjFCnIMiU3@FEY(mYHnx-!wS?t zJjk*a_Ea>?2xTd*rKhc?cnLz$*VOJOk)1iy-@we09op;6AH)$HI*fWDuumnLr`E93 z9li<)^Ps=RmG-{{NW|$$CywTHc#B6o?4c-h`T>w8%?nNOvd|kUchlwxlV+K#G4jaGv{8~ zSaEK@7o?ui3?PN|`pl;HI?fSrK>(A9g6{DH(}KvZo3+t;j^2T}umP_fNpUnBZL z1GpCJ_1Rv}pq>klz2!r23kFWoHs+Wo)1`=lJ^46ahu2Wf^m4x4Kjmb5GF$fi(^s1s z=d13gq8>VP9cMoyR_mQtMKZ{y} z>Y9^ePIWL)9mOl@#rQ`-uEZKQCx?8C0nYlN7Ud^bgs!FzgkcmLU@vMsetXq;dQ~M= zi{j*z-5iMG>ur*WzLYIhpq@2)3$;XKhDZlt9j?i-H*&!i)a1x#~sH>PN|;BPG$OzG#WnoVZZp&*aA)ljA3M#m7{#1JQ5{%_Adjc zxd)iU%bZa$n|d#x$se5gSfmh|oa68mpuVsL5CK(=Ko^2;N^Ck+`n3=?H54lMwgVOg z)h%4M%0)E;FRnNoxxPrHix_>7pQ{~4w>e|QAmA`8<6~AutV|r~LEACPH|2CQ?&-_E z1R7)>m;Mhe2rlE+Kz(I4T=2djsSj{r;o>D{JA^}2a*LdCVLayV3c4mZ8FKx*&{VMh z$m#eGC+B*JZu#=jr;;m!%McuLx3C62t6>|p43XRr-<6+AG>@A3zOG<8a(}m(3d5)E zmL>(xOQ?K2Fa37s^~=%@Ja(tQDg0Tr_Yzhlz>qSFyVWkyW#;t^DO>MhTjtj2$P$!P zUL>syWFt*|1%$sTyd%>Z#WukJYJm!RSlMlP*(Sz8Gamyt4j54{#{_HGkDg;L4Fya$ zcI^FuNhc&EP&{=FZ*4BeQ-|`~g*(uSnhu69r$~C>6Mxh((d$qij5UC@2ZiOxrNzE0 z+Z22!)Ohwc4qa8B@%>*E-+f$kAd?QK%K`>QtMFxF{xh=oNv92L_M83+b*$-9$S#B8 z;a2MW>5d3y3K?Ybot`WcF0{D^(8s@!c!0U9v9toyN#UW z*Z{Twm1tjDUaep$kcz0lRMFmZ8)|$)BjQI%Ugj6s*`sFS`v#k-AX=uq_QhP2hwh@$ zc?qBk*|a008Sd1*HpOSS7_`VTi>k}2N>n@XX1RqnKAI+C zfrw~xtN`qrxf$0`ZDsoDO3e1xB(sBc&eao+i8C&lFfQ@YZyP`~l_Xw}e5`C(=Iw|J zoY1$)susqJ%C~j}frIu4%h%Ha3X@izwv8U&yEMTZr-DN>%j}N~%1BXP^O+TJoDrFn zMqwDCLnhzP$iQK63Do?{Bu;G0htKGyUkJtbLQU%1VL#(P{&@ea`$bBqb@de}`96iO)YHQ;q+!|&|`NlCa{A^8#?@wc<`qP z%M0ZU+D*1YY|lrglwB>ZUlNz9HjXSYnuVTdqFCBzY^;($W>nxd_>QKOla!|yWh`Z? zpv}Knjb6^8o;25oGm6M4uo;m&jsi^T0I~AhV-l(8+0ZWMUDV!LB=&bjy;6%dY2VLJ zSgyb{uHC?p){1Txr#W=ev5O%VEIR& zX0YaUs~Dy2*c9VqR(v9;LgBsxmF2Ku_@NfF8?d?HSb?n~e04t1$|E*!f%LmH>|G4e z?Ol9s*opK%Mg9d{RUwXN_`os=id|l|tg0#$MvJ;T3D8lzcqBc>1Wzm1_$ww=^#_3; zhzlh_63xFgAj0e)7gtfVTAY*h>570jrO;U6<<$jn-*9 zETkLX=FP5@NJt%f#=p4mdhL=7rqoD9aG{%bt9JkF8%wBXA}uQZBVuJllK&zjVoiHT zqiTmCHlsB>!@EDB#-2mj{qxGox2SrL4S~!ei>hPV@&tl$6q8Pk?mZJi6D{QWfbN8Z zWN5}?U~TOc=2K2i!>J|R?~2kgW}0#_zSd$ZpP%3`++g=9>>MBRaz8AWD`!E{G-3HK zaNC~M?$#W1`N);FRpleQyu2T;Wx>{!YHv8WE;*h&=^i$;m~L{EJS$H1bXF?z%VdUD zkuq>|s}r;g`a!TF1}a^ZXlmbDeRb{OvK#F0stTU45kEwzvlKcBcthl)Q-cpbTAH4v zhop!LQpw84%C$*%p1g*N&38?5-Emz~yS}_82)^MQ{~wO*0E7;vQrIHnV8?ks16pte zL@^H--l^dozp`HZnV>z+@a*<2Aa~FsraIcKF7yGdq;rkU9k)b?=8yo*SG@I4_+(ZXZNqq=tnpq zcH35juPfhwa;P5HVUOq{?VZU1sS2w9fVslz&Zfvjweo;R7 zeyMfQmB4Z)X}U%8(n5^Cx#x z*OIW57AX)v0{-C#*z2{IhmcEA$vXtx3LAke8iY&jg)8YNh*A_>==X+dbi^1cE~=O| zoJzu06BkXa5ZoRnCLI9*oEW&+jmI;U=G-Pug?M%`g(?(gnEHGamc0Sc>(ljjVhR%W zSGb0&aj|;EX=!78Pf7KzS|MU_w7G9Z9ZuNhANZbZR;H92)k!oFddC_6+}g=n`MUvD zCMA$ud32k0nKrwzxZJdHosRL29eVAl#&PA~Qv`+BmhbL*TpSSjo{P;hI(M>aLycm7 z=DqcO%)sSP$|4HXvPNksK-Nf@!sCaPtIYb6Wd<#= z%peS&FF<=aW&=)QX1wNr+7CQF-@dE$T*c@oqz(s!>M%0$lCrb!yrOs$F>215YkLm% zK<6hZDk^c_ye#4f)eY6FeUH|N0V^5P(VYBxj~C8{+fRUCEzEf0Gb;A8ZKfdL8Z$)) z@&J9;wv7^VIvPQh)SxTM&GEK0@&Ficf~)BS--|xD0Nsv)ZW{$XzA-S-gs*Z7>U{D} zPRL{coEz=s=Un$c*2bNme*IAWHSp;z)zXjw8D4d7i zQHTo@M|~Wt1RKJp*Sq4>(TTOMa(^0WyTL}Z`sANA5Dy!-O|D`%Egp-S2wfPd?(P5V z7VFtBG~3*W6qVM&z4ak_^ygbFM;8&FIYW97U5nKI9=NiSg^1o;_y8Uvy(v8B*Sw;lQqK=zUJ40! zs?eCs;4dyY3AGL%v7t@z`ah`kk3GzeC(ZK8hJGFezk06FWqOpi1;+YF@>SCUe*EB{ zPc&CkJ#1Qc{8;+t29IxPHW%4yU%XBU9^?B0-ox5h(skr8apJ zjNLWc&s9DA`6z#L5@zqo!p1cpm6(B1A%|t7v_geTB@8JQJ%8SkZ+~F4s`GA?7e%&v zNXqrbCeMCYVYDo0+T{QhYy%w(#_|grkx~RNTva1(xJ0eq`xo7I5TVZ`FL{%a`CTk~ z--@GM-CfMjyz+@7U0gTL@=qoSY&g*{kKxPiq5H64{c>QnTyh{`;3{)qy|Lct?#yom z8F1x)(MfjJo%FJHfjwMP?8C|W~Er+$877$BU0 zL)avwHgTrq<`2n?T=D4IkLJ|8p`(m`F_hKz+hlFu0+T1_bKDO0zp%0A9tyB-oBw_R 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 literal 0 HcmV?d00001 diff --git a/src/efanov/constants/Constant.java b/src/efanov/constants/Constant.java new file mode 100644 index 0000000..2c51c27 --- /dev/null +++ b/src/efanov/constants/Constant.java @@ -0,0 +1,42 @@ +package efanov.constants; + +import efanov.simulation.SimulationSettings; + +public class Constant { + public static final String RESOURCES_PROBABILITY_YAML = "/Users/effgang/dev/Island/src/efanov/resources/probability.yaml"; + public static final String ANIMAL_SETTINGS_PROPERTIES = "/Users/effgang/dev/Island/src/efanov/resources/animal-settings.properties"; + public static final int PLANT_COUNT_TO_ADD = 10; + public static final String END = "***Simulation is over***"; + public static final String DELIMITER = "-".repeat(20); + public static final String SIMULATION_STARTING = "Simulation starting..."; + public static final String CHANGE_DATA = """ + Would you like to change another parameter ? + 1 - Yes + 2 - No"""; + public static final String INVALID_ANSWER = "Invalid answer "; + public static final String WRITE_1_OR_2 = " please write 1 or 2"; + public static final String IT_S_NOT_A_NUMBER = "It's not a number: "; + public static final String ENTER_THE_PARAMETER_VALUE_FOR = "Please re-enter the parameter value for "; + public static final String WRITE_THE_PARAMETER_VALUE = "Write the parameter value: "; + public static final String WRITE_NUMBER_OF_PARAMETER = "Write parameter number: "; + public static final String GREETING = "We are glad to welcome you in our simulation, choose the parameters that you want to change"; + public static final String INVALID_NUMBER_PLEASE_TRY_AGAIN = "Invalid number, please try again"; + public static final String MAP_WIDTH = "Map width"; + public static final String MAP_HEIGHT = "Map height"; + public static final String COUNT_ENTITIES_IN_ONE_LOCATION = "Count entities in one location"; + public static final String LIFE_CYCLE_OF_SIMULATION = "Life cycle of simulation (tact)"; + public static final SimulationSettings settings = new SimulationSettings(); + public static final String START_MENU = """ + 1. Map width + 2. Map height + 3. Count entities in one location + 4. Life cycle of simulation (tact) + 5. Continue + """; + public static final String DATA = "Initial data:\n" + + "width -> " + settings.getWidth() + "\n" + + "height -> " + settings.getHeight() + "\n" + + "Count entities in one location -> " + settings.getEntityCountOnCage() + "\n" + + "Life cycle of simulation (tact) -> " + settings.getLifeCycleTact() + "\n"; + +} diff --git a/src/efanov/dialog/UserDialog.java b/src/efanov/dialog/UserDialog.java new file mode 100644 index 0000000..b73d1b2 --- /dev/null +++ b/src/efanov/dialog/UserDialog.java @@ -0,0 +1,103 @@ +package efanov.dialog; + +import efanov.constants.Constant; +import efanov.simulation.SimulationSettings; + +import java.util.InputMismatchException; +import java.util.Scanner; + +public class UserDialog { + public boolean exit = false; + public String paramType = null; + + public void showMenuAndChangeParameters(SimulationSettings settings) { + try (Scanner scanner = new Scanner(System.in)) { + System.out.println(Constant.DATA); + System.out.println(Constant.GREETING); + while (true) { + System.out.println(Constant.DELIMITER); + System.out.print(Constant.START_MENU); + System.out.println(Constant.DELIMITER); + System.out.print(Constant.WRITE_NUMBER_OF_PARAMETER); + int ans; + try { + ans = scanner.nextInt(); + if (ans < 0 || ans > 5) { + System.out.println(Constant.INVALID_NUMBER_PLEASE_TRY_AGAIN); + continue; + } + } catch (InputMismatchException e) { + String badValue = scanner.nextLine(); + System.out.println(Constant.IT_S_NOT_A_NUMBER + badValue); + continue; + } + + if (ans != 5) { + System.out.print(Constant.WRITE_THE_PARAMETER_VALUE); + } + if (ans == 1) { + paramType = Constant.MAP_WIDTH; + } + if (ans == 2) { + paramType = Constant.MAP_HEIGHT; + } + if (ans == 3) { + paramType = Constant.COUNT_ENTITIES_IN_ONE_LOCATION; + } + if (ans == 4) { + paramType = Constant.LIFE_CYCLE_OF_SIMULATION; + } + if (ans == 5) { + break; + } + + int param; + while (true) { + try { + param = scanner.nextInt(); + } catch (InputMismatchException e) { + String badValue = scanner.nextLine(); + System.out.println(Constant.IT_S_NOT_A_NUMBER + badValue + "\n" + Constant.ENTER_THE_PARAMETER_VALUE_FOR + paramType); + continue; + } + break; + } + + + switch (ans) { + case 1 -> settings.setWidth(param); + case 2 -> settings.setHeight(param); + case 3 -> settings.setEntityCountOnCage(param); + case 4 -> settings.setLifeCycleTact(param); + default -> System.out.println(Constant.INVALID_NUMBER_PLEASE_TRY_AGAIN); + } + + System.out.println(Constant.CHANGE_DATA); + + while (true) { + try { + int solution = scanner.nextInt(); + if (solution == 1) { + break; + } else if (solution == 2) { + exit = true; + break; + } else { + System.out.println(Constant.INVALID_NUMBER_PLEASE_TRY_AGAIN); + } + + } catch (InputMismatchException e) { + String badValue = scanner.nextLine(); + System.out.println(Constant.INVALID_ANSWER + badValue + Constant.WRITE_1_OR_2); + } + + } + if (exit) { + break; + } + } + } finally { + System.out.println(Constant.SIMULATION_STARTING); + } + } +} diff --git a/src/efanov/entities/EntitiesFactory.java b/src/efanov/entities/EntitiesFactory.java index 2c09175..2bb8f32 100644 --- a/src/efanov/entities/EntitiesFactory.java +++ b/src/efanov/entities/EntitiesFactory.java @@ -3,7 +3,7 @@ import efanov.entities.animals.Animal; import efanov.entities.animals.herbivores.*; import efanov.entities.animals.predators.*; -import efanov.entities.plants.Plant; +import efanov.entities.plants.Herb; import efanov.properties.processing.Processor; import java.lang.reflect.Constructor; @@ -14,22 +14,22 @@ public class EntitiesFactory { public Entity createEntity(EntityType entityType) { return switch (entityType) { - case WOLF -> (Wolf) getAnimal(entityType, Wolf.class); - case BEAR -> (Bear) getAnimal(entityType,Bear.class); - case BOA -> (Boa) getAnimal(entityType, Boa.class); - case FOX -> (Fox) getAnimal(entityType, Fox.class); - case EAGLE -> (Eagle) getAnimal(entityType, Eagle.class); - case HORSE -> (Horse) getAnimal(entityType, Horse.class); - case GOAT -> (Goat) getAnimal(entityType, Goat.class); - case SHEEP -> (Sheep) getAnimal(entityType, Sheep.class); - case MOUSE -> (Mouse) getAnimal(entityType, Mouse.class); - case RABBIT -> (Rabbit) getAnimal(entityType, Rabbit.class); - case DEER -> (Deer) getAnimal(entityType, Deer.class); - case WILDBOAR -> (WildBoar) getAnimal(entityType, WildBoar.class); - case DUCK -> (Duck) getAnimal(entityType, Duck.class); - case BUFFALO -> (Buffalo) getAnimal(entityType, Buffalo.class); - case CATERPILLAR -> (Caterpillar) getAnimal(entityType, Caterpillar.class); - case PLANT -> new Plant(processor.getEmojiFromFile(entityType.name()), + case WOLF -> getAnimal(entityType, Wolf.class); + case BEAR -> getAnimal(entityType, Bear.class); + case BOA -> getAnimal(entityType, Boa.class); + case FOX -> getAnimal(entityType, Fox.class); + case EAGLE -> getAnimal(entityType, Eagle.class); + case HORSE -> getAnimal(entityType, Horse.class); + case GOAT -> getAnimal(entityType, Goat.class); + case SHEEP -> getAnimal(entityType, Sheep.class); + case MOUSE -> getAnimal(entityType, Mouse.class); + case RABBIT -> getAnimal(entityType, Rabbit.class); + case DEER -> getAnimal(entityType, Deer.class); + case WILDBOAR -> getAnimal(entityType, WildBoar.class); + case DUCK -> getAnimal(entityType, Duck.class); + case BUFFALO -> getAnimal(entityType, Buffalo.class); + case CATERPILLAR -> getAnimal(entityType, Caterpillar.class); + case PLANT -> new Herb(processor.getEmojiFromFile(entityType.name()), processor.getWeightFromFile(entityType.name()), processor.getMaxCountFromFile(entityType.name())); }; diff --git a/src/efanov/entities/Entity.java b/src/efanov/entities/Entity.java index 8da6827..1c31cf7 100644 --- a/src/efanov/entities/Entity.java +++ b/src/efanov/entities/Entity.java @@ -1,13 +1,11 @@ package efanov.entities; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; +import lombok.*; @Getter @Setter @AllArgsConstructor(access = AccessLevel.PROTECTED) +@EqualsAndHashCode public abstract class Entity { private String emoji; private double weight; diff --git a/src/efanov/entities/animals/Action.java b/src/efanov/entities/animals/Action.java index f00993f..0337f5d 100644 --- a/src/efanov/entities/animals/Action.java +++ b/src/efanov/entities/animals/Action.java @@ -6,9 +6,10 @@ @Getter @AllArgsConstructor public enum Action { - EAT(90), - REPRODUCE(60), - MOVE(100); + EAT(30), + REPRODUCE(30), + MOVE(30), + SLEEP(10); private final int actionChance; } diff --git a/src/efanov/entities/animals/Animal.java b/src/efanov/entities/animals/Animal.java index 54ea68b..cc8f4fb 100644 --- a/src/efanov/entities/animals/Animal.java +++ b/src/efanov/entities/animals/Animal.java @@ -8,11 +8,11 @@ @Getter @Setter -public class Animal extends Entity { +public abstract class Animal extends Entity { private static final int BOUND = 100; - private int speed; - private double saturation; - private double health; + protected int speed; + protected double saturation; + protected double health; public Animal(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation); @@ -21,9 +21,7 @@ public Animal(String emoji, Double weight, Integer maxCountOnLocation, Integer s this.health = saturation; } - public Animal reproduce() { - return new Animal(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); - } + public abstract Animal reproduce(); public void eat(Entity food) { if (food.getWeight() + this.getHealth() >= this.getSaturation()) { @@ -41,7 +39,7 @@ public Direction chooseDirection() { public Action chooseAction() { var action = Action.values()[ThreadLocalRandom.current().nextInt(Action.values().length)]; var isActiveAction = ThreadLocalRandom.current().nextInt(BOUND) < action.getActionChance(); - return isActiveAction ? action : Action.MOVE; + return isActiveAction ? action : Action.SLEEP; } } diff --git a/src/efanov/entities/animals/EatingMap.java b/src/efanov/entities/animals/EatingMap.java index 7c812e6..a3d48f4 100644 --- a/src/efanov/entities/animals/EatingMap.java +++ b/src/efanov/entities/animals/EatingMap.java @@ -1,11 +1,27 @@ package efanov.entities.animals; +import efanov.constants.Constant; import lombok.Getter; +import org.yaml.snakeyaml.Yaml; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; import java.util.Map; + @Getter public class EatingMap { + InputStream inputStream; + + { + try { + inputStream = new FileInputStream(Constant.RESOURCES_PROBABILITY_YAML); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + } - Map> eatingProbability; + Yaml yaml = new Yaml(); + Map> eatingProbability = yaml.load(inputStream); -} \ No newline at end of file +} diff --git a/src/efanov/entities/animals/herbivores/Buffalo.java b/src/efanov/entities/animals/herbivores/Buffalo.java index 2d66652..83d32aa 100644 --- a/src/efanov/entities/animals/herbivores/Buffalo.java +++ b/src/efanov/entities/animals/herbivores/Buffalo.java @@ -8,6 +8,6 @@ public Buffalo(String emoji, Double weight, Integer maxCountOnLocation, Integer @Override public Buffalo reproduce() { - return (Buffalo) super.reproduce(); + return new Buffalo(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/herbivores/Caterpillar.java b/src/efanov/entities/animals/herbivores/Caterpillar.java index bd2b297..e4a06db 100644 --- a/src/efanov/entities/animals/herbivores/Caterpillar.java +++ b/src/efanov/entities/animals/herbivores/Caterpillar.java @@ -4,10 +4,11 @@ public class Caterpillar extends Herbivore { public Caterpillar(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); + this.health = maxCountOnLocation; } @Override public Caterpillar reproduce() { - return (Caterpillar) super.reproduce(); + return new Caterpillar(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/herbivores/Deer.java b/src/efanov/entities/animals/herbivores/Deer.java index e15881f..8893bbb 100644 --- a/src/efanov/entities/animals/herbivores/Deer.java +++ b/src/efanov/entities/animals/herbivores/Deer.java @@ -8,6 +8,6 @@ public Deer(String emoji, Double weight, Integer maxCountOnLocation, Integer spe @Override public Deer reproduce() { - return (Deer) super.reproduce(); + return new Deer(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/herbivores/Duck.java b/src/efanov/entities/animals/herbivores/Duck.java index 0718403..6787528 100644 --- a/src/efanov/entities/animals/herbivores/Duck.java +++ b/src/efanov/entities/animals/herbivores/Duck.java @@ -3,10 +3,11 @@ public class Duck extends Herbivore { public Duck(String emoji, Double weight, Integer maxCountOnLocation, Integer speed, Double saturation) { super(emoji, weight, maxCountOnLocation, speed, saturation); + this.health = speed; } @Override public Duck reproduce() { - return (Duck) super.reproduce(); + return new Duck(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/herbivores/Goat.java b/src/efanov/entities/animals/herbivores/Goat.java index a2b8728..0697282 100644 --- a/src/efanov/entities/animals/herbivores/Goat.java +++ b/src/efanov/entities/animals/herbivores/Goat.java @@ -8,6 +8,6 @@ public Goat(String emoji, Double weight, Integer maxCountOnLocation, Integer spe @Override public Goat reproduce() { - return (Goat) super.reproduce(); + return new Goat(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/herbivores/Horse.java b/src/efanov/entities/animals/herbivores/Horse.java index 75941eb..99f688a 100644 --- a/src/efanov/entities/animals/herbivores/Horse.java +++ b/src/efanov/entities/animals/herbivores/Horse.java @@ -9,6 +9,6 @@ public Horse(String emoji, Double weight, Integer maxCountOnLocation, Integer sp @Override public Horse reproduce() { - return (Horse) super.reproduce(); + return new Horse(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/herbivores/Mouse.java b/src/efanov/entities/animals/herbivores/Mouse.java index a117b61..e754ed4 100644 --- a/src/efanov/entities/animals/herbivores/Mouse.java +++ b/src/efanov/entities/animals/herbivores/Mouse.java @@ -8,6 +8,6 @@ public Mouse(String emoji, Double weight, Integer maxCountOnLocation, Integer sp @Override public Mouse reproduce() { - return (Mouse) super.reproduce(); + return new Mouse(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/herbivores/Rabbit.java b/src/efanov/entities/animals/herbivores/Rabbit.java index 194a0dc..6f3cba6 100644 --- a/src/efanov/entities/animals/herbivores/Rabbit.java +++ b/src/efanov/entities/animals/herbivores/Rabbit.java @@ -8,6 +8,6 @@ public Rabbit(String emoji, Double weight, Integer maxCountOnLocation, Integer s @Override public Rabbit reproduce() { - return (Rabbit) super.reproduce(); + return new Rabbit(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/herbivores/Sheep.java b/src/efanov/entities/animals/herbivores/Sheep.java index d7118d7..0f8c04e 100644 --- a/src/efanov/entities/animals/herbivores/Sheep.java +++ b/src/efanov/entities/animals/herbivores/Sheep.java @@ -8,6 +8,6 @@ public Sheep(String emoji, Double weight, Integer maxCountOnLocation, Integer sp @Override public Sheep reproduce() { - return (Sheep) super.reproduce(); + return new Sheep(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/herbivores/WildBoar.java b/src/efanov/entities/animals/herbivores/WildBoar.java index bbe4d94..381e2aa 100644 --- a/src/efanov/entities/animals/herbivores/WildBoar.java +++ b/src/efanov/entities/animals/herbivores/WildBoar.java @@ -8,6 +8,6 @@ public WildBoar(String emoji, Double weight, Integer maxCountOnLocation, Integer @Override public WildBoar reproduce() { - return (WildBoar) super.reproduce(); + return new WildBoar(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/predators/Bear.java b/src/efanov/entities/animals/predators/Bear.java index eeb1472..85cedb4 100644 --- a/src/efanov/entities/animals/predators/Bear.java +++ b/src/efanov/entities/animals/predators/Bear.java @@ -8,6 +8,6 @@ public Bear(String emoji, Double weight, Integer maxCountOnLocation, Integer spe @Override public Bear reproduce() { - return (Bear) super.reproduce(); + return new Bear(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/predators/Boa.java b/src/efanov/entities/animals/predators/Boa.java index d160502..78e31f0 100644 --- a/src/efanov/entities/animals/predators/Boa.java +++ b/src/efanov/entities/animals/predators/Boa.java @@ -8,6 +8,6 @@ public Boa(String emoji, Double weight, Integer maxCountOnLocation, Integer spee @Override public Boa reproduce() { - return (Boa) super.reproduce(); + return new Boa(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/predators/Eagle.java b/src/efanov/entities/animals/predators/Eagle.java index c8bb84e..6d90b38 100644 --- a/src/efanov/entities/animals/predators/Eagle.java +++ b/src/efanov/entities/animals/predators/Eagle.java @@ -8,6 +8,6 @@ public Eagle(String emoji, Double weight, Integer maxCountOnLocation, Integer sp @Override public Eagle reproduce() { - return (Eagle) super.reproduce(); + return new Eagle(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/predators/Fox.java b/src/efanov/entities/animals/predators/Fox.java index 96b3e57..9decb01 100644 --- a/src/efanov/entities/animals/predators/Fox.java +++ b/src/efanov/entities/animals/predators/Fox.java @@ -8,6 +8,6 @@ public Fox(String emoji, Double weight, Integer maxCountOnLocation, Integer spee @Override public Fox reproduce() { - return (Fox) super.reproduce(); + return new Fox(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/animals/predators/Wolf.java b/src/efanov/entities/animals/predators/Wolf.java index d987a0b..60952e5 100644 --- a/src/efanov/entities/animals/predators/Wolf.java +++ b/src/efanov/entities/animals/predators/Wolf.java @@ -8,6 +8,6 @@ public Wolf(String emoji, Double weight, Integer maxCountOnLocation, Integer spe @Override public Wolf reproduce() { - return (Wolf) super.reproduce(); + return new Wolf(getEmoji(), getWeight(), getMaxCountOnLocation(), speed, saturation); } } diff --git a/src/efanov/entities/plants/Herb.java b/src/efanov/entities/plants/Herb.java new file mode 100644 index 0000000..77d7bd8 --- /dev/null +++ b/src/efanov/entities/plants/Herb.java @@ -0,0 +1,13 @@ +package efanov.entities.plants; + +import efanov.entities.Entity; +import lombok.Getter; + +@Getter +public class Herb extends Entity { + + public Herb(String emoji, double weight, int maxCountOnLocation) { + super(emoji, weight, maxCountOnLocation); + } + +} diff --git a/src/efanov/entities/plants/Plant.java b/src/efanov/entities/plants/Plant.java deleted file mode 100644 index 7958b5e..0000000 --- a/src/efanov/entities/plants/Plant.java +++ /dev/null @@ -1,25 +0,0 @@ -package efanov.entities.plants; - -import efanov.entities.Entity; - -public class Plant extends Entity { - - public Plant(String emoji, double weight, int maxCountOnLocation) { - super(emoji, weight, maxCountOnLocation); - } - - @Override - public String getEmoji() { - return super.getEmoji(); - } - - @Override - public double getWeight() { - return super.getWeight(); - } - - @Override - public int getMaxCountOnLocation() { - return super.getMaxCountOnLocation(); - } -} diff --git a/src/efanov/island/IslandController.java b/src/efanov/island/IslandController.java index 7902b15..7739157 100644 --- a/src/efanov/island/IslandController.java +++ b/src/efanov/island/IslandController.java @@ -1,20 +1,77 @@ package efanov.island; +import efanov.constants.Constant; +import efanov.entities.animals.Action; +import efanov.entities.animals.Animal; import efanov.entities.animals.EatingMap; +import efanov.island.service.impl.ActionServiceImpl; +import efanov.island.service.impl.StepServiceImpl; import efanov.simulation.SimulationSettings; +import efanov.simulation.SimulationStarter; +import efanov.statistic.Statistic; import lombok.Getter; import lombok.Setter; +import java.util.ArrayList; +import java.util.List; + @Getter @Setter public class IslandController { private final IslandMap map; private final EatingMap eatingMap; - private final SimulationSettings simulationSettings; + private final SimulationSettings settings; + private final ActionServiceImpl actionService; + private final Statistic stat; public IslandController(IslandMap map, EatingMap eatingMap, SimulationSettings simulationSettings) { this.map = map; this.eatingMap = eatingMap; - this.simulationSettings = simulationSettings; + this.settings = simulationSettings; + this.actionService = new ActionServiceImpl(new StepServiceImpl(), eatingMap, simulationSettings); + this.stat = new Statistic(map); + } + + public void doAction(Action action, Animal animal, Location location) { + switch (action) { + case MOVE -> actionService.doMove(animal, location, map); + case EAT -> actionService.doEat(animal, location); + case REPRODUCE -> actionService.doReproduce(animal, location); + case SLEEP -> actionService.doSleep(animal); + } + actionService.reduceHealth(animal); } + + public void startLife() { + for (int count = 1; count <= settings.getLifeCycleTact(); count++) { + for (int y = 0; y < settings.getHeight(); y++) { + for (int x = 0; x < settings.getWidth(); x++) { + Location location = map.getLocations()[y][x]; + List animals = new ArrayList<>(location.getAnimals()); + for (Animal animal : animals) { + if (isDead(animal)) { + location.removeEntity(animal); + continue; + } + Action action = animal.chooseAction(); + doAction(action, animal, location); + } + } + } + System.out.println("***" + " Tact - " + count + "***"); + stat.printStatistic(stat.getAllEntitiesStatistic()); + } + stopSimulation(); + System.out.println(Constant.END); + } + + private void stopSimulation() { + SimulationStarter.executorService.shutdown(); + } + + private boolean isDead(Animal animal) { + return animal.getHealth() <= 0; + } + + } diff --git a/src/efanov/island/IslandMap.java b/src/efanov/island/IslandMap.java index d8a8b3c..ec729c6 100644 --- a/src/efanov/island/IslandMap.java +++ b/src/efanov/island/IslandMap.java @@ -1,45 +1,50 @@ package efanov.island; +import efanov.constants.Constant; import efanov.entities.EntitiesFactory; import efanov.entities.Entity; import efanov.entities.EntityType; +import efanov.simulation.SimulationSettings; import lombok.Getter; import lombok.Setter; import java.util.concurrent.ThreadLocalRandom; + @Getter @Setter public class IslandMap { private final EntitiesFactory entitiesFactory; - private final int x, y; + private final SimulationSettings settings; private Location[][] locations; - public IslandMap(int x, int y) { + public IslandMap(SimulationSettings settings) { this.entitiesFactory = new EntitiesFactory(); - this.x = x; - this.y = y; - this.locations = new Location[x][y]; + this.settings = settings; } public void init() { - for (int coordX = 0; coordX < x; coordX++) { - for (int coordY = 0; coordY < y; coordY++) { - locations[coordX][coordY] = new Location(coordX, coordY); + this.locations = new Location[settings.getHeight()][settings.getWidth()]; + for (int coordY = 0; coordY < settings.getHeight(); coordY++) { + for (int coordX = 0; coordX < settings.getWidth(); coordX++) { + locations[coordY][coordX] = new Location(coordY, coordX); } } } public void fillIsland(int maxCount) { - for (int coordX = 0; coordX < x; coordX++) { - for (int coordY = 0; coordY < y; coordY++) { - for (int i = 0; i <= maxCount; i++) { - Entity entity = getRandom(); - var entityAsString = entity.getClass().getSimpleName(); - var entityCountOnLocation = locations[coordX][coordY].getEntitiesCountStatistic().getOrDefault(entityAsString, 0); - if (entityCountOnLocation > maxCount) { - continue; + for (int coordY = 0; coordY < settings.getHeight(); coordY++) { + for (int coordX = 0; coordX < settings.getWidth(); coordX++) { + for (int i = 0; i < maxCount; i++) { + while (true) { + Entity entity = getRandom(); + var count = locations[coordY][coordX].getEntities().stream() + .filter(entityOnLocation -> entityOnLocation.equals(entity)) + .count(); + if (count < entity.getMaxCountOnLocation()) { + locations[coordY][coordX].addEntity(entity); + break; + } } - locations[coordX][coordY].addEntity(entity); } } } @@ -50,4 +55,30 @@ private Entity getRandom() { var entityType = entityTypes[ThreadLocalRandom.current().nextInt(entityTypes.length)]; return entitiesFactory.createEntity(entityType); } + + public Runnable plantGrow() { + return () -> { + while (true) { + var coordY = ThreadLocalRandom.current().nextInt(getHeight()); + var coordX = ThreadLocalRandom.current().nextInt(getWidth()); + var herb = entitiesFactory.createEntity(EntityType.PLANT); + Location location = locations[coordY][coordX]; + if (location.getPlants().size() + Constant.PLANT_COUNT_TO_ADD >= herb.getMaxCountOnLocation()) { + continue; + } + for (int i = 0; i <= Constant.PLANT_COUNT_TO_ADD; i++) { + location.addEntity(herb); + } + break; + } + }; + } + + public int getHeight() { + return settings.getHeight(); + } + + public int getWidth() { + return settings.getWidth(); + } } diff --git a/src/efanov/island/Location.java b/src/efanov/island/Location.java index 93f9f74..9b90527 100644 --- a/src/efanov/island/Location.java +++ b/src/efanov/island/Location.java @@ -2,7 +2,7 @@ import efanov.entities.Entity; import efanov.entities.animals.Animal; -import efanov.entities.plants.Plant; +import efanov.entities.plants.Herb; import lombok.Getter; import java.util.ArrayList; @@ -12,12 +12,12 @@ @Getter public class Location { - private int x; - private int y; - private List entities; - private Map entitiesCountStatistic; + private final int x; + private final int y; + private final List entities; + private final Map entitiesCountStatistic; - public Location(int x, int y) { + public Location(int y, int x) { this.x = x; this.y = y; this.entities = new ArrayList<>(); @@ -41,10 +41,10 @@ public List getAnimals() { .toList(); } - public List getPlants() { + public List getPlants() { return entities.stream() - .filter(e -> e instanceof Plant) - .map(e -> (Plant) e) + .filter(e -> e instanceof Herb) + .map(e -> (Herb) e) .toList(); } diff --git a/src/efanov/island/service/ActionService.java b/src/efanov/island/service/ActionService.java new file mode 100644 index 0000000..f7ade38 --- /dev/null +++ b/src/efanov/island/service/ActionService.java @@ -0,0 +1,16 @@ +package efanov.island.service; + +import efanov.entities.animals.Animal; +import efanov.island.IslandMap; +import efanov.island.Location; + +public interface ActionService { + void doMove(Animal animal, Location location, IslandMap map); + + void doEat(Animal animal, Location location); + + void doReproduce(Animal animal, Location location); + + void doSleep(Animal animal); + +} diff --git a/src/efanov/island/service/StepService.java b/src/efanov/island/service/StepService.java new file mode 100644 index 0000000..96aaea2 --- /dev/null +++ b/src/efanov/island/service/StepService.java @@ -0,0 +1,15 @@ +package efanov.island.service; + +import efanov.entities.animals.Animal; +import efanov.island.IslandMap; +import efanov.island.Location; + +public interface StepService { + Location stepUp(Animal animal, Location location, IslandMap map); + + Location stepDown(Animal animal, Location location, IslandMap map); + + Location stepLeft(Animal animal, Location location, IslandMap map); + + Location stepRight(Animal animal, Location location, IslandMap map); +} diff --git a/src/efanov/island/service/impl/ActionServiceImpl.java b/src/efanov/island/service/impl/ActionServiceImpl.java new file mode 100644 index 0000000..f0be39a --- /dev/null +++ b/src/efanov/island/service/impl/ActionServiceImpl.java @@ -0,0 +1,120 @@ +package efanov.island.service.impl; + +import efanov.entities.animals.Animal; +import efanov.entities.animals.Direction; +import efanov.entities.animals.EatingMap; +import efanov.island.IslandMap; +import efanov.island.Location; +import efanov.island.service.ActionService; +import efanov.simulation.SimulationSettings; + +import java.util.Comparator; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Function; + +public class ActionServiceImpl implements ActionService { + private final StepServiceImpl stepService; + private final EatingMap eatingMap; + private final SimulationSettings settings; + + public ActionServiceImpl(StepServiceImpl stepService, EatingMap eatingMap, SimulationSettings settings) { + this.stepService = stepService; + this.eatingMap = eatingMap; + this.settings = settings; + + } + + @Override + public void doMove(Animal animal, Location location, IslandMap map) { + var stepsCount = ThreadLocalRandom.current().nextInt(animal.getSpeed() + 1); + while (stepsCount > 0) { + Direction direction = animal.chooseDirection(); + switch (direction) { + case UP -> location = stepService.stepUp(animal, location, map); + case DOWN -> location = stepService.stepDown(animal, location, map); + case LEFT -> location = stepService.stepLeft(animal, location, map); + case RIGHT -> location = stepService.stepRight(animal, location, map); + } + stepsCount--; + } + } + + @Override + public void doEat(Animal animal, Location location) { + var entities = location.getEntities() + .stream() + .map(e -> e.getClass().getSimpleName()) + .toList(); + var eatingProbability = eatingMap.getEatingProbability(); + + Map personalProbability = eatingProbability.get(animal.getClass().getSimpleName()); + + var sumOfProbability = personalProbability.entrySet() + .stream() + .filter(animalProbability -> animalProbability.getValue() > 0) + .filter(animalProbability -> entities.contains(animalProbability.getKey())) + .mapToInt(Map.Entry::getValue) + .sum(); + if (sumOfProbability == 0) { + doSleep(animal); + return; + } + + var filteredPersonalProbability = personalProbability.entrySet() + .stream() + .filter(animalProbability -> animalProbability.getValue() > 0).map(Map.Entry::getKey) + .sorted(Comparator.comparing(Function.identity())) + .toList(); + + var temp = ThreadLocalRandom.current().nextInt(1, sumOfProbability); + + for (String name : filteredPersonalProbability) { + if (entities.contains(name)) { + temp -= personalProbability.get(name); + if (temp <= 0) { + var food = location.getEntities().stream() + .filter(e -> e.getClass().getSimpleName().equals(name)).findAny(); + animal.eat(food.get()); + location.removeEntity(food.get()); + + } + } + } + } + + @Override + public void doReproduce(Animal animal, Location location) { + var getAnimalCountOnCage = Optional.ofNullable(location.getEntitiesCountStatistic().get(animal.getClass().getSimpleName())).orElse(0); + if (getAnimalCountOnCage >= animal.getMaxCountOnLocation()) { + return; + } + if (checkReproducePartner(animal, location)) { + location.addEntity(animal.reproduce()); + } + } + + @Override + public void doSleep(Animal animal) { + increaseHealth(animal); + } + + public void reduceHealth(Animal animal) { + double healthScale = animal.getHealth() - ((animal.getSaturation() * settings.getReduceHealth()) / 100); + animal.setHealth(healthScale); + } + + private boolean checkReproducePartner(Animal animal, Location location) { + var duplicate = location.getAnimals().stream() + .map(el -> el.getClass().getSimpleName()) + .filter(el -> el.equals(animal.getClass().getSimpleName())) + .count(); + return duplicate > 1; + } + + private void increaseHealth(Animal animal) { + double healthScale = animal.getHealth() + ((animal.getSaturation() * settings.getIncreaseHealth()) / 100); + animal.setHealth(healthScale); + } +} diff --git a/src/efanov/island/service/impl/StepServiceImpl.java b/src/efanov/island/service/impl/StepServiceImpl.java new file mode 100644 index 0000000..3e91936 --- /dev/null +++ b/src/efanov/island/service/impl/StepServiceImpl.java @@ -0,0 +1,76 @@ +package efanov.island.service.impl; + +import efanov.entities.animals.Animal; +import efanov.island.IslandMap; +import efanov.island.Location; +import efanov.island.service.StepService; + +import java.util.Optional; + +public class StepServiceImpl implements StepService { + public Location stepUp(Animal animal, Location location, IslandMap map) { + int currentX = location.getX(); + int currentY = location.getY(); + if (currentY > 0) { + Location newLocation = map.getLocations()[currentY - 1][currentX]; + if (cantStep(animal, newLocation)) { + return location; + } + newLocation.addEntity(animal); + location.removeEntity(animal); + return newLocation; + } + return location; + } + + public Location stepDown(Animal animal, Location location, IslandMap map) { + int currentX = location.getX(); + int currentY = location.getY(); + if (currentY < map.getHeight() - 1) { + Location newLocation = map.getLocations()[currentY + 1][currentX]; + if (cantStep(animal, newLocation)) { + return location; + } + newLocation.addEntity(animal); + location.removeEntity(animal); + return newLocation; + } + return location; + } + + public Location stepLeft(Animal animal, Location location, IslandMap map) { + int currentX = location.getX(); + int currentY = location.getY(); + if (currentX > 0) { + Location newLocation = map.getLocations()[currentY][currentX - 1]; + if (cantStep(animal, newLocation)) { + return location; + } + newLocation.addEntity(animal); + location.removeEntity(animal); + return newLocation; + } + return location; + } + + public Location stepRight(Animal animal, Location location, IslandMap map) { + int currentX = location.getX(); + int currentY = location.getY(); + if (currentX < map.getWidth() - 1) { + Location newLocation = map.getLocations()[currentY][currentX + 1]; + if (cantStep(animal, newLocation)) { + return location; + } + newLocation.addEntity(animal); + location.removeEntity(animal); + return newLocation; + } + return location; + } + + public boolean cantStep(Animal animal, Location newLocation) { + var animalCount = Optional.ofNullable(newLocation.getEntitiesCountStatistic().get(animal.getClass().getSimpleName())) + .orElse(0); + return animalCount >= animal.getMaxCountOnLocation(); + } +} diff --git a/src/efanov/properties/processing/Processor.java b/src/efanov/properties/processing/Processor.java index eca9baf..1cae66a 100644 --- a/src/efanov/properties/processing/Processor.java +++ b/src/efanov/properties/processing/Processor.java @@ -1,16 +1,15 @@ package efanov.properties.processing; +import efanov.constants.Constant; + import java.io.FileReader; import java.io.IOException; import java.util.Properties; public class Processor { - - public static final String ANIMAL_SETTINGS_PROPERTIES = "/Users/effgang/dev/Island/src/efanov/resources/animal-settings.properties"; - public String getEmojiFromFile(String param) { - try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { + try (FileReader reader = new FileReader(Constant.ANIMAL_SETTINGS_PROPERTIES)) { Properties properties = new Properties(); properties.load(reader); return properties.getProperty(param.toLowerCase() + ".emoji"); @@ -21,7 +20,7 @@ public String getEmojiFromFile(String param) { } public double getWeightFromFile(String param) { - try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { + try (FileReader reader = new FileReader(Constant.ANIMAL_SETTINGS_PROPERTIES)) { Properties properties = new Properties(); properties.load(reader); return Double.parseDouble(properties.getProperty(param.toLowerCase() + ".weight")); @@ -31,7 +30,7 @@ public double getWeightFromFile(String param) { } public int getMaxCountFromFile(String param) { - try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { + try (FileReader reader = new FileReader(Constant.ANIMAL_SETTINGS_PROPERTIES)) { Properties properties = new Properties(); properties.load(reader); return Integer.parseInt(properties.getProperty(param.toLowerCase() + ".maxCount")); @@ -41,7 +40,7 @@ public int getMaxCountFromFile(String param) { } public int getSpeedFromFile(String param) { - try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { + try (FileReader reader = new FileReader(Constant.ANIMAL_SETTINGS_PROPERTIES)) { Properties properties = new Properties(); properties.load(reader); return Integer.parseInt(properties.getProperty(param.toLowerCase() + ".speed")); @@ -51,7 +50,7 @@ public int getSpeedFromFile(String param) { } public double getSaturationFromFile(String param) { - try (FileReader reader = new FileReader(ANIMAL_SETTINGS_PROPERTIES)) { + try (FileReader reader = new FileReader(Constant.ANIMAL_SETTINGS_PROPERTIES)) { Properties properties = new Properties(); properties.load(reader); return Double.parseDouble(properties.getProperty(param.toLowerCase() + ".saturation")); diff --git a/src/efanov/resources/animal-settings.properties b/src/efanov/resources/animal-settings.properties index a109962..4f0082b 100644 --- a/src/efanov/resources/animal-settings.properties +++ b/src/efanov/resources/animal-settings.properties @@ -1,94 +1,94 @@ -bear.emoji = \ud83d\udc3b -bear.weight = 500 -bear.maxCount = 5 -bear.speed = 2 -bear.saturation = 80 - -wolf.emoji = \ud83d\udc3a -wolf.weight = 50 -wolf.maxCount = 30 -wolf.speed = 3 -wolf.saturation = 8 - -boa.emoji = \ud83d\udc0d -boa.weight = 15 -boa.maxCount = 30 -boa.speed = 1 -boa.saturation = 3 - -fox.emoji = \uD83E\uDD8A -fox.weight = 8 -fox.maxCount = 30 -fox.speed = 2 -fox.saturation = 2 - -eagle.emoji = \uD83E\uDD85 -eagle.weight = 6 -eagle.maxCount = 20 -eagle.speed = 3 -eagle.saturation = 1 - -horse.emoji = \uD83D\uDC34 -horse.weight = 400 -horse.maxCount = 20 -horse.speed = 4 -horse.saturation = 60 - -deer.emoji = \uD83E\uDD8C -deer.weight = 300 -deer.maxCount = 20 -deer.speed = 4 -deer.saturation = 50 - -rabbit.emoji = \uD83D\uDC30 -rabbit.weight = 2 -rabbit.maxCount = 150 -rabbit.speed = 2 -rabbit.saturation = 0.45 - -mouse.emoji = \uD83D\uDC2D -mouse.weight = 0.05 -mouse.maxCount = 500 -mouse.speed = 1 -mouse.saturation = 0.01 - -goat.emoji = \uD83D\uDC10 -goat.weight = 60 -goat.maxCount = 140 -goat.speed = 3 -goat.saturation = 10 - -sheep.emoji = \uD83D\uDC11 -sheep.weight = 70 -sheep.maxCount = 140 -sheep.speed = 3 -sheep.saturation = 15 - -wildboar.emoji = \uD83D\uDC17 -wildboar.weight = 400 -wildboar.maxCount = 50 -wildboar.speed = 2 -wildboar.saturation = 50 - -buffalo.emoji = \uD83D\uDC02 -buffalo.weight = 700 -buffalo.maxCount = 10 -buffalo.speed = 3 -buffalo.saturation = 100 - -duck.emoji = \uD83E\uDD86 -duck.weight = 1 -duck.maxCount = 200 -duck.speed = 4 -duck.saturation = 0.15 - -caterpillar.emoji = \uD83D\uDC1B -caterpillar.weight = 0.01 -caterpillar.maxCount = 1000 -caterpillar.speed = 0 -caterpillar.saturation = 0 - -plant.emoji = \uD83C\uDF3F -plant.weight = 1 -plant.maxCount = 200 +bear.emoji=\ud83d\udc3b +bear.weight=500 +bear.maxCount=5 +bear.speed=2 +bear.saturation=80 + +wolf.emoji=\ud83d\udc3a +wolf.weight=50 +wolf.maxCount=30 +wolf.speed=3 +wolf.saturation=8 + +boa.emoji=\ud83d\udc0d +boa.weight=15 +boa.maxCount=30 +boa.speed=1 +boa.saturation=3 + +fox.emoji=\uD83E\uDD8A +fox.weight=8 +fox.maxCount=30 +fox.speed=2 +fox.saturation=2 + +eagle.emoji=\uD83E\uDD85 +eagle.weight=6 +eagle.maxCount=20 +eagle.speed=3 +eagle.saturation=1 + +horse.emoji=\uD83D\uDC34 +horse.weight=400 +horse.maxCount=20 +horse.speed=4 +horse.saturation=60 + +deer.emoji=\uD83E\uDD8C +deer.weight=300 +deer.maxCount=20 +deer.speed=4 +deer.saturation=50 + +rabbit.emoji=\uD83D\uDC30 +rabbit.weight=2 +rabbit.maxCount=150 +rabbit.speed=2 +rabbit.saturation=0.45 + +mouse.emoji=\uD83D\uDC2D +mouse.weight=0.05 +mouse.maxCount=500 +mouse.speed=1 +mouse.saturation=0.01 + +goat.emoji=\uD83D\uDC10 +goat.weight=60 +goat.maxCount=140 +goat.speed=3 +goat.saturation=10 + +sheep.emoji=\uD83D\uDC11 +sheep.weight=70 +sheep.maxCount=140 +sheep.speed=3 +sheep.saturation=15 + +wildboar.emoji=\uD83D\uDC17 +wildboar.weight=400 +wildboar.maxCount=50 +wildboar.speed=2 +wildboar.saturation=50 + +buffalo.emoji=\uD83D\uDC02 +buffalo.weight=700 +buffalo.maxCount=10 +buffalo.speed=3 +buffalo.saturation=100 + +duck.emoji=\uD83E\uDD86 +duck.weight=1 +duck.maxCount=200 +duck.speed=4 +duck.saturation=0.15 + +caterpillar.emoji=\uD83D\uDC1B +caterpillar.weight=0.01 +caterpillar.maxCount=1000 +caterpillar.speed=0 +caterpillar.saturation=0 + +plant.emoji=\uD83C\uDF3F +plant.weight=1 +plant.maxCount=200 diff --git a/src/efanov/resources/probability.yaml b/src/efanov/resources/probability.yaml index 30d2faa..4c3e1df 100644 --- a/src/efanov/resources/probability.yaml +++ b/src/efanov/resources/probability.yaml @@ -1,255 +1,254 @@ -eatingProbability: - Wolf: - Boa: 0 - Fox: 0 - Bear: 0 - Eagle: 0 - Horse: 10 - Deer: 15 - Rabbit: 60 - Mouse: 80 - Goat: 60 - Sheep: 70 - WildBoar: 15 - Buffalo: 10 - Duck: 40 - Caterpillar: 0 - Herb: 0 +Wolf: + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 10 + Deer: 15 + Rabbit: 60 + Mouse: 80 + Goat: 60 + Sheep: 70 + WildBoar: 15 + Buffalo: 10 + Duck: 40 + Caterpillar: 0 + Herb: 0 - Boa: - Wolf: 0 - Fox: 15 - Bear: 0 - Eagle: 0 - Horse: 0 - Deer: 0 - Rabbit: 20 - Mouse: 40 - Goat: 0 - Sheep: 0 - WildBoar: 0 - Buffalo: 0 - Duck: 10 - Caterpillar: 0 - Herb: 0 +Boa: + Wolf: 0 + Fox: 15 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 20 + Mouse: 40 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 10 + Caterpillar: 0 + Herb: 0 - Fox: - Wolf: 0 - Boa: 0 - Bear: 0 - Eagle: 0 - Horse: 0 - Deer: 0 - Rabbit: 70 - Mouse: 90 - Goat: 0 - Sheep: 0 - WildBoar: 0 - Buffalo: 0 - Duck: 60 - Caterpillar: 40 - Herb: 0 +Fox: + Wolf: 0 + Boa: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 70 + Mouse: 90 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 60 + Caterpillar: 40 + Herb: 0 - Bear: - Wolf: 0 - Boa: 80 - Fox: 0 - Eagle: 0 - Horse: 40 - Deer: 80 - Rabbit: 80 - Mouse: 90 - Goat: 70 - Sheep: 70 - WildBoar: 50 - Buffalo: 20 - Duck: 10 - Caterpillar: 0 - Herb: 0 +Bear: + Wolf: 0 + Boa: 80 + Fox: 0 + Eagle: 0 + Horse: 40 + Deer: 80 + Rabbit: 80 + Mouse: 90 + Goat: 70 + Sheep: 70 + WildBoar: 50 + Buffalo: 20 + Duck: 10 + Caterpillar: 0 + Herb: 0 - Eagle: - Wolf: 0 - Boa: 0 - Fox: 10 - Bear: 0 - Horse: 0 - Deer: 0 - Rabbit: 90 - Mouse: 90 - Goat: 0 - Sheep: 0 - WildBoar: 0 - Buffalo: 0 - Duck: 80 - Caterpillar: 0 - Herb: 0 +Eagle: + Wolf: 0 + Boa: 0 + Fox: 10 + Bear: 0 + Horse: 0 + Deer: 0 + Rabbit: 90 + Mouse: 90 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 80 + Caterpillar: 0 + Herb: 0 - Horse: - Wolf: 0 - Boa: 0 - Fox: 0 - Bear: 0 - Eagle: 0 - Deer: 0 - Rabbit: 0 - Mouse: 0 - Goat: 0 - Sheep: 0 - WildBoar: 0 - Buffalo: 0 - Duck: 0 - Caterpillar: 0 - Herb: 100 +Horse: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 - Deer: - Wolf: 0 - Boa: 0 - Fox: 0 - Bear: 0 - Eagle: 0 - Horse: 0 - Rabbit: 0 - Mouse: 0 - Goat: 0 - Sheep: 0 - WildBoar: 0 - Buffalo: 0 - Duck: 0 - Caterpillar: 0 - Herb: 100 +Deer: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 - Rabbit: - Wolf: 0 - Boa: 0 - Fox: 0 - Bear: 0 - Eagle: 0 - Horse: 0 - Deer: 0 - Mouse: 0 - Goat: 0 - Sheep: 0 - WildBoar: 0 - Buffalo: 0 - Duck: 0 - Caterpillar: 0 - Herb: 100 +Rabbit: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Mouse: 0 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 - Mouse: - Wolf: 0 - Boa: 0 - Fox: 0 - Bear: 0 - Eagle: 0 - Horse: 0 - Deer: 0 - Rabbit: 0 - Goat: 0 - Sheep: 0 - WildBoar: 0 - Buffalo: 0 - Duck: 0 - Caterpillar: 90 - Herb: 100 +Mouse: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Goat: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 90 + Herb: 100 - Goat: - Wolf: 0 - Boa: 0 - Fox: 0 - Bear: 0 - Eagle: 0 - Horse: 0 - Deer: 0 - Rabbit: 0 - Mouse: 0 - Sheep: 0 - WildBoar: 0 - Buffalo: 0 - Duck: 0 - Caterpillar: 0 - Herb: 100 +Goat: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Sheep: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 - Sheep: - Wolf: 0 - Boa: 0 - Fox: 0 - Bear: 0 - Eagle: 0 - Horse: 0 - Deer: 0 - Rabbit: 0 - Mouse: 0 - Goat: 0 - WildBoar: 0 - Buffalo: 0 - Duck: 0 - Caterpillar: 0 - Herb: 100 +Sheep: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + WildBoar: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 - WildBoar: - Wolf: 0 - Boa: 0 - Fox: 0 - Bear: 0 - Eagle: 0 - Horse: 0 - Deer: 0 - Rabbit: 0 - Mouse: 50 - Goat: 0 - Sheep: 0 - Buffalo: 0 - Duck: 0 - Caterpillar: 90 - Herb: 100 +WildBoar: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 50 + Goat: 0 + Sheep: 0 + Buffalo: 0 + Duck: 0 + Caterpillar: 90 + Herb: 100 - Buffalo: - Wolf: 0 - Boa: 0 - Fox: 0 - Bear: 0 - Eagle: 0 - Horse: 0 - Deer: 0 - Rabbit: 0 - Mouse: 0 - Goat: 0 - WildBoar: 0 - Sheep: 0 - Duck: 0 - Caterpillar: 0 - Herb: 100 +Buffalo: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + WildBoar: 0 + Sheep: 0 + Duck: 0 + Caterpillar: 0 + Herb: 100 - Duck: - Wolf: 0 - Boa: 0 - Fox: 0 - Bear: 0 - Eagle: 0 - Horse: 0 - Deer: 0 - Rabbit: 0 - Mouse: 0 - Goat: 0 - WildBoar: 0 - Sheep: 0 - Buffalo: 0 - Caterpillar: 90 - Herb: 100 +Duck: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + WildBoar: 0 + Sheep: 0 + Buffalo: 0 + Caterpillar: 90 + Herb: 100 - Caterpillar: - Wolf: 0 - Boa: 0 - Fox: 0 - Bear: 0 - Eagle: 0 - Horse: 0 - Deer: 0 - Rabbit: 0 - Mouse: 0 - Goat: 0 - WildBoar: 0 - Sheep: 0 - Buffalo: 0 - Duck: 0 - Herb: 100 \ No newline at end of file +Caterpillar: + Wolf: 0 + Boa: 0 + Fox: 0 + Bear: 0 + Eagle: 0 + Horse: 0 + Deer: 0 + Rabbit: 0 + Mouse: 0 + Goat: 0 + WildBoar: 0 + Sheep: 0 + Buffalo: 0 + Duck: 0 + Herb: 100 \ No newline at end of file diff --git a/src/efanov/simulation/SimulationSettings.java b/src/efanov/simulation/SimulationSettings.java index 1e9ff66..a578140 100644 --- a/src/efanov/simulation/SimulationSettings.java +++ b/src/efanov/simulation/SimulationSettings.java @@ -3,10 +3,17 @@ import lombok.Getter; import lombok.Setter; -@Getter + @Setter +@Getter public class SimulationSettings { + public static final int INITIAL_GROW_TIME = 100; private int width = 100; private int height = 20; - private int entityCountOnCage = 100; + private int entityCountOnCage = 10; + private double reduceHealth = 15; + private double increaseHealth = 15; + private int plantGrowTime = 200; + private int lifeCycleTact = 200; + } diff --git a/src/efanov/simulation/SimulationStarter.java b/src/efanov/simulation/SimulationStarter.java index 8affb57..0afbf23 100644 --- a/src/efanov/simulation/SimulationStarter.java +++ b/src/efanov/simulation/SimulationStarter.java @@ -1,23 +1,41 @@ package efanov.simulation; +import efanov.dialog.UserDialog; +import efanov.entities.animals.EatingMap; import efanov.island.IslandController; import efanov.island.IslandMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + public class SimulationStarter { - private final IslandMap islandMap; + public static ScheduledExecutorService executorService; private final SimulationSettings simulationSettings; private final IslandController controller; + private final IslandMap islandMap; + private final UserDialog dialog; public SimulationStarter() { + this.dialog = new UserDialog(); this.simulationSettings = new SimulationSettings(); - this.islandMap = new IslandMap(simulationSettings.getWidth(), simulationSettings.getHeight()); - this.controller = new IslandController(islandMap,null,simulationSettings); + EatingMap eatingMap = new EatingMap(); + this.islandMap = new IslandMap(simulationSettings); + this.controller = new IslandController(islandMap, eatingMap, simulationSettings); + executorService = Executors.newSingleThreadScheduledExecutor(); } public void start() { + dialog.showMenuAndChangeParameters(simulationSettings); controller.getMap().init(); controller.getMap().fillIsland(simulationSettings.getEntityCountOnCage()); - System.out.println(); + executorService.scheduleWithFixedDelay(islandMap.plantGrow(), + SimulationSettings.INITIAL_GROW_TIME, + simulationSettings.getPlantGrowTime(), + TimeUnit.MILLISECONDS); + controller.startLife(); + } + } diff --git a/src/efanov/statistic/Statistic.java b/src/efanov/statistic/Statistic.java new file mode 100644 index 0000000..c06c6dd --- /dev/null +++ b/src/efanov/statistic/Statistic.java @@ -0,0 +1,40 @@ +package efanov.statistic; + +import efanov.entities.Entity; +import efanov.island.IslandMap; +import efanov.island.Location; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class Statistic { + public static final String EMOJI_KEY_VALUE = "{0} - {1}"; + private final IslandMap islandMap; + + public Statistic(IslandMap islandMap) { + this.islandMap = islandMap; + } + + public Map getAllEntitiesStatistic() { + Map allEntitiesStatistic = new ConcurrentHashMap<>(); + for (int y = 0; y < islandMap.getHeight(); y++) { + for (int x = 0; x < islandMap.getWidth(); x++) { + Location location = islandMap.getLocations()[y][x]; + List entities = location.getEntities(); + for (Entity entity : entities) { + String emoji = entity.getEmoji(); + allEntitiesStatistic.merge(emoji, 1, (oldValue, newValue) -> oldValue + 1); + } + } + } + return allEntitiesStatistic; + } + + public void printStatistic(Map allEntitiesStatistic) { + allEntitiesStatistic.forEach((key, value) -> System.out.println(MessageFormat.format(EMOJI_KEY_VALUE, key, value))); + System.out.println("\n"); + } + +} From 1100e90158f2965a7baa0b27ae4d5a62bbaabcb3 Mon Sep 17 00:00:00 2001 From: sefanov Date: Wed, 13 Dec 2023 23:43:39 +0300 Subject: [PATCH 6/6] delete img.png --- img.png | Bin 95525 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 img.png diff --git a/img.png b/img.png deleted file mode 100644 index 6cc5230a47845c130fb5f82faa604293b91a88c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95525 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%0AAQ%U1MYQ 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%0A9tyB-oBw_R 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