package com.angrykings.activities; import android.app.Dialog; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.widget.Button; import com.angrykings.Action; import com.angrykings.GameConfig; import com.angrykings.GameStatus; import com.angrykings.IPlayerTurnListener; import com.angrykings.Installation; import com.angrykings.Keyframe; import com.angrykings.KeyframeData; import com.angrykings.PhysicalEntity; import com.angrykings.PhysicsManager; import com.angrykings.R; import com.angrykings.ServerConnection; import com.angrykings.cannons.Cannonball; import com.angrykings.utils.ServerMessage; import org.andengine.engine.camera.ZoomCamera; import org.andengine.engine.options.EngineOptions; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.prefs.Preferences; public class OnlineGameActivity extends GameActivity implements ServerConnection.OnMessageHandler { private static final String TAG = "OnlineGameActivity"; // Camera Positions private static final int MIDDLE = 0; private static final int OWNCANNONBALL = 1; private static final int ENEMYCANNONBALL = 2; private static final int ENEMYCANNON = 3; private static final int OFF = 4; private int followCamera = OFF; // Network private ServerConnection serverConnection; private class MyTurnListener implements IPlayerTurnListener { private ArrayList<Keyframe> keyframes; public MyTurnListener() { this.keyframes = new ArrayList<Keyframe>(); } @Override public void onHandleTurn(int x, int y, ArrayList<Keyframe> keyframes) { this.keyframes.clear(); status = GameStatus.PARTNER_TURN; me.getCannon().hideAimCircle(); partner.getCastle().unfreeze(); //followCamera = OWNCANNONBALL; } @Override public void onEndTurn() { serverConnection.sendTextMessage(ServerMessage.endTurn(aimX, aimY, this.keyframes)); me.setTurn(me.getTurn() + 1); if (me.getTurn() <= partner.getTurn()) { turn(); } else { partner.getCastle().freeze(); hud.setStatus(getString(R.string.enemyTurn)); me.getKing().getSprite().setCurrentTileIndex(0); partner.getKing().getSprite().setCurrentTileIndex(1); partner.getKing().jump(); } //followCamera = ENEMYCANNON; } @Override public void onKeyframe(float time) { try { Keyframe k = new Keyframe(time, me.getCannonball(), partner.getCastle()); this.keyframes.add(k); } catch (JSONException e) { e.printStackTrace(); } } @Override public void onUpdate(float dt) { } } private class PartnerTurnListener implements IPlayerTurnListener { private ArrayList<Keyframe> keyframes; private int keyframeIndex; private float timeElapsedSinceKeyframe; private boolean keyframeInterpolationDone; @Override public void onHandleTurn(int x, int y, ArrayList<Keyframe> keyframes) { partner.getCannon().pointAt(x, y); partner.getCannonball().getBody().setActive(false); this.keyframes = keyframes; this.keyframeIndex = -1; // because onKeyframe is called at t=0 this.timeElapsedSinceKeyframe = 0; this.keyframeInterpolationDone = false; //followCamera = ENEMYCANNONBALL; } @Override public void onEndTurn() { this.keyframes = null; me.getKing().getSprite().setCurrentTileIndex(0); partner.getKing().getSprite().setCurrentTileIndex(1); me.getKing().jump(); turn(); //followCamera = MIDDLE; } @Override public void onKeyframe(float time) { if (this.keyframeIndex == this.keyframes.size() - 1) { return; } this.keyframeIndex++; this.timeElapsedSinceKeyframe = 0; if (this.keyframeIndex == this.keyframes.size() - 1) { this.keyframeInterpolationDone = true; } } @Override public void onUpdate(float dt) { if (this.keyframes == null || this.keyframeInterpolationDone) return; this.timeElapsedSinceKeyframe += dt; Keyframe currentKeyframe = this.keyframes.get(this.keyframeIndex); Keyframe nextKeyframe = this.keyframes.get(this.keyframeIndex + 1); Cannonball cannonball = partner.getCannonball(); float deltaT = (float) (nextKeyframe.getTimestampSec() - currentKeyframe.getTimestampSec()); float t = this.timeElapsedSinceKeyframe / deltaT; KeyframeData interpolated = currentKeyframe.getCannonballKeyframeData() .interpolate( nextKeyframe.getCannonballKeyframeData(), t ); cannonball.setKeyframeData(interpolated); ArrayList<KeyframeData> currentCastleData = currentKeyframe.getCastleKeyframeData(); ArrayList<KeyframeData> nextCastleData = nextKeyframe.getCastleKeyframeData(); for (int i = 0; i < currentCastleData.size(); i++) { KeyframeData currentKeyframeData = currentCastleData.get(i); KeyframeData nextKeyframeData = nextCastleData.get(i); KeyframeData interpolatedKeyframeData = currentKeyframeData.interpolate(nextKeyframeData, t); PhysicalEntity block = PhysicsManager.getInstance().getEntityById(currentKeyframeData.entityId); block.setKeyframeData(interpolatedKeyframeData); } } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { final Dialog dialog = new Dialog(OnlineGameActivity.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) { serverConnection.sendTextMessage(ServerMessage.leaveGame()); dialog.dismiss(); Intent intent = new Intent(OnlineGameActivity.this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); } }); dialog.show(); return true; } return super.onKeyDown(keyCode, event); } private void turn() { Log.i(getClass().getName(), "turn()"); this.hud.setStatus(getString(R.string.yourTurn)); this.status = GameStatus.MY_TURN; me.getCannon().showAimCircle(); } @Override public void onMessage(String payload) { try { JSONObject jObj = new JSONObject(payload); if (jObj.getInt("action") == Action.Server.TURN) { partner.setTurn(partner.getTurn() + 1); final int x = Integer.parseInt(jObj.getString("x")); final int y = Integer.parseInt(jObj.getString("y")); ArrayList<Keyframe> keyframes = null; if (jObj.has("keyframes")) { JSONArray jsonKeyframes = jObj.getJSONArray("keyframes"); keyframes = new ArrayList<Keyframe>(); for (int i = 0; i < jsonKeyframes.length(); ++i) { keyframes.add(new Keyframe(jsonKeyframes.getJSONObject(i))); } Log.i(getClass().getName(), "received " + keyframes.size() + " keyframes"); } else { Log.w(getClass().getName(), "received 0 keyframes"); } partner.handleTurn(x, y, keyframes); } else if (jObj.getInt("action") == Action.Server.YOU_WIN) { onWin(); } else if (jObj.getInt("action") == Action.Server.NEW_GAME) { Log.i(TAG, "enter new game"); JSONObject meJson = jObj.getJSONObject("you"); JSONObject partnerJson = jObj.getJSONObject("opponent"); initializePlayer(meJson.getBoolean("left"), meJson.getString("name"), partnerJson.getString("name")); me.setPlayerTurnListener(new MyTurnListener()); this.partner.setPlayerTurnListener(new PartnerTurnListener()); turn(); fadeIn(); } if (jObj.getInt("action") == Action.Server.EXISTING_GAME) { Log.i(TAG, "enter existing game"); JSONObject meJson = jObj.getJSONObject("you"); JSONObject partnerJson = jObj.getJSONObject("opponent"); initializePlayer(meJson.getBoolean("left"), meJson.getString("name"), partnerJson.getString("name")); me.setPlayerTurnListener(new MyTurnListener()); this.partner.setPlayerTurnListener(new PartnerTurnListener()); JSONObject data_you = meJson.getJSONObject("data"); JSONObject data_opponent = partnerJson.getJSONObject("data"); if (data_you.length() > 1) { JSONArray arr = data_you.getJSONArray("keyframes"); JSONObject lastFrameJson = arr.getJSONObject(arr.length() - 1); Keyframe lastFrame = new Keyframe(lastFrameJson); me.getCastle().setKeyframeData(lastFrame.getCastleKeyframeData()); } if (data_opponent.length() > 1) { JSONArray arr = data_opponent.getJSONArray("keyframes"); JSONObject lastFrameJson = arr.getJSONObject(arr.length() - 1); Keyframe lastFrame = new Keyframe(lastFrameJson); partner.getCastle().setKeyframeData(lastFrame.getCastleKeyframeData()); } me.setTurn(meJson.getInt("turn")); partner.setTurn(partnerJson.getInt("turn")); if (me.getTurn() <= partner.getTurn()) { turn(); } fadeIn(); } } catch (JSONException e) { Log.e(getClass().getName(), "JSONException: " + e); } } @Override public EngineOptions onCreateEngineOptions() { this.serverConnection = ServerConnection.getInstance(); return super.onCreateEngineOptions(); } @Override public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback) throws Exception { super.onCreateScene(pOnCreateSceneCallback); this.serverConnection.setHandler(this); Log.i(TAG, "connected=" + this.serverConnection.isConnected()); if (!this.serverConnection.isConnected()) { this.serverConnection.start(new ServerConnection.OnStartHandler() { @Override public void onStart() { enterGame(); } }); } else { enterGame(); } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); } private void enterGame() { SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); final String id = Installation.id(this); final String registrationId = settings.getString("registrationId", ""); Log.i(TAG, "The installation ID is " + id); ServerConnection .getInstance() .sendTextMessage(ServerMessage.setId(id, registrationId)); Log.i(TAG, "enterGame"); Bundle extras = getIntent().getExtras(); String partnerIdStr = extras.getString("partnerId"); if(partnerIdStr.equals("1")){ this.dummyGame = true; } Log.i(TAG, "entering game with partnerId=" + partnerIdStr); Log.i(TAG, "EXTRAS=" + extras.toString()); Log.i(TAG, "serverConnection=" + this.serverConnection); this.serverConnection.sendTextMessage(ServerMessage.enterGame(Integer.valueOf(partnerIdStr))); } private void deactivateFollowCamera(String s) { ZoomCamera camera = (ZoomCamera) gc.getCamera(); camera.setChaseEntity(null); float cameraX = camera.getCenterX(); float cameraY = camera.getCenterY(); float difX; float difY; if (s.equals("mitte")) { difX = cameraX - (GameConfig.CAMERA_X + GameConfig.CAMERA_WIDTH / 2); difY = cameraY - (GameConfig.CAMERA_Y + GameConfig.CAMERA_HEIGHT / 2); } else { difX = cameraX - (partner.getCannon().getX()); difY = cameraY - (partner.getCannon().getY()); } boolean rightPositionX = false; boolean rightPositionY = false; if (difX < -10) { cameraX += Math.abs(difX) / 5; camera.setCenter(cameraX, cameraY); } else if (difX > 10) { cameraX -= Math.abs(difX) / 5; camera.setCenter(cameraX, cameraY); } else { rightPositionX = true; } if (difY < -10) { cameraY += Math.abs(difY) / 5; camera.setCenter(cameraX, cameraY); } else if (difY > 10) { cameraY -= Math.abs(difY) / 5; camera.setCenter(cameraX, cameraY); } else { rightPositionY = true; } if (rightPositionX && rightPositionY && s.equals("mitte")) { camera.setCenter(GameConfig.CAMERA_X + GameConfig.CAMERA_WIDTH / 2, GameConfig.CAMERA_Y + GameConfig.CAMERA_HEIGHT / 2); camera.setZoomFactor(GameConfig.CAMERA_STARTUP_ZOOM); followCamera = OFF; } else if (rightPositionX && rightPositionY && s.equals("gegner")) { camera.setCenter(partner.getCannon().getX(), partner.getCannon().getY()); camera.setZoomFactor(GameConfig.CAMERA_STARTUP_ZOOM); followCamera = OFF; } } @Override protected void onWin() { if(dummyGame){ serverConnection.sendTextMessage(ServerMessage.win()); } super.onWin(); } @Override protected void onDestroy() { serverConnection.sendTextMessage(ServerMessage.leaveGame()); super.onDestroy(); } @Override protected void onResign() { super.onResign(); serverConnection.sendTextMessage(ServerMessage.lose()); } @Override protected void onLose() { serverConnection.sendTextMessage(ServerMessage.lose()); super.onLose(); } }