package com.angrykings.activities;
import android.app.Dialog;
import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import com.angrykings.AngryParallaxBackground;
import com.angrykings.BuildConfig;
import com.angrykings.GameConfig;
import com.angrykings.GameContext;
import com.angrykings.GameHUD;
import com.angrykings.GameStatus;
import com.angrykings.PhysicalEntity;
import com.angrykings.PhysicsManager;
import com.angrykings.Player;
import com.angrykings.R;
import com.angrykings.ResourceManager;
import com.angrykings.castles.Castle;
import com.angrykings.maps.BasicMap;
import org.andengine.engine.camera.ZoomCamera;
import org.andengine.engine.handler.IUpdateHandler;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.andengine.entity.modifier.AlphaModifier;
import org.andengine.entity.scene.IOnSceneTouchListener;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.ParallaxBackground;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.util.FPSLogger;
import org.andengine.input.touch.TouchEvent;
import org.andengine.input.touch.detector.PinchZoomDetector;
import org.andengine.input.touch.detector.ScrollDetector;
import org.andengine.input.touch.detector.SurfaceScrollDetector;
import org.andengine.ui.activity.BaseGameActivity;
import org.andengine.util.debug.Debug;
import java.util.ArrayList;
public class GameActivity extends BaseGameActivity implements
IOnSceneTouchListener, ScrollDetector.IScrollDetectorListener,
PinchZoomDetector.IPinchZoomDetectorListener {
//
// Core
//
protected GameContext gc;
protected GameHUD hud;
protected ResourceManager rm;
protected Scene scene;
protected ZoomCamera camera;
//
// Game Objects
//
protected GameStatus status;
protected Player me;
protected Player partner;
protected BasicMap map;
protected AngryParallaxBackground parallaxBackground;
protected boolean isLeft;
protected boolean dummyGame;
protected int aimX, aimY;
//
// Navigation Attributes
//
protected SurfaceScrollDetector scrollDetector;
protected PinchZoomDetector pinchZoomDetector;
protected float pinchZoomStartedCameraZoomFactor;
protected boolean isAiming = true;
private static final String TAG = "GameActivity";
@Override
public EngineOptions onCreateEngineOptions() {
GameContext.clear();
gc = GameContext.getInstance();
camera = new ZoomCamera(GameConfig.CAMERA_X, GameConfig.CAMERA_Y, GameConfig.CAMERA_WIDTH, GameConfig.CAMERA_HEIGHT);
camera.setZoomFactor(GameConfig.CAMERA_STARTUP_ZOOM);
camera.setBounds(
GameConfig.CAMERA_MIN_X, GameConfig.CAMERA_MIN_Y,
GameConfig.CAMERA_MAX_X, GameConfig.CAMERA_MAX_Y
);
camera.setBoundsEnabled(true);
gc.setCamera(camera);
return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED,
new RatioResolutionPolicy(GameConfig.CAMERA_WIDTH,
GameConfig.CAMERA_HEIGHT), camera);
}
@Override
public void onCreateResources(OnCreateResourcesCallback pOnCreateResourcesCallback) throws Exception {
this.rm = ResourceManager.getInstance();
this.rm.load(this);
pOnCreateResourcesCallback.onCreateResourcesFinished();
}
protected void initializePlayer(boolean isLeft, String playerNamer, String partnerName) {
this.isLeft = isLeft;
Log.i(getClass().getName(), "this client is " + (isLeft ? "left" : "right"));
// This is important because the entity ids are incremented in the order in which we
// create the entities :(
if (isLeft) {
this.me = new Player(playerNamer, isLeft);
this.partner = new Player(partnerName, !isLeft);
} else {
this.partner = new Player(partnerName, !isLeft);
this.me = new Player(playerNamer, isLeft);
}
hud.setLeftPlayerName(isLeft ? playerNamer : partnerName);
hud.setRightPlayerName(!isLeft ? playerNamer : partnerName);
final Castle leftCastle = isLeft ? me.getCastle() : partner.getCastle();
final Castle rightCastle = !isLeft ? me.getCastle() : partner.getCastle();
final float initialLeftCastleHeight = leftCastle.getInitialHeight();
final float initialRightCastleHeight = rightCastle.getInitialHeight();
final boolean left = isLeft;
scene.registerUpdateHandler(new IUpdateHandler() {
@Override
public void onUpdate(float pSecondsElapsed) {
float leftLife = leftCastle.getHeight() / initialLeftCastleHeight;
float rightLife = rightCastle.getHeight() / initialRightCastleHeight;
hud.getLeftLifeBar().setValue(1.0f - ((1.0f - leftLife) * 2.0f));
hud.getRightLifeBar().setValue(1.0f - ((1.0f - rightLife) * 2.0f));
if (dummyGame && leftLife < 0.5f && status != GameStatus.LOST) {
onWin();
}else if ((left && leftLife < 0.5f || !left && rightLife < 0.5f) && status != GameStatus.LOST) {
onLose();
}
}
@Override
public void reset() {
}
});
me.getCastle().freeze();
partner.getCastle().freeze();
scene.registerUpdateHandler(me);
scene.registerUpdateHandler(partner);
hud.setOnWhiteFlagTouched(new Runnable() {
@Override
public void run() {
onResignDialog();
}
});
scene.setOnSceneTouchListener(this);
scene.setTouchAreaBindingOnActionDownEnabled(true);
scene.registerUpdateHandler(PhysicsManager.getInstance().getPhysicsWorld());
hud.setStatus(getString(R.string.yourTurn));
ArrayList<PhysicalEntity> myBlocks = me.getCastle().getBlocks();
for(PhysicalEntity e : myBlocks)
e.getAreaShape().setAlpha(0f);
ArrayList<PhysicalEntity> partnerBlocks = partner.getCastle().getBlocks();
for(PhysicalEntity e : partnerBlocks)
e.getAreaShape().setAlpha(0f);
}
protected void fadeIn() {
AlphaModifier fadeIn = new AlphaModifier(1, 0, 1);
ArrayList<PhysicalEntity> myBlocks = me.getCastle().getBlocks();
for(PhysicalEntity e : myBlocks)
e.getAreaShape().registerEntityModifier(fadeIn.deepCopy());
ArrayList<PhysicalEntity> partnerBlocks = partner.getCastle().getBlocks();
for(PhysicalEntity e : partnerBlocks)
e.getAreaShape().registerEntityModifier(fadeIn.deepCopy());
me.getCannon().registerEntityModifier(fadeIn.deepCopy());
partner.getCannon().registerEntityModifier(fadeIn.deepCopy());
me.getKing().registerEntityModifier(fadeIn.deepCopy());
partner.getKing().registerEntityModifier(fadeIn.deepCopy());
}
@Override
public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback) throws Exception {
gc.setGameActivity(this);
gc.setVboManager(this.getVertexBufferObjectManager());
if (GameConfig.LOG_FPS)
mEngine.registerUpdateHandler(new FPSLogger());
//
// initialize the scene
//
scene = new Scene();
parallaxBackground = new AngryParallaxBackground(0f, 0f, 0f, 0.5f);
parallaxBackground.attachParallaxEntity(
new ParallaxBackground.ParallaxEntity(0f, rm.getBackgroundSprite())
);
parallaxBackground.attachParallaxEntity(
new ParallaxBackground.ParallaxEntity(20f, new Sprite(0, 0, rm.getParallax2(), gc.getVboManager()))
);
parallaxBackground.attachParallaxEntity(
new ParallaxBackground.ParallaxEntity(10f, new Sprite(0, 100, rm.getParallax1(), gc.getVboManager()))
);
scene.setBackground(parallaxBackground);
gc.setScene(scene);
//
// initialize the physics engine
//
PhysicsManager.clear();
PhysicsManager pm = PhysicsManager.getInstance();
pm.clearEntities();
//
// initialize the entities
//
map = new BasicMap();
scene.attachChild(map);
//
// initialize navigation
//
scrollDetector = new SurfaceScrollDetector(this);
pinchZoomDetector = new PinchZoomDetector(this);
//
// initialize HUD
//
hud = new GameHUD();
gc.setHud(hud);
gc.getCamera().setHUD(hud);
hud.setStatus(getString(R.string.enteringGame));
pOnCreateSceneCallback.onCreateSceneFinished(scene);
}
@Override
public void onPopulateScene(Scene pScene, OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception {
pOnPopulateSceneCallback.onPopulateSceneFinished();
}
@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
if (gc.getPhysicsWorld() == null)
return false;
double cannonDistanceX = pSceneTouchEvent.getX() - this.me.getCannon().getX();
double cannonDistanceY = pSceneTouchEvent.getY() - this.me.getCannon().getY();
double cannonDistanceR = Math.sqrt(cannonDistanceX * cannonDistanceX + cannonDistanceY * cannonDistanceY);
if (cannonDistanceR < rm.getAimCircleTexture().getHeight() &&
((isLeft && cannonDistanceX > 0) || (!isLeft && cannonDistanceX < 0))) {
//
// aim and fire
//
float x = pSceneTouchEvent.getX();
float y = pSceneTouchEvent.getY();
int iX = (int) x;
int iY = (int) y;
if (me.getCannon().pointAt(iX, iY)) {
aimX = iX;
aimY = iY;
}
if (pSceneTouchEvent.isActionUp() && status == GameStatus.MY_TURN) {
Log.i(TAG, "fire");
me.handleTurn(aimX, aimY, null);
}
} else {
//
// pinch and zoom
//
if (pSceneTouchEvent.isActionDown()) {
scrollDetector.setEnabled(true);
}
pinchZoomDetector.onTouchEvent(pSceneTouchEvent);
if (pinchZoomDetector.isZooming()) {
scrollDetector.setEnabled(false);
} else {
scrollDetector.onTouchEvent(pSceneTouchEvent);
}
}
return true;
}
@Override
public void onPinchZoomStarted(PinchZoomDetector pPinchZoomDetector, TouchEvent pSceneTouchEvent) {
this.pinchZoomStartedCameraZoomFactor = camera.getZoomFactor();
}
@Override
public void onPinchZoom(PinchZoomDetector pPinchZoomDetector, TouchEvent pTouchEvent, float pZoomFactor) {
float factor = pinchZoomStartedCameraZoomFactor * pZoomFactor;
if (factor > GameConfig.CAMERA_ZOOM_MIN && factor < GameConfig.CAMERA_ZOOM_MAX)
camera.setZoomFactor(factor);
}
@Override
public void onPinchZoomFinished(PinchZoomDetector pPinchZoomDetector, TouchEvent pTouchEvent, float pZoomFactor) {
float factor = pinchZoomStartedCameraZoomFactor * pZoomFactor;
if (factor > GameConfig.CAMERA_ZOOM_MIN && factor < GameConfig.CAMERA_ZOOM_MAX)
camera.setZoomFactor(factor);
}
@Override
public void onScrollStarted(ScrollDetector pScollDetector, int pPointerID, float pDistanceX, float pDistanceY) {
final float zoomFactor = camera.getZoomFactor();
camera.offsetCenter(-pDistanceX / zoomFactor, -pDistanceY / zoomFactor);
}
@Override
public void onScroll(ScrollDetector pScollDetector, int pPointerID, float pDistanceX, float pDistanceY) {
final float zoomFactor = camera.getZoomFactor();
camera.offsetCenter(-pDistanceX / zoomFactor, -pDistanceY / zoomFactor);
}
@Override
public void onScrollFinished(ScrollDetector pScollDetector, int pPointerID, float pDistanceX, float pDistanceY) {
final float zoomFactor = camera.getZoomFactor();
camera.offsetCenter(-pDistanceX / zoomFactor, -pDistanceY / zoomFactor);
}
protected void onLose() {
status = GameStatus.LOST;
gc.getHud().setStatus(getString(R.string.hasLost));
Intent intent = new Intent(GameActivity.this, EndGameActivity.class);
intent.putExtra("hasWon", false);
intent.putExtra("isLeft", GameActivity.this.isLeft);
intent.putExtra("username", me.getName());
intent.putExtra("partnername", partner.getName());
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
}
protected void onWin() {
this.status = GameStatus.WON;
Intent intent = new Intent(GameActivity.this, EndGameActivity.class);
intent.putExtra("hasWon", true);
intent.putExtra("isLeft", GameActivity.this.isLeft);
intent.putExtra("username", me.getName());
intent.putExtra("partnername", partner.getName());
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
}
protected void onResignDialog() {
runOnUiThread(new Runnable() {
@Override
public void run() {
final Dialog dialog = new Dialog(GameActivity.this);
dialog.setContentView(R.layout.quit_dialog);
dialog.setCancelable(true);
dialog.getWindow().setBackgroundDrawable(
new ColorDrawable(android.graphics.Color.TRANSPARENT));
Button bCancel = (Button) dialog.findViewById(R.id.bCancel);
Button bResign = (Button) dialog.findViewById(R.id.bResign);
bCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
bResign.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
onResign();
}
});
dialog.show();
}
});
}
protected void onResign() {
Intent intent = new Intent(GameActivity.this, EndGameActivity.class);
intent.putExtra("hasWon", false);
intent.putExtra("isLeft", GameActivity.this.isLeft);
intent.putExtra("username", me.getName());
intent.putExtra("partnername", partner.getName());
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
hud.setStatus(getString(R.string.youResigned));
}
}