13c1e67e433728684b5f228c5d4f3e5b1457bb271sm/* 23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project 33c1e67e433728684b5f228c5d4f3e5b1457bb271sm * 43c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Licensed under the Apache License, Version 2.0 (the "License"); 53c1e67e433728684b5f228c5d4f3e5b1457bb271sm * you may not use this file except in compliance with the License. 63c1e67e433728684b5f228c5d4f3e5b1457bb271sm * You may obtain a copy of the License at 73c1e67e433728684b5f228c5d4f3e5b1457bb271sm * 83c1e67e433728684b5f228c5d4f3e5b1457bb271sm * http://www.apache.org/licenses/LICENSE-2.0 93c1e67e433728684b5f228c5d4f3e5b1457bb271sm * 103c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Unless required by applicable law or agreed to in writing, software 113c1e67e433728684b5f228c5d4f3e5b1457bb271sm * distributed under the License is distributed on an "AS IS" BASIS, 123c1e67e433728684b5f228c5d4f3e5b1457bb271sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133c1e67e433728684b5f228c5d4f3e5b1457bb271sm * See the License for the specific language governing permissions and 143c1e67e433728684b5f228c5d4f3e5b1457bb271sm * limitations under the License. 153c1e67e433728684b5f228c5d4f3e5b1457bb271sm */ 163c1e67e433728684b5f228c5d4f3e5b1457bb271sm 17cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland; 18cfd74d65d832137e20e193c960802afba73b5d38sm 19cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.GameObject.ActionType; 20cfd74d65d832137e20e193c960802afba73b5d38sm 21cfd74d65d832137e20e193c960802afba73b5d38smpublic class TheSourceComponent extends GameComponent { 22cfd74d65d832137e20e193c960802afba73b5d38sm public final static float SHAKE_TIME = 0.6f; 23cfd74d65d832137e20e193c960802afba73b5d38sm private final static float DIE_TIME = 30.0f; 24cfd74d65d832137e20e193c960802afba73b5d38sm private final static float EXPLOSION_TIME = 0.1f; 25cfd74d65d832137e20e193c960802afba73b5d38sm private final static float SHAKE_MAGNITUDE = 5.0f; 26cfd74d65d832137e20e193c960802afba73b5d38sm private final static float SHAKE_SCALE = 300.0f; 27cfd74d65d832137e20e193c960802afba73b5d38sm private final static float CAMERA_HIT_SHAKE_MAGNITUDE = 3.0f; 28cfd74d65d832137e20e193c960802afba73b5d38sm 29cfd74d65d832137e20e193c960802afba73b5d38sm private final static float SINK_SPEED = -20.0f; 30cfd74d65d832137e20e193c960802afba73b5d38sm private float mTimer; 31cfd74d65d832137e20e193c960802afba73b5d38sm private float mExplosionTimer; 32cfd74d65d832137e20e193c960802afba73b5d38sm private float mShakeStartPosition; 33cfd74d65d832137e20e193c960802afba73b5d38sm private ChannelSystem.Channel mChannel; 34cfd74d65d832137e20e193c960802afba73b5d38sm private int mGameEvent; 35cfd74d65d832137e20e193c960802afba73b5d38sm private int mGameEventIndex; 36cfd74d65d832137e20e193c960802afba73b5d38sm private boolean mDead; 37cfd74d65d832137e20e193c960802afba73b5d38sm 38cfd74d65d832137e20e193c960802afba73b5d38sm private static ChannelSystem.ChannelBooleanValue sChannelValue = new ChannelSystem.ChannelBooleanValue(); 39cfd74d65d832137e20e193c960802afba73b5d38sm 40cfd74d65d832137e20e193c960802afba73b5d38sm public TheSourceComponent() { 41cfd74d65d832137e20e193c960802afba73b5d38sm super(); 42cfd74d65d832137e20e193c960802afba73b5d38sm reset(); 43cfd74d65d832137e20e193c960802afba73b5d38sm setPhase(ComponentPhases.THINK.ordinal()); 44cfd74d65d832137e20e193c960802afba73b5d38sm } 45cfd74d65d832137e20e193c960802afba73b5d38sm 46cfd74d65d832137e20e193c960802afba73b5d38sm @Override 47cfd74d65d832137e20e193c960802afba73b5d38sm public void reset() { 48cfd74d65d832137e20e193c960802afba73b5d38sm mTimer = 0.0f; 49cfd74d65d832137e20e193c960802afba73b5d38sm mExplosionTimer = 0.0f; 50cfd74d65d832137e20e193c960802afba73b5d38sm mShakeStartPosition = 0.0f; 51cfd74d65d832137e20e193c960802afba73b5d38sm mChannel = null; 52cfd74d65d832137e20e193c960802afba73b5d38sm sChannelValue.value = false; 53cfd74d65d832137e20e193c960802afba73b5d38sm mGameEvent = -1; 54cfd74d65d832137e20e193c960802afba73b5d38sm mGameEventIndex = -1; 55cfd74d65d832137e20e193c960802afba73b5d38sm mDead = false; 56cfd74d65d832137e20e193c960802afba73b5d38sm } 57cfd74d65d832137e20e193c960802afba73b5d38sm 58cfd74d65d832137e20e193c960802afba73b5d38sm @Override 59cfd74d65d832137e20e193c960802afba73b5d38sm public void update(float timeDelta, BaseObject parent) { 60cfd74d65d832137e20e193c960802afba73b5d38sm GameObject parentObject = (GameObject)parent; 61cfd74d65d832137e20e193c960802afba73b5d38sm GameObject.ActionType currentAction = parentObject.getCurrentAction(); 62cfd74d65d832137e20e193c960802afba73b5d38sm 63cfd74d65d832137e20e193c960802afba73b5d38sm CameraSystem camera = sSystemRegistry.cameraSystem; 64cfd74d65d832137e20e193c960802afba73b5d38sm 65cfd74d65d832137e20e193c960802afba73b5d38sm if (currentAction == ActionType.HIT_REACT) { 66cfd74d65d832137e20e193c960802afba73b5d38sm if (parentObject.life > 0) { 67cfd74d65d832137e20e193c960802afba73b5d38sm mTimer = SHAKE_TIME; 68cfd74d65d832137e20e193c960802afba73b5d38sm camera.shake(SHAKE_TIME, CAMERA_HIT_SHAKE_MAGNITUDE); 69cfd74d65d832137e20e193c960802afba73b5d38sm mShakeStartPosition = parentObject.getPosition().x; 70cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.setCurrentAction(ActionType.IDLE); 71cfd74d65d832137e20e193c960802afba73b5d38sm currentAction = ActionType.IDLE; 72cfd74d65d832137e20e193c960802afba73b5d38sm } else { 73cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.setCurrentAction(ActionType.DEATH); 74cfd74d65d832137e20e193c960802afba73b5d38sm currentAction = ActionType.DEATH; 75cfd74d65d832137e20e193c960802afba73b5d38sm mTimer = DIE_TIME; 76cfd74d65d832137e20e193c960802afba73b5d38sm mExplosionTimer = EXPLOSION_TIME; 77cfd74d65d832137e20e193c960802afba73b5d38sm if (mChannel != null) { 78cfd74d65d832137e20e193c960802afba73b5d38sm mChannel.value = sChannelValue; 79cfd74d65d832137e20e193c960802afba73b5d38sm sChannelValue.value = true; 80cfd74d65d832137e20e193c960802afba73b5d38sm } 81cfd74d65d832137e20e193c960802afba73b5d38sm mDead = true; 82cfd74d65d832137e20e193c960802afba73b5d38sm } 83cfd74d65d832137e20e193c960802afba73b5d38sm 84cfd74d65d832137e20e193c960802afba73b5d38sm } 85cfd74d65d832137e20e193c960802afba73b5d38sm 86cfd74d65d832137e20e193c960802afba73b5d38sm mTimer -= timeDelta; 87cfd74d65d832137e20e193c960802afba73b5d38sm 88cfd74d65d832137e20e193c960802afba73b5d38sm if (mDead) { 89cfd74d65d832137e20e193c960802afba73b5d38sm // Wait for the player to take the camera back, then steal it! 90cfd74d65d832137e20e193c960802afba73b5d38sm GameObjectManager manager = sSystemRegistry.gameObjectManager; 91cfd74d65d832137e20e193c960802afba73b5d38sm 92cfd74d65d832137e20e193c960802afba73b5d38sm if (camera != null && manager != null && camera.getTarget() == manager.getPlayer()) { 93cfd74d65d832137e20e193c960802afba73b5d38sm camera.setTarget(parentObject); 94cfd74d65d832137e20e193c960802afba73b5d38sm } 95cfd74d65d832137e20e193c960802afba73b5d38sm 96cfd74d65d832137e20e193c960802afba73b5d38sm final float offset = SINK_SPEED * timeDelta; 97cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.getPosition().y += offset; 98cfd74d65d832137e20e193c960802afba73b5d38sm 99cfd74d65d832137e20e193c960802afba73b5d38sm mExplosionTimer -= timeDelta; 100cfd74d65d832137e20e193c960802afba73b5d38sm if (mExplosionTimer < 0.0f) { 101cfd74d65d832137e20e193c960802afba73b5d38sm GameObjectFactory factory = sSystemRegistry.gameObjectFactory; 102cfd74d65d832137e20e193c960802afba73b5d38sm if (factory != null) { 103cfd74d65d832137e20e193c960802afba73b5d38sm float x = ((float)Math.random() - 0.5f) * (parentObject.width * 0.75f); 104cfd74d65d832137e20e193c960802afba73b5d38sm float y = ((float)Math.random() - 0.5f) * (parentObject.height * 0.75f); 105cfd74d65d832137e20e193c960802afba73b5d38sm GameObject object = 106cfd74d65d832137e20e193c960802afba73b5d38sm factory.spawn(GameObjectFactory.GameObjectType.EXPLOSION_GIANT, 107cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.getCenteredPositionX() + x, 108cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.getCenteredPositionY() + y, 109cfd74d65d832137e20e193c960802afba73b5d38sm false); 110cfd74d65d832137e20e193c960802afba73b5d38sm if (object != null) { 111cfd74d65d832137e20e193c960802afba73b5d38sm manager.add(object); 112cfd74d65d832137e20e193c960802afba73b5d38sm } 113cfd74d65d832137e20e193c960802afba73b5d38sm mExplosionTimer = EXPLOSION_TIME; 114cfd74d65d832137e20e193c960802afba73b5d38sm } 115cfd74d65d832137e20e193c960802afba73b5d38sm } 116cfd74d65d832137e20e193c960802afba73b5d38sm 117cfd74d65d832137e20e193c960802afba73b5d38sm if (mTimer - timeDelta <= 0.0f) { 118cfd74d65d832137e20e193c960802afba73b5d38sm mTimer = 0.0f; 119cfd74d65d832137e20e193c960802afba73b5d38sm if (mGameEvent != -1) { 120cfd74d65d832137e20e193c960802afba73b5d38sm HudSystem hud = sSystemRegistry.hudSystem; 121cfd74d65d832137e20e193c960802afba73b5d38sm if (hud != null) { 122cfd74d65d832137e20e193c960802afba73b5d38sm hud.startFade(false, 1.5f); 123cfd74d65d832137e20e193c960802afba73b5d38sm hud.sendGameEventOnFadeComplete(mGameEvent, mGameEventIndex); 124cfd74d65d832137e20e193c960802afba73b5d38sm mGameEvent = -1; 125cfd74d65d832137e20e193c960802afba73b5d38sm } 126cfd74d65d832137e20e193c960802afba73b5d38sm } 127cfd74d65d832137e20e193c960802afba73b5d38sm } 128cfd74d65d832137e20e193c960802afba73b5d38sm } else if (mTimer > 0) { 129cfd74d65d832137e20e193c960802afba73b5d38sm // shake 130cfd74d65d832137e20e193c960802afba73b5d38sm float delta = (float)Math.sin(mTimer * SHAKE_SCALE); 131cfd74d65d832137e20e193c960802afba73b5d38sm delta *= SHAKE_MAGNITUDE; 132cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.getPosition().x = mShakeStartPosition + delta; 133cfd74d65d832137e20e193c960802afba73b5d38sm if (mTimer - timeDelta <= 0.0f) { 134cfd74d65d832137e20e193c960802afba73b5d38sm // end one step early and fix the position. 135cfd74d65d832137e20e193c960802afba73b5d38sm mTimer = 0; 136cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.getPosition().x = mShakeStartPosition; 137cfd74d65d832137e20e193c960802afba73b5d38sm } 138cfd74d65d832137e20e193c960802afba73b5d38sm } 139cfd74d65d832137e20e193c960802afba73b5d38sm } 140cfd74d65d832137e20e193c960802afba73b5d38sm 141cfd74d65d832137e20e193c960802afba73b5d38sm public void setChannel(ChannelSystem.Channel channel) { 142cfd74d65d832137e20e193c960802afba73b5d38sm mChannel = channel; 143cfd74d65d832137e20e193c960802afba73b5d38sm } 144cfd74d65d832137e20e193c960802afba73b5d38sm 145cfd74d65d832137e20e193c960802afba73b5d38sm public void setGameEvent(int event, int index) { 146cfd74d65d832137e20e193c960802afba73b5d38sm mGameEvent = event; 147cfd74d65d832137e20e193c960802afba73b5d38sm mGameEventIndex = index; 148cfd74d65d832137e20e193c960802afba73b5d38sm } 149cfd74d65d832137e20e193c960802afba73b5d38sm} 150