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.GameObject.ActionType;
20cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.SoundSystem.Sound;
21cfd74d65d832137e20e193c960802afba73b5d38sm
22cfd74d65d832137e20e193c960802afba73b5d38smpublic class LauncherComponent extends GameComponent {
23cfd74d65d832137e20e193c960802afba73b5d38sm    private final static float DEFAULT_LAUNCH_DELAY = 2.0f;
24cfd74d65d832137e20e193c960802afba73b5d38sm    private final static float DEFAULT_LAUNCH_MAGNITUDE = 2000.0f;
25cfd74d65d832137e20e193c960802afba73b5d38sm    private final static float DEFAULT_POST_LAUNCH_DELAY = 1.0f;
26cfd74d65d832137e20e193c960802afba73b5d38sm    private GameObject mShot;
27cfd74d65d832137e20e193c960802afba73b5d38sm    private float mLaunchTime;
28cfd74d65d832137e20e193c960802afba73b5d38sm    private float mAngle;
29cfd74d65d832137e20e193c960802afba73b5d38sm    private float mLaunchDelay;
30cfd74d65d832137e20e193c960802afba73b5d38sm    private Vector2 mLaunchDirection;
31cfd74d65d832137e20e193c960802afba73b5d38sm    private float mLaunchMagnitude;
32cfd74d65d832137e20e193c960802afba73b5d38sm    private float mPostLaunchDelay;
33cfd74d65d832137e20e193c960802afba73b5d38sm    private boolean mDriveActions;
34cfd74d65d832137e20e193c960802afba73b5d38sm    private GameObjectFactory.GameObjectType mLaunchEffect;
35cfd74d65d832137e20e193c960802afba73b5d38sm    private float mLaunchEffectOffsetX;
36cfd74d65d832137e20e193c960802afba73b5d38sm    private float mLaunchEffectOffsetY;
37cfd74d65d832137e20e193c960802afba73b5d38sm    private Sound mLaunchSound;
38cfd74d65d832137e20e193c960802afba73b5d38sm
39cfd74d65d832137e20e193c960802afba73b5d38sm    public LauncherComponent() {
40cfd74d65d832137e20e193c960802afba73b5d38sm        super();
41cfd74d65d832137e20e193c960802afba73b5d38sm        mLaunchDirection = new Vector2();
42cfd74d65d832137e20e193c960802afba73b5d38sm        reset();
43cfd74d65d832137e20e193c960802afba73b5d38sm        setPhase(ComponentPhases.THINK.ordinal());
44cfd74d65d832137e20e193c960802afba73b5d38sm    }
45cfd74d65d832137e20e193c960802afba73b5d38sm
46cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
47cfd74d65d832137e20e193c960802afba73b5d38sm    public void reset() {
48cfd74d65d832137e20e193c960802afba73b5d38sm        mShot = null;
49cfd74d65d832137e20e193c960802afba73b5d38sm        mLaunchTime = 0.0f;
50cfd74d65d832137e20e193c960802afba73b5d38sm        mAngle = 0.0f;
51cfd74d65d832137e20e193c960802afba73b5d38sm        mLaunchDelay = DEFAULT_LAUNCH_DELAY;
52cfd74d65d832137e20e193c960802afba73b5d38sm        mLaunchMagnitude = DEFAULT_LAUNCH_MAGNITUDE;
53cfd74d65d832137e20e193c960802afba73b5d38sm        mPostLaunchDelay = DEFAULT_POST_LAUNCH_DELAY;
54cfd74d65d832137e20e193c960802afba73b5d38sm        mDriveActions = true;
55cfd74d65d832137e20e193c960802afba73b5d38sm        mLaunchEffect = GameObjectFactory.GameObjectType.INVALID;
56cfd74d65d832137e20e193c960802afba73b5d38sm        mLaunchEffectOffsetX = 0.0f;
57cfd74d65d832137e20e193c960802afba73b5d38sm        mLaunchEffectOffsetY = 0.0f;
58cfd74d65d832137e20e193c960802afba73b5d38sm        mLaunchSound = null;
59cfd74d65d832137e20e193c960802afba73b5d38sm    }
60cfd74d65d832137e20e193c960802afba73b5d38sm
61cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
62cfd74d65d832137e20e193c960802afba73b5d38sm    public void update(float timeDelta, BaseObject parent) {
63cfd74d65d832137e20e193c960802afba73b5d38sm        final TimeSystem time = sSystemRegistry.timeSystem;
64cfd74d65d832137e20e193c960802afba73b5d38sm        final float gameTime = time.getGameTime();
65cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject parentObject = (GameObject)parent;
66cfd74d65d832137e20e193c960802afba73b5d38sm
67cfd74d65d832137e20e193c960802afba73b5d38sm        if (mShot != null) {
68cfd74d65d832137e20e193c960802afba73b5d38sm            if (mShot.life <= 0) {
69cfd74d65d832137e20e193c960802afba73b5d38sm                // Looks like the shot is dead.  Let's forget about it.
70cfd74d65d832137e20e193c960802afba73b5d38sm                // TODO: this is unreliable.  We should have a "notify on death" event or something.
71cfd74d65d832137e20e193c960802afba73b5d38sm                mShot = null;
72cfd74d65d832137e20e193c960802afba73b5d38sm            } else {
73cfd74d65d832137e20e193c960802afba73b5d38sm                if (gameTime > mLaunchTime) {
74cfd74d65d832137e20e193c960802afba73b5d38sm                    fire(mShot, parentObject, mAngle);
75cfd74d65d832137e20e193c960802afba73b5d38sm                    mShot = null;
76cfd74d65d832137e20e193c960802afba73b5d38sm                    if (mDriveActions) {
77cfd74d65d832137e20e193c960802afba73b5d38sm                    	parentObject.setCurrentAction(ActionType.ATTACK);
78cfd74d65d832137e20e193c960802afba73b5d38sm                    }
79cfd74d65d832137e20e193c960802afba73b5d38sm                } else {
80cfd74d65d832137e20e193c960802afba73b5d38sm                    mShot.setPosition(parentObject.getPosition());
81cfd74d65d832137e20e193c960802afba73b5d38sm                }
82cfd74d65d832137e20e193c960802afba73b5d38sm            }
83cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (gameTime > mLaunchTime + mPostLaunchDelay) {
84cfd74d65d832137e20e193c960802afba73b5d38sm        	if (mDriveActions) {
85cfd74d65d832137e20e193c960802afba73b5d38sm        		parentObject.setCurrentAction(ActionType.IDLE);
86cfd74d65d832137e20e193c960802afba73b5d38sm        	}
87cfd74d65d832137e20e193c960802afba73b5d38sm        }
88cfd74d65d832137e20e193c960802afba73b5d38sm    }
89cfd74d65d832137e20e193c960802afba73b5d38sm
90cfd74d65d832137e20e193c960802afba73b5d38sm    public void prepareToLaunch(GameObject object, GameObject parentObject) {
91cfd74d65d832137e20e193c960802afba73b5d38sm        if (mShot != object) {
92cfd74d65d832137e20e193c960802afba73b5d38sm            if (mShot != null) {
93cfd74d65d832137e20e193c960802afba73b5d38sm                // We already have a shot loaded and we are asked to shoot something else.
94cfd74d65d832137e20e193c960802afba73b5d38sm                // Shoot the current shot off and then load the new one.
95cfd74d65d832137e20e193c960802afba73b5d38sm                fire(mShot, parentObject, mAngle);
96cfd74d65d832137e20e193c960802afba73b5d38sm            }
97cfd74d65d832137e20e193c960802afba73b5d38sm            final TimeSystem time = sSystemRegistry.timeSystem;
98cfd74d65d832137e20e193c960802afba73b5d38sm            final float gameTime = time.getGameTime();
99cfd74d65d832137e20e193c960802afba73b5d38sm            mShot = object;
100cfd74d65d832137e20e193c960802afba73b5d38sm            mLaunchTime = gameTime + mLaunchDelay;
101cfd74d65d832137e20e193c960802afba73b5d38sm        }
102cfd74d65d832137e20e193c960802afba73b5d38sm    }
103cfd74d65d832137e20e193c960802afba73b5d38sm
104cfd74d65d832137e20e193c960802afba73b5d38sm    private void fire(GameObject object, GameObject parentObject, float mAngle) {
105cfd74d65d832137e20e193c960802afba73b5d38sm        if (mDriveActions) {
106cfd74d65d832137e20e193c960802afba73b5d38sm        	object.setCurrentAction(ActionType.MOVE);
107cfd74d65d832137e20e193c960802afba73b5d38sm        }
108cfd74d65d832137e20e193c960802afba73b5d38sm        mLaunchDirection.set((float)Math.sin(mAngle), (float)Math.cos(mAngle));
109cfd74d65d832137e20e193c960802afba73b5d38sm        mLaunchDirection.multiply(parentObject.facingDirection);
110cfd74d65d832137e20e193c960802afba73b5d38sm        mLaunchDirection.multiply(mLaunchMagnitude);
111cfd74d65d832137e20e193c960802afba73b5d38sm        object.setVelocity(mLaunchDirection);
112cfd74d65d832137e20e193c960802afba73b5d38sm
113cfd74d65d832137e20e193c960802afba73b5d38sm        if (mLaunchSound != null) {
114cfd74d65d832137e20e193c960802afba73b5d38sm        	SoundSystem sound = sSystemRegistry.soundSystem;
115cfd74d65d832137e20e193c960802afba73b5d38sm        	if (sound != null) {
116cfd74d65d832137e20e193c960802afba73b5d38sm        		sound.play(mLaunchSound, false, SoundSystem.PRIORITY_NORMAL);
117cfd74d65d832137e20e193c960802afba73b5d38sm        	}
118cfd74d65d832137e20e193c960802afba73b5d38sm        }
119cfd74d65d832137e20e193c960802afba73b5d38sm
120cfd74d65d832137e20e193c960802afba73b5d38sm        if (mLaunchEffect != GameObjectFactory.GameObjectType.INVALID) {
121cfd74d65d832137e20e193c960802afba73b5d38sm        	GameObjectFactory factory = sSystemRegistry.gameObjectFactory;
122cfd74d65d832137e20e193c960802afba73b5d38sm        	GameObjectManager manager = sSystemRegistry.gameObjectManager;
123cfd74d65d832137e20e193c960802afba73b5d38sm        	if (factory != null && manager != null) {
124cfd74d65d832137e20e193c960802afba73b5d38sm        		final Vector2 position = parentObject.getPosition();
125cfd74d65d832137e20e193c960802afba73b5d38sm
126cfd74d65d832137e20e193c960802afba73b5d38sm        		GameObject effect = factory.spawn(mLaunchEffect,
127cfd74d65d832137e20e193c960802afba73b5d38sm        				position.x + (mLaunchEffectOffsetX * parentObject.facingDirection.x),
128cfd74d65d832137e20e193c960802afba73b5d38sm        				position.y + (mLaunchEffectOffsetY * parentObject.facingDirection.y),
129cfd74d65d832137e20e193c960802afba73b5d38sm        				false);
1309d4cc2572d37983607df38b0f4216ed76ac51814sm        		if (effect != null) {
1319d4cc2572d37983607df38b0f4216ed76ac51814sm        			manager.add(effect);
1329d4cc2572d37983607df38b0f4216ed76ac51814sm        		}
133cfd74d65d832137e20e193c960802afba73b5d38sm        	}
134cfd74d65d832137e20e193c960802afba73b5d38sm        }
135cfd74d65d832137e20e193c960802afba73b5d38sm    }
136cfd74d65d832137e20e193c960802afba73b5d38sm
137cfd74d65d832137e20e193c960802afba73b5d38sm    public void setup(float angle, float magnitude, float launchDelay, float postLaunchDelay, boolean driveActions) {
138cfd74d65d832137e20e193c960802afba73b5d38sm    	mAngle = angle;
139cfd74d65d832137e20e193c960802afba73b5d38sm    	mLaunchMagnitude = magnitude;
140cfd74d65d832137e20e193c960802afba73b5d38sm    	mLaunchDelay = launchDelay;
141cfd74d65d832137e20e193c960802afba73b5d38sm    	mPostLaunchDelay = postLaunchDelay;
142cfd74d65d832137e20e193c960802afba73b5d38sm    	mDriveActions = driveActions;
143cfd74d65d832137e20e193c960802afba73b5d38sm    }
144cfd74d65d832137e20e193c960802afba73b5d38sm
145cfd74d65d832137e20e193c960802afba73b5d38sm    public void setLaunchEffect(GameObjectFactory.GameObjectType effectType, float offsetX, float offsetY) {
146cfd74d65d832137e20e193c960802afba73b5d38sm    	mLaunchEffect = effectType;
147cfd74d65d832137e20e193c960802afba73b5d38sm    	mLaunchEffectOffsetX = offsetX;
148cfd74d65d832137e20e193c960802afba73b5d38sm    	mLaunchEffectOffsetY = offsetY;
149cfd74d65d832137e20e193c960802afba73b5d38sm    }
150cfd74d65d832137e20e193c960802afba73b5d38sm
151cfd74d65d832137e20e193c960802afba73b5d38sm    public void setLaunchSound(Sound sound) {
152cfd74d65d832137e20e193c960802afba73b5d38sm    	mLaunchSound = sound;
153cfd74d65d832137e20e193c960802afba73b5d38sm    }
154cfd74d65d832137e20e193c960802afba73b5d38sm
155cfd74d65d832137e20e193c960802afba73b5d38sm}
156