From b07dc822e274d54ae309e678ad5b7b483863ab81 Mon Sep 17 00:00:00 2001 From: Jeasonfire Date: Mon, 18 May 2015 02:09:12 +0300 Subject: [PATCH 1/2] Added berserker AI. (WIP) --- .../gladiator/level/premade/Round1Level.java | 3 +- .../gladiator/listeners/ai/BerserkerAI.java | 73 +++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 core/src/com/saltosion/gladiator/listeners/ai/BerserkerAI.java diff --git a/core/src/com/saltosion/gladiator/level/premade/Round1Level.java b/core/src/com/saltosion/gladiator/level/premade/Round1Level.java index 5badf4a..2acc512 100644 --- a/core/src/com/saltosion/gladiator/level/premade/Round1Level.java +++ b/core/src/com/saltosion/gladiator/level/premade/Round1Level.java @@ -4,6 +4,7 @@ import com.badlogic.ashley.core.Entity; import com.badlogic.gdx.math.Vector2; import com.saltosion.gladiator.components.CAI; import com.saltosion.gladiator.level.Level; +import com.saltosion.gladiator.listeners.ai.BerserkerAI; import com.saltosion.gladiator.listeners.ai.HeavenWorshiperAI; import com.saltosion.gladiator.util.AppUtil; import com.saltosion.gladiator.util.Direction; @@ -42,7 +43,7 @@ public class Round1Level implements Level { enemies.add(AppUtil.entityFactory.createEnemy(new Vector2(10, 2), Direction.LEFT, new CAI().setReactDistance(12f).setAIListener(new HeavenWorshiperAI()))); enemies.add(AppUtil.entityFactory.createEnemy(new Vector2(-10, 2), Direction.RIGHT, - new CAI().setReactDistance(12f).setAIListener(new HeavenWorshiperAI()))); + new CAI().setReactDistance(12f).setAIListener(new BerserkerAI()))); } } diff --git a/core/src/com/saltosion/gladiator/listeners/ai/BerserkerAI.java b/core/src/com/saltosion/gladiator/listeners/ai/BerserkerAI.java new file mode 100644 index 0000000..b2599f1 --- /dev/null +++ b/core/src/com/saltosion/gladiator/listeners/ai/BerserkerAI.java @@ -0,0 +1,73 @@ +package com.saltosion.gladiator.listeners.ai; + +import com.badlogic.ashley.core.Entity; +import com.saltosion.gladiator.components.CCombat; +import com.saltosion.gladiator.components.CPhysics; +import com.saltosion.gladiator.listeners.AIListener; +import com.saltosion.gladiator.util.Direction; +import java.util.ArrayList; + +public class BerserkerAI implements AIListener { + + @Override + public void react(ArrayList closeEntities, Entity host) { + float dist = -1; + Entity closestEntity = null; + CPhysics p0 = host.getComponent(CPhysics.class); + p0.movingRight = false; + p0.movingLeft = false; + + for (Entity entity : closeEntities) { + CPhysics p1 = entity.getComponent(CPhysics.class); + float newDist = p0.getPosition().cpy().add(p1.getPosition().cpy().scl(-1)).len(); + if (dist == -1 || newDist < dist) { + dist = newDist; + closestEntity = entity; + } + } + if (closestEntity == null) { + return; + } + + CPhysics p1 = closestEntity.getComponent(CPhysics.class); + if (p0.getPosition().x + p0.getSize().x / 3 < p1.getPosition().x - p1.getSize().x / 3) { + p0.movingRight = true; + } else if (p0.getPosition().x - p0.getSize().x / 3 > p1.getPosition().x + p1.getSize().x / 3) { + p0.movingLeft = true; + } + + CCombat c0 = host.getComponent(CCombat.class); + c0.inputs.put(Direction.RIGHT, false); + c0.inputs.put(Direction.LEFT, false); + c0.inputs.put(Direction.UP, false); + c0.inputs.put(Direction.DOWN, false); + if (dist < c0.getSwingSize().x) { + if (Math.random() < 0.5) { + switch ((int) Math.ceil(Math.random() * 4)) { + default: + case 1: + c0.inputs.put(Direction.RIGHT, true); + break; + case 2: + c0.inputs.put(Direction.LEFT, true); + break; + case 3: + c0.inputs.put(Direction.UP, true); + break; + case 4: + c0.inputs.put(Direction.DOWN, true); + break; + } + } else if (p0.getPosition().x + p0.getSize().x / 3 < p1.getPosition().x - p1.getSize().x / 3) { + c0.inputs.put(Direction.RIGHT, true); + } else if (p0.getPosition().x - p0.getSize().x / 3 > p1.getPosition().x + p1.getSize().x / 3) { + c0.inputs.put(Direction.LEFT, true); + } else if (p0.getPosition().y < p0.getPosition().y) { + c0.inputs.put(Direction.UP, true); + } else if (p0.getPosition().y > p0.getPosition().y) { + c0.inputs.put(Direction.DOWN, true); + } + } + } + +} From f9668d4333de03c40254b078b133656da9f82e5e Mon Sep 17 00:00:00 2001 From: Jeasonfire Date: Mon, 18 May 2015 02:20:10 +0300 Subject: [PATCH 2/2] Improved berserker AI. --- .../gladiator/listeners/ai/BerserkerAI.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/core/src/com/saltosion/gladiator/listeners/ai/BerserkerAI.java b/core/src/com/saltosion/gladiator/listeners/ai/BerserkerAI.java index b2599f1..52c15d1 100644 --- a/core/src/com/saltosion/gladiator/listeners/ai/BerserkerAI.java +++ b/core/src/com/saltosion/gladiator/listeners/ai/BerserkerAI.java @@ -5,6 +5,7 @@ import com.saltosion.gladiator.components.CCombat; import com.saltosion.gladiator.components.CPhysics; import com.saltosion.gladiator.listeners.AIListener; import com.saltosion.gladiator.util.Direction; +import com.saltosion.gladiator.util.Log; import java.util.ArrayList; public class BerserkerAI implements AIListener { @@ -41,8 +42,8 @@ public class BerserkerAI implements AIListener { c0.inputs.put(Direction.LEFT, false); c0.inputs.put(Direction.UP, false); c0.inputs.put(Direction.DOWN, false); - if (dist < c0.getSwingSize().x) { - if (Math.random() < 0.5) { + if (dist < c0.getSwingSize().x + c0.getSwingSize().y) { + if (Math.random() < 0.8) { switch ((int) Math.ceil(Math.random() * 4)) { default: case 1: @@ -58,14 +59,19 @@ public class BerserkerAI implements AIListener { c0.inputs.put(Direction.DOWN, true); break; } - } else if (p0.getPosition().x + p0.getSize().x / 3 < p1.getPosition().x - p1.getSize().x / 3) { - c0.inputs.put(Direction.RIGHT, true); - } else if (p0.getPosition().x - p0.getSize().x / 3 > p1.getPosition().x + p1.getSize().x / 3) { - c0.inputs.put(Direction.LEFT, true); - } else if (p0.getPosition().y < p0.getPosition().y) { - c0.inputs.put(Direction.UP, true); - } else if (p0.getPosition().y > p0.getPosition().y) { - c0.inputs.put(Direction.DOWN, true); + } else { + if (p0.getPosition().x + p0.getSize().x / 3 < p1.getPosition().x - p1.getSize().x / 3) { + c0.inputs.put(Direction.RIGHT, true); + } else if (p0.getPosition().x - p0.getSize().x / 3 > p1.getPosition().x + p1.getSize().x / 3) { + c0.inputs.put(Direction.LEFT, true); + } + if (p0.getPosition().y < p1.getPosition().y) { + Log.info("asd"); + c0.inputs.put(Direction.UP, true); + } else if (p0.getPosition().y > p1.getPosition().y) { + Log.info("asd"); + c0.inputs.put(Direction.DOWN, true); + } } } }