blob: e4852c61581b00dd0155028bc73b4be8eec812f9 [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;
/**
* A component that implements the "pop-out" AI behavior. Pop-out characters alternate between
* hiding and appearing based on their distance from the player. They do not move or normally
* attack.
*/
public class SleeperComponent extends GameComponent {
private final static int STATE_SLEEPING = 0;
private final static int STATE_WAKING = 1;
private final static int STATE_ATTACKING = 2;
private final static int STATE_SLAM = 3;
private final static float DEFAULT_WAKE_UP_DURATION = 3.0f;
private float mWakeUpDuration;
private float mStateTime;
private int mState;
private float mSlamDuration;
private float mSlamMagnitude;
private float mAttackImpulseX;
private float mAttackImpulseY;
public SleeperComponent() {
super();
setPhase(GameComponent.ComponentPhases.THINK.ordinal());
reset();
}
@Override
public void reset() {
mWakeUpDuration = DEFAULT_WAKE_UP_DURATION;
mState = STATE_SLEEPING;
mStateTime = 0.0f;
mSlamDuration = 0.0f;
mSlamMagnitude = 0.0f;
mAttackImpulseX = 0.0f;
mAttackImpulseY = 0.0f;
}
@Override
public void update(float timeDelta, BaseObject parent) {
GameObject parentObject = (GameObject) parent;
if (parentObject.getCurrentAction() == ActionType.INVALID) {
parentObject.setCurrentAction(GameObject.ActionType.IDLE);
mState = STATE_SLEEPING;
}
CameraSystem camera = sSystemRegistry.cameraSystem;
switch(mState) {
case STATE_SLEEPING:
if (camera.shaking() && camera.pointVisible(parentObject.getPosition(), parentObject.width / 2.0f)) {
mState = STATE_WAKING;
mStateTime = mWakeUpDuration;
parentObject.setCurrentAction(GameObject.ActionType.MOVE);
}
break;
case STATE_WAKING:
mStateTime -= timeDelta;
if (mStateTime <= 0.0f) {
mState = STATE_ATTACKING;
parentObject.setCurrentAction(GameObject.ActionType.ATTACK);
parentObject.getImpulse().x += mAttackImpulseX * parentObject.facingDirection.x;
parentObject.getImpulse().y += mAttackImpulseY;
}
break;
case STATE_ATTACKING:
if (parentObject.touchingGround() && parentObject.getVelocity().y < 0.0f) {
mState = STATE_SLAM;
camera.shake(mSlamDuration, mSlamMagnitude);
parentObject.getVelocity().zero();
}
break;
case STATE_SLAM:
if (!camera.shaking()) {
mState = STATE_SLEEPING;
parentObject.setCurrentAction(GameObject.ActionType.IDLE);
}
break;
}
}
public void setWakeUpDuration(float duration) {
mWakeUpDuration = duration;
}
public void setSlam(float duration, float magnitude) {
mSlamDuration = duration;
mSlamMagnitude = magnitude;
}
public void setAttackImpulse(float x, float y) {
mAttackImpulseX = x;
mAttackImpulseY = y;
}
}