package com.corosus.game.system;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import com.artemis.Aspect;
import com.artemis.ComponentMapper;
import com.artemis.Entity;
import com.artemis.systems.IntervalEntityProcessingSystem;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.controllers.Controller;
import com.badlogic.gdx.controllers.Controllers;
import com.badlogic.gdx.math.Vector2;
import com.corosus.game.GameSettings;
import com.corosus.game.Game_AI_TestBed;
import com.corosus.game.Logger;
import com.corosus.game.client.assets.GameAssetManager;
import com.corosus.game.client.input.XBox360Pad;
import com.corosus.game.component.EntityData;
import com.corosus.game.component.Position;
import com.corosus.game.component.ProfileData;
import com.corosus.game.component.Velocity;
import com.corosus.game.component.WeaponData;
import com.corosus.game.component.WeaponData.Weapon;
import com.corosus.game.factory.EntityFactory;
import com.corosus.game.factory.spawnable.SpawnableTypes;
public class GameInput extends IntervalEntityProcessingSystem {
//keyboard
public static HashMap<Integer, Boolean> lookupKeysDown = new HashMap<Integer, Boolean>();
//mouse
public static float mouseX = 0;
public static float mouseY = 0;
public static HashMap<Integer, Boolean> lookupMouseDown = new HashMap<Integer, Boolean>();
//xbox controller
public static Controller controller = null;
private ComponentMapper<Position> mapPos;
private ComponentMapper<Velocity> mapVelocity;
private ComponentMapper<ProfileData> mapProfile;
private ComponentMapper<WeaponData> mapWeapons;
private ComponentMapper<EntityData> mapEntData;
public GameInput(float interval) {
super(Aspect.exclude(), interval);
/*lookupKeysDown.put(Input.Keys.W, false);
lookupKeysDown.put(Input.Keys.A, false);
lookupKeysDown.put(Input.Keys.S, false);
lookupKeysDown.put(Input.Keys.D, false);
lookupKeysDown.put(Input.Keys.SHIFT_LEFT, false);*/
}
@Override
protected void process(Entity e) {
}
@Override
protected void processSystem() {
//Logger.dbg("tick " + this);
if (controller == null) {
if (Controllers.getControllers().size > 0) {
System.out.println("controllers found: " + Controllers.getControllers().size);
controller = Controllers.getControllers().first();
}
} else {
}
Iterator<Entry<Integer, Boolean>> iter = lookupKeysDown.entrySet().iterator();
Entity player = Game_AI_TestBed.instance().getActiveLevel().getPlayerEntity();
while (iter.hasNext()) {
Map.Entry<Integer, Boolean> entry = iter.next();
if (!entry.getValue()) continue;
int keycode = entry.getKey();
float speed = 15;
if (keycode == Input.Keys.UP) {
Game_AI_TestBed.instance().getCamera().translate(0, speed);
}
if (keycode == Input.Keys.DOWN) {
Game_AI_TestBed.instance().getCamera().translate(0, -speed);
}
if (keycode == Input.Keys.LEFT) {
Game_AI_TestBed.instance().getCamera().translate(-speed, 0);
}
if (keycode == Input.Keys.RIGHT) {
Game_AI_TestBed.instance().getCamera().translate(speed, 0);
}
if (player != null) {
}
//if (entry.getKey() == )
}
if (player != null) {
Velocity vel = mapVelocity.get(player);
Position pos = mapPos.get(player);
ProfileData profile = mapProfile.get(player);
WeaponData weapons = mapWeapons.get(player);
EntityData entData = mapEntData.get(player);
//force no movement unless input
vel.x = 0F;
vel.y = 0;
//process controller
if (controller != null) {
System.out.println("data: " + controller.getAxis(XBox360Pad.AXIS_LEFT_X));
float vecX = controller.getAxis(XBox360Pad.AXIS_LEFT_X);
float vecY = -controller.getAxis(XBox360Pad.AXIS_LEFT_Y);
float deadZone = 0.25F;
if (vecX < -deadZone || vecX > deadZone) {
vel.x = profile.moveSpeed * vecX;
}
if (vecY < -deadZone || vecY > deadZone) {
vel.y = profile.moveSpeed * vecY;
}
} else {
//System.out.println("cant find controller!");
}
try {
boolean gridMovement = true;
if (gridMovement) {
if (keyDown(Input.Keys.A)) {
vel.x += -profile.moveSpeed;
//x = true;
}
if (keyDown(Input.Keys.D)) {
vel.x += profile.moveSpeed;
//if (x) vel.x = 0;
}
if (keyDown(Input.Keys.W)) {
vel.y += profile.moveSpeed;
//y = true;
}
if (keyDown(Input.Keys.S)) {
vel.y += -profile.moveSpeed;
//if (y) vel.y = 0;
}
} else {
if (keyDown(Input.Keys.W)) {
double rot = Math.toRadians(pos.rotationYaw);
vel.y += (float) (Math.sin(rot));
vel.x += (float) (Math.cos(rot));
}
if (keyDown(Input.Keys.S)) {
double rot = Math.toRadians(pos.rotationYaw + 180);
vel.y += (float) (Math.sin(rot));
vel.x += (float) (Math.cos(rot));
}
if (keyDown(Input.Keys.A)) {
double rot = Math.toRadians(pos.rotationYaw + 90);
vel.y += (float) (Math.sin(rot));
vel.x += (float) (Math.cos(rot));
}
if (keyDown(Input.Keys.D)) {
double rot = Math.toRadians(pos.rotationYaw - 90);
vel.y += (float) (Math.sin(rot));
vel.x += (float) (Math.cos(rot));
}
}
//dodge
if (keyDown(Input.Keys.SHIFT_LEFT)) {
float velX = vel.x;
float velY = vel.y;
double length = Math.sqrt(velX * velX + velY * velY);
if (length > 0) {
velX /= length;
velY /= length;
}
float dodgeSpeed = profile.moveSpeed * 3;
velX *= dodgeSpeed;
velY *= dodgeSpeed;
//try to activate the dodge which is currently added to index 0
//TODO: assign a more sane action/skill system
boolean result = profile.listRoutines.get(0).tryActivate(new Vector2(velX, velY));
if (result) {
//Logger.dbg("dodged!");
//GameAssetManager.instance().getSound("test").play(0.3F);
} else {
//Logger.dbg("cant dodge");
}
}
//normalize speed
double length = Math.sqrt(vel.x * vel.x + vel.y * vel.y);
if (length > 0) {
vel.x /= length;
vel.y /= length;
}
vel.x *= profile.moveSpeed;
vel.y *= profile.moveSpeed;
//mouse shoot
if (mouseDown(0)) {
if (weapons.hasPrimaryWeapon()) {
Weapon weapon = weapons.getActivePrimary();
if (weapon.canFire()) {
//TODO: group this stuff together better
weapon.fire();
GameAssetManager.instance().getSound("shoot").play(GameSettings.vol);
double rot = Math.toRadians(pos.rotationYaw + 90);
float vecX = (float) (Math.sin(rot))/* * profile.moveSpeed * 2F*/;
float vecY = (float) (-Math.cos(rot))/* * profile.moveSpeed * 2F*/;
EntityFactory.getEntity(weapon.projectileType).prepareFromData(entData.levelID, pos.x + vecX, pos.y + vecY, EntityData.TEAM_PLAYER, vecX, vecY);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
//process keys
iter = lookupKeysDown.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<Integer, Boolean> entry = iter.next();
if (!entry.getValue()) continue;
int keycode = entry.getKey();
//boolean x = false;
//boolean y = false;
}
//process mouse
float screenSizeX = Gdx.graphics.getWidth();
float screenSizeY = Gdx.graphics.getHeight();
float cameraX = Game_AI_TestBed.instance().getCamera().position.x;
float cameraY = Game_AI_TestBed.instance().getCamera().position.y;
float mapCoordX = cameraX - (screenSizeX/2) + mouseX;
float mapCoordY = cameraY - (screenSizeY/2) + (screenSizeY - mouseY);
//System.out.println("screen: " + screenSizeX + " - " + screenSizeY);
//System.out.println("camera: " + cameraX + " - " + cameraY);
//System.out.println("mouse: " + mouseX + " - " + mouseY);
/*pos.x = mapCoordX;
pos.y = mapCoordY;*/
/*vel.x = -(pos.x - mapCoordX);
vel.y = -(pos.y - mapCoordY);*/
//make rotationYaw be aimed at mouse
float vecX = -(pos.x - mapCoordX);
float vecY = -(pos.y - mapCoordY);
double angle = Math.toDegrees(Math.atan2(vecY, vecX));
if (angle < 0) angle += 360;
pos.rotationYaw = (float) angle;
//System.out.println(angle);
//Orient.fromAngle(angle);
}
//super.processSystem();
}
public boolean keyDown(int keyCode) {
if (!lookupKeysDown.containsKey(keyCode)) return false;
return lookupKeysDown.get(keyCode);
}
public boolean mouseDown(int buttonCode) {
if (!lookupMouseDown.containsKey(buttonCode)) return false;
return lookupMouseDown.get(buttonCode);
}
}