package com.deftwun.zombiecopter.systems;
import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.systems.IteratingSystem;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Logger;
import com.deftwun.zombiecopter.ComponentMappers;
import com.deftwun.zombiecopter.App;
import com.deftwun.zombiecopter.components.ChildComponent;
import com.deftwun.zombiecopter.components.ControllerComponent;
import com.deftwun.zombiecopter.components.GunComponent;
import com.deftwun.zombiecopter.components.MeleeComponent;
import com.deftwun.zombiecopter.components.PhysicsComponent;
import com.deftwun.zombiecopter.components.TimeToLiveComponent;
public class WeaponSystem extends IteratingSystem {
private Logger logger = new Logger("WeaponSystem",Logger.INFO);
private Vector2 pos = new Vector2(),
vel = new Vector2();
@SuppressWarnings("unchecked")
public WeaponSystem(){
super(Family.one(GunComponent.class,MeleeComponent.class).get());
logger.debug("initializing");
}
@Override
protected void processEntity(Entity entity, float deltaTime) {
ComponentMappers mappers = App.engine.mappers;
PhysicsComponent physics = mappers.physics.get(entity);
GunComponent gun = mappers.gun.get(entity);
MeleeComponent melee = mappers.melee.get(entity);
ControllerComponent controller = mappers.controller.get(entity);
//Shoot Gun
if (gun != null){
gun.triggerPulled = controller.attack;
gun.time += deltaTime;
if (gun.triggerPulled && gun.time >= gun.cooldown){
logger.debug(String.format("Entity %s is firing",entity.getId()));
vel.set(controller.lookVector).nor().scl(gun.bulletSpeed).add(physics.getLinearVelocity());
vel.rotate(MathUtils.random(gun.spreadAngle)-gun.spreadAngle/2);
pos.set(gun.offset).rotate(controller.lookVector.angle()).add(physics.getPosition());
Entity bulletEntity = App.engine.factory.build(gun.projectileName,pos,vel,controller.lookVector.angle());
if (bulletEntity != null){
//Time to live
TimeToLiveComponent ttl = App.engine.createComponent(TimeToLiveComponent.class);
ttl.timeLimit = gun.range / gun.bulletSpeed;
//Parent
ChildComponent child = App.engine.createComponent(ChildComponent.class);
child.parentEntity = entity;
bulletEntity.add(ttl);
bulletEntity.add(child);
gun.time = 0;
}
}
}
//Melee Attack
if (melee != null){
melee.triggerPulled = controller.attack;
melee.time += deltaTime;
String status = String.format("Melee.target = %b\n TriggerPulled = %b\n Cooled = %b",
melee.target != null,melee.triggerPulled,melee.time >= melee.coolDown);
logger.debug(status);
if (melee.target != null && melee.triggerPulled && melee.time >= melee.coolDown){
logger.debug("Entity " + entity.getId() + " is meleeing");
Vector2 targetPosition = mappers.physics.get(melee.target).getPosition();
App.engine.systems.damage.dealDamage(entity,melee.target,melee.damage,targetPosition.sub(physics.getPosition()).angle());
melee.time = 0;
}
}
}
}