1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.replica.replicaisland;
18
19import com.replica.replicaisland.GameObject.ActionType;
20
21/**
22 * A component that implements the "pop-out" AI behavior.  Pop-out characters alternate between
23 * hiding and appearing based on their distance from the player.  They do not move or normally
24 * attack.
25 */
26public class SleeperComponent extends GameComponent {
27    private final static int STATE_SLEEPING = 0;
28    private final static int STATE_WAKING = 1;
29    private final static int STATE_ATTACKING = 2;
30    private final static int STATE_SLAM = 3;
31    private final static float DEFAULT_WAKE_UP_DURATION = 3.0f;
32    private float mWakeUpDuration;
33    private float mStateTime;
34    private int mState;
35    private float mSlamDuration;
36    private float mSlamMagnitude;
37    private float mAttackImpulseX;
38    private float mAttackImpulseY;
39
40    public SleeperComponent() {
41        super();
42        setPhase(GameComponent.ComponentPhases.THINK.ordinal());
43        reset();
44    }
45
46    @Override
47    public void reset() {
48        mWakeUpDuration = DEFAULT_WAKE_UP_DURATION;
49        mState = STATE_SLEEPING;
50        mStateTime = 0.0f;
51        mSlamDuration = 0.0f;
52        mSlamMagnitude = 0.0f;
53        mAttackImpulseX = 0.0f;
54        mAttackImpulseY = 0.0f;
55    }
56
57    @Override
58    public void update(float timeDelta, BaseObject parent) {
59        GameObject parentObject = (GameObject) parent;
60
61        if (parentObject.getCurrentAction() == ActionType.INVALID) {
62            parentObject.setCurrentAction(GameObject.ActionType.IDLE);
63            mState = STATE_SLEEPING;
64        }
65
66        CameraSystem camera = sSystemRegistry.cameraSystem;
67        switch(mState) {
68            case STATE_SLEEPING:
69                if (camera.shaking() && camera.pointVisible(parentObject.getPosition(), parentObject.width / 2.0f)) {
70                    mState = STATE_WAKING;
71                    mStateTime = mWakeUpDuration;
72                    parentObject.setCurrentAction(GameObject.ActionType.MOVE);
73                }
74                break;
75            case STATE_WAKING:
76                mStateTime -= timeDelta;
77                if (mStateTime <= 0.0f) {
78                    mState = STATE_ATTACKING;
79                    parentObject.setCurrentAction(GameObject.ActionType.ATTACK);
80                    parentObject.getImpulse().x += mAttackImpulseX * parentObject.facingDirection.x;
81                    parentObject.getImpulse().y += mAttackImpulseY;
82                }
83                break;
84            case STATE_ATTACKING:
85                if (parentObject.touchingGround() && parentObject.getVelocity().y < 0.0f) {
86                    mState = STATE_SLAM;
87                    camera.shake(mSlamDuration, mSlamMagnitude);
88                    parentObject.getVelocity().zero();
89                }
90                break;
91            case STATE_SLAM:
92                if (!camera.shaking()) {
93                    mState = STATE_SLEEPING;
94                    parentObject.setCurrentAction(GameObject.ActionType.IDLE);
95                }
96                break;
97
98        }
99    }
100
101
102    public void setWakeUpDuration(float duration) {
103        mWakeUpDuration = duration;
104    }
105
106    public void setSlam(float duration, float magnitude) {
107        mSlamDuration = duration;
108        mSlamMagnitude = magnitude;
109    }
110
111    public void setAttackImpulse(float x, float y) {
112        mAttackImpulseX = x;
113        mAttackImpulseY = y;
114    }
115}
116
117
118