1cfd74d65d832137e20e193c960802afba73b5d38sm/*
23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project
3cfd74d65d832137e20e193c960802afba73b5d38sm *
4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License");
5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License.
6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at
7cfd74d65d832137e20e193c960802afba73b5d38sm *
8cfd74d65d832137e20e193c960802afba73b5d38sm *      http://www.apache.org/licenses/LICENSE-2.0
9cfd74d65d832137e20e193c960802afba73b5d38sm *
10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software
11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS,
12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and
14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License.
15cfd74d65d832137e20e193c960802afba73b5d38sm */
16cfd74d65d832137e20e193c960802afba73b5d38sm
17cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland;
18cfd74d65d832137e20e193c960802afba73b5d38sm
19cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.ChannelSystem.Channel;
20cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.GameObject.ActionType;
21cfd74d65d832137e20e193c960802afba73b5d38sm
22cfd74d65d832137e20e193c960802afba73b5d38smpublic class NPCAnimationComponent extends GameComponent {
23cfd74d65d832137e20e193c960802afba73b5d38sm
24cfd74d65d832137e20e193c960802afba73b5d38sm    // Animations
25cfd74d65d832137e20e193c960802afba73b5d38sm    public static final int IDLE = 0;
26cfd74d65d832137e20e193c960802afba73b5d38sm    public static final int WALK = 1;
27cfd74d65d832137e20e193c960802afba73b5d38sm    public static final int RUN_START = 2;
28cfd74d65d832137e20e193c960802afba73b5d38sm    public static final int RUN = 3;
29cfd74d65d832137e20e193c960802afba73b5d38sm    public static final int SHOOT = 4;
30cfd74d65d832137e20e193c960802afba73b5d38sm    public static final int JUMP_START = 5;
31cfd74d65d832137e20e193c960802afba73b5d38sm    public static final int JUMP_AIR = 6;
32cfd74d65d832137e20e193c960802afba73b5d38sm    public static final int TAKE_HIT = 7;
33cfd74d65d832137e20e193c960802afba73b5d38sm    public static final int SURPRISED = 8;
34cfd74d65d832137e20e193c960802afba73b5d38sm    public static final int DEATH = 9;
35cfd74d65d832137e20e193c960802afba73b5d38sm
36cfd74d65d832137e20e193c960802afba73b5d38sm
37cfd74d65d832137e20e193c960802afba73b5d38sm    protected static final float RUN_SPEED_THRESHOLD = 100.0f;
38cfd74d65d832137e20e193c960802afba73b5d38sm    protected static final float JUMP_SPEED_THRESHOLD = 25.0f;
39cfd74d65d832137e20e193c960802afba73b5d38sm    protected static final float FALL_SPEED_THRESHOLD = -25.0f;
40cfd74d65d832137e20e193c960802afba73b5d38sm    protected static final float FALL_TIME_THRESHOLD = 0.2f;
41cfd74d65d832137e20e193c960802afba73b5d38sm
42cfd74d65d832137e20e193c960802afba73b5d38sm    private int mCurrentAnimation;
43cfd74d65d832137e20e193c960802afba73b5d38sm    private SpriteComponent mSprite;
44cfd74d65d832137e20e193c960802afba73b5d38sm    private ChannelSystem.Channel mChannel;
45cfd74d65d832137e20e193c960802afba73b5d38sm    private int mChannelTrigger;
46cfd74d65d832137e20e193c960802afba73b5d38sm    private boolean mFlying;
47cfd74d65d832137e20e193c960802afba73b5d38sm    private boolean mStopAtWalls;	// Controls whether or not the character will go back
48cfd74d65d832137e20e193c960802afba73b5d38sm    								// to idle when running into a wall
49cfd74d65d832137e20e193c960802afba73b5d38sm
50cfd74d65d832137e20e193c960802afba73b5d38sm
51cfd74d65d832137e20e193c960802afba73b5d38sm    public NPCAnimationComponent() {
52cfd74d65d832137e20e193c960802afba73b5d38sm        super();
53cfd74d65d832137e20e193c960802afba73b5d38sm        reset();
54cfd74d65d832137e20e193c960802afba73b5d38sm        setPhase(GameComponent.ComponentPhases.ANIMATION.ordinal());
55cfd74d65d832137e20e193c960802afba73b5d38sm    }
56cfd74d65d832137e20e193c960802afba73b5d38sm
57cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
58cfd74d65d832137e20e193c960802afba73b5d38sm    public void reset() {
59cfd74d65d832137e20e193c960802afba73b5d38sm        mCurrentAnimation = IDLE;
60cfd74d65d832137e20e193c960802afba73b5d38sm        mChannel = null;
61cfd74d65d832137e20e193c960802afba73b5d38sm        mSprite = null;
62cfd74d65d832137e20e193c960802afba73b5d38sm        mFlying = false;
63cfd74d65d832137e20e193c960802afba73b5d38sm        mStopAtWalls = true;
64cfd74d65d832137e20e193c960802afba73b5d38sm    }
65cfd74d65d832137e20e193c960802afba73b5d38sm
66cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
67cfd74d65d832137e20e193c960802afba73b5d38sm    public void update(float timeDelta, BaseObject parent) {
68cfd74d65d832137e20e193c960802afba73b5d38sm        if (mSprite != null) {
69cfd74d65d832137e20e193c960802afba73b5d38sm            GameObject parentObject = (GameObject)parent;
70cfd74d65d832137e20e193c960802afba73b5d38sm
71cfd74d65d832137e20e193c960802afba73b5d38sm            final int oldAnimation = mCurrentAnimation;
72cfd74d65d832137e20e193c960802afba73b5d38sm            switch(mCurrentAnimation) {
73cfd74d65d832137e20e193c960802afba73b5d38sm                case IDLE:
74cfd74d65d832137e20e193c960802afba73b5d38sm                    idle(parentObject);
75cfd74d65d832137e20e193c960802afba73b5d38sm                    break;
76cfd74d65d832137e20e193c960802afba73b5d38sm                case WALK:
77cfd74d65d832137e20e193c960802afba73b5d38sm                    walk(parentObject);
78cfd74d65d832137e20e193c960802afba73b5d38sm                    break;
79cfd74d65d832137e20e193c960802afba73b5d38sm                case RUN_START:
80cfd74d65d832137e20e193c960802afba73b5d38sm                    runStart(parentObject);
81cfd74d65d832137e20e193c960802afba73b5d38sm                    break;
82cfd74d65d832137e20e193c960802afba73b5d38sm                case RUN:
83cfd74d65d832137e20e193c960802afba73b5d38sm                    run(parentObject);
84cfd74d65d832137e20e193c960802afba73b5d38sm                    break;
85cfd74d65d832137e20e193c960802afba73b5d38sm                case SHOOT:
86cfd74d65d832137e20e193c960802afba73b5d38sm                    shoot(parentObject);
87cfd74d65d832137e20e193c960802afba73b5d38sm                    break;
88cfd74d65d832137e20e193c960802afba73b5d38sm                case JUMP_START:
89cfd74d65d832137e20e193c960802afba73b5d38sm                    jumpStart(parentObject);
90cfd74d65d832137e20e193c960802afba73b5d38sm                    break;
91cfd74d65d832137e20e193c960802afba73b5d38sm                case JUMP_AIR:
92cfd74d65d832137e20e193c960802afba73b5d38sm                    jumpAir(parentObject);
93cfd74d65d832137e20e193c960802afba73b5d38sm                    break;
94cfd74d65d832137e20e193c960802afba73b5d38sm                case TAKE_HIT:
95cfd74d65d832137e20e193c960802afba73b5d38sm                	takeHit(parentObject);
96cfd74d65d832137e20e193c960802afba73b5d38sm                	break;
97cfd74d65d832137e20e193c960802afba73b5d38sm                case SURPRISED:
98cfd74d65d832137e20e193c960802afba73b5d38sm                	surprised(parentObject);
99cfd74d65d832137e20e193c960802afba73b5d38sm                	break;
100cfd74d65d832137e20e193c960802afba73b5d38sm                case DEATH:
101cfd74d65d832137e20e193c960802afba73b5d38sm                	death(parentObject);
102cfd74d65d832137e20e193c960802afba73b5d38sm                	break;
103cfd74d65d832137e20e193c960802afba73b5d38sm               default:
104cfd74d65d832137e20e193c960802afba73b5d38sm                    assert(false);
105cfd74d65d832137e20e193c960802afba73b5d38sm            }
106cfd74d65d832137e20e193c960802afba73b5d38sm
107cfd74d65d832137e20e193c960802afba73b5d38sm            if (mChannel != null) {
108cfd74d65d832137e20e193c960802afba73b5d38sm            	if (mChannel.value != null
109cfd74d65d832137e20e193c960802afba73b5d38sm            			&& ((ChannelSystem.ChannelBooleanValue)mChannel.value).value) {
110cfd74d65d832137e20e193c960802afba73b5d38sm            		mCurrentAnimation = mChannelTrigger;
111cfd74d65d832137e20e193c960802afba73b5d38sm            	}
112cfd74d65d832137e20e193c960802afba73b5d38sm            }
113cfd74d65d832137e20e193c960802afba73b5d38sm
114cfd74d65d832137e20e193c960802afba73b5d38sm            if (oldAnimation != mCurrentAnimation) {
115cfd74d65d832137e20e193c960802afba73b5d38sm                mSprite.playAnimation(mCurrentAnimation);
116cfd74d65d832137e20e193c960802afba73b5d38sm            }
117cfd74d65d832137e20e193c960802afba73b5d38sm        }
118cfd74d65d832137e20e193c960802afba73b5d38sm    }
119cfd74d65d832137e20e193c960802afba73b5d38sm
120cfd74d65d832137e20e193c960802afba73b5d38sm    protected boolean shouldFall(GameObject parentObject) {
121cfd74d65d832137e20e193c960802afba73b5d38sm        boolean result = false;
122cfd74d65d832137e20e193c960802afba73b5d38sm        TimeSystem time = sSystemRegistry.timeSystem;
123cfd74d65d832137e20e193c960802afba73b5d38sm        final float airTime = time.getGameTime() - parentObject.getLastTouchedFloorTime();
124cfd74d65d832137e20e193c960802afba73b5d38sm        if (!mFlying && !parentObject.touchingGround() && airTime > FALL_TIME_THRESHOLD) {
125cfd74d65d832137e20e193c960802afba73b5d38sm            final Vector2 velocity = parentObject.getVelocity();
126cfd74d65d832137e20e193c960802afba73b5d38sm            if (velocity.y < FALL_SPEED_THRESHOLD) {
127cfd74d65d832137e20e193c960802afba73b5d38sm                result = true;
128cfd74d65d832137e20e193c960802afba73b5d38sm            }
129cfd74d65d832137e20e193c960802afba73b5d38sm        }
130cfd74d65d832137e20e193c960802afba73b5d38sm        return result;
131cfd74d65d832137e20e193c960802afba73b5d38sm    }
132cfd74d65d832137e20e193c960802afba73b5d38sm
133cfd74d65d832137e20e193c960802afba73b5d38sm    protected boolean shouldJump(GameObject parentObject) {
134cfd74d65d832137e20e193c960802afba73b5d38sm        boolean result = false;
135cfd74d65d832137e20e193c960802afba73b5d38sm
136cfd74d65d832137e20e193c960802afba73b5d38sm        if (!mFlying) {
137cfd74d65d832137e20e193c960802afba73b5d38sm	        final Vector2 velocity = parentObject.getVelocity();
138cfd74d65d832137e20e193c960802afba73b5d38sm	        if (velocity.y > JUMP_SPEED_THRESHOLD) {
139cfd74d65d832137e20e193c960802afba73b5d38sm	            result = true;
140cfd74d65d832137e20e193c960802afba73b5d38sm	        }
141cfd74d65d832137e20e193c960802afba73b5d38sm        }
142cfd74d65d832137e20e193c960802afba73b5d38sm        return result;
143cfd74d65d832137e20e193c960802afba73b5d38sm    }
144cfd74d65d832137e20e193c960802afba73b5d38sm
145cfd74d65d832137e20e193c960802afba73b5d38sm    protected boolean shouldRun(GameObject parentObject) {
146cfd74d65d832137e20e193c960802afba73b5d38sm        boolean result = false;
147cfd74d65d832137e20e193c960802afba73b5d38sm        if (!mFlying && parentObject.touchingGround()) {
148cfd74d65d832137e20e193c960802afba73b5d38sm            final Vector2 velocity = parentObject.getVelocity();
149cfd74d65d832137e20e193c960802afba73b5d38sm            if (Math.abs(velocity.x) >= RUN_SPEED_THRESHOLD) {
150cfd74d65d832137e20e193c960802afba73b5d38sm                result = true;
151cfd74d65d832137e20e193c960802afba73b5d38sm            }
152cfd74d65d832137e20e193c960802afba73b5d38sm        }
153cfd74d65d832137e20e193c960802afba73b5d38sm        return result;
154cfd74d65d832137e20e193c960802afba73b5d38sm    }
155cfd74d65d832137e20e193c960802afba73b5d38sm
156cfd74d65d832137e20e193c960802afba73b5d38sm    protected boolean shouldMove(GameObject parentObject) {
157cfd74d65d832137e20e193c960802afba73b5d38sm        boolean result = true;
158cfd74d65d832137e20e193c960802afba73b5d38sm        final Vector2 velocity = parentObject.getVelocity();
159cfd74d65d832137e20e193c960802afba73b5d38sm
160cfd74d65d832137e20e193c960802afba73b5d38sm        if (mStopAtWalls) {
161cfd74d65d832137e20e193c960802afba73b5d38sm	        if ((velocity.x < 0.0f && parentObject.touchingLeftWall())
162cfd74d65d832137e20e193c960802afba73b5d38sm	                || (velocity.x > 0.0f && parentObject.touchingRightWall())) {
163cfd74d65d832137e20e193c960802afba73b5d38sm	            result = false;
164cfd74d65d832137e20e193c960802afba73b5d38sm	        }
165cfd74d65d832137e20e193c960802afba73b5d38sm        }
166cfd74d65d832137e20e193c960802afba73b5d38sm        return result;
167cfd74d65d832137e20e193c960802afba73b5d38sm    }
168cfd74d65d832137e20e193c960802afba73b5d38sm
169cfd74d65d832137e20e193c960802afba73b5d38sm    protected boolean shouldTakeHit(GameObject parentObject) {
170cfd74d65d832137e20e193c960802afba73b5d38sm    	boolean result = false;
171cfd74d65d832137e20e193c960802afba73b5d38sm    	if (parentObject.getCurrentAction() == ActionType.HIT_REACT
172cfd74d65d832137e20e193c960802afba73b5d38sm    			&& mSprite.findAnimation(TAKE_HIT) != null) {
173cfd74d65d832137e20e193c960802afba73b5d38sm    		result = true;
174cfd74d65d832137e20e193c960802afba73b5d38sm    	}
175cfd74d65d832137e20e193c960802afba73b5d38sm    	return result;
176cfd74d65d832137e20e193c960802afba73b5d38sm    }
177cfd74d65d832137e20e193c960802afba73b5d38sm
178cfd74d65d832137e20e193c960802afba73b5d38sm    protected void gotoRunStart() {
179cfd74d65d832137e20e193c960802afba73b5d38sm        if (mSprite.findAnimation(RUN_START) != null) {
180cfd74d65d832137e20e193c960802afba73b5d38sm            mCurrentAnimation = RUN_START;
181cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
182cfd74d65d832137e20e193c960802afba73b5d38sm            mCurrentAnimation = RUN;
183cfd74d65d832137e20e193c960802afba73b5d38sm        }
184cfd74d65d832137e20e193c960802afba73b5d38sm    }
185cfd74d65d832137e20e193c960802afba73b5d38sm
186cfd74d65d832137e20e193c960802afba73b5d38sm    protected void gotoRun() {
187cfd74d65d832137e20e193c960802afba73b5d38sm        mCurrentAnimation = RUN;
188cfd74d65d832137e20e193c960802afba73b5d38sm    }
189cfd74d65d832137e20e193c960802afba73b5d38sm
190cfd74d65d832137e20e193c960802afba73b5d38sm    protected void idle(GameObject parentObject) {
191cfd74d65d832137e20e193c960802afba73b5d38sm        final GameObject.ActionType currentAction = parentObject.getCurrentAction();
192cfd74d65d832137e20e193c960802afba73b5d38sm        if (currentAction == ActionType.MOVE) {
193cfd74d65d832137e20e193c960802afba73b5d38sm            final Vector2 velocity = parentObject.getVelocity();
194cfd74d65d832137e20e193c960802afba73b5d38sm            if (shouldFall(parentObject)) {
195cfd74d65d832137e20e193c960802afba73b5d38sm                mCurrentAnimation = JUMP_AIR;
196cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (shouldJump(parentObject)) {
197cfd74d65d832137e20e193c960802afba73b5d38sm                mCurrentAnimation = JUMP_START;
198cfd74d65d832137e20e193c960802afba73b5d38sm                parentObject.positionLocked = true;
199cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (Math.abs(velocity.x) > 0.0f && shouldMove(parentObject)) {
200cfd74d65d832137e20e193c960802afba73b5d38sm                if (shouldRun(parentObject)) {
201cfd74d65d832137e20e193c960802afba73b5d38sm                	gotoRunStart();
202cfd74d65d832137e20e193c960802afba73b5d38sm                	parentObject.positionLocked = true;
203cfd74d65d832137e20e193c960802afba73b5d38sm                } else {
204cfd74d65d832137e20e193c960802afba73b5d38sm                    mCurrentAnimation = WALK;
205cfd74d65d832137e20e193c960802afba73b5d38sm                }
206cfd74d65d832137e20e193c960802afba73b5d38sm            }
207cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (currentAction == ActionType.ATTACK) {
208cfd74d65d832137e20e193c960802afba73b5d38sm            mCurrentAnimation = SHOOT;
209cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (shouldTakeHit(parentObject)) {
210cfd74d65d832137e20e193c960802afba73b5d38sm        	mCurrentAnimation = TAKE_HIT;
211cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (parentObject.getCurrentAction() == ActionType.DEATH) {
212cfd74d65d832137e20e193c960802afba73b5d38sm        	mCurrentAnimation = DEATH;
213cfd74d65d832137e20e193c960802afba73b5d38sm        }
214cfd74d65d832137e20e193c960802afba73b5d38sm     }
215cfd74d65d832137e20e193c960802afba73b5d38sm
216cfd74d65d832137e20e193c960802afba73b5d38sm    protected void walk(GameObject parentObject) {
217cfd74d65d832137e20e193c960802afba73b5d38sm        final GameObject.ActionType currentAction = parentObject.getCurrentAction();
218cfd74d65d832137e20e193c960802afba73b5d38sm        if (currentAction == ActionType.MOVE) {
219cfd74d65d832137e20e193c960802afba73b5d38sm            final Vector2 velocity = parentObject.getVelocity();
220cfd74d65d832137e20e193c960802afba73b5d38sm            if (shouldFall(parentObject)) {
221cfd74d65d832137e20e193c960802afba73b5d38sm                mCurrentAnimation = JUMP_AIR;
222cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (shouldJump(parentObject)) {
223cfd74d65d832137e20e193c960802afba73b5d38sm                mCurrentAnimation = JUMP_START;
224cfd74d65d832137e20e193c960802afba73b5d38sm                parentObject.positionLocked = true;
225cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (Math.abs(velocity.x) > 0.0f) {
226cfd74d65d832137e20e193c960802afba73b5d38sm                if (shouldRun(parentObject)) {
227cfd74d65d832137e20e193c960802afba73b5d38sm                    gotoRun();
228cfd74d65d832137e20e193c960802afba73b5d38sm                }
229cfd74d65d832137e20e193c960802afba73b5d38sm                if (velocity.x > 0.0f) {
230cfd74d65d832137e20e193c960802afba73b5d38sm                    parentObject.facingDirection.x = 1;
231cfd74d65d832137e20e193c960802afba73b5d38sm                } else {
232cfd74d65d832137e20e193c960802afba73b5d38sm                    parentObject.facingDirection.x = -1;
233cfd74d65d832137e20e193c960802afba73b5d38sm                }
234cfd74d65d832137e20e193c960802afba73b5d38sm            } else {
235cfd74d65d832137e20e193c960802afba73b5d38sm                mCurrentAnimation = IDLE;
236cfd74d65d832137e20e193c960802afba73b5d38sm            }
237cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (currentAction == ActionType.ATTACK) {
238cfd74d65d832137e20e193c960802afba73b5d38sm            mCurrentAnimation = SHOOT;
239cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (shouldTakeHit(parentObject)) {
240cfd74d65d832137e20e193c960802afba73b5d38sm        	mCurrentAnimation = TAKE_HIT;
241cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (parentObject.getCurrentAction() == ActionType.DEATH) {
242cfd74d65d832137e20e193c960802afba73b5d38sm        	mCurrentAnimation = DEATH;
243cfd74d65d832137e20e193c960802afba73b5d38sm        }
244cfd74d65d832137e20e193c960802afba73b5d38sm    }
245cfd74d65d832137e20e193c960802afba73b5d38sm
246cfd74d65d832137e20e193c960802afba73b5d38sm    protected void runStart(GameObject parentObject) {
247cfd74d65d832137e20e193c960802afba73b5d38sm    	parentObject.positionLocked = true;
248cfd74d65d832137e20e193c960802afba73b5d38sm        if (mSprite.animationFinished()) {
249cfd74d65d832137e20e193c960802afba73b5d38sm            mCurrentAnimation = RUN;
250cfd74d65d832137e20e193c960802afba73b5d38sm            parentObject.positionLocked = false;
251cfd74d65d832137e20e193c960802afba73b5d38sm        }
252cfd74d65d832137e20e193c960802afba73b5d38sm    }
253cfd74d65d832137e20e193c960802afba73b5d38sm    protected void run(GameObject parentObject) {
254cfd74d65d832137e20e193c960802afba73b5d38sm        final GameObject.ActionType currentAction = parentObject.getCurrentAction();
255cfd74d65d832137e20e193c960802afba73b5d38sm        if (currentAction == ActionType.MOVE) {
256cfd74d65d832137e20e193c960802afba73b5d38sm            final Vector2 velocity = parentObject.getVelocity();
257cfd74d65d832137e20e193c960802afba73b5d38sm            if (shouldFall(parentObject)) {
258cfd74d65d832137e20e193c960802afba73b5d38sm                mCurrentAnimation = JUMP_AIR;
259cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (shouldJump(parentObject)) {
260cfd74d65d832137e20e193c960802afba73b5d38sm                parentObject.positionLocked = true;
261cfd74d65d832137e20e193c960802afba73b5d38sm                mCurrentAnimation = JUMP_START;
262cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (Math.abs(velocity.x) > 0.0f) {
263cfd74d65d832137e20e193c960802afba73b5d38sm                if (!shouldRun(parentObject)) {
264cfd74d65d832137e20e193c960802afba73b5d38sm                    mCurrentAnimation = WALK;
265cfd74d65d832137e20e193c960802afba73b5d38sm                }
266cfd74d65d832137e20e193c960802afba73b5d38sm
267cfd74d65d832137e20e193c960802afba73b5d38sm                if (velocity.x > 0.0f) {
268cfd74d65d832137e20e193c960802afba73b5d38sm                    parentObject.facingDirection.x = 1;
269cfd74d65d832137e20e193c960802afba73b5d38sm                } else {
270cfd74d65d832137e20e193c960802afba73b5d38sm                    parentObject.facingDirection.x = -1;
271cfd74d65d832137e20e193c960802afba73b5d38sm                }
272cfd74d65d832137e20e193c960802afba73b5d38sm            } else {
273cfd74d65d832137e20e193c960802afba73b5d38sm            	mCurrentAnimation = IDLE;
274cfd74d65d832137e20e193c960802afba73b5d38sm            }
275cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (currentAction == ActionType.ATTACK) {
276cfd74d65d832137e20e193c960802afba73b5d38sm            mCurrentAnimation = SHOOT;
277cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (shouldTakeHit(parentObject)) {
278cfd74d65d832137e20e193c960802afba73b5d38sm        	mCurrentAnimation = TAKE_HIT;
279cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (parentObject.getCurrentAction() == ActionType.DEATH) {
280cfd74d65d832137e20e193c960802afba73b5d38sm        	mCurrentAnimation = DEATH;
281cfd74d65d832137e20e193c960802afba73b5d38sm        }
282cfd74d65d832137e20e193c960802afba73b5d38sm    }
283cfd74d65d832137e20e193c960802afba73b5d38sm
284cfd74d65d832137e20e193c960802afba73b5d38sm    protected void shoot(GameObject parentObject) {
285cfd74d65d832137e20e193c960802afba73b5d38sm        if (mSprite.animationFinished() || parentObject.getCurrentAction() != ActionType.ATTACK) {
286cfd74d65d832137e20e193c960802afba73b5d38sm            mCurrentAnimation = IDLE;
287cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (shouldTakeHit(parentObject)) {
288cfd74d65d832137e20e193c960802afba73b5d38sm        	mCurrentAnimation = TAKE_HIT;
289cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (parentObject.getCurrentAction() == ActionType.DEATH) {
290cfd74d65d832137e20e193c960802afba73b5d38sm            	mCurrentAnimation = DEATH;
291cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
292cfd74d65d832137e20e193c960802afba73b5d38sm            final Vector2 velocity = parentObject.getVelocity();
293cfd74d65d832137e20e193c960802afba73b5d38sm
294cfd74d65d832137e20e193c960802afba73b5d38sm        	if (velocity.x > 0.0f) {
295cfd74d65d832137e20e193c960802afba73b5d38sm                parentObject.facingDirection.x = 1;
296cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (velocity.x < 0.0f) {
297cfd74d65d832137e20e193c960802afba73b5d38sm                parentObject.facingDirection.x = -1;
298cfd74d65d832137e20e193c960802afba73b5d38sm            }
299cfd74d65d832137e20e193c960802afba73b5d38sm        }
300cfd74d65d832137e20e193c960802afba73b5d38sm    }
301cfd74d65d832137e20e193c960802afba73b5d38sm
302cfd74d65d832137e20e193c960802afba73b5d38sm    protected void jumpStart(GameObject parentObject) {
303cfd74d65d832137e20e193c960802afba73b5d38sm        final Vector2 velocity = parentObject.getVelocity();
304cfd74d65d832137e20e193c960802afba73b5d38sm
305cfd74d65d832137e20e193c960802afba73b5d38sm        if (velocity.x > 0.0f) {
306cfd74d65d832137e20e193c960802afba73b5d38sm            parentObject.facingDirection.x = 1;
307cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (velocity.x < 0.0f) {
308cfd74d65d832137e20e193c960802afba73b5d38sm            parentObject.facingDirection.x = -1;
309cfd74d65d832137e20e193c960802afba73b5d38sm        }
310cfd74d65d832137e20e193c960802afba73b5d38sm        parentObject.positionLocked = true;
311cfd74d65d832137e20e193c960802afba73b5d38sm
312cfd74d65d832137e20e193c960802afba73b5d38sm        if (mSprite.animationFinished()) {
313cfd74d65d832137e20e193c960802afba73b5d38sm            mCurrentAnimation = JUMP_AIR;
314cfd74d65d832137e20e193c960802afba73b5d38sm            parentObject.positionLocked = false;
315cfd74d65d832137e20e193c960802afba73b5d38sm        }
316cfd74d65d832137e20e193c960802afba73b5d38sm    }
317cfd74d65d832137e20e193c960802afba73b5d38sm
318cfd74d65d832137e20e193c960802afba73b5d38sm    protected void jumpAir(GameObject parentObject) {
319cfd74d65d832137e20e193c960802afba73b5d38sm        final GameObject.ActionType currentAction = parentObject.getCurrentAction();
320cfd74d65d832137e20e193c960802afba73b5d38sm        if (currentAction == ActionType.MOVE) {
321cfd74d65d832137e20e193c960802afba73b5d38sm            final Vector2 velocity = parentObject.getVelocity();
322cfd74d65d832137e20e193c960802afba73b5d38sm
323cfd74d65d832137e20e193c960802afba73b5d38sm            if (parentObject.touchingGround()) {
324cfd74d65d832137e20e193c960802afba73b5d38sm                if (Math.abs(velocity.x) > 0.0f) {
325cfd74d65d832137e20e193c960802afba73b5d38sm                    if (shouldRun(parentObject)) {
326cfd74d65d832137e20e193c960802afba73b5d38sm                        mCurrentAnimation = RUN;
327cfd74d65d832137e20e193c960802afba73b5d38sm                    } else {
328cfd74d65d832137e20e193c960802afba73b5d38sm                        mCurrentAnimation = WALK;
329cfd74d65d832137e20e193c960802afba73b5d38sm                    }
330cfd74d65d832137e20e193c960802afba73b5d38sm                } else {
331cfd74d65d832137e20e193c960802afba73b5d38sm                    mCurrentAnimation = IDLE;
332cfd74d65d832137e20e193c960802afba73b5d38sm                }
333cfd74d65d832137e20e193c960802afba73b5d38sm            } else {
334cfd74d65d832137e20e193c960802afba73b5d38sm
335cfd74d65d832137e20e193c960802afba73b5d38sm                if (velocity.x > 0.0f) {
336cfd74d65d832137e20e193c960802afba73b5d38sm                    parentObject.facingDirection.x = 1;
337cfd74d65d832137e20e193c960802afba73b5d38sm                } else if (velocity.x < 0.0f) {
338cfd74d65d832137e20e193c960802afba73b5d38sm                    parentObject.facingDirection.x = -1;
339cfd74d65d832137e20e193c960802afba73b5d38sm                }
340cfd74d65d832137e20e193c960802afba73b5d38sm
341cfd74d65d832137e20e193c960802afba73b5d38sm            }
342cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
343cfd74d65d832137e20e193c960802afba73b5d38sm            mCurrentAnimation = IDLE;
344cfd74d65d832137e20e193c960802afba73b5d38sm        }
345cfd74d65d832137e20e193c960802afba73b5d38sm    }
346cfd74d65d832137e20e193c960802afba73b5d38sm
347cfd74d65d832137e20e193c960802afba73b5d38sm    protected void takeHit(GameObject parentObject) {
348cfd74d65d832137e20e193c960802afba73b5d38sm    	if (mSprite.animationFinished()) {
349cfd74d65d832137e20e193c960802afba73b5d38sm    		if (parentObject.life > 0 && parentObject.getCurrentAction() != ActionType.DEATH) {
350cfd74d65d832137e20e193c960802afba73b5d38sm    			if (parentObject.getCurrentAction() != ActionType.HIT_REACT) {
351cfd74d65d832137e20e193c960802afba73b5d38sm    				mCurrentAnimation = IDLE;
352cfd74d65d832137e20e193c960802afba73b5d38sm    			}
353cfd74d65d832137e20e193c960802afba73b5d38sm			} else {
354cfd74d65d832137e20e193c960802afba73b5d38sm    			mCurrentAnimation = DEATH;
355cfd74d65d832137e20e193c960802afba73b5d38sm    		}
356cfd74d65d832137e20e193c960802afba73b5d38sm    	}
357cfd74d65d832137e20e193c960802afba73b5d38sm    }
358cfd74d65d832137e20e193c960802afba73b5d38sm
359cfd74d65d832137e20e193c960802afba73b5d38sm    protected void surprised(GameObject parentObject) {
360cfd74d65d832137e20e193c960802afba73b5d38sm    	if (mSprite.animationFinished()) {
361cfd74d65d832137e20e193c960802afba73b5d38sm    		mCurrentAnimation = IDLE;
362cfd74d65d832137e20e193c960802afba73b5d38sm    	}
363cfd74d65d832137e20e193c960802afba73b5d38sm    }
364cfd74d65d832137e20e193c960802afba73b5d38sm
365cfd74d65d832137e20e193c960802afba73b5d38sm    protected void death(GameObject parentObject) {
366cfd74d65d832137e20e193c960802afba73b5d38sm    }
367cfd74d65d832137e20e193c960802afba73b5d38sm
368cfd74d65d832137e20e193c960802afba73b5d38sm    public void setSprite(SpriteComponent sprite) {
369cfd74d65d832137e20e193c960802afba73b5d38sm        mSprite = sprite;
370cfd74d65d832137e20e193c960802afba73b5d38sm    }
371cfd74d65d832137e20e193c960802afba73b5d38sm
372cfd74d65d832137e20e193c960802afba73b5d38sm	public void setChannel(Channel channel) {
373cfd74d65d832137e20e193c960802afba73b5d38sm		mChannel = channel;
374cfd74d65d832137e20e193c960802afba73b5d38sm	}
375cfd74d65d832137e20e193c960802afba73b5d38sm
376cfd74d65d832137e20e193c960802afba73b5d38sm	public void setChannelTrigger(int animation) {
377cfd74d65d832137e20e193c960802afba73b5d38sm		mChannelTrigger = animation;
378cfd74d65d832137e20e193c960802afba73b5d38sm	}
379cfd74d65d832137e20e193c960802afba73b5d38sm
380cfd74d65d832137e20e193c960802afba73b5d38sm	public void setFlying(boolean flying) {
381cfd74d65d832137e20e193c960802afba73b5d38sm		mFlying = flying;
382cfd74d65d832137e20e193c960802afba73b5d38sm	}
383cfd74d65d832137e20e193c960802afba73b5d38sm
384cfd74d65d832137e20e193c960802afba73b5d38sm	public void setStopAtWalls(boolean stop) {
385cfd74d65d832137e20e193c960802afba73b5d38sm		mStopAtWalls = stop;
386cfd74d65d832137e20e193c960802afba73b5d38sm	}
387cfd74d65d832137e20e193c960802afba73b5d38sm}
388