blob: a3a2feb2707206474271edcee7c38fba5624bf9b [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.replica.replicaisland;
import com.replica.replicaisland.GameObject.ActionType;
public class TheSourceComponent extends GameComponent {
public final static float SHAKE_TIME = 0.6f;
private final static float DIE_TIME = 30.0f;
private final static float EXPLOSION_TIME = 0.1f;
private final static float SHAKE_MAGNITUDE = 5.0f;
private final static float SHAKE_SCALE = 300.0f;
private final static float CAMERA_HIT_SHAKE_MAGNITUDE = 3.0f;
private final static float SINK_SPEED = -20.0f;
private float mTimer;
private float mExplosionTimer;
private float mShakeStartPosition;
private ChannelSystem.Channel mChannel;
private int mGameEvent;
private int mGameEventIndex;
private boolean mDead;
private static ChannelSystem.ChannelBooleanValue sChannelValue = new ChannelSystem.ChannelBooleanValue();
public TheSourceComponent() {
super();
reset();
setPhase(ComponentPhases.THINK.ordinal());
}
@Override
public void reset() {
mTimer = 0.0f;
mExplosionTimer = 0.0f;
mShakeStartPosition = 0.0f;
mChannel = null;
sChannelValue.value = false;
mGameEvent = -1;
mGameEventIndex = -1;
mDead = false;
}
@Override
public void update(float timeDelta, BaseObject parent) {
GameObject parentObject = (GameObject)parent;
GameObject.ActionType currentAction = parentObject.getCurrentAction();
CameraSystem camera = sSystemRegistry.cameraSystem;
if (currentAction == ActionType.HIT_REACT) {
if (parentObject.life > 0) {
mTimer = SHAKE_TIME;
camera.shake(SHAKE_TIME, CAMERA_HIT_SHAKE_MAGNITUDE);
mShakeStartPosition = parentObject.getPosition().x;
parentObject.setCurrentAction(ActionType.IDLE);
currentAction = ActionType.IDLE;
} else {
parentObject.setCurrentAction(ActionType.DEATH);
currentAction = ActionType.DEATH;
mTimer = DIE_TIME;
mExplosionTimer = EXPLOSION_TIME;
if (mChannel != null) {
mChannel.value = sChannelValue;
sChannelValue.value = true;
}
mDead = true;
}
}
mTimer -= timeDelta;
if (mDead) {
// Wait for the player to take the camera back, then steal it!
GameObjectManager manager = sSystemRegistry.gameObjectManager;
if (camera != null && manager != null && camera.getTarget() == manager.getPlayer()) {
camera.setTarget(parentObject);
}
final float offset = SINK_SPEED * timeDelta;
parentObject.getPosition().y += offset;
mExplosionTimer -= timeDelta;
if (mExplosionTimer < 0.0f) {
GameObjectFactory factory = sSystemRegistry.gameObjectFactory;
if (factory != null) {
float x = ((float)Math.random() - 0.5f) * (parentObject.width * 0.75f);
float y = ((float)Math.random() - 0.5f) * (parentObject.height * 0.75f);
GameObject object =
factory.spawn(GameObjectFactory.GameObjectType.EXPLOSION_GIANT,
parentObject.getCenteredPositionX() + x,
parentObject.getCenteredPositionY() + y,
false);
if (object != null) {
manager.add(object);
}
mExplosionTimer = EXPLOSION_TIME;
}
}
if (mTimer - timeDelta <= 0.0f) {
mTimer = 0.0f;
if (mGameEvent != -1) {
HudSystem hud = sSystemRegistry.hudSystem;
if (hud != null) {
hud.startFade(false, 1.5f);
hud.sendGameEventOnFadeComplete(mGameEvent, mGameEventIndex);
mGameEvent = -1;
}
}
}
} else if (mTimer > 0) {
// shake
float delta = (float)Math.sin(mTimer * SHAKE_SCALE);
delta *= SHAKE_MAGNITUDE;
parentObject.getPosition().x = mShakeStartPosition + delta;
if (mTimer - timeDelta <= 0.0f) {
// end one step early and fix the position.
mTimer = 0;
parentObject.getPosition().x = mShakeStartPosition;
}
}
}
public void setChannel(ChannelSystem.Channel channel) {
mChannel = channel;
}
public void setGameEvent(int event, int index) {
mGameEvent = event;
mGameEventIndex = index;
}
}