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