AnimationComponent.java revision 9d4cc2572d37983607df38b0f4216ed76ac51814
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
19cfd74d65d832137e20e193c960802afba73b5d38sm
20cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.CollisionParameters.HitType;
21cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.GameObject.ActionType;
22cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.SoundSystem.Sound;
23cfd74d65d832137e20e193c960802afba73b5d38sm
24cfd74d65d832137e20e193c960802afba73b5d38sm/**
25cfd74d65d832137e20e193c960802afba73b5d38sm * Player Animation game object component.  Responsible for selecting an animation to describe the
26cfd74d65d832137e20e193c960802afba73b5d38sm * player's current state.  Requires the object to contain a SpriteComponent to play animations.
27cfd74d65d832137e20e193c960802afba73b5d38sm */
28cfd74d65d832137e20e193c960802afba73b5d38smpublic class AnimationComponent extends GameComponent {
29cfd74d65d832137e20e193c960802afba73b5d38sm
30cfd74d65d832137e20e193c960802afba73b5d38sm    public enum PlayerAnimations {
31cfd74d65d832137e20e193c960802afba73b5d38sm        IDLE,
32cfd74d65d832137e20e193c960802afba73b5d38sm        MOVE,
33cfd74d65d832137e20e193c960802afba73b5d38sm        MOVE_FAST,
34cfd74d65d832137e20e193c960802afba73b5d38sm        BOOST_UP,
35cfd74d65d832137e20e193c960802afba73b5d38sm        BOOST_MOVE,
36cfd74d65d832137e20e193c960802afba73b5d38sm        BOOST_MOVE_FAST,
37cfd74d65d832137e20e193c960802afba73b5d38sm        STOMP,
38cfd74d65d832137e20e193c960802afba73b5d38sm        HIT_REACT,
39cfd74d65d832137e20e193c960802afba73b5d38sm        DEATH,
40cfd74d65d832137e20e193c960802afba73b5d38sm        FROZEN
41cfd74d65d832137e20e193c960802afba73b5d38sm    }
42cfd74d65d832137e20e193c960802afba73b5d38sm
43cfd74d65d832137e20e193c960802afba73b5d38sm    private static final float MIN_ROCKET_TIME = 0.0f;
44cfd74d65d832137e20e193c960802afba73b5d38sm    private static final float FLICKER_INTERVAL = 0.15f;
45cfd74d65d832137e20e193c960802afba73b5d38sm    private static final float FLICKER_DURATION = 3.0f;
46cfd74d65d832137e20e193c960802afba73b5d38sm    private static final float LAND_THUMP_DELAY = 0.5f;
47cfd74d65d832137e20e193c960802afba73b5d38sm
48cfd74d65d832137e20e193c960802afba73b5d38sm    private SpriteComponent mSprite;
49cfd74d65d832137e20e193c960802afba73b5d38sm    private SpriteComponent mJetSprite;
50cfd74d65d832137e20e193c960802afba73b5d38sm    private SpriteComponent mSparksSprite;
51cfd74d65d832137e20e193c960802afba73b5d38sm
52cfd74d65d832137e20e193c960802afba73b5d38sm    private PlayerComponent mPlayer;
53cfd74d65d832137e20e193c960802afba73b5d38sm    private float mLastFlickerTime;
54cfd74d65d832137e20e193c960802afba73b5d38sm    private boolean mFlickerOn;
55cfd74d65d832137e20e193c960802afba73b5d38sm    private float mFlickerTimeRemaining;
56cfd74d65d832137e20e193c960802afba73b5d38sm
57cfd74d65d832137e20e193c960802afba73b5d38sm    private GameObject.ActionType mPreviousAction;
58cfd74d65d832137e20e193c960802afba73b5d38sm
59cfd74d65d832137e20e193c960802afba73b5d38sm    private float mLastRocketsOnTime;
60cfd74d65d832137e20e193c960802afba73b5d38sm    private boolean mExplodingDeath;
61cfd74d65d832137e20e193c960802afba73b5d38sm
62cfd74d65d832137e20e193c960802afba73b5d38sm    private ChangeComponentsComponent mDamageSwap;
63cfd74d65d832137e20e193c960802afba73b5d38sm    private Sound mLandThump;
64cfd74d65d832137e20e193c960802afba73b5d38sm    private Sound mRocketSound;
65cfd74d65d832137e20e193c960802afba73b5d38sm    private Sound mExplosionSound;
66cfd74d65d832137e20e193c960802afba73b5d38sm    private float mLandThumpDelay;
67cfd74d65d832137e20e193c960802afba73b5d38sm    private int mRocketSoundStream;
68cfd74d65d832137e20e193c960802afba73b5d38sm    private boolean mRocketSoundPaused;
69cfd74d65d832137e20e193c960802afba73b5d38sm
70cfd74d65d832137e20e193c960802afba73b5d38sm    private int mLastRubyCount;
71cfd74d65d832137e20e193c960802afba73b5d38sm    private Sound mRubySound1;
72cfd74d65d832137e20e193c960802afba73b5d38sm    private Sound mRubySound2;
73cfd74d65d832137e20e193c960802afba73b5d38sm    private Sound mRubySound3;
74cfd74d65d832137e20e193c960802afba73b5d38sm    private InventoryComponent mInventory;
75cfd74d65d832137e20e193c960802afba73b5d38sm
76cfd74d65d832137e20e193c960802afba73b5d38sm
77cfd74d65d832137e20e193c960802afba73b5d38sm    public AnimationComponent() {
78cfd74d65d832137e20e193c960802afba73b5d38sm        super();
79cfd74d65d832137e20e193c960802afba73b5d38sm        reset();
80cfd74d65d832137e20e193c960802afba73b5d38sm        setPhase(ComponentPhases.ANIMATION.ordinal());
81cfd74d65d832137e20e193c960802afba73b5d38sm    }
82cfd74d65d832137e20e193c960802afba73b5d38sm
83cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
84cfd74d65d832137e20e193c960802afba73b5d38sm    public void reset() {
85cfd74d65d832137e20e193c960802afba73b5d38sm        mPreviousAction = ActionType.INVALID;
86cfd74d65d832137e20e193c960802afba73b5d38sm        mSprite = null;
87cfd74d65d832137e20e193c960802afba73b5d38sm        mJetSprite = null;
88cfd74d65d832137e20e193c960802afba73b5d38sm        mSparksSprite = null;
89cfd74d65d832137e20e193c960802afba73b5d38sm        mPlayer = null;
90cfd74d65d832137e20e193c960802afba73b5d38sm        mLastFlickerTime = 0.0f;
91cfd74d65d832137e20e193c960802afba73b5d38sm        mFlickerOn = false;
92cfd74d65d832137e20e193c960802afba73b5d38sm        mFlickerTimeRemaining = 0.0f;
93cfd74d65d832137e20e193c960802afba73b5d38sm        mLastRocketsOnTime = 0.0f;
94cfd74d65d832137e20e193c960802afba73b5d38sm        mExplodingDeath = false;
95cfd74d65d832137e20e193c960802afba73b5d38sm        mDamageSwap = null;
96cfd74d65d832137e20e193c960802afba73b5d38sm        mLandThump = null;
97cfd74d65d832137e20e193c960802afba73b5d38sm        mLandThumpDelay = 0.0f;
98cfd74d65d832137e20e193c960802afba73b5d38sm        mRocketSound = null;
99cfd74d65d832137e20e193c960802afba73b5d38sm        mRocketSoundStream = -1;
100cfd74d65d832137e20e193c960802afba73b5d38sm        mLastRubyCount = 0;
101cfd74d65d832137e20e193c960802afba73b5d38sm        mInventory = null;
102cfd74d65d832137e20e193c960802afba73b5d38sm        mExplosionSound = null;
103cfd74d65d832137e20e193c960802afba73b5d38sm    }
104cfd74d65d832137e20e193c960802afba73b5d38sm
105cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
106cfd74d65d832137e20e193c960802afba73b5d38sm    public void update(float timeDelta, BaseObject parent) {
107cfd74d65d832137e20e193c960802afba73b5d38sm        if (mSprite != null) {
108cfd74d65d832137e20e193c960802afba73b5d38sm
109cfd74d65d832137e20e193c960802afba73b5d38sm            GameObject parentObject = (GameObject) parent;
110cfd74d65d832137e20e193c960802afba73b5d38sm
111cfd74d65d832137e20e193c960802afba73b5d38sm            final float velocityX = parentObject.getVelocity().x;
112cfd74d65d832137e20e193c960802afba73b5d38sm            final float velocityY = parentObject.getVelocity().y;
113cfd74d65d832137e20e193c960802afba73b5d38sm
114cfd74d65d832137e20e193c960802afba73b5d38sm
115cfd74d65d832137e20e193c960802afba73b5d38sm            GameObject.ActionType currentAction = parentObject.getCurrentAction();
116cfd74d65d832137e20e193c960802afba73b5d38sm
117cfd74d65d832137e20e193c960802afba73b5d38sm            if (mJetSprite != null) {
118cfd74d65d832137e20e193c960802afba73b5d38sm                mJetSprite.setVisible(false);
119cfd74d65d832137e20e193c960802afba73b5d38sm            }
120cfd74d65d832137e20e193c960802afba73b5d38sm
121cfd74d65d832137e20e193c960802afba73b5d38sm            if (mSparksSprite != null) {
122cfd74d65d832137e20e193c960802afba73b5d38sm                mSparksSprite.setVisible(false);
123cfd74d65d832137e20e193c960802afba73b5d38sm            }
124cfd74d65d832137e20e193c960802afba73b5d38sm
125cfd74d65d832137e20e193c960802afba73b5d38sm
126cfd74d65d832137e20e193c960802afba73b5d38sm            final TimeSystem time = sSystemRegistry.timeSystem;
127cfd74d65d832137e20e193c960802afba73b5d38sm            final float gameTime = time.getGameTime();
128cfd74d65d832137e20e193c960802afba73b5d38sm
129cfd74d65d832137e20e193c960802afba73b5d38sm            if (currentAction != ActionType.HIT_REACT && mPreviousAction == ActionType.HIT_REACT) {
130cfd74d65d832137e20e193c960802afba73b5d38sm                mFlickerTimeRemaining = FLICKER_DURATION;
131cfd74d65d832137e20e193c960802afba73b5d38sm            }
132cfd74d65d832137e20e193c960802afba73b5d38sm
133cfd74d65d832137e20e193c960802afba73b5d38sm
134cfd74d65d832137e20e193c960802afba73b5d38sm            final boolean touchingGround = parentObject.touchingGround();
135cfd74d65d832137e20e193c960802afba73b5d38sm
136cfd74d65d832137e20e193c960802afba73b5d38sm            boolean boosting = mPlayer != null ? mPlayer.getRocketsOn() : false;
137cfd74d65d832137e20e193c960802afba73b5d38sm
138cfd74d65d832137e20e193c960802afba73b5d38sm            boolean visible = true;
139cfd74d65d832137e20e193c960802afba73b5d38sm
140cfd74d65d832137e20e193c960802afba73b5d38sm            SoundSystem sound = sSystemRegistry.soundSystem;
141cfd74d65d832137e20e193c960802afba73b5d38sm
142cfd74d65d832137e20e193c960802afba73b5d38sm            // It's usually not necessary to test to see if sound is enabled or not (when it's disabled,
143cfd74d65d832137e20e193c960802afba73b5d38sm            // play() is just a nop), but in this case I have a stream that is maintained for the rocket
144cfd74d65d832137e20e193c960802afba73b5d38sm            // sounds.  So it's simpler to just avoid that code if sound is off.
145cfd74d65d832137e20e193c960802afba73b5d38sm            if (sound.getSoundEnabled()) {
146cfd74d65d832137e20e193c960802afba73b5d38sm	            if (boosting) {
147cfd74d65d832137e20e193c960802afba73b5d38sm	                mLastRocketsOnTime = gameTime;
148cfd74d65d832137e20e193c960802afba73b5d38sm	            } else {
149cfd74d65d832137e20e193c960802afba73b5d38sm	                if (gameTime - mLastRocketsOnTime < MIN_ROCKET_TIME
150cfd74d65d832137e20e193c960802afba73b5d38sm	                        && velocityY >= 0.0f) {
151cfd74d65d832137e20e193c960802afba73b5d38sm	                    boosting = true;
152cfd74d65d832137e20e193c960802afba73b5d38sm	                }
153cfd74d65d832137e20e193c960802afba73b5d38sm	            }
154cfd74d65d832137e20e193c960802afba73b5d38sm
155cfd74d65d832137e20e193c960802afba73b5d38sm	            if (mRocketSound != null) {
156cfd74d65d832137e20e193c960802afba73b5d38sm		            if (boosting) {
157cfd74d65d832137e20e193c960802afba73b5d38sm		            	if (mRocketSoundStream == -1) {
158cfd74d65d832137e20e193c960802afba73b5d38sm		            		mRocketSoundStream = sound.play(mRocketSound, true, SoundSystem.PRIORITY_HIGH);
159cfd74d65d832137e20e193c960802afba73b5d38sm		            		mRocketSoundPaused = false;
160cfd74d65d832137e20e193c960802afba73b5d38sm		            	} else if (mRocketSoundPaused) {
161cfd74d65d832137e20e193c960802afba73b5d38sm		            		sound.resume(mRocketSoundStream);
162cfd74d65d832137e20e193c960802afba73b5d38sm		            		mRocketSoundPaused = false;
163cfd74d65d832137e20e193c960802afba73b5d38sm		            	}
164cfd74d65d832137e20e193c960802afba73b5d38sm		            } else {
165cfd74d65d832137e20e193c960802afba73b5d38sm		            	sound.pause(mRocketSoundStream);
166cfd74d65d832137e20e193c960802afba73b5d38sm		            	mRocketSoundPaused = true;
167cfd74d65d832137e20e193c960802afba73b5d38sm		            }
168cfd74d65d832137e20e193c960802afba73b5d38sm	            }
169cfd74d65d832137e20e193c960802afba73b5d38sm            }
170cfd74d65d832137e20e193c960802afba73b5d38sm
171cfd74d65d832137e20e193c960802afba73b5d38sm            // Normally, for collectables like the coin, we could just tell the object to play
172cfd74d65d832137e20e193c960802afba73b5d38sm            // a sound when it is collected.  The gems are a special case, though, as we
173cfd74d65d832137e20e193c960802afba73b5d38sm            // want to pick a different sound depending on how many have been collected.
174cfd74d65d832137e20e193c960802afba73b5d38sm            if (mInventory != null && mRubySound1 != null && mRubySound2 != null && mRubySound3 != null) {
175cfd74d65d832137e20e193c960802afba73b5d38sm            	InventoryComponent.UpdateRecord inventory = mInventory.getRecord();
176cfd74d65d832137e20e193c960802afba73b5d38sm            	final int rubyCount = inventory.rubyCount;
177cfd74d65d832137e20e193c960802afba73b5d38sm            	if (rubyCount != mLastRubyCount) {
178cfd74d65d832137e20e193c960802afba73b5d38sm            		mLastRubyCount = rubyCount;
179cfd74d65d832137e20e193c960802afba73b5d38sm            		switch (rubyCount) {
180cfd74d65d832137e20e193c960802afba73b5d38sm            		case 1:
181cfd74d65d832137e20e193c960802afba73b5d38sm            			sound.play(mRubySound1, false, SoundSystem.PRIORITY_NORMAL);
182cfd74d65d832137e20e193c960802afba73b5d38sm            			break;
183cfd74d65d832137e20e193c960802afba73b5d38sm            		case 2:
184cfd74d65d832137e20e193c960802afba73b5d38sm            			sound.play(mRubySound2, false, SoundSystem.PRIORITY_NORMAL);
185cfd74d65d832137e20e193c960802afba73b5d38sm            			break;
186cfd74d65d832137e20e193c960802afba73b5d38sm            		case 3:
187cfd74d65d832137e20e193c960802afba73b5d38sm            			sound.play(mRubySound3, false, SoundSystem.PRIORITY_NORMAL);
188cfd74d65d832137e20e193c960802afba73b5d38sm            			break;
189cfd74d65d832137e20e193c960802afba73b5d38sm            		}
190cfd74d65d832137e20e193c960802afba73b5d38sm
191cfd74d65d832137e20e193c960802afba73b5d38sm            	}
192cfd74d65d832137e20e193c960802afba73b5d38sm            }
193cfd74d65d832137e20e193c960802afba73b5d38sm
194cfd74d65d832137e20e193c960802afba73b5d38sm            // Turn on visual effects (smoke, etc) when the player's life reaches 1.
195cfd74d65d832137e20e193c960802afba73b5d38sm            if (mDamageSwap != null) {
196cfd74d65d832137e20e193c960802afba73b5d38sm                if (parentObject.life == 1 && !mDamageSwap.getCurrentlySwapped()) {
197cfd74d65d832137e20e193c960802afba73b5d38sm                    mDamageSwap.activate(parentObject);
198cfd74d65d832137e20e193c960802afba73b5d38sm                } else if (parentObject.life != 1 && mDamageSwap.getCurrentlySwapped()) {
199cfd74d65d832137e20e193c960802afba73b5d38sm                    mDamageSwap.activate(parentObject);
200cfd74d65d832137e20e193c960802afba73b5d38sm                }
201cfd74d65d832137e20e193c960802afba73b5d38sm            }
202cfd74d65d832137e20e193c960802afba73b5d38sm
203cfd74d65d832137e20e193c960802afba73b5d38sm            float opacity = 1.0f;
204cfd74d65d832137e20e193c960802afba73b5d38sm
205cfd74d65d832137e20e193c960802afba73b5d38sm            if (currentAction == ActionType.MOVE) {
2069d4cc2572d37983607df38b0f4216ed76ac51814sm                InputGameInterface input = sSystemRegistry.inputGameInterface;
2079d4cc2572d37983607df38b0f4216ed76ac51814sm                final InputXY dpad = input.getDirectionalPad();
2089d4cc2572d37983607df38b0f4216ed76ac51814sm                if (dpad.getX() < 0.0f) {
209cfd74d65d832137e20e193c960802afba73b5d38sm                    parentObject.facingDirection.x = -1.0f;
2109d4cc2572d37983607df38b0f4216ed76ac51814sm                } else if (dpad.getX() > 0.0f) {
211cfd74d65d832137e20e193c960802afba73b5d38sm                    parentObject.facingDirection.x = 1.0f;
212cfd74d65d832137e20e193c960802afba73b5d38sm                }
213cfd74d65d832137e20e193c960802afba73b5d38sm
214cfd74d65d832137e20e193c960802afba73b5d38sm                // TODO: get rid of these magic numbers!
215cfd74d65d832137e20e193c960802afba73b5d38sm                if (touchingGround) {
216cfd74d65d832137e20e193c960802afba73b5d38sm
217cfd74d65d832137e20e193c960802afba73b5d38sm                    if (Utils.close(velocityX, 0.0f, 30.0f)) {
218cfd74d65d832137e20e193c960802afba73b5d38sm                        mSprite.playAnimation(PlayerAnimations.IDLE.ordinal());
219cfd74d65d832137e20e193c960802afba73b5d38sm                    } else if (Math.abs(velocityX) > 300.0f) {
220cfd74d65d832137e20e193c960802afba73b5d38sm                        mSprite.playAnimation(PlayerAnimations.MOVE_FAST.ordinal());
221cfd74d65d832137e20e193c960802afba73b5d38sm                    } else {
222cfd74d65d832137e20e193c960802afba73b5d38sm                        mSprite.playAnimation(PlayerAnimations.MOVE.ordinal());
223cfd74d65d832137e20e193c960802afba73b5d38sm                    }
224cfd74d65d832137e20e193c960802afba73b5d38sm
2259d4cc2572d37983607df38b0f4216ed76ac51814sm                    final InputButton attackButton = input.getAttackButton();
2269d4cc2572d37983607df38b0f4216ed76ac51814sm
2279d4cc2572d37983607df38b0f4216ed76ac51814sm                    if (attackButton.getPressed()) {
228cfd74d65d832137e20e193c960802afba73b5d38sm                        // charge
2299d4cc2572d37983607df38b0f4216ed76ac51814sm                        final float pressedTime = gameTime - attackButton.getLastPressedTime();
230cfd74d65d832137e20e193c960802afba73b5d38sm                        final float wave = (float)Math.cos(pressedTime * (float)Math.PI * 2.0f);
231cfd74d65d832137e20e193c960802afba73b5d38sm                        opacity = (wave * 0.25f) + 0.75f;
232cfd74d65d832137e20e193c960802afba73b5d38sm                    }
233cfd74d65d832137e20e193c960802afba73b5d38sm
234cfd74d65d832137e20e193c960802afba73b5d38sm                } else {
235cfd74d65d832137e20e193c960802afba73b5d38sm                    if (boosting) {
236cfd74d65d832137e20e193c960802afba73b5d38sm                        if (mJetSprite != null) {
237cfd74d65d832137e20e193c960802afba73b5d38sm                            mJetSprite.setVisible(true);
238cfd74d65d832137e20e193c960802afba73b5d38sm                        }
239cfd74d65d832137e20e193c960802afba73b5d38sm
240cfd74d65d832137e20e193c960802afba73b5d38sm                        if (Math.abs(velocityX) < 100.0f && velocityY > 10.0f) {
241cfd74d65d832137e20e193c960802afba73b5d38sm                            mSprite.playAnimation(PlayerAnimations.BOOST_UP.ordinal());
242cfd74d65d832137e20e193c960802afba73b5d38sm                        } else if (Math.abs(velocityX) > 300.0f) {
243cfd74d65d832137e20e193c960802afba73b5d38sm                            mSprite.playAnimation(PlayerAnimations.BOOST_MOVE_FAST.ordinal());
244cfd74d65d832137e20e193c960802afba73b5d38sm                        } else {
245cfd74d65d832137e20e193c960802afba73b5d38sm                            mSprite.playAnimation(PlayerAnimations.BOOST_MOVE.ordinal());
246cfd74d65d832137e20e193c960802afba73b5d38sm                        }
247cfd74d65d832137e20e193c960802afba73b5d38sm                    } else {
248cfd74d65d832137e20e193c960802afba73b5d38sm
249cfd74d65d832137e20e193c960802afba73b5d38sm                        if (Utils.close(velocityX, 0.0f, 1.0f)) {
250cfd74d65d832137e20e193c960802afba73b5d38sm                            mSprite.playAnimation(PlayerAnimations.IDLE.ordinal());
251cfd74d65d832137e20e193c960802afba73b5d38sm                        } else if (Math.abs(velocityX) > 300.0f) {
252cfd74d65d832137e20e193c960802afba73b5d38sm                            mSprite.playAnimation(PlayerAnimations.MOVE_FAST.ordinal());
253cfd74d65d832137e20e193c960802afba73b5d38sm                        } else {
254cfd74d65d832137e20e193c960802afba73b5d38sm                            mSprite.playAnimation(PlayerAnimations.MOVE.ordinal());
255cfd74d65d832137e20e193c960802afba73b5d38sm                        }
256cfd74d65d832137e20e193c960802afba73b5d38sm                    }
257cfd74d65d832137e20e193c960802afba73b5d38sm
258cfd74d65d832137e20e193c960802afba73b5d38sm                }
259cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (currentAction == ActionType.ATTACK) {
260cfd74d65d832137e20e193c960802afba73b5d38sm                mSprite.playAnimation(PlayerAnimations.STOMP.ordinal());
261cfd74d65d832137e20e193c960802afba73b5d38sm                if (touchingGround && gameTime > mLandThumpDelay) {
262cfd74d65d832137e20e193c960802afba73b5d38sm                    if (mLandThump != null && sound != null) {
263cfd74d65d832137e20e193c960802afba73b5d38sm                        // modulate the sound slightly to avoid sounding too similar
264cfd74d65d832137e20e193c960802afba73b5d38sm                        sound.play(mLandThump, false, SoundSystem.PRIORITY_HIGH, 1.0f,
265cfd74d65d832137e20e193c960802afba73b5d38sm                                (float)(Math.random() * 0.5f) + 0.75f);
266cfd74d65d832137e20e193c960802afba73b5d38sm                        mLandThumpDelay = gameTime + LAND_THUMP_DELAY;
267cfd74d65d832137e20e193c960802afba73b5d38sm                    }
268cfd74d65d832137e20e193c960802afba73b5d38sm                }
269cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (currentAction == ActionType.HIT_REACT) {
270cfd74d65d832137e20e193c960802afba73b5d38sm                mSprite.playAnimation(PlayerAnimations.HIT_REACT.ordinal());
271cfd74d65d832137e20e193c960802afba73b5d38sm
272cfd74d65d832137e20e193c960802afba73b5d38sm                if (velocityX > 0.0f) {
273cfd74d65d832137e20e193c960802afba73b5d38sm                    parentObject.facingDirection.x = -1.0f;
274cfd74d65d832137e20e193c960802afba73b5d38sm                } else if (velocityX < 0.0f) {
275cfd74d65d832137e20e193c960802afba73b5d38sm                    parentObject.facingDirection.x = 1.0f;
276cfd74d65d832137e20e193c960802afba73b5d38sm                }
277cfd74d65d832137e20e193c960802afba73b5d38sm
278cfd74d65d832137e20e193c960802afba73b5d38sm                if (mSparksSprite != null) {
279cfd74d65d832137e20e193c960802afba73b5d38sm                    mSparksSprite.setVisible(true);
280cfd74d65d832137e20e193c960802afba73b5d38sm                }
281cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (currentAction == ActionType.DEATH) {
282cfd74d65d832137e20e193c960802afba73b5d38sm                if (mPreviousAction != currentAction) {
283cfd74d65d832137e20e193c960802afba73b5d38sm                	if (mExplosionSound != null) {
284cfd74d65d832137e20e193c960802afba73b5d38sm                		sound.play(mExplosionSound, false, SoundSystem.PRIORITY_NORMAL);
285cfd74d65d832137e20e193c960802afba73b5d38sm                	}
286cfd74d65d832137e20e193c960802afba73b5d38sm                	// by default, explode when hit with the DEATH hit type.
287cfd74d65d832137e20e193c960802afba73b5d38sm                    boolean explodingDeath = parentObject.lastReceivedHitType == HitType.DEATH;
288cfd74d65d832137e20e193c960802afba73b5d38sm                    // or if touching a death tile.
289cfd74d65d832137e20e193c960802afba73b5d38sm                    HotSpotSystem hotSpot = sSystemRegistry.hotSpotSystem;
290cfd74d65d832137e20e193c960802afba73b5d38sm                    if (hotSpot != null) {
291cfd74d65d832137e20e193c960802afba73b5d38sm                        // TODO: HACK!  Unify all this code.
292cfd74d65d832137e20e193c960802afba73b5d38sm                        if (hotSpot.getHotSpot(parentObject.getCenteredPositionX(),
293cfd74d65d832137e20e193c960802afba73b5d38sm                                parentObject.getPosition().y + 10.0f) == HotSpotSystem.HotSpotType.DIE) {
294cfd74d65d832137e20e193c960802afba73b5d38sm                            explodingDeath = true;
295cfd74d65d832137e20e193c960802afba73b5d38sm                        }
296cfd74d65d832137e20e193c960802afba73b5d38sm                    }
297cfd74d65d832137e20e193c960802afba73b5d38sm                    if (explodingDeath) {
298cfd74d65d832137e20e193c960802afba73b5d38sm                        mExplodingDeath = true;
299cfd74d65d832137e20e193c960802afba73b5d38sm                        GameObjectFactory factory = sSystemRegistry.gameObjectFactory;
300cfd74d65d832137e20e193c960802afba73b5d38sm                        GameObjectManager manager = sSystemRegistry.gameObjectManager;
301cfd74d65d832137e20e193c960802afba73b5d38sm                        if (factory != null && manager != null) {
302cfd74d65d832137e20e193c960802afba73b5d38sm                            GameObject explosion = factory.spawnEffectExplosionGiant(parentObject.getPosition().x, parentObject.getPosition().y);
303cfd74d65d832137e20e193c960802afba73b5d38sm                            if (explosion != null) {
304cfd74d65d832137e20e193c960802afba73b5d38sm                                manager.add(explosion);
305cfd74d65d832137e20e193c960802afba73b5d38sm                            }
306cfd74d65d832137e20e193c960802afba73b5d38sm                        }
307cfd74d65d832137e20e193c960802afba73b5d38sm                    } else {
308cfd74d65d832137e20e193c960802afba73b5d38sm                        mSprite.playAnimation(PlayerAnimations.DEATH.ordinal());
309cfd74d65d832137e20e193c960802afba73b5d38sm                        mExplodingDeath = false;
310cfd74d65d832137e20e193c960802afba73b5d38sm                    }
311cfd74d65d832137e20e193c960802afba73b5d38sm
312cfd74d65d832137e20e193c960802afba73b5d38sm                    mFlickerTimeRemaining = 0.0f;
313cfd74d65d832137e20e193c960802afba73b5d38sm                    if (mSparksSprite != null) {
314cfd74d65d832137e20e193c960802afba73b5d38sm                        if (!mSprite.animationFinished()) {
315cfd74d65d832137e20e193c960802afba73b5d38sm                            mSparksSprite.setVisible(true);
316cfd74d65d832137e20e193c960802afba73b5d38sm                        }
317cfd74d65d832137e20e193c960802afba73b5d38sm                    }
318cfd74d65d832137e20e193c960802afba73b5d38sm                }
319cfd74d65d832137e20e193c960802afba73b5d38sm                if (mExplodingDeath) {
320cfd74d65d832137e20e193c960802afba73b5d38sm                    visible = false;
321cfd74d65d832137e20e193c960802afba73b5d38sm                }
322cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (currentAction == ActionType.FROZEN) {
323cfd74d65d832137e20e193c960802afba73b5d38sm                mSprite.playAnimation(PlayerAnimations.FROZEN.ordinal());
324cfd74d65d832137e20e193c960802afba73b5d38sm            }
325cfd74d65d832137e20e193c960802afba73b5d38sm
326cfd74d65d832137e20e193c960802afba73b5d38sm            if (mFlickerTimeRemaining > 0.0f) {
327cfd74d65d832137e20e193c960802afba73b5d38sm                mFlickerTimeRemaining -= timeDelta;
328cfd74d65d832137e20e193c960802afba73b5d38sm                if (gameTime > mLastFlickerTime + FLICKER_INTERVAL) {
329cfd74d65d832137e20e193c960802afba73b5d38sm                    mLastFlickerTime = gameTime;
330cfd74d65d832137e20e193c960802afba73b5d38sm                    mFlickerOn = !mFlickerOn;
331cfd74d65d832137e20e193c960802afba73b5d38sm                }
332cfd74d65d832137e20e193c960802afba73b5d38sm                mSprite.setVisible(mFlickerOn);
333cfd74d65d832137e20e193c960802afba73b5d38sm                if (mJetSprite != null && mJetSprite.getVisible()) {
334cfd74d65d832137e20e193c960802afba73b5d38sm                    mJetSprite.setVisible(mFlickerOn);
335cfd74d65d832137e20e193c960802afba73b5d38sm                }
336cfd74d65d832137e20e193c960802afba73b5d38sm            } else {
337cfd74d65d832137e20e193c960802afba73b5d38sm                mSprite.setVisible(visible);
338cfd74d65d832137e20e193c960802afba73b5d38sm                mSprite.setOpacity(opacity);
339cfd74d65d832137e20e193c960802afba73b5d38sm            }
340cfd74d65d832137e20e193c960802afba73b5d38sm
341cfd74d65d832137e20e193c960802afba73b5d38sm            mPreviousAction = currentAction;
342cfd74d65d832137e20e193c960802afba73b5d38sm        }
343cfd74d65d832137e20e193c960802afba73b5d38sm    }
344cfd74d65d832137e20e193c960802afba73b5d38sm
345cfd74d65d832137e20e193c960802afba73b5d38sm    public void setSprite(SpriteComponent sprite) {
346cfd74d65d832137e20e193c960802afba73b5d38sm        mSprite = sprite;
347cfd74d65d832137e20e193c960802afba73b5d38sm    }
348cfd74d65d832137e20e193c960802afba73b5d38sm
349cfd74d65d832137e20e193c960802afba73b5d38sm    public void setJetSprite(SpriteComponent sprite) {
350cfd74d65d832137e20e193c960802afba73b5d38sm        mJetSprite = sprite;
351cfd74d65d832137e20e193c960802afba73b5d38sm    }
352cfd74d65d832137e20e193c960802afba73b5d38sm
353cfd74d65d832137e20e193c960802afba73b5d38sm    public void setSparksSprite(SpriteComponent sprite) {
354cfd74d65d832137e20e193c960802afba73b5d38sm        mSparksSprite = sprite;
355cfd74d65d832137e20e193c960802afba73b5d38sm    }
356cfd74d65d832137e20e193c960802afba73b5d38sm
357cfd74d65d832137e20e193c960802afba73b5d38sm    public void setPlayer(PlayerComponent player) {
358cfd74d65d832137e20e193c960802afba73b5d38sm        mPlayer = player;
359cfd74d65d832137e20e193c960802afba73b5d38sm    }
360cfd74d65d832137e20e193c960802afba73b5d38sm
361cfd74d65d832137e20e193c960802afba73b5d38sm    public final void setDamageSwap(ChangeComponentsComponent damageSwap) {
362cfd74d65d832137e20e193c960802afba73b5d38sm        mDamageSwap = damageSwap;
363cfd74d65d832137e20e193c960802afba73b5d38sm    }
364cfd74d65d832137e20e193c960802afba73b5d38sm
365cfd74d65d832137e20e193c960802afba73b5d38sm    public void setLandThump(Sound land) {
366cfd74d65d832137e20e193c960802afba73b5d38sm        mLandThump = land;
367cfd74d65d832137e20e193c960802afba73b5d38sm    }
368cfd74d65d832137e20e193c960802afba73b5d38sm
369cfd74d65d832137e20e193c960802afba73b5d38sm	public void setRocketSound(Sound sound) {
370cfd74d65d832137e20e193c960802afba73b5d38sm		mRocketSound = sound;
371cfd74d65d832137e20e193c960802afba73b5d38sm	}
372cfd74d65d832137e20e193c960802afba73b5d38sm
373cfd74d65d832137e20e193c960802afba73b5d38sm	public void setRubySounds(Sound one, Sound two, Sound three) {
374cfd74d65d832137e20e193c960802afba73b5d38sm		mRubySound1 = one;
375cfd74d65d832137e20e193c960802afba73b5d38sm		mRubySound2 = two;
376cfd74d65d832137e20e193c960802afba73b5d38sm		mRubySound3 = three;
377cfd74d65d832137e20e193c960802afba73b5d38sm	}
378cfd74d65d832137e20e193c960802afba73b5d38sm
379cfd74d65d832137e20e193c960802afba73b5d38sm	public void setInventory(InventoryComponent inventory) {
380cfd74d65d832137e20e193c960802afba73b5d38sm		mInventory = inventory;
381cfd74d65d832137e20e193c960802afba73b5d38sm	}
382cfd74d65d832137e20e193c960802afba73b5d38sm
383cfd74d65d832137e20e193c960802afba73b5d38sm	public void setExplosionSound(Sound sound) {
384cfd74d65d832137e20e193c960802afba73b5d38sm		mExplosionSound = sound;
385cfd74d65d832137e20e193c960802afba73b5d38sm	}
386cfd74d65d832137e20e193c960802afba73b5d38sm}
387