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); + } + } + } + +}