GameObjectFactory.java revision cfd74d65d832137e20e193c960802afba73b5d38
1cfd74d65d832137e20e193c960802afba73b5d38sm/*
2cfd74d65d832137e20e193c960802afba73b5d38sm * Copyright (C) 2008 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 java.util.Comparator;
20cfd74d65d832137e20e193c960802afba73b5d38sm
21cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.AnimationComponent.PlayerAnimations;
22cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.CollisionParameters.HitType;
23cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.EnemyAnimationComponent.EnemyAnimations;
24cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.GameObject.ActionType;
25cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.GameObject.Team;
26cfd74d65d832137e20e193c960802afba73b5d38sm
27cfd74d65d832137e20e193c960802afba73b5d38sm/** A class for generating game objects at runtime.
28cfd74d65d832137e20e193c960802afba73b5d38sm * This should really be replaced with something that is data-driven, but it is hard to do data
29cfd74d65d832137e20e193c960802afba73b5d38sm * parsing quickly at runtime.  For the moment this class is full of large functions that just
30cfd74d65d832137e20e193c960802afba73b5d38sm * patch pointers between objects, but in the future those functions should either be
31cfd74d65d832137e20e193c960802afba73b5d38sm * a) generated from data at compile time, or b) described by data at runtime.
32cfd74d65d832137e20e193c960802afba73b5d38sm */
33cfd74d65d832137e20e193c960802afba73b5d38smpublic class GameObjectFactory extends BaseObject {
34cfd74d65d832137e20e193c960802afba73b5d38sm    private final static int MAX_GAME_OBJECTS = 256;
35cfd74d65d832137e20e193c960802afba73b5d38sm    private final static ComponentPoolComparator sComponentPoolComparator = new ComponentPoolComparator();
36cfd74d65d832137e20e193c960802afba73b5d38sm    private FixedSizeArray<FixedSizeArray<BaseObject>> mStaticData;
37cfd74d65d832137e20e193c960802afba73b5d38sm    private FixedSizeArray<GameComponentPool> mComponentPools;
38cfd74d65d832137e20e193c960802afba73b5d38sm    private GameComponentPool mPoolSearchDummy;
39cfd74d65d832137e20e193c960802afba73b5d38sm    private GameObjectPool mGameObjectPool;
40cfd74d65d832137e20e193c960802afba73b5d38sm
41cfd74d65d832137e20e193c960802afba73b5d38sm    private float mTightActivationRadius;
42cfd74d65d832137e20e193c960802afba73b5d38sm    private float mNormalActivationRadius;
43cfd74d65d832137e20e193c960802afba73b5d38sm    private float mWideActivationRadius;
44cfd74d65d832137e20e193c960802afba73b5d38sm    private float mAlwaysActive;
45cfd74d65d832137e20e193c960802afba73b5d38sm
46cfd74d65d832137e20e193c960802afba73b5d38sm    private final static String sRedButtonChannel = "RED BUTTON";
47cfd74d65d832137e20e193c960802afba73b5d38sm    private final static String sBlueButtonChannel = "BLUE BUTTON";
48cfd74d65d832137e20e193c960802afba73b5d38sm    private final static String sGreenButtonChannel = "GREEN BUTTON";
49cfd74d65d832137e20e193c960802afba73b5d38sm    private final static String sSurprisedNPCChannel = "SURPRISED";
50cfd74d65d832137e20e193c960802afba73b5d38sm
51cfd74d65d832137e20e193c960802afba73b5d38sm
52cfd74d65d832137e20e193c960802afba73b5d38sm    // A list of game objects that can be spawned at runtime.  Note that the indicies of these
53cfd74d65d832137e20e193c960802afba73b5d38sm    // objects must match the order of the object tileset in the level editor in order for the
54cfd74d65d832137e20e193c960802afba73b5d38sm    // level content to make sense.
55cfd74d65d832137e20e193c960802afba73b5d38sm    public enum GameObjectType {
56cfd74d65d832137e20e193c960802afba73b5d38sm        INVALID(-1),
57cfd74d65d832137e20e193c960802afba73b5d38sm
58cfd74d65d832137e20e193c960802afba73b5d38sm        PLAYER (0),
59cfd74d65d832137e20e193c960802afba73b5d38sm
60cfd74d65d832137e20e193c960802afba73b5d38sm        // Collectables
61cfd74d65d832137e20e193c960802afba73b5d38sm        COIN (1),
62cfd74d65d832137e20e193c960802afba73b5d38sm        RUBY (2),
63cfd74d65d832137e20e193c960802afba73b5d38sm        DIARY (3),
64cfd74d65d832137e20e193c960802afba73b5d38sm
65cfd74d65d832137e20e193c960802afba73b5d38sm        // Characters
66cfd74d65d832137e20e193c960802afba73b5d38sm        WANDA (10),
67cfd74d65d832137e20e193c960802afba73b5d38sm        KYLE (11),
68cfd74d65d832137e20e193c960802afba73b5d38sm        KYLE_DEAD (12),
69cfd74d65d832137e20e193c960802afba73b5d38sm        ANDOU_DEAD (13),
70cfd74d65d832137e20e193c960802afba73b5d38sm        KABOCHA (26),
71cfd74d65d832137e20e193c960802afba73b5d38sm        ROKUDOU_TERMINAL (27),
72cfd74d65d832137e20e193c960802afba73b5d38sm        KABOCHA_TERMINAL (28),
73cfd74d65d832137e20e193c960802afba73b5d38sm        EVIL_KABOCHA (29),
74cfd74d65d832137e20e193c960802afba73b5d38sm        ROKUDOU (30),
75cfd74d65d832137e20e193c960802afba73b5d38sm
76cfd74d65d832137e20e193c960802afba73b5d38sm        // AI
77cfd74d65d832137e20e193c960802afba73b5d38sm        BROBOT (16),
78cfd74d65d832137e20e193c960802afba73b5d38sm        SNAILBOMB (17),
79cfd74d65d832137e20e193c960802afba73b5d38sm        SHADOWSLIME (18),
80cfd74d65d832137e20e193c960802afba73b5d38sm        MUDMAN (19),
81cfd74d65d832137e20e193c960802afba73b5d38sm        SKELETON (20),
82cfd74d65d832137e20e193c960802afba73b5d38sm        KARAGUIN (21),
83cfd74d65d832137e20e193c960802afba73b5d38sm        PINK_NAMAZU (22),
84cfd74d65d832137e20e193c960802afba73b5d38sm        TURRET (23),
85cfd74d65d832137e20e193c960802afba73b5d38sm        TURRET_LEFT (24),
86cfd74d65d832137e20e193c960802afba73b5d38sm        BAT (6),
87cfd74d65d832137e20e193c960802afba73b5d38sm        STING(7),
88cfd74d65d832137e20e193c960802afba73b5d38sm        ONION(8),
89cfd74d65d832137e20e193c960802afba73b5d38sm
90cfd74d65d832137e20e193c960802afba73b5d38sm        // Objects
91cfd74d65d832137e20e193c960802afba73b5d38sm        DOOR_RED (32),
92cfd74d65d832137e20e193c960802afba73b5d38sm        DOOR_BLUE (33),
93cfd74d65d832137e20e193c960802afba73b5d38sm        DOOR_GREEN (34),
94cfd74d65d832137e20e193c960802afba73b5d38sm        BUTTON_RED (35),
95cfd74d65d832137e20e193c960802afba73b5d38sm        BUTTON_BLUE (36),
96cfd74d65d832137e20e193c960802afba73b5d38sm        BUTTON_GREEN (37),
97cfd74d65d832137e20e193c960802afba73b5d38sm        CANNON (38),
98cfd74d65d832137e20e193c960802afba73b5d38sm        BROBOT_SPAWNER (39),
99cfd74d65d832137e20e193c960802afba73b5d38sm        BROBOT_SPAWNER_LEFT (40),
100cfd74d65d832137e20e193c960802afba73b5d38sm        BREAKABLE_BLOCK(41),
101cfd74d65d832137e20e193c960802afba73b5d38sm        THE_SOURCE(42),
102cfd74d65d832137e20e193c960802afba73b5d38sm
103cfd74d65d832137e20e193c960802afba73b5d38sm        // Effects
104cfd74d65d832137e20e193c960802afba73b5d38sm        DUST(48),
105cfd74d65d832137e20e193c960802afba73b5d38sm        EXPLOSION_SMALL(49),
106cfd74d65d832137e20e193c960802afba73b5d38sm        EXPLOSION_LARGE(50),
107cfd74d65d832137e20e193c960802afba73b5d38sm        EXPLOSION_GIANT(51),
108cfd74d65d832137e20e193c960802afba73b5d38sm
109cfd74d65d832137e20e193c960802afba73b5d38sm
110cfd74d65d832137e20e193c960802afba73b5d38sm        // Special Spawnable
111cfd74d65d832137e20e193c960802afba73b5d38sm        DOOR_RED_NONBLOCKING (52),
112cfd74d65d832137e20e193c960802afba73b5d38sm        DOOR_BLUE_NONBLOCKING (53),
113cfd74d65d832137e20e193c960802afba73b5d38sm        DOOR_GREEN_NONBLOCKING (54),
114cfd74d65d832137e20e193c960802afba73b5d38sm
115cfd74d65d832137e20e193c960802afba73b5d38sm        GHOST_NPC(55),
116cfd74d65d832137e20e193c960802afba73b5d38sm
117cfd74d65d832137e20e193c960802afba73b5d38sm        CAMERA_BIAS(56),
118cfd74d65d832137e20e193c960802afba73b5d38sm
119cfd74d65d832137e20e193c960802afba73b5d38sm        SMOKE_BIG(57),
120cfd74d65d832137e20e193c960802afba73b5d38sm        SMOKE_SMALL(58),
121cfd74d65d832137e20e193c960802afba73b5d38sm
122cfd74d65d832137e20e193c960802afba73b5d38sm        CRUSH_FLASH(59),
123cfd74d65d832137e20e193c960802afba73b5d38sm        FLASH(60),
124cfd74d65d832137e20e193c960802afba73b5d38sm
125cfd74d65d832137e20e193c960802afba73b5d38sm        // Projectiles
126cfd74d65d832137e20e193c960802afba73b5d38sm        ENERGY_BALL(68),
127cfd74d65d832137e20e193c960802afba73b5d38sm        CANNON_BALL(65),
128cfd74d65d832137e20e193c960802afba73b5d38sm        TURRET_BULLET(66),
129cfd74d65d832137e20e193c960802afba73b5d38sm        BROBOT_BULLET(67),
130cfd74d65d832137e20e193c960802afba73b5d38sm        BREAKABLE_BLOCK_PIECE(68),
131cfd74d65d832137e20e193c960802afba73b5d38sm        BREAKABLE_BLOCK_PIECE_SPAWNER(69),
132cfd74d65d832137e20e193c960802afba73b5d38sm        WANDA_SHOT(70),
133cfd74d65d832137e20e193c960802afba73b5d38sm
134cfd74d65d832137e20e193c960802afba73b5d38sm        // Special Objects -- Not spawnable normally
135cfd74d65d832137e20e193c960802afba73b5d38sm        PLAYER_JETS(-1),
136cfd74d65d832137e20e193c960802afba73b5d38sm        PLAYER_SPARKS(-1),
137cfd74d65d832137e20e193c960802afba73b5d38sm        PLAYER_GLOW(-1),
138cfd74d65d832137e20e193c960802afba73b5d38sm        ENEMY_SPARKS(-1),
139cfd74d65d832137e20e193c960802afba73b5d38sm        GHOST(-1),
140cfd74d65d832137e20e193c960802afba73b5d38sm        SMOKE_POOF(-1),
141cfd74d65d832137e20e193c960802afba73b5d38sm        GEM_EFFECT(-1),
142cfd74d65d832137e20e193c960802afba73b5d38sm        GEM_EFFECT_SPAWNER(-1),
143cfd74d65d832137e20e193c960802afba73b5d38sm
144cfd74d65d832137e20e193c960802afba73b5d38sm
145cfd74d65d832137e20e193c960802afba73b5d38sm        // End
146cfd74d65d832137e20e193c960802afba73b5d38sm        OBJECT_COUNT(-1);
147cfd74d65d832137e20e193c960802afba73b5d38sm
148cfd74d65d832137e20e193c960802afba73b5d38sm        private final int mIndex;
149cfd74d65d832137e20e193c960802afba73b5d38sm        GameObjectType(int index) {
150cfd74d65d832137e20e193c960802afba73b5d38sm            this.mIndex = index;
151cfd74d65d832137e20e193c960802afba73b5d38sm        }
152cfd74d65d832137e20e193c960802afba73b5d38sm
153cfd74d65d832137e20e193c960802afba73b5d38sm        public int index() {
154cfd74d65d832137e20e193c960802afba73b5d38sm            return mIndex;
155cfd74d65d832137e20e193c960802afba73b5d38sm        }
156cfd74d65d832137e20e193c960802afba73b5d38sm
157cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO: Is there any better way to do this?
158cfd74d65d832137e20e193c960802afba73b5d38sm        public static GameObjectType indexToType(int index) {
159cfd74d65d832137e20e193c960802afba73b5d38sm            final GameObjectType[] valuesArray = values();
160cfd74d65d832137e20e193c960802afba73b5d38sm            GameObjectType foundType = INVALID;
161cfd74d65d832137e20e193c960802afba73b5d38sm            for (int x = 0; x < valuesArray.length; x++) {
162cfd74d65d832137e20e193c960802afba73b5d38sm                GameObjectType type = valuesArray[x];
163cfd74d65d832137e20e193c960802afba73b5d38sm                if (type.mIndex == index) {
164cfd74d65d832137e20e193c960802afba73b5d38sm                    foundType = type;
165cfd74d65d832137e20e193c960802afba73b5d38sm                    break;
166cfd74d65d832137e20e193c960802afba73b5d38sm                }
167cfd74d65d832137e20e193c960802afba73b5d38sm            }
168cfd74d65d832137e20e193c960802afba73b5d38sm            return foundType;
169cfd74d65d832137e20e193c960802afba73b5d38sm        }
170cfd74d65d832137e20e193c960802afba73b5d38sm
171cfd74d65d832137e20e193c960802afba73b5d38sm    }
172cfd74d65d832137e20e193c960802afba73b5d38sm
173cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObjectFactory() {
174cfd74d65d832137e20e193c960802afba73b5d38sm        super();
175cfd74d65d832137e20e193c960802afba73b5d38sm
176cfd74d65d832137e20e193c960802afba73b5d38sm        mGameObjectPool = new GameObjectPool(MAX_GAME_OBJECTS);
177cfd74d65d832137e20e193c960802afba73b5d38sm
178cfd74d65d832137e20e193c960802afba73b5d38sm        final int objectTypeCount = GameObjectType.OBJECT_COUNT.ordinal();
179cfd74d65d832137e20e193c960802afba73b5d38sm        mStaticData = new FixedSizeArray<FixedSizeArray<BaseObject>>(objectTypeCount);
180cfd74d65d832137e20e193c960802afba73b5d38sm
181cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < objectTypeCount; x++) {
182cfd74d65d832137e20e193c960802afba73b5d38sm            mStaticData.add(null);
183cfd74d65d832137e20e193c960802afba73b5d38sm        }
184cfd74d65d832137e20e193c960802afba73b5d38sm
185cfd74d65d832137e20e193c960802afba73b5d38sm        final ContextParameters context = sSystemRegistry.contextParameters;
186cfd74d65d832137e20e193c960802afba73b5d38sm        final float halfHeight2 = (context.gameHeight * 0.5f) * (context.gameHeight * 0.5f);
187cfd74d65d832137e20e193c960802afba73b5d38sm        final float halfWidth2 = (context.gameWidth * 0.5f) * (context.gameWidth * 0.5f);
188cfd74d65d832137e20e193c960802afba73b5d38sm        final float screenSizeRadius = (float)Math.sqrt(halfHeight2 + halfWidth2);
189cfd74d65d832137e20e193c960802afba73b5d38sm        mTightActivationRadius = screenSizeRadius + 128.0f;
190cfd74d65d832137e20e193c960802afba73b5d38sm        mNormalActivationRadius = screenSizeRadius * 1.25f;
191cfd74d65d832137e20e193c960802afba73b5d38sm        mWideActivationRadius = screenSizeRadius * 2.0f;
192cfd74d65d832137e20e193c960802afba73b5d38sm        mAlwaysActive = -1.0f;
193cfd74d65d832137e20e193c960802afba73b5d38sm
194cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO: I wish there was a way to do this automatically, but the ClassLoader doesn't seem
195cfd74d65d832137e20e193c960802afba73b5d38sm        // to provide access to the currently loaded class list.  There's some discussion of walking
196cfd74d65d832137e20e193c960802afba73b5d38sm        // the actual class file objects and using forName() to instantiate them, but that sounds
197cfd74d65d832137e20e193c960802afba73b5d38sm        // really heavy-weight.  For now I'll rely on (sucky) manual enumeration.
198cfd74d65d832137e20e193c960802afba73b5d38sm        class ComponentClass {
199cfd74d65d832137e20e193c960802afba73b5d38sm            public Class<?> type;
200cfd74d65d832137e20e193c960802afba73b5d38sm            public int poolSize;
201cfd74d65d832137e20e193c960802afba73b5d38sm            public ComponentClass(Class<?> classType, int size) {
202cfd74d65d832137e20e193c960802afba73b5d38sm                type = classType;
203cfd74d65d832137e20e193c960802afba73b5d38sm                poolSize = size;
204cfd74d65d832137e20e193c960802afba73b5d38sm            }
205cfd74d65d832137e20e193c960802afba73b5d38sm        }
206cfd74d65d832137e20e193c960802afba73b5d38sm        ComponentClass[] componentTypes = {
207cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(AnimationComponent.class, 1),
208cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(AttackAtDistanceComponent.class, 16),
209cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(BackgroundCollisionComponent.class, 128),
210cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(ButtonAnimationComponent.class, 32),
211cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(CameraBiasComponent.class, 8),
212cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(ChangeComponentsComponent.class, 128),
213cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(DoorAnimationComponent.class, 256),  //!
214cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(DynamicCollisionComponent.class, 256),
215cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(EnemyAnimationComponent.class, 128),
216cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(FadeDrawableComponent.class, 32),
217cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(FixedAnimationComponent.class, 8),
218cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(GenericAnimationComponent.class, 32),
219cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(GhostComponent.class, 64),
220cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(GravityComponent.class, 128),
221cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(HitPlayerComponent.class, 256),
222cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(HitReactionComponent.class, 256),
223cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(InventoryComponent.class, 128),
224cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(LauncherComponent.class, 16),
225cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(LaunchProjectileComponent.class, 128),
226cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(LifetimeComponent.class, 256),
227cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(MotionBlurComponent.class, 1),
228cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(MovementComponent.class, 128),
229cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(NPCAnimationComponent.class, 8),
230cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(NPCComponent.class, 8),
231cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(OrbitalMagnetComponent.class, 1),
232cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(PatrolComponent.class, 128),
233cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(PhysicsComponent.class, 8),
234cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(PlayerComponent.class, 1),
235cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(PlaySingleSoundComponent.class, 32),
236cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(PopOutComponent.class, 32),
237cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(RenderComponent.class, 256),
238cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(ScrollerComponent.class, 8),
239cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(SelectDialogComponent.class, 8),
240cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(SimpleCollisionComponent.class, 32),
241cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(SimplePhysicsComponent.class, 128),
242cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(SleeperComponent.class, 32),
243cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(SolidSurfaceComponent.class, 16),
244cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(SpriteComponent.class, 256),
245cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(TheSourceComponent.class, 1),
246cfd74d65d832137e20e193c960802afba73b5d38sm
247cfd74d65d832137e20e193c960802afba73b5d38sm
248cfd74d65d832137e20e193c960802afba73b5d38sm        };
249cfd74d65d832137e20e193c960802afba73b5d38sm
250cfd74d65d832137e20e193c960802afba73b5d38sm        mComponentPools = new FixedSizeArray<GameComponentPool>(componentTypes.length, sComponentPoolComparator);
251cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < componentTypes.length; x++) {
252cfd74d65d832137e20e193c960802afba73b5d38sm            ComponentClass component = componentTypes[x];
253cfd74d65d832137e20e193c960802afba73b5d38sm            mComponentPools.add(new GameComponentPool(component.type, component.poolSize));
254cfd74d65d832137e20e193c960802afba73b5d38sm        }
255cfd74d65d832137e20e193c960802afba73b5d38sm        mComponentPools.sort(true);
256cfd74d65d832137e20e193c960802afba73b5d38sm
257cfd74d65d832137e20e193c960802afba73b5d38sm        mPoolSearchDummy = new GameComponentPool(Object.class, 1);
258cfd74d65d832137e20e193c960802afba73b5d38sm
259cfd74d65d832137e20e193c960802afba73b5d38sm    }
260cfd74d65d832137e20e193c960802afba73b5d38sm
261cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
262cfd74d65d832137e20e193c960802afba73b5d38sm    public void reset() {
263cfd74d65d832137e20e193c960802afba73b5d38sm
264cfd74d65d832137e20e193c960802afba73b5d38sm    }
265cfd74d65d832137e20e193c960802afba73b5d38sm
266cfd74d65d832137e20e193c960802afba73b5d38sm    protected GameComponentPool getComponentPool(Class<?> componentType) {
267cfd74d65d832137e20e193c960802afba73b5d38sm        GameComponentPool pool = null;
268cfd74d65d832137e20e193c960802afba73b5d38sm        mPoolSearchDummy.objectClass = componentType;
269cfd74d65d832137e20e193c960802afba73b5d38sm        final int index = mComponentPools.find(mPoolSearchDummy, false);
270cfd74d65d832137e20e193c960802afba73b5d38sm        if (index != -1) {
271cfd74d65d832137e20e193c960802afba73b5d38sm            pool = mComponentPools.get(index);
272cfd74d65d832137e20e193c960802afba73b5d38sm        }
273cfd74d65d832137e20e193c960802afba73b5d38sm        return pool;
274cfd74d65d832137e20e193c960802afba73b5d38sm    }
275cfd74d65d832137e20e193c960802afba73b5d38sm
276cfd74d65d832137e20e193c960802afba73b5d38sm    protected GameComponent allocateComponent(Class<?> componentType) {
277cfd74d65d832137e20e193c960802afba73b5d38sm        GameComponentPool pool = getComponentPool(componentType);
278cfd74d65d832137e20e193c960802afba73b5d38sm        assert pool != null;
279cfd74d65d832137e20e193c960802afba73b5d38sm        GameComponent component = null;
280cfd74d65d832137e20e193c960802afba73b5d38sm        if (pool != null) {
281cfd74d65d832137e20e193c960802afba73b5d38sm            component = pool.allocate();
282cfd74d65d832137e20e193c960802afba73b5d38sm        }
283cfd74d65d832137e20e193c960802afba73b5d38sm        return component;
284cfd74d65d832137e20e193c960802afba73b5d38sm    }
285cfd74d65d832137e20e193c960802afba73b5d38sm
286cfd74d65d832137e20e193c960802afba73b5d38sm    protected void releaseComponent(GameComponent component) {
287cfd74d65d832137e20e193c960802afba73b5d38sm        GameComponentPool pool = getComponentPool(component.getClass());
288cfd74d65d832137e20e193c960802afba73b5d38sm        assert pool != null;
289cfd74d65d832137e20e193c960802afba73b5d38sm        if (pool != null) {
290cfd74d65d832137e20e193c960802afba73b5d38sm            component.reset();
291cfd74d65d832137e20e193c960802afba73b5d38sm            component.shared = false;
292cfd74d65d832137e20e193c960802afba73b5d38sm            pool.release(component);
293cfd74d65d832137e20e193c960802afba73b5d38sm        }
294cfd74d65d832137e20e193c960802afba73b5d38sm    }
295cfd74d65d832137e20e193c960802afba73b5d38sm
296cfd74d65d832137e20e193c960802afba73b5d38sm    public void preloadEffects() {
297cfd74d65d832137e20e193c960802afba73b5d38sm        // These textures appear in every level, so they are long-term.
298cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
299cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.dust01);
300cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.dust02);
301cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.dust03);
302cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.dust04);
303cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.dust05);
304cfd74d65d832137e20e193c960802afba73b5d38sm
305cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_energyball01);
306cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_energyball02);
307cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_energyball03);
308cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_energyball04);
309cfd74d65d832137e20e193c960802afba73b5d38sm
310cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small01);
311cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small02);
312cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small03);
313cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small04);
314cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small05);
315cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small06);
316cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small07);
317cfd74d65d832137e20e193c960802afba73b5d38sm
318cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big01);
319cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big02);
320cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big03);
321cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big04);
322cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big05);
323cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big06);
324cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big07);
325cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big08);
326cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big09);
327cfd74d65d832137e20e193c960802afba73b5d38sm
328cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_big01);
329cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_big02);
330cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_big03);
331cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_big04);
332cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_big05);
333cfd74d65d832137e20e193c960802afba73b5d38sm
334cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_small01);
335cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_small02);
336cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_small03);
337cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_small04);
338cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_small05);
339cfd74d65d832137e20e193c960802afba73b5d38sm
340cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_back01);
341cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_back02);
342cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_back03);
343cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front01);
344cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front02);
345cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front03);
346cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front04);
347cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front05);
348cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front06);
349cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front07);
350cfd74d65d832137e20e193c960802afba73b5d38sm    }
351cfd74d65d832137e20e193c960802afba73b5d38sm
352cfd74d65d832137e20e193c960802afba73b5d38sm    public void destroy(GameObject object) {
353cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
354cfd74d65d832137e20e193c960802afba73b5d38sm        final int componentCount = object.getCount();
355cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < componentCount; x++) {
356cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent component = (GameComponent)object.get(x);
357cfd74d65d832137e20e193c960802afba73b5d38sm            if (!component.shared) {
358cfd74d65d832137e20e193c960802afba73b5d38sm                releaseComponent(component);
359cfd74d65d832137e20e193c960802afba73b5d38sm            }
360cfd74d65d832137e20e193c960802afba73b5d38sm        }
361cfd74d65d832137e20e193c960802afba73b5d38sm        object.removeAll();
362cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
363cfd74d65d832137e20e193c960802afba73b5d38sm        mGameObjectPool.release(object);
364cfd74d65d832137e20e193c960802afba73b5d38sm    }
365cfd74d65d832137e20e193c960802afba73b5d38sm
366cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawn(GameObjectType type, float x, float y, boolean horzFlip) {
367cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject newObject = null;
368cfd74d65d832137e20e193c960802afba73b5d38sm        switch(type) {
369cfd74d65d832137e20e193c960802afba73b5d38sm            case PLAYER:
370cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnPlayer(x, y);
371cfd74d65d832137e20e193c960802afba73b5d38sm                break;
372cfd74d65d832137e20e193c960802afba73b5d38sm            case COIN:
373cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnCoin(x, y);
374cfd74d65d832137e20e193c960802afba73b5d38sm                break;
375cfd74d65d832137e20e193c960802afba73b5d38sm            case RUBY:
376cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnRuby(x, y);
377cfd74d65d832137e20e193c960802afba73b5d38sm                break;
378cfd74d65d832137e20e193c960802afba73b5d38sm            case DIARY:
379cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnDiary(x, y);
380cfd74d65d832137e20e193c960802afba73b5d38sm                break;
381cfd74d65d832137e20e193c960802afba73b5d38sm            case WANDA:
382cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyWanda(x, y, true);
383cfd74d65d832137e20e193c960802afba73b5d38sm                break;
384cfd74d65d832137e20e193c960802afba73b5d38sm            case KYLE:
385cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyKyle(x, y, true);
386cfd74d65d832137e20e193c960802afba73b5d38sm                break;
387cfd74d65d832137e20e193c960802afba73b5d38sm            case KYLE_DEAD:
388cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyKyleDead(x, y);
389cfd74d65d832137e20e193c960802afba73b5d38sm                break;
390cfd74d65d832137e20e193c960802afba73b5d38sm            case ANDOU_DEAD:
391cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyAndouDead(x, y);
392cfd74d65d832137e20e193c960802afba73b5d38sm                break;
393cfd74d65d832137e20e193c960802afba73b5d38sm            case KABOCHA:
394cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyKabocha(x, y, true);
395cfd74d65d832137e20e193c960802afba73b5d38sm                break;
396cfd74d65d832137e20e193c960802afba73b5d38sm            case ROKUDOU_TERMINAL:
397cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnRokudouTerminal(x, y);
398cfd74d65d832137e20e193c960802afba73b5d38sm                break;
399cfd74d65d832137e20e193c960802afba73b5d38sm            case KABOCHA_TERMINAL:
400cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnKabochaTerminal(x, y);
401cfd74d65d832137e20e193c960802afba73b5d38sm                break;
402cfd74d65d832137e20e193c960802afba73b5d38sm            case EVIL_KABOCHA:
403cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyEvilKabocha(x, y, true);
404cfd74d65d832137e20e193c960802afba73b5d38sm                break;
405cfd74d65d832137e20e193c960802afba73b5d38sm            case ROKUDOU:
406cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyRokudou(x, y, true);
407cfd74d65d832137e20e193c960802afba73b5d38sm                break;
408cfd74d65d832137e20e193c960802afba73b5d38sm            case BROBOT:
409cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyBrobot(x, y, horzFlip);
410cfd74d65d832137e20e193c960802afba73b5d38sm                break;
411cfd74d65d832137e20e193c960802afba73b5d38sm            case SNAILBOMB:
412cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemySnailBomb(x, y, horzFlip);
413cfd74d65d832137e20e193c960802afba73b5d38sm                break;
414cfd74d65d832137e20e193c960802afba73b5d38sm            case SHADOWSLIME:
415cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyShadowSlime(x, y, horzFlip);
416cfd74d65d832137e20e193c960802afba73b5d38sm                break;
417cfd74d65d832137e20e193c960802afba73b5d38sm            case MUDMAN:
418cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyMudman(x, y, horzFlip);
419cfd74d65d832137e20e193c960802afba73b5d38sm                break;
420cfd74d65d832137e20e193c960802afba73b5d38sm            case SKELETON:
421cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemySkeleton(x, y, horzFlip);
422cfd74d65d832137e20e193c960802afba73b5d38sm                break;
423cfd74d65d832137e20e193c960802afba73b5d38sm            case KARAGUIN:
424cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyKaraguin(x, y, horzFlip);
425cfd74d65d832137e20e193c960802afba73b5d38sm                break;
426cfd74d65d832137e20e193c960802afba73b5d38sm            case PINK_NAMAZU:
427cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyPinkNamazu(x, y, horzFlip);
428cfd74d65d832137e20e193c960802afba73b5d38sm                break;
429cfd74d65d832137e20e193c960802afba73b5d38sm            case BAT:
430cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyBat(x, y, horzFlip);
431cfd74d65d832137e20e193c960802afba73b5d38sm                break;
432cfd74d65d832137e20e193c960802afba73b5d38sm            case STING:
433cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemySting(x, y, horzFlip);
434cfd74d65d832137e20e193c960802afba73b5d38sm                break;
435cfd74d65d832137e20e193c960802afba73b5d38sm            case ONION:
436cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyOnion(x, y, horzFlip);
437cfd74d65d832137e20e193c960802afba73b5d38sm                break;
438cfd74d65d832137e20e193c960802afba73b5d38sm            case TURRET:
439cfd74d65d832137e20e193c960802afba73b5d38sm            case TURRET_LEFT:
440cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectTurret(x, y, (type == GameObjectType.TURRET_LEFT));
441cfd74d65d832137e20e193c960802afba73b5d38sm                break;
442cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_RED:
443cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_RED_NONBLOCKING:
444cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectDoor(x, y, GameObjectType.DOOR_RED, (type == GameObjectType.DOOR_RED));
445cfd74d65d832137e20e193c960802afba73b5d38sm                break;
446cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_BLUE:
447cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_BLUE_NONBLOCKING:
448cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectDoor(x, y, GameObjectType.DOOR_BLUE, (type == GameObjectType.DOOR_BLUE));
449cfd74d65d832137e20e193c960802afba73b5d38sm                break;
450cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_GREEN:
451cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_GREEN_NONBLOCKING:
452cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectDoor(x, y, GameObjectType.DOOR_GREEN, (type == GameObjectType.DOOR_GREEN));
453cfd74d65d832137e20e193c960802afba73b5d38sm                break;
454cfd74d65d832137e20e193c960802afba73b5d38sm            case BUTTON_RED:
455cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectButton(x, y, GameObjectType.BUTTON_RED);
456cfd74d65d832137e20e193c960802afba73b5d38sm                break;
457cfd74d65d832137e20e193c960802afba73b5d38sm            case BUTTON_BLUE:
458cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectButton(x, y, GameObjectType.BUTTON_BLUE);
459cfd74d65d832137e20e193c960802afba73b5d38sm                break;
460cfd74d65d832137e20e193c960802afba73b5d38sm            case BUTTON_GREEN:
461cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectButton(x, y, GameObjectType.BUTTON_GREEN);
462cfd74d65d832137e20e193c960802afba73b5d38sm                break;
463cfd74d65d832137e20e193c960802afba73b5d38sm            case CANNON:
464cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectCannon(x, y);
465cfd74d65d832137e20e193c960802afba73b5d38sm                break;
466cfd74d65d832137e20e193c960802afba73b5d38sm            case BROBOT_SPAWNER:
467cfd74d65d832137e20e193c960802afba73b5d38sm            case BROBOT_SPAWNER_LEFT:
468cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectBrobotSpawner(x, y, (type == GameObjectType.BROBOT_SPAWNER_LEFT));
469cfd74d65d832137e20e193c960802afba73b5d38sm                break;
470cfd74d65d832137e20e193c960802afba73b5d38sm            case BREAKABLE_BLOCK:
471cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectBreakableBlock(x, y);
472cfd74d65d832137e20e193c960802afba73b5d38sm                break;
473cfd74d65d832137e20e193c960802afba73b5d38sm            case THE_SOURCE:
474cfd74d65d832137e20e193c960802afba73b5d38sm            	newObject = spawnObjectTheSource(x, y);
475cfd74d65d832137e20e193c960802afba73b5d38sm            	break;
476cfd74d65d832137e20e193c960802afba73b5d38sm            case DUST:
477cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnDust(x, y, horzFlip);
478cfd74d65d832137e20e193c960802afba73b5d38sm                break;
479cfd74d65d832137e20e193c960802afba73b5d38sm            case EXPLOSION_SMALL:
480cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectExplosionSmall(x, y);
481cfd74d65d832137e20e193c960802afba73b5d38sm                break;
482cfd74d65d832137e20e193c960802afba73b5d38sm            case EXPLOSION_LARGE:
483cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectExplosionLarge(x, y);
484cfd74d65d832137e20e193c960802afba73b5d38sm                break;
485cfd74d65d832137e20e193c960802afba73b5d38sm            case EXPLOSION_GIANT:
486cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectExplosionGiant(x, y);
487cfd74d65d832137e20e193c960802afba73b5d38sm                break;
488cfd74d65d832137e20e193c960802afba73b5d38sm            case GHOST_NPC:
489cfd74d65d832137e20e193c960802afba73b5d38sm            	newObject = spawnGhostNPC(x, y);
490cfd74d65d832137e20e193c960802afba73b5d38sm            	break;
491cfd74d65d832137e20e193c960802afba73b5d38sm            case CAMERA_BIAS:
492cfd74d65d832137e20e193c960802afba73b5d38sm            	newObject = spawnCameraBias(x, y);
493cfd74d65d832137e20e193c960802afba73b5d38sm            	break;
494cfd74d65d832137e20e193c960802afba73b5d38sm            case SMOKE_BIG:
495cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectSmokeBig(x, y);
496cfd74d65d832137e20e193c960802afba73b5d38sm                break;
497cfd74d65d832137e20e193c960802afba73b5d38sm            case SMOKE_SMALL:
498cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectSmokeSmall(x, y);
499cfd74d65d832137e20e193c960802afba73b5d38sm                break;
500cfd74d65d832137e20e193c960802afba73b5d38sm            case CRUSH_FLASH:
501cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectCrushFlash(x, y);
502cfd74d65d832137e20e193c960802afba73b5d38sm                break;
503cfd74d65d832137e20e193c960802afba73b5d38sm            case FLASH:
504cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectFlash(x, y);
505cfd74d65d832137e20e193c960802afba73b5d38sm                break;
506cfd74d65d832137e20e193c960802afba73b5d38sm            case ENERGY_BALL:
507cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnergyBall(x, y, horzFlip);
508cfd74d65d832137e20e193c960802afba73b5d38sm                break;
509cfd74d65d832137e20e193c960802afba73b5d38sm            case CANNON_BALL:
510cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnCannonBall(x, y, horzFlip);
511cfd74d65d832137e20e193c960802afba73b5d38sm                break;
512cfd74d65d832137e20e193c960802afba73b5d38sm            case TURRET_BULLET:
513cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnTurretBullet(x, y, horzFlip);
514cfd74d65d832137e20e193c960802afba73b5d38sm                break;
515cfd74d65d832137e20e193c960802afba73b5d38sm            case BROBOT_BULLET:
516cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnBrobotBullet(x, y, horzFlip);
517cfd74d65d832137e20e193c960802afba73b5d38sm                break;
518cfd74d65d832137e20e193c960802afba73b5d38sm            case BREAKABLE_BLOCK_PIECE:
519cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnBreakableBlockPiece(x, y);
520cfd74d65d832137e20e193c960802afba73b5d38sm                break;
521cfd74d65d832137e20e193c960802afba73b5d38sm            case BREAKABLE_BLOCK_PIECE_SPAWNER:
522cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnBreakableBlockPieceSpawner(x, y);
523cfd74d65d832137e20e193c960802afba73b5d38sm                break;
524cfd74d65d832137e20e193c960802afba73b5d38sm            case WANDA_SHOT:
525cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnWandaShot(x, y, horzFlip);
526cfd74d65d832137e20e193c960802afba73b5d38sm                break;
527cfd74d65d832137e20e193c960802afba73b5d38sm            case SMOKE_POOF:
528cfd74d65d832137e20e193c960802afba73b5d38sm            	newObject = spawnSmokePoof(x, y);
529cfd74d65d832137e20e193c960802afba73b5d38sm            	break;
530cfd74d65d832137e20e193c960802afba73b5d38sm            case GEM_EFFECT:
531cfd74d65d832137e20e193c960802afba73b5d38sm            	newObject = spawnGemEffect(x, y);
532cfd74d65d832137e20e193c960802afba73b5d38sm            	break;
533cfd74d65d832137e20e193c960802afba73b5d38sm            case GEM_EFFECT_SPAWNER:
534cfd74d65d832137e20e193c960802afba73b5d38sm            	newObject = spawnGemEffectSpawner(x, y);
535cfd74d65d832137e20e193c960802afba73b5d38sm            	break;
536cfd74d65d832137e20e193c960802afba73b5d38sm        }
537cfd74d65d832137e20e193c960802afba73b5d38sm
538cfd74d65d832137e20e193c960802afba73b5d38sm        return newObject;
539cfd74d65d832137e20e193c960802afba73b5d38sm    }
540cfd74d65d832137e20e193c960802afba73b5d38sm
541cfd74d65d832137e20e193c960802afba73b5d38sm
542cfd74d65d832137e20e193c960802afba73b5d38sm
543cfd74d65d832137e20e193c960802afba73b5d38sm	public void spawnFromWorld(TiledWorld world, int tileWidth, int tileHeight) {
544cfd74d65d832137e20e193c960802afba73b5d38sm        // Walk the world and spawn objects based on tile indexes.
545cfd74d65d832137e20e193c960802afba73b5d38sm        final float worldHeight = world.getHeight() * tileHeight;
546cfd74d65d832137e20e193c960802afba73b5d38sm        GameObjectManager manager = sSystemRegistry.gameObjectManager;
547cfd74d65d832137e20e193c960802afba73b5d38sm        if (manager != null) {
548cfd74d65d832137e20e193c960802afba73b5d38sm            for (int y = 0; y < world.getHeight(); y++) {
549cfd74d65d832137e20e193c960802afba73b5d38sm                for (int x = 0; x < world.getWidth(); x++) {
550cfd74d65d832137e20e193c960802afba73b5d38sm                    int index = world.getTile(x, y);
551cfd74d65d832137e20e193c960802afba73b5d38sm                    if (index != -1) {
552cfd74d65d832137e20e193c960802afba73b5d38sm                        GameObjectType type = GameObjectType.indexToType(index);
553cfd74d65d832137e20e193c960802afba73b5d38sm                        if (type != GameObjectType.INVALID) {
554cfd74d65d832137e20e193c960802afba73b5d38sm                            final float worldX = x * tileWidth;
555cfd74d65d832137e20e193c960802afba73b5d38sm                            final float worldY = worldHeight - ((y + 1) * tileHeight);
556cfd74d65d832137e20e193c960802afba73b5d38sm                            GameObject object = spawn(type, worldX, worldY, false);
557cfd74d65d832137e20e193c960802afba73b5d38sm                            if (object != null) {
558cfd74d65d832137e20e193c960802afba73b5d38sm                                if (object.height < tileHeight) {
559cfd74d65d832137e20e193c960802afba73b5d38sm                                    // make sure small objects are vertically centered in their
560cfd74d65d832137e20e193c960802afba73b5d38sm                                    // tile.
561cfd74d65d832137e20e193c960802afba73b5d38sm                                    object.getPosition().y += (tileHeight - object.height) / 2.0f;
562cfd74d65d832137e20e193c960802afba73b5d38sm                                }
563cfd74d65d832137e20e193c960802afba73b5d38sm                                if (object.width < tileWidth) {
564cfd74d65d832137e20e193c960802afba73b5d38sm                                    object.getPosition().x += (tileWidth - object.width) / 2.0f;
565cfd74d65d832137e20e193c960802afba73b5d38sm                                } else if (object.width > tileWidth) {
566cfd74d65d832137e20e193c960802afba73b5d38sm                                    object.getPosition().x -= (object.width - tileWidth) / 2.0f;
567cfd74d65d832137e20e193c960802afba73b5d38sm                                }
568cfd74d65d832137e20e193c960802afba73b5d38sm                                manager.add(object);
569cfd74d65d832137e20e193c960802afba73b5d38sm                                if (type == GameObjectType.PLAYER) {
570cfd74d65d832137e20e193c960802afba73b5d38sm                                    manager.setPlayer(object);
571cfd74d65d832137e20e193c960802afba73b5d38sm                                }
572cfd74d65d832137e20e193c960802afba73b5d38sm                            }
573cfd74d65d832137e20e193c960802afba73b5d38sm                        }
574cfd74d65d832137e20e193c960802afba73b5d38sm                    }
575cfd74d65d832137e20e193c960802afba73b5d38sm                }
576cfd74d65d832137e20e193c960802afba73b5d38sm            }
577cfd74d65d832137e20e193c960802afba73b5d38sm        }
578cfd74d65d832137e20e193c960802afba73b5d38sm    }
579cfd74d65d832137e20e193c960802afba73b5d38sm
580cfd74d65d832137e20e193c960802afba73b5d38sm
581cfd74d65d832137e20e193c960802afba73b5d38sm    private FixedSizeArray<BaseObject> getStaticData(GameObjectType type) {
582cfd74d65d832137e20e193c960802afba73b5d38sm        return mStaticData.get(type.ordinal());
583cfd74d65d832137e20e193c960802afba73b5d38sm    }
584cfd74d65d832137e20e193c960802afba73b5d38sm
585cfd74d65d832137e20e193c960802afba73b5d38sm    private void setStaticData(GameObjectType type, FixedSizeArray<BaseObject> data) {
586cfd74d65d832137e20e193c960802afba73b5d38sm        int index = type.ordinal();
587cfd74d65d832137e20e193c960802afba73b5d38sm        assert mStaticData.get(index) == null;
588cfd74d65d832137e20e193c960802afba73b5d38sm
589cfd74d65d832137e20e193c960802afba73b5d38sm        final int staticDataCount = data.getCount();
590cfd74d65d832137e20e193c960802afba73b5d38sm
591cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < staticDataCount; x++) {
592cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject entry = data.get(x);
593cfd74d65d832137e20e193c960802afba73b5d38sm            if (entry instanceof GameComponent) {
594cfd74d65d832137e20e193c960802afba73b5d38sm                ((GameComponent) entry).shared = true;
595cfd74d65d832137e20e193c960802afba73b5d38sm            }
596cfd74d65d832137e20e193c960802afba73b5d38sm        }
597cfd74d65d832137e20e193c960802afba73b5d38sm
598cfd74d65d832137e20e193c960802afba73b5d38sm        mStaticData.set(index, data);
599cfd74d65d832137e20e193c960802afba73b5d38sm    }
600cfd74d65d832137e20e193c960802afba73b5d38sm
601cfd74d65d832137e20e193c960802afba73b5d38sm    private void addStaticData(GameObjectType type, GameObject object, SpriteComponent sprite) {
602cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(type);
603cfd74d65d832137e20e193c960802afba73b5d38sm        assert staticData != null;
604cfd74d65d832137e20e193c960802afba73b5d38sm
605cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData != null) {
606cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticDataCount = staticData.getCount();
607cfd74d65d832137e20e193c960802afba73b5d38sm
608cfd74d65d832137e20e193c960802afba73b5d38sm            for (int x = 0; x < staticDataCount; x++) {
609cfd74d65d832137e20e193c960802afba73b5d38sm                BaseObject entry = staticData.get(x);
610cfd74d65d832137e20e193c960802afba73b5d38sm                if (entry instanceof GameComponent && object != null) {
611cfd74d65d832137e20e193c960802afba73b5d38sm                    object.add((GameComponent)entry);
612cfd74d65d832137e20e193c960802afba73b5d38sm                } else if (entry instanceof SpriteAnimation && sprite != null) {
613cfd74d65d832137e20e193c960802afba73b5d38sm                    sprite.addAnimation((SpriteAnimation)entry);
614cfd74d65d832137e20e193c960802afba73b5d38sm                }
615cfd74d65d832137e20e193c960802afba73b5d38sm            }
616cfd74d65d832137e20e193c960802afba73b5d38sm        }
617cfd74d65d832137e20e193c960802afba73b5d38sm    }
618cfd74d65d832137e20e193c960802afba73b5d38sm
619cfd74d65d832137e20e193c960802afba73b5d38sm    public void clearStaticData() {
620cfd74d65d832137e20e193c960802afba73b5d38sm        final int typeCount = mStaticData.getCount();
621cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < typeCount; x++) {
622cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<BaseObject> staticData = mStaticData.get(x);
623cfd74d65d832137e20e193c960802afba73b5d38sm            if (staticData != null) {
624cfd74d65d832137e20e193c960802afba73b5d38sm                final int count = staticData.getCount();
625cfd74d65d832137e20e193c960802afba73b5d38sm                for (int y = 0; y < count; y++) {
626cfd74d65d832137e20e193c960802afba73b5d38sm                    BaseObject entry = staticData.get(y);
627cfd74d65d832137e20e193c960802afba73b5d38sm                    if (entry != null) {
628cfd74d65d832137e20e193c960802afba73b5d38sm                        if (entry instanceof GameComponent) {
629cfd74d65d832137e20e193c960802afba73b5d38sm                            releaseComponent((GameComponent)entry);
630cfd74d65d832137e20e193c960802afba73b5d38sm                        }
631cfd74d65d832137e20e193c960802afba73b5d38sm                    }
632cfd74d65d832137e20e193c960802afba73b5d38sm                }
633cfd74d65d832137e20e193c960802afba73b5d38sm                staticData.clear();
634cfd74d65d832137e20e193c960802afba73b5d38sm                mStaticData.set(x, null);
635cfd74d65d832137e20e193c960802afba73b5d38sm            }
636cfd74d65d832137e20e193c960802afba73b5d38sm        }
637cfd74d65d832137e20e193c960802afba73b5d38sm    }
638cfd74d65d832137e20e193c960802afba73b5d38sm
639cfd74d65d832137e20e193c960802afba73b5d38sm    public void sanityCheckPools() {
640cfd74d65d832137e20e193c960802afba73b5d38sm        final int outstandingObjects = mGameObjectPool.getAllocatedCount();
641cfd74d65d832137e20e193c960802afba73b5d38sm        if (outstandingObjects != 0) {
642cfd74d65d832137e20e193c960802afba73b5d38sm            DebugLog.d("Sanity Check", "Outstanding game object allocations! ("
643cfd74d65d832137e20e193c960802afba73b5d38sm                    + outstandingObjects + ")");
644cfd74d65d832137e20e193c960802afba73b5d38sm            assert false;
645cfd74d65d832137e20e193c960802afba73b5d38sm        }
646cfd74d65d832137e20e193c960802afba73b5d38sm
647cfd74d65d832137e20e193c960802afba73b5d38sm        final int componentPoolCount = mComponentPools.getCount();
648cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < componentPoolCount; x++) {
649cfd74d65d832137e20e193c960802afba73b5d38sm            final int outstandingComponents = mComponentPools.get(x).getAllocatedCount();
650cfd74d65d832137e20e193c960802afba73b5d38sm
651cfd74d65d832137e20e193c960802afba73b5d38sm            if (outstandingComponents != 0) {
652cfd74d65d832137e20e193c960802afba73b5d38sm                DebugLog.d("Sanity Check", "Outstanding "
653cfd74d65d832137e20e193c960802afba73b5d38sm                        + mComponentPools.get(x).objectClass.getSimpleName()
654cfd74d65d832137e20e193c960802afba73b5d38sm                        + " allocations! (" + outstandingComponents + ")");
655cfd74d65d832137e20e193c960802afba73b5d38sm                //assert false;
656cfd74d65d832137e20e193c960802afba73b5d38sm            }
657cfd74d65d832137e20e193c960802afba73b5d38sm        }
658cfd74d65d832137e20e193c960802afba73b5d38sm    }
659cfd74d65d832137e20e193c960802afba73b5d38sm
660cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnPlayer(float positionX, float positionY) {
661cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
662cfd74d65d832137e20e193c960802afba73b5d38sm
663cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
664cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
665cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
666cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
667cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
668cfd74d65d832137e20e193c960802afba73b5d38sm
669cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.PLAYER);
670cfd74d65d832137e20e193c960802afba73b5d38sm
671cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
672cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 13;
673cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
674cfd74d65d832137e20e193c960802afba73b5d38sm
675cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
676cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
677cfd74d65d832137e20e193c960802afba73b5d38sm            PhysicsComponent physics = (PhysicsComponent)allocateComponent(PhysicsComponent.class);
678cfd74d65d832137e20e193c960802afba73b5d38sm
679cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setMass(9.1f);   // ~90kg w/ earth gravity
680cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setDynamicFrictionCoeffecient(0.2f);
681cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setStaticFrictionCoeffecient(0.01f);
682cfd74d65d832137e20e193c960802afba73b5d38sm
683cfd74d65d832137e20e193c960802afba73b5d38sm            // Animation Data
684cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
685cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
686cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32));
687cfd74d65d832137e20e193c960802afba73b5d38sm
688cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> pressAndCollectVolume =
689cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(2);
690cfd74d65d832137e20e193c960802afba73b5d38sm            AABoxCollisionVolume collectionVolume = new AABoxCollisionVolume(16, 0, 32, 48);
691cfd74d65d832137e20e193c960802afba73b5d38sm            collectionVolume.setHitType(HitType.COLLECT);
692cfd74d65d832137e20e193c960802afba73b5d38sm            pressAndCollectVolume.add(collectionVolume);
693cfd74d65d832137e20e193c960802afba73b5d38sm            AABoxCollisionVolume pressCollisionVolume = new AABoxCollisionVolume(16, 0, 32, 16);
694cfd74d65d832137e20e193c960802afba73b5d38sm            pressCollisionVolume.setHitType(HitType.DEPRESS);
695cfd74d65d832137e20e193c960802afba73b5d38sm            pressAndCollectVolume.add(pressCollisionVolume);
696cfd74d65d832137e20e193c960802afba73b5d38sm
697cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(PlayerAnimations.IDLE.ordinal(), 1);
698cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stand),
699cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, pressAndCollectVolume, basicVulnerabilityVolume));
700cfd74d65d832137e20e193c960802afba73b5d38sm
701cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation angle = new SpriteAnimation(PlayerAnimations.MOVE.ordinal(), 1);
702cfd74d65d832137e20e193c960802afba73b5d38sm            angle.addFrame(
703cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diag01),
704cfd74d65d832137e20e193c960802afba73b5d38sm                            0.0416f, pressAndCollectVolume, basicVulnerabilityVolume));
705cfd74d65d832137e20e193c960802afba73b5d38sm
706cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation extremeAngle = new SpriteAnimation(
707cfd74d65d832137e20e193c960802afba73b5d38sm                    PlayerAnimations.MOVE_FAST.ordinal(), 1);
708cfd74d65d832137e20e193c960802afba73b5d38sm            extremeAngle.addFrame(
709cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diagmore01),
710cfd74d65d832137e20e193c960802afba73b5d38sm                            0.0416f, pressAndCollectVolume, basicVulnerabilityVolume));
711cfd74d65d832137e20e193c960802afba73b5d38sm
712cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation up = new SpriteAnimation(PlayerAnimations.BOOST_UP.ordinal(), 2);
713cfd74d65d832137e20e193c960802afba73b5d38sm            up.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_flyup02),
714cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume));
715cfd74d65d832137e20e193c960802afba73b5d38sm            up.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_flyup03),
716cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume));
717cfd74d65d832137e20e193c960802afba73b5d38sm            up.setLoop(true);
718cfd74d65d832137e20e193c960802afba73b5d38sm
719cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation boostAngle = new SpriteAnimation(PlayerAnimations.BOOST_MOVE.ordinal(), 2);
720cfd74d65d832137e20e193c960802afba73b5d38sm            boostAngle.addFrame(
721cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diag02),
722cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume));
723cfd74d65d832137e20e193c960802afba73b5d38sm            boostAngle.addFrame(
724cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diag03),
725cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume));
726cfd74d65d832137e20e193c960802afba73b5d38sm            boostAngle.setLoop(true);
727cfd74d65d832137e20e193c960802afba73b5d38sm
728cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation boostExtremeAngle = new SpriteAnimation(
729cfd74d65d832137e20e193c960802afba73b5d38sm                    PlayerAnimations.BOOST_MOVE_FAST.ordinal(), 2);
730cfd74d65d832137e20e193c960802afba73b5d38sm            boostExtremeAngle.addFrame(
731cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diagmore02),
732cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume));
733cfd74d65d832137e20e193c960802afba73b5d38sm            boostExtremeAngle.addFrame(
734cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diagmore03),
735cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume));
736cfd74d65d832137e20e193c960802afba73b5d38sm            boostExtremeAngle.setLoop(true);
737cfd74d65d832137e20e193c960802afba73b5d38sm
738cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> stompAttackVolume =
739cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(3);
740cfd74d65d832137e20e193c960802afba73b5d38sm            stompAttackVolume.add(new AABoxCollisionVolume(16, -5.0f, 32, 37, HitType.HIT));
741cfd74d65d832137e20e193c960802afba73b5d38sm            stompAttackVolume.add(pressCollisionVolume);
742cfd74d65d832137e20e193c960802afba73b5d38sm            stompAttackVolume.add(collectionVolume);
743cfd74d65d832137e20e193c960802afba73b5d38sm
744cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation stomp = new SpriteAnimation(PlayerAnimations.STOMP.ordinal(), 4);
745cfd74d65d832137e20e193c960802afba73b5d38sm            stomp.addFrame(
746cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp01),
747cfd74d65d832137e20e193c960802afba73b5d38sm                    		Utils.framesToTime(24, 1), stompAttackVolume, null));
748cfd74d65d832137e20e193c960802afba73b5d38sm            stomp.addFrame(
749cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp02),
750cfd74d65d832137e20e193c960802afba73b5d38sm                    		Utils.framesToTime(24, 1), stompAttackVolume, null));
751cfd74d65d832137e20e193c960802afba73b5d38sm            stomp.addFrame(
752cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp03),
753cfd74d65d832137e20e193c960802afba73b5d38sm                    		Utils.framesToTime(24, 1), stompAttackVolume, null));
754cfd74d65d832137e20e193c960802afba73b5d38sm            stomp.addFrame(
755cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp04),
756cfd74d65d832137e20e193c960802afba73b5d38sm                    		Utils.framesToTime(24, 1), stompAttackVolume, null));
757cfd74d65d832137e20e193c960802afba73b5d38sm
758cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation hitReactAnim = new SpriteAnimation(PlayerAnimations.HIT_REACT.ordinal(), 1);
759cfd74d65d832137e20e193c960802afba73b5d38sm            hitReactAnim.addFrame(
760cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_hit),
761cfd74d65d832137e20e193c960802afba73b5d38sm                            0.1f, pressAndCollectVolume, null));
762cfd74d65d832137e20e193c960802afba73b5d38sm
763cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation deathAnim = new SpriteAnimation(PlayerAnimations.DEATH.ordinal(), 16);
764cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame death1 =
765cfd74d65d832137e20e193c960802afba73b5d38sm                new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_die01),
766cfd74d65d832137e20e193c960802afba73b5d38sm                        Utils.framesToTime(24, 1), null, null);
767cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame death2 =
768cfd74d65d832137e20e193c960802afba73b5d38sm                new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_die02),
769cfd74d65d832137e20e193c960802afba73b5d38sm                        Utils.framesToTime(24, 1), null, null);
770cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(death1);
771cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(death2);
772cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(death1);
773cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(death2);
774cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
775cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode01),
776cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), null, null));
777cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
778cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode02),
779cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), null, null));
780cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
781cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode03),
782cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), null, null));
783cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
784cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode04),
785cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), null, null));
786cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
787cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode05),
788cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
789cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
790cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode06),
791cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
792cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
793cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode07),
794cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
795cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
796cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode08),
797cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
798cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
799cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode09),
800cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
801cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
802cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode10),
803cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
804cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
805cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode11),
806cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
807cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
808cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode12),
809cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
810cfd74d65d832137e20e193c960802afba73b5d38sm
811cfd74d65d832137e20e193c960802afba73b5d38sm
812cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation frozenAnim = new SpriteAnimation(PlayerAnimations.FROZEN.ordinal(), 1);
813cfd74d65d832137e20e193c960802afba73b5d38sm            // Frozen has no frames!
814cfd74d65d832137e20e193c960802afba73b5d38sm
815cfd74d65d832137e20e193c960802afba73b5d38sm
816cfd74d65d832137e20e193c960802afba73b5d38sm            // Save static data
817cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
818cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
819cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
820cfd74d65d832137e20e193c960802afba73b5d38sm
821cfd74d65d832137e20e193c960802afba73b5d38sm
822cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
823cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(angle);
824cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(extremeAngle);
825cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(up);
826cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(boostAngle);
827cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(boostExtremeAngle);
828cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(stomp);
829cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(hitReactAnim);
830cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(deathAnim);
831cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(frozenAnim);
832cfd74d65d832137e20e193c960802afba73b5d38sm
833cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.PLAYER, staticData);
834cfd74d65d832137e20e193c960802afba73b5d38sm        }
835cfd74d65d832137e20e193c960802afba73b5d38sm
836cfd74d65d832137e20e193c960802afba73b5d38sm
837cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
838cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PLAYER);
839cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision
840cfd74d65d832137e20e193c960802afba73b5d38sm            = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
841cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 48);
842cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(16, 0);
843cfd74d65d832137e20e193c960802afba73b5d38sm        PlayerComponent player = (PlayerComponent)allocateComponent(PlayerComponent.class);
844cfd74d65d832137e20e193c960802afba73b5d38sm        AnimationComponent animation =
845cfd74d65d832137e20e193c960802afba73b5d38sm            (AnimationComponent)allocateComponent(AnimationComponent.class);
846cfd74d65d832137e20e193c960802afba73b5d38sm
847cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setPlayer(player);
848cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = sSystemRegistry.soundSystem;
849cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
850cfd74d65d832137e20e193c960802afba73b5d38sm            animation.setLandThump(sound.load(R.raw.thump));
851cfd74d65d832137e20e193c960802afba73b5d38sm            animation.setRocketSound(sound.load(R.raw.rockets));
852cfd74d65d832137e20e193c960802afba73b5d38sm            animation.setRubySounds(sound.load(R.raw.gem1), sound.load(R.raw.gem2), sound.load(R.raw.gem3));
853cfd74d65d832137e20e193c960802afba73b5d38sm            animation.setExplosionSound(sound.load(R.raw.sound_explode));
854cfd74d65d832137e20e193c960802afba73b5d38sm        }
855cfd74d65d832137e20e193c960802afba73b5d38sm
856cfd74d65d832137e20e193c960802afba73b5d38sm
857cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
858cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
859cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
860cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
861cfd74d65d832137e20e193c960802afba73b5d38sm
862cfd74d65d832137e20e193c960802afba73b5d38sm
863cfd74d65d832137e20e193c960802afba73b5d38sm
864cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision
865cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
866cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
867cfd74d65d832137e20e193c960802afba73b5d38sm
868cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
869cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setBounceOnHit(true);
870cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setPauseOnAttack(true);
871cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincibleTime(3.0f);
872cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setSpawnOnDealHit(HitType.HIT, GameObjectType.CRUSH_FLASH, false, true);
873cfd74d65d832137e20e193c960802afba73b5d38sm
874cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
875cfd74d65d832137e20e193c960802afba73b5d38sm            hitReact.setTakeHitSound(HitType.HIT, sound.load(R.raw.deep_clang));
876cfd74d65d832137e20e193c960802afba73b5d38sm        }
877cfd74d65d832137e20e193c960802afba73b5d38sm
878cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
879cfd74d65d832137e20e193c960802afba73b5d38sm
880cfd74d65d832137e20e193c960802afba73b5d38sm        player.setHitReactionComponent(hitReact);
881cfd74d65d832137e20e193c960802afba73b5d38sm
882cfd74d65d832137e20e193c960802afba73b5d38sm        InventoryComponent inventory = (InventoryComponent)allocateComponent(InventoryComponent.class);
883cfd74d65d832137e20e193c960802afba73b5d38sm
884cfd74d65d832137e20e193c960802afba73b5d38sm        player.setInventory(inventory);
885cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setInventory(inventory);
886cfd74d65d832137e20e193c960802afba73b5d38sm
887cfd74d65d832137e20e193c960802afba73b5d38sm        ChangeComponentsComponent damageSwap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class);
888cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setDamageSwap(damageSwap);
889cfd74d65d832137e20e193c960802afba73b5d38sm
890cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent smokeGun
891cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
892cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setDelayBetweenShots(0.25f);
893cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setObjectTypeToSpawn(GameObjectType.SMOKE_BIG);
894cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setOffsetX(32);
895cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setOffsetY(15);
896cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setVelocityX(-150.0f);
897cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setVelocityY(100.0f);
898cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setThetaError(0.1f);
899cfd74d65d832137e20e193c960802afba73b5d38sm
900cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent smokeGun2
901cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
902cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setDelayBetweenShots(0.35f);
903cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setObjectTypeToSpawn(GameObjectType.SMOKE_SMALL);
904cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setOffsetX(16);
905cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setOffsetY(15);
906cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setVelocityX(-150.0f);
907cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setVelocityY(150.0f);
908cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setThetaError(0.1f);
909cfd74d65d832137e20e193c960802afba73b5d38sm
910cfd74d65d832137e20e193c960802afba73b5d38sm        damageSwap.addSwapInComponent(smokeGun);
911cfd74d65d832137e20e193c960802afba73b5d38sm        damageSwap.addSwapInComponent(smokeGun2);
912cfd74d65d832137e20e193c960802afba73b5d38sm        damageSwap.setPingPongBehavior(true);
913cfd74d65d832137e20e193c960802afba73b5d38sm
914cfd74d65d832137e20e193c960802afba73b5d38sm        ChangeComponentsComponent invincibleSwap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class);
915cfd74d65d832137e20e193c960802afba73b5d38sm        invincibleSwap.setPingPongBehavior(true);
916cfd74d65d832137e20e193c960802afba73b5d38sm        player.setInvincibleSwap(invincibleSwap);
917cfd74d65d832137e20e193c960802afba73b5d38sm
918cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = PlayerComponent.MAX_PLAYER_LIFE;
919cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.PLAYER;
920cfd74d65d832137e20e193c960802afba73b5d38sm
921cfd74d65d832137e20e193c960802afba73b5d38sm        // Very very basic DDA.  Make the game easier if we've died on this level too much.
922cfd74d65d832137e20e193c960802afba73b5d38sm        LevelSystem level = sSystemRegistry.levelSystem;
923cfd74d65d832137e20e193c960802afba73b5d38sm        if (level != null) {
924cfd74d65d832137e20e193c960802afba73b5d38sm        	player.adjustDifficulty(object, level.getAttemptsCount());
925cfd74d65d832137e20e193c960802afba73b5d38sm        }
926cfd74d65d832137e20e193c960802afba73b5d38sm
927cfd74d65d832137e20e193c960802afba73b5d38sm
928cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(player);
929cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(inventory);
930cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
931cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
932cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
933cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
934cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
935cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
936cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(damageSwap);
937cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(invincibleSwap);
938cfd74d65d832137e20e193c960802afba73b5d38sm
939cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.PLAYER, object, sprite);
940cfd74d65d832137e20e193c960802afba73b5d38sm
941cfd74d65d832137e20e193c960802afba73b5d38sm
942cfd74d65d832137e20e193c960802afba73b5d38sm
943cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(PlayerAnimations.IDLE.ordinal());
944cfd74d65d832137e20e193c960802afba73b5d38sm
945cfd74d65d832137e20e193c960802afba73b5d38sm
946cfd74d65d832137e20e193c960802afba73b5d38sm        // Jets
947cfd74d65d832137e20e193c960802afba73b5d38sm        {
948cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<BaseObject> jetStaticData = getStaticData(GameObjectType.PLAYER_JETS);
949cfd74d65d832137e20e193c960802afba73b5d38sm            if (jetStaticData == null) {
950cfd74d65d832137e20e193c960802afba73b5d38sm                jetStaticData = new FixedSizeArray<BaseObject>(1);
951cfd74d65d832137e20e193c960802afba73b5d38sm
952cfd74d65d832137e20e193c960802afba73b5d38sm                SpriteAnimation jetAnim = new SpriteAnimation(0, 2);
953cfd74d65d832137e20e193c960802afba73b5d38sm                jetAnim.addFrame(
954cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.jetfire01),
955cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1)));
956cfd74d65d832137e20e193c960802afba73b5d38sm                jetAnim.addFrame(
957cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.jetfire02),
958cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1)));
959cfd74d65d832137e20e193c960802afba73b5d38sm                jetAnim.setLoop(true);
960cfd74d65d832137e20e193c960802afba73b5d38sm
961cfd74d65d832137e20e193c960802afba73b5d38sm                jetStaticData.add(jetAnim);
962cfd74d65d832137e20e193c960802afba73b5d38sm
963cfd74d65d832137e20e193c960802afba73b5d38sm                setStaticData(GameObjectType.PLAYER_JETS, jetStaticData);
964cfd74d65d832137e20e193c960802afba73b5d38sm            }
965cfd74d65d832137e20e193c960802afba73b5d38sm
966cfd74d65d832137e20e193c960802afba73b5d38sm            RenderComponent jetRender = (RenderComponent)allocateComponent(RenderComponent.class);
967cfd74d65d832137e20e193c960802afba73b5d38sm            jetRender.setPriority(SortConstants.PLAYER - 1);
968cfd74d65d832137e20e193c960802afba73b5d38sm            jetRender.setDrawOffset(0.0f, -16.0f);
969cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteComponent jetSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
970cfd74d65d832137e20e193c960802afba73b5d38sm            jetSprite.setSize(64, 64);
971cfd74d65d832137e20e193c960802afba73b5d38sm            jetSprite.setRenderComponent(jetRender);
972cfd74d65d832137e20e193c960802afba73b5d38sm
973cfd74d65d832137e20e193c960802afba73b5d38sm            object.add(jetRender);
974cfd74d65d832137e20e193c960802afba73b5d38sm            object.add(jetSprite);
975cfd74d65d832137e20e193c960802afba73b5d38sm
976cfd74d65d832137e20e193c960802afba73b5d38sm            addStaticData(GameObjectType.PLAYER_JETS, object, jetSprite);
977cfd74d65d832137e20e193c960802afba73b5d38sm
978cfd74d65d832137e20e193c960802afba73b5d38sm            jetSprite.playAnimation(0);
979cfd74d65d832137e20e193c960802afba73b5d38sm
980cfd74d65d832137e20e193c960802afba73b5d38sm            animation.setJetSprite(jetSprite);
981cfd74d65d832137e20e193c960802afba73b5d38sm        }
982cfd74d65d832137e20e193c960802afba73b5d38sm        // Sparks
983cfd74d65d832137e20e193c960802afba73b5d38sm        {
984cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<BaseObject> sparksStaticData = getStaticData(GameObjectType.PLAYER_SPARKS);
985cfd74d65d832137e20e193c960802afba73b5d38sm
986cfd74d65d832137e20e193c960802afba73b5d38sm            if (sparksStaticData == null) {
987cfd74d65d832137e20e193c960802afba73b5d38sm                sparksStaticData = new FixedSizeArray<BaseObject>(1);
988cfd74d65d832137e20e193c960802afba73b5d38sm
989cfd74d65d832137e20e193c960802afba73b5d38sm                SpriteAnimation sparksAnim = new SpriteAnimation(0, 3);
990cfd74d65d832137e20e193c960802afba73b5d38sm                sparksAnim.addFrame(
991cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark01),
992cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1)));
993cfd74d65d832137e20e193c960802afba73b5d38sm                sparksAnim.addFrame(
994cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark02),
995cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1)));
996cfd74d65d832137e20e193c960802afba73b5d38sm                sparksAnim.addFrame(
997cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark03),
998cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1)));
999cfd74d65d832137e20e193c960802afba73b5d38sm                sparksAnim.setLoop(true);
1000cfd74d65d832137e20e193c960802afba73b5d38sm
1001cfd74d65d832137e20e193c960802afba73b5d38sm                sparksStaticData.add(sparksAnim);
1002cfd74d65d832137e20e193c960802afba73b5d38sm
1003cfd74d65d832137e20e193c960802afba73b5d38sm                setStaticData(GameObjectType.PLAYER_SPARKS, sparksStaticData);
1004cfd74d65d832137e20e193c960802afba73b5d38sm            }
1005cfd74d65d832137e20e193c960802afba73b5d38sm
1006cfd74d65d832137e20e193c960802afba73b5d38sm            RenderComponent sparksRender = (RenderComponent)allocateComponent(RenderComponent.class);
1007cfd74d65d832137e20e193c960802afba73b5d38sm            sparksRender.setPriority(SortConstants.PLAYER + 1);
1008cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteComponent sparksSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1009cfd74d65d832137e20e193c960802afba73b5d38sm            sparksSprite.setSize(64, 64);
1010cfd74d65d832137e20e193c960802afba73b5d38sm            sparksSprite.setRenderComponent(sparksRender);
1011cfd74d65d832137e20e193c960802afba73b5d38sm
1012cfd74d65d832137e20e193c960802afba73b5d38sm            object.add(sparksRender);
1013cfd74d65d832137e20e193c960802afba73b5d38sm            object.add(sparksSprite);
1014cfd74d65d832137e20e193c960802afba73b5d38sm
1015cfd74d65d832137e20e193c960802afba73b5d38sm            addStaticData(GameObjectType.PLAYER_SPARKS, object, sparksSprite);
1016cfd74d65d832137e20e193c960802afba73b5d38sm
1017cfd74d65d832137e20e193c960802afba73b5d38sm            sparksSprite.playAnimation(0);
1018cfd74d65d832137e20e193c960802afba73b5d38sm
1019cfd74d65d832137e20e193c960802afba73b5d38sm            animation.setSparksSprite(sparksSprite);
1020cfd74d65d832137e20e193c960802afba73b5d38sm        }
1021cfd74d65d832137e20e193c960802afba73b5d38sm
1022cfd74d65d832137e20e193c960802afba73b5d38sm        // Glow
1023cfd74d65d832137e20e193c960802afba73b5d38sm        {
1024cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<BaseObject> glowStaticData = getStaticData(GameObjectType.PLAYER_GLOW);
1025cfd74d65d832137e20e193c960802afba73b5d38sm            if (glowStaticData == null) {
1026cfd74d65d832137e20e193c960802afba73b5d38sm                glowStaticData = new FixedSizeArray<BaseObject>(1);
1027cfd74d65d832137e20e193c960802afba73b5d38sm
1028cfd74d65d832137e20e193c960802afba73b5d38sm                FixedSizeArray<CollisionVolume> glowAttackVolume =
1029cfd74d65d832137e20e193c960802afba73b5d38sm                    new FixedSizeArray<CollisionVolume>(1);
1030cfd74d65d832137e20e193c960802afba73b5d38sm                glowAttackVolume.add(new SphereCollisionVolume(40, 40, 40, HitType.HIT));
1031cfd74d65d832137e20e193c960802afba73b5d38sm
1032cfd74d65d832137e20e193c960802afba73b5d38sm                SpriteAnimation glowAnim = new SpriteAnimation(0, 3);
1033cfd74d65d832137e20e193c960802afba73b5d38sm                glowAnim.addFrame(
1034cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_glow01),
1035cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1), glowAttackVolume, null));
1036cfd74d65d832137e20e193c960802afba73b5d38sm                glowAnim.addFrame(
1037cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_glow02),
1038cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1), glowAttackVolume, null));
1039cfd74d65d832137e20e193c960802afba73b5d38sm                glowAnim.addFrame(
1040cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_glow03),
1041cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1), glowAttackVolume, null));
1042cfd74d65d832137e20e193c960802afba73b5d38sm                glowAnim.setLoop(true);
1043cfd74d65d832137e20e193c960802afba73b5d38sm
1044cfd74d65d832137e20e193c960802afba73b5d38sm                glowStaticData.add(glowAnim);
1045cfd74d65d832137e20e193c960802afba73b5d38sm
1046cfd74d65d832137e20e193c960802afba73b5d38sm                setStaticData(GameObjectType.PLAYER_GLOW, glowStaticData);
1047cfd74d65d832137e20e193c960802afba73b5d38sm            }
1048cfd74d65d832137e20e193c960802afba73b5d38sm
1049cfd74d65d832137e20e193c960802afba73b5d38sm            RenderComponent glowRender = (RenderComponent)allocateComponent(RenderComponent.class);
1050cfd74d65d832137e20e193c960802afba73b5d38sm            glowRender.setPriority(SortConstants.PLAYER + 1);
1051cfd74d65d832137e20e193c960802afba73b5d38sm            glowRender.setDrawOffset(0, -5.0f);
1052cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteComponent glowSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1053cfd74d65d832137e20e193c960802afba73b5d38sm            glowSprite.setSize(64, 64);
1054cfd74d65d832137e20e193c960802afba73b5d38sm            glowSprite.setRenderComponent(glowRender);
1055cfd74d65d832137e20e193c960802afba73b5d38sm
1056cfd74d65d832137e20e193c960802afba73b5d38sm            DynamicCollisionComponent glowCollision
1057cfd74d65d832137e20e193c960802afba73b5d38sm                = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
1058cfd74d65d832137e20e193c960802afba73b5d38sm            glowSprite.setCollisionComponent(glowCollision);
1059cfd74d65d832137e20e193c960802afba73b5d38sm
1060cfd74d65d832137e20e193c960802afba73b5d38sm            FadeDrawableComponent glowFade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
1061cfd74d65d832137e20e193c960802afba73b5d38sm            glowFade.setupFade(1.0f, 0.0f, 0.15f,
1062cfd74d65d832137e20e193c960802afba73b5d38sm            		FadeDrawableComponent.LOOP_TYPE_PING_PONG,
1063cfd74d65d832137e20e193c960802afba73b5d38sm            		FadeDrawableComponent.FADE_EASE,
1064cfd74d65d832137e20e193c960802afba73b5d38sm            		PlayerComponent.GLOW_DURATION - 4.0f);	// 4 seconds before the glow ends, start flashing
1065cfd74d65d832137e20e193c960802afba73b5d38sm            glowFade.setPhaseDuration(PlayerComponent.GLOW_DURATION);
1066cfd74d65d832137e20e193c960802afba73b5d38sm            glowFade.setRenderComponent(glowRender);
1067cfd74d65d832137e20e193c960802afba73b5d38sm
1068cfd74d65d832137e20e193c960802afba73b5d38sm            invincibleSwap.addSwapInComponent(glowRender);
1069cfd74d65d832137e20e193c960802afba73b5d38sm            invincibleSwap.addSwapInComponent(glowSprite);
1070cfd74d65d832137e20e193c960802afba73b5d38sm            invincibleSwap.addSwapInComponent(glowCollision);
1071cfd74d65d832137e20e193c960802afba73b5d38sm            invincibleSwap.addSwapInComponent(glowFade);
1072cfd74d65d832137e20e193c960802afba73b5d38sm
1073cfd74d65d832137e20e193c960802afba73b5d38sm            addStaticData(GameObjectType.PLAYER_GLOW, object, glowSprite);
1074cfd74d65d832137e20e193c960802afba73b5d38sm
1075cfd74d65d832137e20e193c960802afba73b5d38sm            glowSprite.playAnimation(0);
1076cfd74d65d832137e20e193c960802afba73b5d38sm
1077cfd74d65d832137e20e193c960802afba73b5d38sm        }
1078cfd74d65d832137e20e193c960802afba73b5d38sm
1079cfd74d65d832137e20e193c960802afba73b5d38sm        CameraSystem camera = sSystemRegistry.cameraSystem;
1080cfd74d65d832137e20e193c960802afba73b5d38sm        if (camera != null) {
1081cfd74d65d832137e20e193c960802afba73b5d38sm            camera.setTarget(object);
1082cfd74d65d832137e20e193c960802afba73b5d38sm        }
1083cfd74d65d832137e20e193c960802afba73b5d38sm
1084cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
1085cfd74d65d832137e20e193c960802afba73b5d38sm    }
1086cfd74d65d832137e20e193c960802afba73b5d38sm
1087cfd74d65d832137e20e193c960802afba73b5d38sm
1088cfd74d65d832137e20e193c960802afba73b5d38sm    // Sparks are used by more than one enemy type, so the setup for them is abstracted.
1089cfd74d65d832137e20e193c960802afba73b5d38sm    private void setupEnemySparks() {
1090cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ENEMY_SPARKS);
1091cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
1092cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(1);
1093cfd74d65d832137e20e193c960802afba73b5d38sm            TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
1094cfd74d65d832137e20e193c960802afba73b5d38sm
1095cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation sparksAnim = new SpriteAnimation(0, 13);
1096cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 =
1097cfd74d65d832137e20e193c960802afba73b5d38sm                new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark01),
1098cfd74d65d832137e20e193c960802afba73b5d38sm                        Utils.framesToTime(24, 1));
1099cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame2 =
1100cfd74d65d832137e20e193c960802afba73b5d38sm                new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark02),
1101cfd74d65d832137e20e193c960802afba73b5d38sm                        Utils.framesToTime(24, 1));
1102cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame3 =
1103cfd74d65d832137e20e193c960802afba73b5d38sm                new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark03),
1104cfd74d65d832137e20e193c960802afba73b5d38sm                        Utils.framesToTime(24, 1));
1105cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame1);
1106cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame2);
1107cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame3);
1108cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame1);
1109cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame2);
1110cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame3);
1111cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame1);
1112cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame2);
1113cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame3);
1114cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame1);
1115cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame2);
1116cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame3);
1117cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(new AnimationFrame(null, 3.0f));
1118cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.setLoop(true);
1119cfd74d65d832137e20e193c960802afba73b5d38sm
1120cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(sparksAnim);
1121cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.ENEMY_SPARKS, staticData);
1122cfd74d65d832137e20e193c960802afba73b5d38sm        }
1123cfd74d65d832137e20e193c960802afba73b5d38sm
1124cfd74d65d832137e20e193c960802afba73b5d38sm    }
1125cfd74d65d832137e20e193c960802afba73b5d38sm
1126cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyBrobot(float positionX, float positionY, boolean flipHorizontal) {
1127cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
1128cfd74d65d832137e20e193c960802afba73b5d38sm
1129cfd74d65d832137e20e193c960802afba73b5d38sm
1130cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
1131cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
1132cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
1133cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
1134cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
1135cfd74d65d832137e20e193c960802afba73b5d38sm
1136cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BROBOT);
1137cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
1138cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 5;
1139cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
1140cfd74d65d832137e20e193c960802afba73b5d38sm
1141cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
1142cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
1143cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
1144cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.4f);
1145cfd74d65d832137e20e193c960802afba73b5d38sm
1146cfd74d65d832137e20e193c960802afba73b5d38sm
1147cfd74d65d832137e20e193c960802afba73b5d38sm            // Animations
1148cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
1149cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
1150cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32));
1151cfd74d65d832137e20e193c960802afba73b5d38sm
1152cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
1153cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(2);
1154cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 32, 32, HitType.HIT));
1155cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new AABoxCollisionVolume(16, 0, 32, 16, HitType.DEPRESS));
1156cfd74d65d832137e20e193c960802afba73b5d38sm
1157cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 4);
1158cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1159cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle01),
1160cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));
1161cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1162cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle02),
1163cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
1164cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1165cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle03),
1166cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));
1167cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1168cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle02),
1169cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));
1170cfd74d65d832137e20e193c960802afba73b5d38sm
1171cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
1172cfd74d65d832137e20e193c960802afba73b5d38sm
1173cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 3);
1174cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1175cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk01),
1176cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
1177cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1178cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk02),
1179cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
1180cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1181cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk03),
1182cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
1183cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
1184cfd74d65d832137e20e193c960802afba73b5d38sm
1185cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
1186cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
1187cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
1188cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
1189cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
1190cfd74d65d832137e20e193c960802afba73b5d38sm
1191cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.BROBOT, staticData);
1192cfd74d65d832137e20e193c960802afba73b5d38sm
1193cfd74d65d832137e20e193c960802afba73b5d38sm        }
1194cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
1195cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
1196cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision
1197cfd74d65d832137e20e193c960802afba73b5d38sm            = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
1198cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 48);
1199cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(16, 0);
1200cfd74d65d832137e20e193c960802afba73b5d38sm
1201cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1202cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
1203cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
1204cfd74d65d832137e20e193c960802afba73b5d38sm
1205cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation
1206cfd74d65d832137e20e193c960802afba73b5d38sm            = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
1207cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
1208cfd74d65d832137e20e193c960802afba73b5d38sm
1209cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
1210cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(50.0f, 1000.0f);
1211cfd74d65d832137e20e193c960802afba73b5d38sm
1212cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
1213cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
1214cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
1215cfd74d65d832137e20e193c960802afba73b5d38sm
1216cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
1217cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
1218cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
1219cfd74d65d832137e20e193c960802afba73b5d38sm
1220cfd74d65d832137e20e193c960802afba73b5d38sm
1221cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
1222cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.EXPLOSION_GIANT);
1223cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setVulnerableToDeathTiles(true);
1224cfd74d65d832137e20e193c960802afba73b5d38sm
1225cfd74d65d832137e20e193c960802afba73b5d38sm        GhostComponent ghost = (GhostComponent)allocateComponent(GhostComponent.class);
1226cfd74d65d832137e20e193c960802afba73b5d38sm        ghost.setMovementSpeed(500.0f);
1227cfd74d65d832137e20e193c960802afba73b5d38sm        ghost.setAcceleration(1000.0f);
1228cfd74d65d832137e20e193c960802afba73b5d38sm        ghost.setJumpImpulse(300.0f);
1229cfd74d65d832137e20e193c960802afba73b5d38sm        ghost.setKillOnRelease(true);
1230cfd74d65d832137e20e193c960802afba73b5d38sm        ghost.setDelayOnRelease(1.5f);
1231cfd74d65d832137e20e193c960802afba73b5d38sm
1232cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
1233cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
1234cfd74d65d832137e20e193c960802afba73b5d38sm        	ghost.setAmbientSound(sound.load(R.raw.sound_possession));
1235cfd74d65d832137e20e193c960802afba73b5d38sm        }
1236cfd74d65d832137e20e193c960802afba73b5d38sm
1237cfd74d65d832137e20e193c960802afba73b5d38sm        ChangeComponentsComponent ghostSwap
1238cfd74d65d832137e20e193c960802afba73b5d38sm            = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class);
1239cfd74d65d832137e20e193c960802afba73b5d38sm        ghostSwap.addSwapInComponent(ghost);
1240cfd74d65d832137e20e193c960802afba73b5d38sm        ghostSwap.addSwapOutComponent(patrol);
1241cfd74d65d832137e20e193c960802afba73b5d38sm
1242cfd74d65d832137e20e193c960802afba73b5d38sm        SimplePhysicsComponent ghostPhysics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
1243cfd74d65d832137e20e193c960802afba73b5d38sm        ghostPhysics.setBounciness(0.0f);
1244cfd74d65d832137e20e193c960802afba73b5d38sm
1245cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
1246cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
1247cfd74d65d832137e20e193c960802afba73b5d38sm
1248cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
1249cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
1250cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
1251cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
1252cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
1253cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
1254cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(ghostSwap);
1255cfd74d65d832137e20e193c960802afba73b5d38sm
1256cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
1257cfd74d65d832137e20e193c960802afba73b5d38sm
1258cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
1259cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
1260cfd74d65d832137e20e193c960802afba73b5d38sm        }
1261cfd74d65d832137e20e193c960802afba73b5d38sm
1262cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.BROBOT, object, sprite);
1263cfd74d65d832137e20e193c960802afba73b5d38sm
1264cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
1265cfd74d65d832137e20e193c960802afba73b5d38sm
1266cfd74d65d832137e20e193c960802afba73b5d38sm        SimplePhysicsComponent normalPhysics = object.findByClass(SimplePhysicsComponent.class);
1267cfd74d65d832137e20e193c960802afba73b5d38sm        if (normalPhysics != null) {
1268cfd74d65d832137e20e193c960802afba73b5d38sm            ghostSwap.addSwapOutComponent(normalPhysics);
1269cfd74d65d832137e20e193c960802afba73b5d38sm        }
1270cfd74d65d832137e20e193c960802afba73b5d38sm
1271cfd74d65d832137e20e193c960802afba73b5d38sm        ghostSwap.addSwapInComponent(ghostPhysics);
1272cfd74d65d832137e20e193c960802afba73b5d38sm
1273cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
1274cfd74d65d832137e20e193c960802afba73b5d38sm
1275cfd74d65d832137e20e193c960802afba73b5d38sm        // Sparks
1276cfd74d65d832137e20e193c960802afba73b5d38sm        setupEnemySparks();
1277cfd74d65d832137e20e193c960802afba73b5d38sm
1278cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent sparksRender = (RenderComponent)allocateComponent(RenderComponent.class);
1279cfd74d65d832137e20e193c960802afba73b5d38sm        sparksRender.setPriority(render.getPriority() + 1);
1280cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sparksSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1281cfd74d65d832137e20e193c960802afba73b5d38sm        sparksSprite.setSize(64, 64);
1282cfd74d65d832137e20e193c960802afba73b5d38sm        sparksSprite.setRenderComponent(sparksRender);
1283cfd74d65d832137e20e193c960802afba73b5d38sm
1284cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.ENEMY_SPARKS, object, sparksSprite);
1285cfd74d65d832137e20e193c960802afba73b5d38sm
1286cfd74d65d832137e20e193c960802afba73b5d38sm        sparksSprite.playAnimation(0);
1287cfd74d65d832137e20e193c960802afba73b5d38sm
1288cfd74d65d832137e20e193c960802afba73b5d38sm        ghostSwap.addSwapInComponent(sparksSprite);
1289cfd74d65d832137e20e193c960802afba73b5d38sm        ghostSwap.addSwapInComponent(sparksRender);
1290cfd74d65d832137e20e193c960802afba73b5d38sm
1291cfd74d65d832137e20e193c960802afba73b5d38sm
1292cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setPossessionComponent(ghostSwap);
1293cfd74d65d832137e20e193c960802afba73b5d38sm
1294cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
1295cfd74d65d832137e20e193c960802afba73b5d38sm    }
1296cfd74d65d832137e20e193c960802afba73b5d38sm
1297cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemySnailBomb(float positionX, float positionY, boolean flipHorizontal) {
1298cfd74d65d832137e20e193c960802afba73b5d38sm
1299cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
1300cfd74d65d832137e20e193c960802afba73b5d38sm
1301cfd74d65d832137e20e193c960802afba73b5d38sm
1302cfd74d65d832137e20e193c960802afba73b5d38sm        // Make sure related textures are loaded.
1303cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.snail_bomb);
1304cfd74d65d832137e20e193c960802afba73b5d38sm
1305cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
1306cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
1307cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
1308cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
1309cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
1310cfd74d65d832137e20e193c960802afba73b5d38sm
1311cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SNAILBOMB);
1312cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
1313cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 6;
1314cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
1315cfd74d65d832137e20e193c960802afba73b5d38sm
1316cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
1317cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
1318cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent physics = allocateComponent(SimplePhysicsComponent.class);
1319cfd74d65d832137e20e193c960802afba73b5d38sm
1320cfd74d65d832137e20e193c960802afba73b5d38sm            // Animations
1321cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
1322cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
1323cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(12, 5, 42, 27, HitType.HIT));
1324cfd74d65d832137e20e193c960802afba73b5d38sm
1325cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
1326cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
1327cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new AABoxCollisionVolume(12, 5, 42, 27, HitType.HIT));
1328cfd74d65d832137e20e193c960802afba73b5d38sm
1329cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 1);
1330cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1331cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_stand),
1332cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));
1333cfd74d65d832137e20e193c960802afba73b5d38sm
1334cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 5);
1335cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1336cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_stand),
1337cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume));
1338cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1339cfd74d65d832137e20e193c960802afba73b5d38sm                        textureLibrary.allocateTexture(R.drawable.snailbomb_walk01),
1340cfd74d65d832137e20e193c960802afba73b5d38sm                        Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume));
1341cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1342cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_walk02),
1343cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), basicAttackVolume, basicVulnerabilityVolume));
1344cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1345cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_walk01),
1346cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume));
1347cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1348cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_stand),
1349cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume));
1350cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
1351cfd74d65d832137e20e193c960802afba73b5d38sm
1352cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 2);
1353cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1354cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_shoot01),
1355cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));
1356cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1357cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_shoot02),
1358cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume));
1359cfd74d65d832137e20e193c960802afba73b5d38sm
1360cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
1361cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
1362cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
1363cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
1364cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
1365cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
1366cfd74d65d832137e20e193c960802afba73b5d38sm
1367cfd74d65d832137e20e193c960802afba73b5d38sm
1368cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.SNAILBOMB, staticData);
1369cfd74d65d832137e20e193c960802afba73b5d38sm        }
1370cfd74d65d832137e20e193c960802afba73b5d38sm
1371cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
1372cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
1373cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision
1374cfd74d65d832137e20e193c960802afba73b5d38sm            = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
1375cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 48);
1376cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(16, 5);
1377cfd74d65d832137e20e193c960802afba73b5d38sm
1378cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1379cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
1380cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
1381cfd74d65d832137e20e193c960802afba73b5d38sm
1382cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation
1383cfd74d65d832137e20e193c960802afba73b5d38sm            = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
1384cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
1385cfd74d65d832137e20e193c960802afba73b5d38sm
1386cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
1387cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(20.0f, 1000.0f);
1388cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setupAttack(300, 1.0f, 4.0f, true);
1389cfd74d65d832137e20e193c960802afba73b5d38sm
1390cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
1391cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
1392cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
1393cfd74d65d832137e20e193c960802afba73b5d38sm
1394cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
1395cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
1396cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
1397cfd74d65d832137e20e193c960802afba73b5d38sm
1398cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
1399cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setVulnerableToDeathTiles(true);
1400cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
1401cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
1402cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
1403cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
1404cfd74d65d832137e20e193c960802afba73b5d38sm        }
1405cfd74d65d832137e20e193c960802afba73b5d38sm
1406cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent gun
1407cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
1408cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setSetsPerActivation(1);
1409cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShotsPerSet(3);
1410cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setDelayBeforeFirstSet(1.0f);
1411cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setDelayBetweenShots(0.25f);
1412cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setObjectTypeToSpawn(GameObjectType.CANNON_BALL);
1413cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetX(55);
1414cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetY(21);
1415cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setRequiredAction(GameObject.ActionType.ATTACK);
1416cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityX(100.0f);
1417cfd74d65d832137e20e193c960802afba73b5d38sm
1418cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
1419cfd74d65d832137e20e193c960802afba73b5d38sm
1420cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
1421cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
1422cfd74d65d832137e20e193c960802afba73b5d38sm        }
1423cfd74d65d832137e20e193c960802afba73b5d38sm
1424cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
1425cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
1426cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
1427cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
1428cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
1429cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
1430cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
1431cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
1432cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun);
1433cfd74d65d832137e20e193c960802afba73b5d38sm
1434cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.SNAILBOMB, object, sprite);
1435cfd74d65d832137e20e193c960802afba73b5d38sm
1436cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation attack = sprite.findAnimation(EnemyAnimations.ATTACK.ordinal());
1437cfd74d65d832137e20e193c960802afba73b5d38sm        if (attack != null) {
1438cfd74d65d832137e20e193c960802afba73b5d38sm            gun.setDelayBeforeFirstSet(attack.getLength());
1439cfd74d65d832137e20e193c960802afba73b5d38sm        }
1440cfd74d65d832137e20e193c960802afba73b5d38sm
1441cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
1442cfd74d65d832137e20e193c960802afba73b5d38sm
1443cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
1444cfd74d65d832137e20e193c960802afba73b5d38sm    }
1445cfd74d65d832137e20e193c960802afba73b5d38sm
1446cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyShadowSlime(float positionX, float positionY, boolean flipHorizontal) {
1447cfd74d65d832137e20e193c960802afba73b5d38sm
1448cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
1449cfd74d65d832137e20e193c960802afba73b5d38sm
1450cfd74d65d832137e20e193c960802afba73b5d38sm
1451cfd74d65d832137e20e193c960802afba73b5d38sm        // Make sure related textures are loaded.
1452cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball01);
1453cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball02);
1454cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball03);
1455cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball04);
1456cfd74d65d832137e20e193c960802afba73b5d38sm
1457cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
1458cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
1459cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
1460cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
1461cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
1462cfd74d65d832137e20e193c960802afba73b5d38sm
1463cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SHADOWSLIME);
1464cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
1465cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 5;
1466cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
1467cfd74d65d832137e20e193c960802afba73b5d38sm
1468cfd74d65d832137e20e193c960802afba73b5d38sm            PopOutComponent popOut = (PopOutComponent)allocateComponent(PopOutComponent.class);
1469cfd74d65d832137e20e193c960802afba73b5d38sm            popOut.setAppearDistance(150);
1470cfd74d65d832137e20e193c960802afba73b5d38sm            popOut.setHideDistance(190);
1471cfd74d65d832137e20e193c960802afba73b5d38sm
1472cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1);
1473cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32));
1474cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.HIT);
1475cfd74d65d832137e20e193c960802afba73b5d38sm
1476cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume = new FixedSizeArray<CollisionVolume>(1);
1477cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 32, 32, HitType.HIT));
1478cfd74d65d832137e20e193c960802afba73b5d38sm
1479cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 2);
1480cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame idle1 = new AnimationFrame(
1481cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_idle01),
1482cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume);
1483cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame idle2 = new AnimationFrame(
1484cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_idle02),
1485cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume);
1486cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle1);
1487cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle2);
1488cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
1489cfd74d65d832137e20e193c960802afba73b5d38sm
1490cfd74d65d832137e20e193c960802afba73b5d38sm
1491cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation appear = new SpriteAnimation(EnemyAnimations.APPEAR.ordinal(), 6);
1492cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame appear1 = new AnimationFrame(
1493cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate01),
1494cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume);
1495cfd74d65d832137e20e193c960802afba73b5d38sm
1496cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame appear2 = new AnimationFrame(
1497cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate02),
1498cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume);
1499cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame appear3 = new AnimationFrame(
1500cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate03),
1501cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume);
1502cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame appear4 = new AnimationFrame(
1503cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate04),
1504cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume);
1505cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame appear5 = new AnimationFrame(
1506cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate05),
1507cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume);
1508cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame appear6 = new AnimationFrame(
1509cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate06),
1510cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume);
1511cfd74d65d832137e20e193c960802afba73b5d38sm
1512cfd74d65d832137e20e193c960802afba73b5d38sm            appear.addFrame(appear1);
1513cfd74d65d832137e20e193c960802afba73b5d38sm            appear.addFrame(appear2);
1514cfd74d65d832137e20e193c960802afba73b5d38sm            appear.addFrame(appear3);
1515cfd74d65d832137e20e193c960802afba73b5d38sm            appear.addFrame(appear4);
1516cfd74d65d832137e20e193c960802afba73b5d38sm            appear.addFrame(appear5);
1517cfd74d65d832137e20e193c960802afba73b5d38sm            appear.addFrame(appear6);
1518cfd74d65d832137e20e193c960802afba73b5d38sm
1519cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation hidden = new SpriteAnimation(EnemyAnimations.HIDDEN.ordinal(), 6);
1520cfd74d65d832137e20e193c960802afba73b5d38sm            hidden.addFrame(appear6);
1521cfd74d65d832137e20e193c960802afba73b5d38sm            hidden.addFrame(appear5);
1522cfd74d65d832137e20e193c960802afba73b5d38sm            hidden.addFrame(appear4);
1523cfd74d65d832137e20e193c960802afba73b5d38sm            hidden.addFrame(appear3);
1524cfd74d65d832137e20e193c960802afba73b5d38sm            hidden.addFrame(appear2);
1525cfd74d65d832137e20e193c960802afba73b5d38sm            hidden.addFrame(appear1);
1526cfd74d65d832137e20e193c960802afba73b5d38sm            /*hidden.addFrame(new AnimationFrame(
1527cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_stand),
1528cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));*/
1529cfd74d65d832137e20e193c960802afba73b5d38sm
1530cfd74d65d832137e20e193c960802afba73b5d38sm
1531cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 10);
1532cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack1 = new AnimationFrame(
1533cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack01),
1534cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume);
1535cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack2 = new AnimationFrame(
1536cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack02),
1537cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume);
1538cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack3 = new AnimationFrame(
1539cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack03),
1540cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume);
1541cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack4 = new AnimationFrame(
1542cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack04),
1543cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), basicAttackVolume, basicVulnerabilityVolume);
1544cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attackFlash = new AnimationFrame(
1545cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_flash),
1546cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume);
1547cfd74d65d832137e20e193c960802afba73b5d38sm
1548cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack5 = new AnimationFrame(
1549cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack03),
1550cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume);
1551cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack6 = new AnimationFrame(
1552cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack02),
1553cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume);
1554cfd74d65d832137e20e193c960802afba73b5d38sm
1555cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack7 = new AnimationFrame(
1556cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack04),
1557cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume);
1558cfd74d65d832137e20e193c960802afba73b5d38sm
1559cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack1);
1560cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack2);
1561cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack3);
1562cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack4);
1563cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attackFlash);
1564cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack7);
1565cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attackFlash);
1566cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack5);
1567cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack6);
1568cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack1);
1569cfd74d65d832137e20e193c960802afba73b5d38sm
1570cfd74d65d832137e20e193c960802afba73b5d38sm            popOut.setupAttack(200, 2.0f, attack.getLength());
1571cfd74d65d832137e20e193c960802afba73b5d38sm
1572cfd74d65d832137e20e193c960802afba73b5d38sm
1573cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(popOut);
1574cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
1575cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(hidden);
1576cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(appear);
1577cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
1578cfd74d65d832137e20e193c960802afba73b5d38sm
1579cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.SHADOWSLIME, staticData);
1580cfd74d65d832137e20e193c960802afba73b5d38sm        }
1581cfd74d65d832137e20e193c960802afba73b5d38sm
1582cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
1583cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
1584cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision
1585cfd74d65d832137e20e193c960802afba73b5d38sm            = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
1586cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 48);
1587cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(16, 5);
1588cfd74d65d832137e20e193c960802afba73b5d38sm
1589cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1590cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
1591cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
1592cfd74d65d832137e20e193c960802afba73b5d38sm
1593cfd74d65d832137e20e193c960802afba73b5d38sm
1594cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
1595cfd74d65d832137e20e193c960802afba73b5d38sm
1596cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation
1597cfd74d65d832137e20e193c960802afba73b5d38sm            = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
1598cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
1599cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setFacePlayer(true);
1600cfd74d65d832137e20e193c960802afba73b5d38sm
1601cfd74d65d832137e20e193c960802afba73b5d38sm
1602cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
1603cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
1604cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
1605cfd74d65d832137e20e193c960802afba73b5d38sm
1606cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
1607cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
1608cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
1609cfd74d65d832137e20e193c960802afba73b5d38sm
1610cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
1611cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
1612cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
1613cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
1614cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
1615cfd74d65d832137e20e193c960802afba73b5d38sm        }
1616cfd74d65d832137e20e193c960802afba73b5d38sm
1617cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent gun
1618cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
1619cfd74d65d832137e20e193c960802afba73b5d38sm
1620cfd74d65d832137e20e193c960802afba73b5d38sm
1621cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShotsPerSet(1);
1622cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setSetsPerActivation(1);
1623cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setObjectTypeToSpawn(GameObjectType.ENERGY_BALL);
1624cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetX(44);
1625cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetY(22);
1626cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setRequiredAction(GameObject.ActionType.ATTACK);
1627cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityX(30.0f);
1628cfd74d65d832137e20e193c960802afba73b5d38sm
1629cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
1630cfd74d65d832137e20e193c960802afba73b5d38sm
1631cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
1632cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
1633cfd74d65d832137e20e193c960802afba73b5d38sm        }
1634cfd74d65d832137e20e193c960802afba73b5d38sm
1635cfd74d65d832137e20e193c960802afba73b5d38sm        // Hack.  Adjusting position lets us avoid giving this character gravity, physics, and
1636cfd74d65d832137e20e193c960802afba73b5d38sm        // collision.
1637cfd74d65d832137e20e193c960802afba73b5d38sm
1638cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().y -= 5;
1639cfd74d65d832137e20e193c960802afba73b5d38sm
1640cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
1641cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
1642cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
1643cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
1644cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
1645cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
1646cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
1647cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun);
1648cfd74d65d832137e20e193c960802afba73b5d38sm
1649cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.SHADOWSLIME, object, sprite);
1650cfd74d65d832137e20e193c960802afba73b5d38sm
1651cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation attack = sprite.findAnimation(EnemyAnimations.ATTACK.ordinal());
1652cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation appear = sprite.findAnimation(EnemyAnimations.APPEAR.ordinal());
1653cfd74d65d832137e20e193c960802afba73b5d38sm        if (attack != null && appear != null) {
1654cfd74d65d832137e20e193c960802afba73b5d38sm            gun.setDelayBeforeFirstSet(attack.getLength() / 2.0f);
1655cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
1656cfd74d65d832137e20e193c960802afba73b5d38sm            gun.setDelayBeforeFirstSet(Utils.framesToTime(24, 12));
1657cfd74d65d832137e20e193c960802afba73b5d38sm        }
1658cfd74d65d832137e20e193c960802afba73b5d38sm
1659cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
1660cfd74d65d832137e20e193c960802afba73b5d38sm    }
1661cfd74d65d832137e20e193c960802afba73b5d38sm
1662cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyMudman(float positionX, float positionY, boolean flipHorizontal) {
1663cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
1664cfd74d65d832137e20e193c960802afba73b5d38sm
1665cfd74d65d832137e20e193c960802afba73b5d38sm
1666cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
1667cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
1668cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
1669cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 128;
1670cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
1671cfd74d65d832137e20e193c960802afba73b5d38sm
1672cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.MUDMAN);
1673cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
1674cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 7;
1675cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
1676cfd74d65d832137e20e193c960802afba73b5d38sm
1677cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
1678cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
1679cfd74d65d832137e20e193c960802afba73b5d38sm
1680cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent physics = allocateComponent(SimplePhysicsComponent.class);
1681cfd74d65d832137e20e193c960802afba73b5d38sm
1682cfd74d65d832137e20e193c960802afba73b5d38sm            SolidSurfaceComponent solidSurface
1683cfd74d65d832137e20e193c960802afba73b5d38sm                = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class);
1684cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.inititalize(4);
1685cfd74d65d832137e20e193c960802afba73b5d38sm            // house shape:
1686cfd74d65d832137e20e193c960802afba73b5d38sm            // / \      1/ \2
1687cfd74d65d832137e20e193c960802afba73b5d38sm            // | |      3| |4
1688cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Start = new Vector2(32, 64);
1689cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1End = new Vector2(64, 96);
1690cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Normal = new Vector2(-0.707f, 0.707f);
1691cfd74d65d832137e20e193c960802afba73b5d38sm            surface1Normal.normalize();
1692cfd74d65d832137e20e193c960802afba73b5d38sm
1693cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Start = new Vector2(64, 96);
1694cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2End = new Vector2(75, 64);
1695cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Normal = new Vector2(0.9456f, 0.3250f);
1696cfd74d65d832137e20e193c960802afba73b5d38sm            surface2Normal.normalize();
1697cfd74d65d832137e20e193c960802afba73b5d38sm
1698cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Start = new Vector2(32, 0);
1699cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3End = new Vector2(32, 64);
1700cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Normal = new Vector2(-1, 0);
1701cfd74d65d832137e20e193c960802afba73b5d38sm
1702cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Start = new Vector2(75, 0);
1703cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4End = new Vector2(75, 64);
1704cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Normal = new Vector2(1, 0);
1705cfd74d65d832137e20e193c960802afba73b5d38sm
1706cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface1Start, surface1End, surface1Normal);
1707cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface2Start, surface2End, surface2Normal);
1708cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface3Start, surface3End, surface3Normal);
1709cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface4Start, surface4End, surface4Normal);
1710cfd74d65d832137e20e193c960802afba73b5d38sm
1711cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 4);
1712cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1713cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_stand),
1714cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 12), null, null));
1715cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame idle1 = new AnimationFrame(
1716cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_idle01),
1717cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null);
1718cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame idle2 = new AnimationFrame(
1719cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_idle01),
1720cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 7), null, null);
1721cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle1);
1722cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle2);
1723cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle1);
1724cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
1725cfd74d65d832137e20e193c960802afba73b5d38sm
1726cfd74d65d832137e20e193c960802afba73b5d38sm
1727cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 6);
1728cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1729cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_walk01),
1730cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, null));
1731cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1732cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_walk02),
1733cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, null));
1734cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1735cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_walk03),
1736cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 5), null, null));
1737cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1738cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_walk04),
1739cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, null));
1740cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1741cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_walk05),
1742cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, null));
1743cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1744cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_walk06),
1745cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 5), null, null));
1746cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
1747cfd74d65d832137e20e193c960802afba73b5d38sm
1748cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> crushAttackVolume =
1749cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
1750cfd74d65d832137e20e193c960802afba73b5d38sm            crushAttackVolume.add(new AABoxCollisionVolume(64, 0, 64, 96, HitType.HIT));
1751cfd74d65d832137e20e193c960802afba73b5d38sm
1752cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 8);
1753cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1754cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_stand),
1755cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
1756cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1757cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack01),
1758cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
1759cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1760cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack02),
1761cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
1762cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1763cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack03),
1764cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
1765cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1766cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack04),
1767cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), crushAttackVolume, null));
1768cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1769cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack05),
1770cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), crushAttackVolume, null));
1771cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1772cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack06),
1773cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 8), crushAttackVolume, null));
1774cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1775cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack07),
1776cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 5), null, null));
1777cfd74d65d832137e20e193c960802afba73b5d38sm
1778cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
1779cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
1780cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
1781cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(solidSurface);
1782cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
1783cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
1784cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
1785cfd74d65d832137e20e193c960802afba73b5d38sm
1786cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.MUDMAN, staticData);
1787cfd74d65d832137e20e193c960802afba73b5d38sm        }
1788cfd74d65d832137e20e193c960802afba73b5d38sm
1789cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
1790cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
1791cfd74d65d832137e20e193c960802afba73b5d38sm
1792cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
1793cfd74d65d832137e20e193c960802afba73b5d38sm		bgcollision.setSize(80, 90);
1794cfd74d65d832137e20e193c960802afba73b5d38sm		bgcollision.setOffset(32, 5);
1795cfd74d65d832137e20e193c960802afba73b5d38sm
1796cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1797cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
1798cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
1799cfd74d65d832137e20e193c960802afba73b5d38sm
1800cfd74d65d832137e20e193c960802afba73b5d38sm
1801cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
1802cfd74d65d832137e20e193c960802afba73b5d38sm
1803cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
1804cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
1805cfd74d65d832137e20e193c960802afba73b5d38sm
1806cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
1807cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(20.0f, 400.0f);
1808cfd74d65d832137e20e193c960802afba73b5d38sm
1809cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
1810cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
1811cfd74d65d832137e20e193c960802afba73b5d38sm
1812cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
1813cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
1814cfd74d65d832137e20e193c960802afba73b5d38sm
1815cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
1816cfd74d65d832137e20e193c960802afba73b5d38sm
1817cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
1818cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
1819cfd74d65d832137e20e193c960802afba73b5d38sm
1820cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
1821cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
1822cfd74d65d832137e20e193c960802afba73b5d38sm        }
1823cfd74d65d832137e20e193c960802afba73b5d38sm
1824cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
1825cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
1826cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
1827cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
1828cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
1829cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
1830cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
1831cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
1832cfd74d65d832137e20e193c960802afba73b5d38sm
1833cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.MUDMAN, object, sprite);
1834cfd74d65d832137e20e193c960802afba73b5d38sm
1835cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation attack = sprite.findAnimation(EnemyAnimations.ATTACK.ordinal());
1836cfd74d65d832137e20e193c960802afba73b5d38sm        if (attack != null) {
1837cfd74d65d832137e20e193c960802afba73b5d38sm            patrol.setupAttack(70.0f, attack.getLength(), 0.0f, true);
1838cfd74d65d832137e20e193c960802afba73b5d38sm        }
1839cfd74d65d832137e20e193c960802afba73b5d38sm
1840cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
1841cfd74d65d832137e20e193c960802afba73b5d38sm
1842cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
1843cfd74d65d832137e20e193c960802afba73b5d38sm    }
1844cfd74d65d832137e20e193c960802afba73b5d38sm
1845cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemySkeleton(float positionX, float positionY, boolean flipHorizontal) {
1846cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
1847cfd74d65d832137e20e193c960802afba73b5d38sm
1848cfd74d65d832137e20e193c960802afba73b5d38sm
1849cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
1850cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
1851cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
1852cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
1853cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
1854cfd74d65d832137e20e193c960802afba73b5d38sm
1855cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SKELETON);
1856cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
1857cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 7;
1858cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
1859cfd74d65d832137e20e193c960802afba73b5d38sm
1860cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
1861cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
1862cfd74d65d832137e20e193c960802afba73b5d38sm
1863cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent physics = allocateComponent(SimplePhysicsComponent.class);
1864cfd74d65d832137e20e193c960802afba73b5d38sm
1865cfd74d65d832137e20e193c960802afba73b5d38sm            SolidSurfaceComponent solidSurface = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class);
1866cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.inititalize(4);
1867cfd74d65d832137e20e193c960802afba73b5d38sm
1868cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Start = new Vector2(25, 0);
1869cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1End = new Vector2(25, 64);
1870cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Normal = new Vector2(-1, 0);
1871cfd74d65d832137e20e193c960802afba73b5d38sm
1872cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Start = new Vector2(40, 0);
1873cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2End = new Vector2(40, 64);
1874cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Normal = new Vector2(1, 0);
1875cfd74d65d832137e20e193c960802afba73b5d38sm
1876cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface1Start, surface1End, surface1Normal);
1877cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface2Start, surface2End, surface2Normal);
1878cfd74d65d832137e20e193c960802afba73b5d38sm
1879cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
1880cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
1881cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32));
1882cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.HIT);
1883cfd74d65d832137e20e193c960802afba73b5d38sm
1884cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
1885cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
1886cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 48, 32, HitType.HIT));
1887cfd74d65d832137e20e193c960802afba73b5d38sm
1888cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 1);
1889cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1890cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_stand),
1891cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
1892cfd74d65d832137e20e193c960802afba73b5d38sm
1893cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 6);
1894cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1895cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk01),
1896cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume));
1897cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1898cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk02),
1899cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, basicVulnerabilityVolume));
1900cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1901cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk03),
1902cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume));
1903cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1904cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk04),
1905cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume));
1906cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1907cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk05),
1908cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, basicVulnerabilityVolume));
1909cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1910cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk03),
1911cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume));
1912cfd74d65d832137e20e193c960802afba73b5d38sm
1913cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
1914cfd74d65d832137e20e193c960802afba73b5d38sm
1915cfd74d65d832137e20e193c960802afba73b5d38sm
1916cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 3);
1917cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1918cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_attack01),
1919cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 5), null, basicVulnerabilityVolume));
1920cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1921cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_attack03),
1922cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
1923cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1924cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_attack04),
1925cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
1926cfd74d65d832137e20e193c960802afba73b5d38sm
1927cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
1928cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
1929cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
1930cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(solidSurface);
1931cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
1932cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
1933cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
1934cfd74d65d832137e20e193c960802afba73b5d38sm
1935cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.SKELETON, staticData);
1936cfd74d65d832137e20e193c960802afba73b5d38sm        }
1937cfd74d65d832137e20e193c960802afba73b5d38sm
1938cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
1939cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
1940cfd74d65d832137e20e193c960802afba73b5d38sm
1941cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
1942cfd74d65d832137e20e193c960802afba73b5d38sm		bgcollision.setSize(32, 48);
1943cfd74d65d832137e20e193c960802afba73b5d38sm		bgcollision.setOffset(16, 5);
1944cfd74d65d832137e20e193c960802afba73b5d38sm
1945cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1946cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
1947cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
1948cfd74d65d832137e20e193c960802afba73b5d38sm
1949cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
1950cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
1951cfd74d65d832137e20e193c960802afba73b5d38sm
1952cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
1953cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(20.0f, 1000.0f);
1954cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setTurnToFacePlayer(true);
1955cfd74d65d832137e20e193c960802afba73b5d38sm
1956cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
1957cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
1958cfd74d65d832137e20e193c960802afba73b5d38sm
1959cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
1960cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
1961cfd74d65d832137e20e193c960802afba73b5d38sm
1962cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
1963cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setVulnerableToDeathTiles(true);
1964cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
1965cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
1966cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
1967cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
1968cfd74d65d832137e20e193c960802afba73b5d38sm        }
1969cfd74d65d832137e20e193c960802afba73b5d38sm
1970cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
1971cfd74d65d832137e20e193c960802afba73b5d38sm
1972cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
1973cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
1974cfd74d65d832137e20e193c960802afba73b5d38sm        }
1975cfd74d65d832137e20e193c960802afba73b5d38sm
1976cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
1977cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
1978cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
1979cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
1980cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
1981cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
1982cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
1983cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
1984cfd74d65d832137e20e193c960802afba73b5d38sm
1985cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.SKELETON, object, sprite);
1986cfd74d65d832137e20e193c960802afba73b5d38sm
1987cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation attack = sprite.findAnimation(EnemyAnimations.ATTACK.ordinal());
1988cfd74d65d832137e20e193c960802afba73b5d38sm        if (attack != null) {
1989cfd74d65d832137e20e193c960802afba73b5d38sm            patrol.setupAttack(75.0f, attack.getLength(), 2.0f, true);
1990cfd74d65d832137e20e193c960802afba73b5d38sm        }
1991cfd74d65d832137e20e193c960802afba73b5d38sm
1992cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
1993cfd74d65d832137e20e193c960802afba73b5d38sm
1994cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
1995cfd74d65d832137e20e193c960802afba73b5d38sm    }
1996cfd74d65d832137e20e193c960802afba73b5d38sm
1997cfd74d65d832137e20e193c960802afba73b5d38sm
1998cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyKaraguin(float positionX, float positionY, boolean flipHorizontal) {
1999cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2000cfd74d65d832137e20e193c960802afba73b5d38sm
2001cfd74d65d832137e20e193c960802afba73b5d38sm
2002cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2003cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2004cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
2005cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
2006cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
2007cfd74d65d832137e20e193c960802afba73b5d38sm
2008cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KARAGUIN);
2009cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2010cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
2011cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2012cfd74d65d832137e20e193c960802afba73b5d38sm
2013cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2014cfd74d65d832137e20e193c960802afba73b5d38sm
2015cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
2016cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2017cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(8, 16, 16));
2018cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.HIT);
2019cfd74d65d832137e20e193c960802afba73b5d38sm
2020cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
2021cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2022cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(8, 16, 16, HitType.HIT));
2023cfd74d65d832137e20e193c960802afba73b5d38sm
2024cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 3);
2025cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2026cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_karaguin01),
2027cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2028cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2029cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_karaguin02),
2030cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2031cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2032cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_karaguin03),
2033cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2034cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
2035cfd74d65d832137e20e193c960802afba73b5d38sm
2036cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2037cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2038cfd74d65d832137e20e193c960802afba73b5d38sm
2039cfd74d65d832137e20e193c960802afba73b5d38sm
2040cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.KARAGUIN, staticData);
2041cfd74d65d832137e20e193c960802afba73b5d38sm        }
2042cfd74d65d832137e20e193c960802afba73b5d38sm
2043cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2044cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
2045cfd74d65d832137e20e193c960802afba73b5d38sm
2046cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2047cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2048cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2049cfd74d65d832137e20e193c960802afba73b5d38sm
2050cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
2051cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(50.0f, 1000.0f);
2052cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setTurnToFacePlayer(false);
2053cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setFlying(true);
2054cfd74d65d832137e20e193c960802afba73b5d38sm
2055cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2056cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2057cfd74d65d832137e20e193c960802afba73b5d38sm
2058cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2059cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2060cfd74d65d832137e20e193c960802afba73b5d38sm
2061cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
2062cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
2063cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
2064cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
2065cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
2066cfd74d65d832137e20e193c960802afba73b5d38sm        }
2067cfd74d65d832137e20e193c960802afba73b5d38sm
2068cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
2069cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2070cfd74d65d832137e20e193c960802afba73b5d38sm
2071cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
2072cfd74d65d832137e20e193c960802afba73b5d38sm
2073cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2074cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2075cfd74d65d832137e20e193c960802afba73b5d38sm        }
2076cfd74d65d832137e20e193c960802afba73b5d38sm        // HACK.  These guys originally moved on their own, so let's keep them that way.
2077cfd74d65d832137e20e193c960802afba73b5d38sm        object.getVelocity().x = 50.0f * object.facingDirection.x;
2078cfd74d65d832137e20e193c960802afba73b5d38sm        object.getTargetVelocity().x = 50.0f * object.facingDirection.x;
2079cfd74d65d832137e20e193c960802afba73b5d38sm
2080cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2081cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2082cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2083cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
2084cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2085cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2086cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
2087cfd74d65d832137e20e193c960802afba73b5d38sm
2088cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.KARAGUIN, object, sprite);
2089cfd74d65d832137e20e193c960802afba73b5d38sm
2090cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
2091cfd74d65d832137e20e193c960802afba73b5d38sm
2092cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2093cfd74d65d832137e20e193c960802afba73b5d38sm    }
2094cfd74d65d832137e20e193c960802afba73b5d38sm
2095cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyPinkNamazu(float positionX, float positionY, boolean flipHorizontal) {
2096cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2097cfd74d65d832137e20e193c960802afba73b5d38sm
2098cfd74d65d832137e20e193c960802afba73b5d38sm
2099cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2100cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2101cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
2102cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 128;
2103cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
2104cfd74d65d832137e20e193c960802afba73b5d38sm
2105cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.PINK_NAMAZU);
2106cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2107cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 7;
2108cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2109cfd74d65d832137e20e193c960802afba73b5d38sm
2110cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
2111cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2112cfd74d65d832137e20e193c960802afba73b5d38sm
2113cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent physics = allocateComponent(SimplePhysicsComponent.class);
2114cfd74d65d832137e20e193c960802afba73b5d38sm
2115cfd74d65d832137e20e193c960802afba73b5d38sm            SolidSurfaceComponent solidSurface
2116cfd74d65d832137e20e193c960802afba73b5d38sm                = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class);
2117cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.inititalize(5);
2118cfd74d65d832137e20e193c960802afba73b5d38sm            // circle shape:
2119cfd74d65d832137e20e193c960802afba73b5d38sm            //  __        __3
2120cfd74d65d832137e20e193c960802afba73b5d38sm            // /  \      2/ \4
2121cfd74d65d832137e20e193c960802afba73b5d38sm            // |   |     1|  |5
2122cfd74d65d832137e20e193c960802afba73b5d38sm            /*
2123cfd74d65d832137e20e193c960802afba73b5d38sm                0:12,6:22,52:0.98058067569092,-0.19611613513818
2124cfd74d65d832137e20e193c960802afba73b5d38sm                0:22,52:50,75:-0.62580046626293,0.77998318983495
2125cfd74d65d832137e20e193c960802afba73b5d38sm                0:50,75:81,75:0,1
2126cfd74d65d832137e20e193c960802afba73b5d38sm                0:81,75:104,49:0.74038072228541,0.67218776102228
2127cfd74d65d832137e20e193c960802afba73b5d38sm                0:104,49:104,6:-0.99997086544204,-0.00763336538505
2128cfd74d65d832137e20e193c960802afba73b5d38sm             */
2129cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Start = new Vector2(12, 3);
2130cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1End = new Vector2(22, 52);
2131cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Normal = new Vector2(-0.98058067569092f, -0.19611613513818f);
2132cfd74d65d832137e20e193c960802afba73b5d38sm            surface1Normal.normalize();
2133cfd74d65d832137e20e193c960802afba73b5d38sm
2134cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Start = new Vector2(22, 52);
2135cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2End = new Vector2(50, 75);
2136cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Normal = new Vector2(-0.62580046626293f, 0.77998318983495f);
2137cfd74d65d832137e20e193c960802afba73b5d38sm            surface2Normal.normalize();
2138cfd74d65d832137e20e193c960802afba73b5d38sm
2139cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Start = new Vector2(50, 75);
2140cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3End = new Vector2(81, 75);
2141cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Normal = new Vector2(0, 1);
2142cfd74d65d832137e20e193c960802afba73b5d38sm
2143cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Start = new Vector2(81, 75);
2144cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4End = new Vector2(104,49);
2145cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Normal = new Vector2(0.74038072228541f, 0.67218776102228f);
2146cfd74d65d832137e20e193c960802afba73b5d38sm
2147cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface5Start = new Vector2(104,49);
2148cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface5End = new Vector2(104, 3);
2149cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface5Normal = new Vector2(1.0f, 0.0f);
2150cfd74d65d832137e20e193c960802afba73b5d38sm
2151cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface1Start, surface1End, surface1Normal);
2152cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface2Start, surface2End, surface2Normal);
2153cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface3Start, surface3End, surface3Normal);
2154cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface4Start, surface4End, surface4Normal);
2155cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface5Start, surface5End, surface5Normal);
2156cfd74d65d832137e20e193c960802afba73b5d38sm
2157cfd74d65d832137e20e193c960802afba73b5d38sm
2158cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(GenericAnimationComponent.Animation.IDLE, 4);
2159cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2160cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_stand),
2161cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 8), null, null));
2162cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame idle1 = new AnimationFrame(
2163cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_sleep01),
2164cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, null);
2165cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame idle2 = new AnimationFrame(
2166cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_sleep02),
2167cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 8), null, null);
2168cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle1);
2169cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle2);
2170cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle1);
2171cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
2172cfd74d65d832137e20e193c960802afba73b5d38sm
2173cfd74d65d832137e20e193c960802afba73b5d38sm
2174cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation wake = new SpriteAnimation(GenericAnimationComponent.Animation.MOVE, 4);
2175cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame wake1 = new AnimationFrame(
2176cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_eyeopen),
2177cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, null);
2178cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame wake2 = new AnimationFrame(
2179cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_stand),
2180cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, null);
2181cfd74d65d832137e20e193c960802afba73b5d38sm            wake.addFrame(wake1);
2182cfd74d65d832137e20e193c960802afba73b5d38sm            wake.addFrame(wake2);
2183cfd74d65d832137e20e193c960802afba73b5d38sm            wake.addFrame(wake1);
2184cfd74d65d832137e20e193c960802afba73b5d38sm            wake.addFrame(wake2);
2185cfd74d65d832137e20e193c960802afba73b5d38sm
2186cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> crushAttackVolume =
2187cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2188cfd74d65d832137e20e193c960802afba73b5d38sm            crushAttackVolume.add(new AABoxCollisionVolume(32, 0, 64, 32, HitType.HIT));
2189cfd74d65d832137e20e193c960802afba73b5d38sm
2190cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(GenericAnimationComponent.Animation.ATTACK, 1);
2191cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2192cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_jump),
2193cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), crushAttackVolume, null));
2194cfd74d65d832137e20e193c960802afba73b5d38sm
2195cfd74d65d832137e20e193c960802afba73b5d38sm
2196cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
2197cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2198cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
2199cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(solidSurface);
2200cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2201cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(wake);
2202cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
2203cfd74d65d832137e20e193c960802afba73b5d38sm
2204cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.PINK_NAMAZU, staticData);
2205cfd74d65d832137e20e193c960802afba73b5d38sm        }
2206cfd74d65d832137e20e193c960802afba73b5d38sm
2207cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2208cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
2209cfd74d65d832137e20e193c960802afba73b5d38sm
2210cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
2211cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(100, 75);
2212cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(12, 5);
2213cfd74d65d832137e20e193c960802afba73b5d38sm
2214cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2215cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2216cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2217cfd74d65d832137e20e193c960802afba73b5d38sm
2218cfd74d65d832137e20e193c960802afba73b5d38sm        GenericAnimationComponent animation =
2219cfd74d65d832137e20e193c960802afba73b5d38sm            (GenericAnimationComponent)allocateComponent(GenericAnimationComponent.class);
2220cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2221cfd74d65d832137e20e193c960802afba73b5d38sm
2222cfd74d65d832137e20e193c960802afba73b5d38sm        SleeperComponent sleeper = (SleeperComponent)allocateComponent(SleeperComponent.class);
2223cfd74d65d832137e20e193c960802afba73b5d38sm        sleeper.setAttackImpulse(100.0f, 170.0f);
2224cfd74d65d832137e20e193c960802afba73b5d38sm        sleeper.setSlam(0.3f, 25.0f);
2225cfd74d65d832137e20e193c960802afba73b5d38sm
2226cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2227cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2228cfd74d65d832137e20e193c960802afba73b5d38sm
2229cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2230cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2231cfd74d65d832137e20e193c960802afba73b5d38sm
2232cfd74d65d832137e20e193c960802afba73b5d38sm
2233cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
2234cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
2235cfd74d65d832137e20e193c960802afba73b5d38sm
2236cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2237cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2238cfd74d65d832137e20e193c960802afba73b5d38sm        }
2239cfd74d65d832137e20e193c960802afba73b5d38sm
2240cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2241cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2242cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
2243cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2244cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2245cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2246cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sleeper);
2247cfd74d65d832137e20e193c960802afba73b5d38sm
2248cfd74d65d832137e20e193c960802afba73b5d38sm
2249cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.PINK_NAMAZU, object, sprite);
2250cfd74d65d832137e20e193c960802afba73b5d38sm
2251cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation wakeUp = sprite.findAnimation(GenericAnimationComponent.Animation.MOVE);
2252cfd74d65d832137e20e193c960802afba73b5d38sm        if (wakeUp != null) {
2253cfd74d65d832137e20e193c960802afba73b5d38sm            sleeper.setWakeUpDuration(wakeUp.getLength() + 1.0f);
2254cfd74d65d832137e20e193c960802afba73b5d38sm        }
2255cfd74d65d832137e20e193c960802afba73b5d38sm
2256cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(GenericAnimationComponent.Animation.IDLE);
2257cfd74d65d832137e20e193c960802afba73b5d38sm
2258cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2259cfd74d65d832137e20e193c960802afba73b5d38sm    }
2260cfd74d65d832137e20e193c960802afba73b5d38sm
2261cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyBat(float positionX, float positionY, boolean flipHorizontal) {
2262cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2263cfd74d65d832137e20e193c960802afba73b5d38sm
2264cfd74d65d832137e20e193c960802afba73b5d38sm
2265cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2266cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2267cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
2268cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
2269cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
2270cfd74d65d832137e20e193c960802afba73b5d38sm
2271cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BAT);
2272cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2273cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
2274cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2275cfd74d65d832137e20e193c960802afba73b5d38sm
2276cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2277cfd74d65d832137e20e193c960802afba73b5d38sm
2278cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
2279cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2280cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 16));
2281cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.HIT);
2282cfd74d65d832137e20e193c960802afba73b5d38sm
2283cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
2284cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2285cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 32, 16, HitType.HIT));
2286cfd74d65d832137e20e193c960802afba73b5d38sm
2287cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 4);
2288cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2289cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_bat01),
2290cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2291cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2292cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_bat02),
2293cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2294cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2295cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_bat03),
2296cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2297cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2298cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_bat04),
2299cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2300cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
2301cfd74d65d832137e20e193c960802afba73b5d38sm
2302cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2303cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2304cfd74d65d832137e20e193c960802afba73b5d38sm
2305cfd74d65d832137e20e193c960802afba73b5d38sm
2306cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.BAT, staticData);
2307cfd74d65d832137e20e193c960802afba73b5d38sm        }
2308cfd74d65d832137e20e193c960802afba73b5d38sm
2309cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2310cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
2311cfd74d65d832137e20e193c960802afba73b5d38sm
2312cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2313cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2314cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2315cfd74d65d832137e20e193c960802afba73b5d38sm
2316cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
2317cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(75.0f, 1000.0f);
2318cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setTurnToFacePlayer(false);
2319cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setFlying(true);
2320cfd74d65d832137e20e193c960802afba73b5d38sm
2321cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2322cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2323cfd74d65d832137e20e193c960802afba73b5d38sm
2324cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2325cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2326cfd74d65d832137e20e193c960802afba73b5d38sm
2327cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
2328cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
2329cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
2330cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
2331cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
2332cfd74d65d832137e20e193c960802afba73b5d38sm        }
2333cfd74d65d832137e20e193c960802afba73b5d38sm
2334cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
2335cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2336cfd74d65d832137e20e193c960802afba73b5d38sm
2337cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
2338cfd74d65d832137e20e193c960802afba73b5d38sm
2339cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2340cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2341cfd74d65d832137e20e193c960802afba73b5d38sm        }
2342cfd74d65d832137e20e193c960802afba73b5d38sm
2343cfd74d65d832137e20e193c960802afba73b5d38sm        // HACK.  These guys originally moved on their own, so let's keep them that way.
2344cfd74d65d832137e20e193c960802afba73b5d38sm        object.getVelocity().x = 75.0f * object.facingDirection.x;
2345cfd74d65d832137e20e193c960802afba73b5d38sm        object.getTargetVelocity().x = 75.0f * object.facingDirection.x;
2346cfd74d65d832137e20e193c960802afba73b5d38sm
2347cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2348cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2349cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2350cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
2351cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2352cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2353cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
2354cfd74d65d832137e20e193c960802afba73b5d38sm
2355cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.BAT, object, sprite);
2356cfd74d65d832137e20e193c960802afba73b5d38sm
2357cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
2358cfd74d65d832137e20e193c960802afba73b5d38sm
2359cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2360cfd74d65d832137e20e193c960802afba73b5d38sm    }
2361cfd74d65d832137e20e193c960802afba73b5d38sm
2362cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemySting(float positionX, float positionY, boolean flipHorizontal) {
2363cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2364cfd74d65d832137e20e193c960802afba73b5d38sm
2365cfd74d65d832137e20e193c960802afba73b5d38sm
2366cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2367cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2368cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
2369cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
2370cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
2371cfd74d65d832137e20e193c960802afba73b5d38sm
2372cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.STING);
2373cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2374cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
2375cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2376cfd74d65d832137e20e193c960802afba73b5d38sm
2377cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2378cfd74d65d832137e20e193c960802afba73b5d38sm
2379cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
2380cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2381cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 16));
2382cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.HIT);
2383cfd74d65d832137e20e193c960802afba73b5d38sm
2384cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
2385cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2386cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 32, 16, HitType.HIT));
2387cfd74d65d832137e20e193c960802afba73b5d38sm
2388cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 3);
2389cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2390cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_sting01),
2391cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2392cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2393cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_sting02),
2394cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2395cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2396cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_sting03),
2397cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2398cfd74d65d832137e20e193c960802afba73b5d38sm
2399cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
2400cfd74d65d832137e20e193c960802afba73b5d38sm
2401cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2402cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2403cfd74d65d832137e20e193c960802afba73b5d38sm
2404cfd74d65d832137e20e193c960802afba73b5d38sm
2405cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.STING, staticData);
2406cfd74d65d832137e20e193c960802afba73b5d38sm        }
2407cfd74d65d832137e20e193c960802afba73b5d38sm
2408cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2409cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
2410cfd74d65d832137e20e193c960802afba73b5d38sm
2411cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2412cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2413cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2414cfd74d65d832137e20e193c960802afba73b5d38sm
2415cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
2416cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(75.0f, 1000.0f);
2417cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setTurnToFacePlayer(false);
2418cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setFlying(true);
2419cfd74d65d832137e20e193c960802afba73b5d38sm
2420cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2421cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2422cfd74d65d832137e20e193c960802afba73b5d38sm
2423cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2424cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2425cfd74d65d832137e20e193c960802afba73b5d38sm
2426cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
2427cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
2428cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
2429cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
2430cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
2431cfd74d65d832137e20e193c960802afba73b5d38sm        }
2432cfd74d65d832137e20e193c960802afba73b5d38sm
2433cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
2434cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2435cfd74d65d832137e20e193c960802afba73b5d38sm
2436cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
2437cfd74d65d832137e20e193c960802afba73b5d38sm
2438cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2439cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2440cfd74d65d832137e20e193c960802afba73b5d38sm        }
2441cfd74d65d832137e20e193c960802afba73b5d38sm
2442cfd74d65d832137e20e193c960802afba73b5d38sm        // HACK.  These guys originally moved on their own, so let's keep them that way.
2443cfd74d65d832137e20e193c960802afba73b5d38sm        object.getVelocity().x = 25.0f * object.facingDirection.x;
2444cfd74d65d832137e20e193c960802afba73b5d38sm        object.getTargetVelocity().x = 25.0f * object.facingDirection.x;
2445cfd74d65d832137e20e193c960802afba73b5d38sm
2446cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2447cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2448cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2449cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
2450cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2451cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2452cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
2453cfd74d65d832137e20e193c960802afba73b5d38sm
2454cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.STING, object, sprite);
2455cfd74d65d832137e20e193c960802afba73b5d38sm
2456cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
2457cfd74d65d832137e20e193c960802afba73b5d38sm
2458cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2459cfd74d65d832137e20e193c960802afba73b5d38sm    }
2460cfd74d65d832137e20e193c960802afba73b5d38sm
2461cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyOnion(float positionX, float positionY, boolean flipHorizontal) {
2462cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2463cfd74d65d832137e20e193c960802afba73b5d38sm
2464cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2465cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2466cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
2467cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
2468cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
2469cfd74d65d832137e20e193c960802afba73b5d38sm
2470cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ONION);
2471cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2472cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 5;
2473cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2474cfd74d65d832137e20e193c960802afba73b5d38sm
2475cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
2476cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2477cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
2478cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.2f);
2479cfd74d65d832137e20e193c960802afba73b5d38sm
2480cfd74d65d832137e20e193c960802afba73b5d38sm
2481cfd74d65d832137e20e193c960802afba73b5d38sm            // Animations
2482cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
2483cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2484cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32));
2485cfd74d65d832137e20e193c960802afba73b5d38sm
2486cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
2487cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2488cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 32, 32, HitType.HIT));
2489cfd74d65d832137e20e193c960802afba73b5d38sm
2490cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 1);
2491cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2492cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_onion01),
2493cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));
2494cfd74d65d832137e20e193c960802afba73b5d38sm
2495cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
2496cfd74d65d832137e20e193c960802afba73b5d38sm
2497cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 3);
2498cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
2499cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_onion01),
2500cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2501cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
2502cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_onion02),
2503cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2504cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
2505cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_onion03),
2506cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2507cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
2508cfd74d65d832137e20e193c960802afba73b5d38sm
2509cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
2510cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2511cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
2512cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2513cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
2514cfd74d65d832137e20e193c960802afba73b5d38sm
2515cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.ONION, staticData);
2516cfd74d65d832137e20e193c960802afba73b5d38sm
2517cfd74d65d832137e20e193c960802afba73b5d38sm        }
2518cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2519cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
2520cfd74d65d832137e20e193c960802afba73b5d38sm
2521cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision
2522cfd74d65d832137e20e193c960802afba73b5d38sm            = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
2523cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 48);
2524cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(16, 5);
2525cfd74d65d832137e20e193c960802afba73b5d38sm
2526cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2527cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2528cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2529cfd74d65d832137e20e193c960802afba73b5d38sm
2530cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation
2531cfd74d65d832137e20e193c960802afba73b5d38sm            = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
2532cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2533cfd74d65d832137e20e193c960802afba73b5d38sm
2534cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
2535cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(50.0f, 1000.0f);
2536cfd74d65d832137e20e193c960802afba73b5d38sm
2537cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
2538cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2539cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2540cfd74d65d832137e20e193c960802afba73b5d38sm
2541cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
2542cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2543cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2544cfd74d65d832137e20e193c960802afba73b5d38sm
2545cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
2546cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setVulnerableToDeathTiles(true);
2547cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
2548cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
2549cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
2550cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
2551cfd74d65d832137e20e193c960802afba73b5d38sm        }
2552cfd74d65d832137e20e193c960802afba73b5d38sm
2553cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2554cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2555cfd74d65d832137e20e193c960802afba73b5d38sm
2556cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
2557cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2558cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
2559cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2560cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2561cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
2562cfd74d65d832137e20e193c960802afba73b5d38sm
2563cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
2564cfd74d65d832137e20e193c960802afba73b5d38sm
2565cfd74d65d832137e20e193c960802afba73b5d38sm
2566cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2567cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2568cfd74d65d832137e20e193c960802afba73b5d38sm        }
2569cfd74d65d832137e20e193c960802afba73b5d38sm
2570cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.ONION, object, sprite);
2571cfd74d65d832137e20e193c960802afba73b5d38sm
2572cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
2573cfd74d65d832137e20e193c960802afba73b5d38sm
2574cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2575cfd74d65d832137e20e193c960802afba73b5d38sm    }
2576cfd74d65d832137e20e193c960802afba73b5d38sm
2577cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyWanda(float positionX, float positionY, boolean flipHorizontal) {
2578cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2579cfd74d65d832137e20e193c960802afba73b5d38sm
2580cfd74d65d832137e20e193c960802afba73b5d38sm
2581cfd74d65d832137e20e193c960802afba73b5d38sm        // Make sure related textures are loaded.
2582cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball01);
2583cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball02);
2584cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball03);
2585cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball04);
2586cfd74d65d832137e20e193c960802afba73b5d38sm
2587cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2588cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2589cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
2590cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
2591cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
2592cfd74d65d832137e20e193c960802afba73b5d38sm
2593cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.WANDA);
2594cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2595cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 9;
2596cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2597cfd74d65d832137e20e193c960802afba73b5d38sm
2598cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
2599cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2600cfd74d65d832137e20e193c960802afba73b5d38sm
2601cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
2602cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.0f);
2603cfd74d65d832137e20e193c960802afba73b5d38sm
2604cfd74d65d832137e20e193c960802afba73b5d38sm
2605cfd74d65d832137e20e193c960802afba73b5d38sm
2606cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
2607cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2608cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(20, 5, 26, 80, HitType.COLLECT));
2609cfd74d65d832137e20e193c960802afba73b5d38sm
2610cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1);
2611cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2612cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_stand),
2613cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2614cfd74d65d832137e20e193c960802afba73b5d38sm
2615cfd74d65d832137e20e193c960802afba73b5d38sm
2616cfd74d65d832137e20e193c960802afba73b5d38sm
2617cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame1 = new AnimationFrame(
2618cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk01),
2619cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2620cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame2 = new AnimationFrame(
2621cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk02),
2622cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2623cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame3 = new AnimationFrame(
2624cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk03),
2625cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2626cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame4 = new AnimationFrame(
2627cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk04),
2628cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2629cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame5 = new AnimationFrame(
2630cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk05),
2631cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2632cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(NPCAnimationComponent.WALK, 8);
2633cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame1);
2634cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame2);
2635cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame3);
2636cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame4);
2637cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame5);
2638cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame4);
2639cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame3);
2640cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame2);
2641cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
2642cfd74d65d832137e20e193c960802afba73b5d38sm
2643cfd74d65d832137e20e193c960802afba73b5d38sm
2644cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame runFrame4 = new AnimationFrame(
2645cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run04),
2646cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
2647cfd74d65d832137e20e193c960802afba73b5d38sm
2648cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation run = new SpriteAnimation(NPCAnimationComponent.RUN, 9);
2649cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2650cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run01),
2651cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2652cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2653cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run02),
2654cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2655cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2656cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run03),
2657cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2658cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(runFrame4);
2659cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2660cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run05),
2661cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2662cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2663cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run06),
2664cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2665cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2666cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run07),
2667cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2668cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(runFrame4);
2669cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2670cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run08),
2671cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2672cfd74d65d832137e20e193c960802afba73b5d38sm            run.setLoop(true);
2673cfd74d65d832137e20e193c960802afba73b5d38sm
2674cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation jumpStart = new SpriteAnimation(NPCAnimationComponent.JUMP_START, 4);
2675cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame jump1 = new AnimationFrame(
2676cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_jump01),
2677cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
2678cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame jump2 = new AnimationFrame(
2679cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_jump01),
2680cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
2681cfd74d65d832137e20e193c960802afba73b5d38sm            jumpStart.addFrame(new AnimationFrame(
2682cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run04),
2683cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
2684cfd74d65d832137e20e193c960802afba73b5d38sm            jumpStart.addFrame(new AnimationFrame(
2685cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_crouch),
2686cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2687cfd74d65d832137e20e193c960802afba73b5d38sm            jumpStart.addFrame(jump1);
2688cfd74d65d832137e20e193c960802afba73b5d38sm            jumpStart.addFrame(jump2);
2689cfd74d65d832137e20e193c960802afba73b5d38sm
2690cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation jumpAir = new SpriteAnimation(NPCAnimationComponent.JUMP_AIR, 2);
2691cfd74d65d832137e20e193c960802afba73b5d38sm            jumpAir.addFrame(jump1);
2692cfd74d65d832137e20e193c960802afba73b5d38sm            jumpAir.addFrame(jump2);
2693cfd74d65d832137e20e193c960802afba73b5d38sm            jumpAir.setLoop(true);
2694cfd74d65d832137e20e193c960802afba73b5d38sm
2695cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(NPCAnimationComponent.SHOOT, 11);
2696cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2697cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot01),
2698cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
2699cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2700cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot02),
2701cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 8), null, basicVulnerabilityVolume));
2702cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2703cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot03),
2704cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2705cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2706cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot04),
2707cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2708cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2709cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot05),
2710cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2711cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2712cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot06),
2713cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2714cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2715cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot07),
2716cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2717cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2718cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot08),
2719cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2720cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2721cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot09),
2722cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
2723cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2724cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot02),
2725cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume));
2726cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2727cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot01),
2728cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume));
2729cfd74d65d832137e20e193c960802afba73b5d38sm
2730cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
2731cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2732cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
2733cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2734cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
2735cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(run);
2736cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(jumpStart);
2737cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(jumpAir);
2738cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
2739cfd74d65d832137e20e193c960802afba73b5d38sm
2740cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.WANDA, staticData);
2741cfd74d65d832137e20e193c960802afba73b5d38sm        }
2742cfd74d65d832137e20e193c960802afba73b5d38sm
2743cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2744cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.NPC);
2745cfd74d65d832137e20e193c960802afba73b5d38sm
2746cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
2747cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 82);
2748cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(20, 5);
2749cfd74d65d832137e20e193c960802afba73b5d38sm
2750cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2751cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2752cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2753cfd74d65d832137e20e193c960802afba73b5d38sm
2754cfd74d65d832137e20e193c960802afba73b5d38sm        NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class);
2755cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2756cfd74d65d832137e20e193c960802afba73b5d38sm
2757cfd74d65d832137e20e193c960802afba73b5d38sm        NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class);
2758cfd74d65d832137e20e193c960802afba73b5d38sm
2759cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2760cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2761cfd74d65d832137e20e193c960802afba73b5d38sm
2762cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2763cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2764cfd74d65d832137e20e193c960802afba73b5d38sm
2765cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setHitReactionComponent(hitReact);
2766cfd74d65d832137e20e193c960802afba73b5d38sm
2767cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = sSystemRegistry.soundSystem;
2768cfd74d65d832137e20e193c960802afba73b5d38sm
2769cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent gun
2770cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
2771cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShotsPerSet(1);
2772cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setSetsPerActivation(1);
2773cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setDelayBeforeFirstSet(Utils.framesToTime(24, 11));
2774cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setObjectTypeToSpawn(GameObjectType.WANDA_SHOT);
2775cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetX(45);
2776cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetY(42);
2777cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setRequiredAction(GameObject.ActionType.ATTACK);
2778cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityX(300.0f);
2779cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShootSound(sound.load(R.raw.sound_poing));
2780cfd74d65d832137e20e193c960802afba73b5d38sm
2781cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
2782cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
2783cfd74d65d832137e20e193c960802afba73b5d38sm
2784cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2785cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2786cfd74d65d832137e20e193c960802afba73b5d38sm        }
2787cfd74d65d832137e20e193c960802afba73b5d38sm
2788cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun);
2789cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2790cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2791cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
2792cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2793cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
2794cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2795cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2796cfd74d65d832137e20e193c960802afba73b5d38sm
2797cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.WANDA, object, sprite);
2798cfd74d65d832137e20e193c960802afba73b5d38sm
2799cfd74d65d832137e20e193c960802afba73b5d38sm
2800cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
2801cfd74d65d832137e20e193c960802afba73b5d38sm
2802cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2803cfd74d65d832137e20e193c960802afba73b5d38sm    }
2804cfd74d65d832137e20e193c960802afba73b5d38sm
2805cfd74d65d832137e20e193c960802afba73b5d38sm
2806cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyKyle(float positionX, float positionY, boolean flipHorizontal) {
2807cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2808cfd74d65d832137e20e193c960802afba73b5d38sm
2809cfd74d65d832137e20e193c960802afba73b5d38sm
2810cfd74d65d832137e20e193c960802afba73b5d38sm
2811cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2812cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2813cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
2814cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
2815cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
2816cfd74d65d832137e20e193c960802afba73b5d38sm
2817cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KYLE);
2818cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2819cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 9;
2820cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2821cfd74d65d832137e20e193c960802afba73b5d38sm
2822cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
2823cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2824cfd74d65d832137e20e193c960802afba73b5d38sm
2825cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
2826cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.0f);
2827cfd74d65d832137e20e193c960802afba73b5d38sm
2828cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
2829cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2830cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(20, 5, 26, 80, HitType.COLLECT));
2831cfd74d65d832137e20e193c960802afba73b5d38sm
2832cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1);
2833cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2834cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_stand),
2835cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2836cfd74d65d832137e20e193c960802afba73b5d38sm
2837cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame1 = new AnimationFrame(
2838cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk01),
2839cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2840cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame2 = new AnimationFrame(
2841cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk02),
2842cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2843cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame3 = new AnimationFrame(
2844cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk03),
2845cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2846cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame4 = new AnimationFrame(
2847cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk04),
2848cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2849cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame5 = new AnimationFrame(
2850cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk05),
2851cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2852cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame6 = new AnimationFrame(
2853cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk06),
2854cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2855cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame7 = new AnimationFrame(
2856cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk07),
2857cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2858cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(NPCAnimationComponent.WALK, 12);
2859cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame1);
2860cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame2);
2861cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame3);
2862cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame4);
2863cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame3);
2864cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame2);
2865cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame1);
2866cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame5);
2867cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame6);
2868cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame7);
2869cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame6);
2870cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame5);
2871cfd74d65d832137e20e193c960802afba73b5d38sm
2872cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
2873cfd74d65d832137e20e193c960802afba73b5d38sm
2874cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame crouch1 = new AnimationFrame(
2875cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_crouch01),
2876cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
2877cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame crouch2 = new AnimationFrame(
2878cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_crouch02),
2879cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
2880cfd74d65d832137e20e193c960802afba73b5d38sm
2881cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation runStart = new SpriteAnimation(NPCAnimationComponent.RUN_START, 2);
2882cfd74d65d832137e20e193c960802afba73b5d38sm            runStart.addFrame(crouch1);
2883cfd74d65d832137e20e193c960802afba73b5d38sm            runStart.addFrame(crouch2);
2884cfd74d65d832137e20e193c960802afba73b5d38sm
2885cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> attackVolume =
2886cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(2);
2887cfd74d65d832137e20e193c960802afba73b5d38sm            attackVolume.add(new AABoxCollisionVolume(32, 32, 50, 32, HitType.HIT));
2888cfd74d65d832137e20e193c960802afba73b5d38sm            attackVolume.add(new AABoxCollisionVolume(32, 32, 50, 32, HitType.COLLECT));
2889cfd74d65d832137e20e193c960802afba73b5d38sm
2890cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation run = new SpriteAnimation(NPCAnimationComponent.RUN, 2);
2891cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2892cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_dash01),
2893cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), attackVolume, basicVulnerabilityVolume));
2894cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2895cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_dash02),
2896cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), attackVolume, basicVulnerabilityVolume));
2897cfd74d65d832137e20e193c960802afba73b5d38sm            run.setLoop(true);
2898cfd74d65d832137e20e193c960802afba73b5d38sm
2899cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation jumpStart = new SpriteAnimation(NPCAnimationComponent.JUMP_START, 2);
2900cfd74d65d832137e20e193c960802afba73b5d38sm            jumpStart.addFrame(crouch1);
2901cfd74d65d832137e20e193c960802afba73b5d38sm            jumpStart.addFrame(crouch2);
2902cfd74d65d832137e20e193c960802afba73b5d38sm
2903cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation jumpAir = new SpriteAnimation(NPCAnimationComponent.JUMP_AIR, 2);
2904cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame jump1 = new AnimationFrame(
2905cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_jump01),
2906cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
2907cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame jump2 = new AnimationFrame(
2908cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_jump01),
2909cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
2910cfd74d65d832137e20e193c960802afba73b5d38sm            jumpAir.addFrame(jump1);
2911cfd74d65d832137e20e193c960802afba73b5d38sm            jumpAir.addFrame(jump2);
2912cfd74d65d832137e20e193c960802afba73b5d38sm            jumpAir.setLoop(true);
2913cfd74d65d832137e20e193c960802afba73b5d38sm
2914cfd74d65d832137e20e193c960802afba73b5d38sm
2915cfd74d65d832137e20e193c960802afba73b5d38sm
2916cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
2917cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2918cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
2919cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2920cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
2921cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(runStart);
2922cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(run);
2923cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(jumpStart);
2924cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(jumpAir);
2925cfd74d65d832137e20e193c960802afba73b5d38sm
2926cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.KYLE, staticData);
2927cfd74d65d832137e20e193c960802afba73b5d38sm        }
2928cfd74d65d832137e20e193c960802afba73b5d38sm
2929cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2930cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.NPC);
2931cfd74d65d832137e20e193c960802afba73b5d38sm
2932cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
2933cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 90);
2934cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(20, 5);
2935cfd74d65d832137e20e193c960802afba73b5d38sm
2936cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2937cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2938cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2939cfd74d65d832137e20e193c960802afba73b5d38sm
2940cfd74d65d832137e20e193c960802afba73b5d38sm        NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class);
2941cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2942cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setStopAtWalls(false); // Kyle can run through walls
2943cfd74d65d832137e20e193c960802afba73b5d38sm
2944cfd74d65d832137e20e193c960802afba73b5d38sm        NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class);
2945cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setSpeeds(350.0f, 50.0f, 400.0f, -10.0f, 400.0f);
2946cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setGameEvent(GameFlowEvent.EVENT_SHOW_ANIMATION, AnimationPlayerActivity.KYLE_DEATH, false);
2947cfd74d65d832137e20e193c960802afba73b5d38sm
2948cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2949cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2950cfd74d65d832137e20e193c960802afba73b5d38sm
2951cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2952cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2953cfd74d65d832137e20e193c960802afba73b5d38sm
2954cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setHitReactionComponent(hitReact);
2955cfd74d65d832137e20e193c960802afba73b5d38sm
2956cfd74d65d832137e20e193c960802afba73b5d38sm        MotionBlurComponent motionBlur = (MotionBlurComponent)allocateComponent(MotionBlurComponent.class);
2957cfd74d65d832137e20e193c960802afba73b5d38sm        motionBlur.setTarget(render);
2958cfd74d65d832137e20e193c960802afba73b5d38sm
2959cfd74d65d832137e20e193c960802afba73b5d38sm        LauncherComponent launcher = (LauncherComponent)allocateComponent(LauncherComponent.class);
2960cfd74d65d832137e20e193c960802afba73b5d38sm        launcher.setup((float)(Math.PI * 0.45f), 1000.0f, 0.0f, 0.0f, false);
2961cfd74d65d832137e20e193c960802afba73b5d38sm        launcher.setLaunchEffect(GameObjectType.FLASH, 70.0f, 50.0f);
2962cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setLauncherComponent(launcher, HitType.HIT);
2963cfd74d65d832137e20e193c960802afba73b5d38sm
2964cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.NONE;
2965cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
2966cfd74d65d832137e20e193c960802afba73b5d38sm
2967cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2968cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2969cfd74d65d832137e20e193c960802afba73b5d38sm        }
2970cfd74d65d832137e20e193c960802afba73b5d38sm
2971cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2972cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2973cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
2974cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2975cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
2976cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2977cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2978cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(motionBlur);
2979cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(launcher);
2980cfd74d65d832137e20e193c960802afba73b5d38sm
2981cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.KYLE, object, sprite);
2982cfd74d65d832137e20e193c960802afba73b5d38sm
2983cfd74d65d832137e20e193c960802afba73b5d38sm
2984cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
2985cfd74d65d832137e20e193c960802afba73b5d38sm
2986cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2987cfd74d65d832137e20e193c960802afba73b5d38sm    }
2988cfd74d65d832137e20e193c960802afba73b5d38sm
2989cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyKyleDead(float positionX, float positionY) {
2990cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2991cfd74d65d832137e20e193c960802afba73b5d38sm
2992cfd74d65d832137e20e193c960802afba73b5d38sm
2993cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2994cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2995cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
2996cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 128;
2997cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
2998cfd74d65d832137e20e193c960802afba73b5d38sm
2999cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KYLE_DEAD);
3000cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3001cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
3002cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3003cfd74d65d832137e20e193c960802afba73b5d38sm
3004cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
3005cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
3006cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(32, 5, 64, 32, HitType.COLLECT));
3007cfd74d65d832137e20e193c960802afba73b5d38sm
3008cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 1);
3009cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.enemy_kyle_dead),
3010cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3011cfd74d65d832137e20e193c960802afba73b5d38sm
3012cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
3013cfd74d65d832137e20e193c960802afba73b5d38sm
3014cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
3015cfd74d65d832137e20e193c960802afba73b5d38sm
3016cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3017cfd74d65d832137e20e193c960802afba73b5d38sm
3018cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.KYLE_DEAD, staticData);
3019cfd74d65d832137e20e193c960802afba73b5d38sm        }
3020cfd74d65d832137e20e193c960802afba73b5d38sm
3021cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3022cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
3023cfd74d65d832137e20e193c960802afba73b5d38sm
3024cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3025cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3026cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3027cfd74d65d832137e20e193c960802afba73b5d38sm
3028cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3029cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
3030cfd74d65d832137e20e193c960802afba73b5d38sm
3031cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3032cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
3033cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setSpawnGameEventOnHit(HitType.COLLECT, GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER2, 0);
3034cfd74d65d832137e20e193c960802afba73b5d38sm
3035cfd74d65d832137e20e193c960802afba73b5d38sm        SelectDialogComponent dialogSelect = (SelectDialogComponent)allocateComponent(SelectDialogComponent.class);
3036cfd74d65d832137e20e193c960802afba73b5d38sm        dialogSelect.setHitReact(hitReact);
3037cfd74d65d832137e20e193c960802afba73b5d38sm
3038cfd74d65d832137e20e193c960802afba73b5d38sm        // Since this object doesn't have gravity or background collision, adjust down to simulate the position
3039cfd74d65d832137e20e193c960802afba73b5d38sm        // at which a bounding volume would rest.
3040cfd74d65d832137e20e193c960802afba73b5d38sm
3041cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().y -= 5.0f;
3042cfd74d65d832137e20e193c960802afba73b5d38sm
3043cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dialogSelect);
3044cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3045cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3046cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
3047cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3048cfd74d65d832137e20e193c960802afba73b5d38sm
3049cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.KYLE_DEAD, object, sprite);
3050cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3051cfd74d65d832137e20e193c960802afba73b5d38sm
3052cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3053cfd74d65d832137e20e193c960802afba73b5d38sm    }
3054cfd74d65d832137e20e193c960802afba73b5d38sm
3055cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyAndouDead(float positionX, float positionY) {
3056cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3057cfd74d65d832137e20e193c960802afba73b5d38sm
3058cfd74d65d832137e20e193c960802afba73b5d38sm
3059cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3060cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3061cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
3062cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
3063cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
3064cfd74d65d832137e20e193c960802afba73b5d38sm
3065cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ANDOU_DEAD);
3066cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3067cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
3068cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3069cfd74d65d832137e20e193c960802afba73b5d38sm
3070cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 1);
3071cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode12),
3072cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
3073cfd74d65d832137e20e193c960802afba73b5d38sm
3074cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
3075cfd74d65d832137e20e193c960802afba73b5d38sm
3076cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
3077cfd74d65d832137e20e193c960802afba73b5d38sm
3078cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3079cfd74d65d832137e20e193c960802afba73b5d38sm
3080cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.ANDOU_DEAD, staticData);
3081cfd74d65d832137e20e193c960802afba73b5d38sm        }
3082cfd74d65d832137e20e193c960802afba73b5d38sm
3083cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3084cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
3085cfd74d65d832137e20e193c960802afba73b5d38sm
3086cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3087cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3088cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3089cfd74d65d832137e20e193c960802afba73b5d38sm
3090cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent smokeGun
3091cfd74d65d832137e20e193c960802afba73b5d38sm	        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
3092cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setDelayBetweenShots(0.25f);
3093cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setObjectTypeToSpawn(GameObjectType.SMOKE_BIG);
3094cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setOffsetX(32);
3095cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setOffsetY(15);
3096cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setVelocityX(-150.0f);
3097cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setVelocityY(100.0f);
3098cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setThetaError(0.1f);
3099cfd74d65d832137e20e193c960802afba73b5d38sm
3100cfd74d65d832137e20e193c960802afba73b5d38sm	    LaunchProjectileComponent smokeGun2
3101cfd74d65d832137e20e193c960802afba73b5d38sm	        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
3102cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setDelayBetweenShots(0.35f);
3103cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setObjectTypeToSpawn(GameObjectType.SMOKE_SMALL);
3104cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setOffsetX(16);
3105cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setOffsetY(15);
3106cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setVelocityX(-150.0f);
3107cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setVelocityY(150.0f);
3108cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setThetaError(0.1f);
3109cfd74d65d832137e20e193c960802afba73b5d38sm
3110cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3111cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3112cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(smokeGun);
3113cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(smokeGun2);
3114cfd74d65d832137e20e193c960802afba73b5d38sm
3115cfd74d65d832137e20e193c960802afba73b5d38sm        object.facingDirection.x = -1.0f;
3116cfd74d65d832137e20e193c960802afba73b5d38sm
3117cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.ANDOU_DEAD, object, sprite);
3118cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3119cfd74d65d832137e20e193c960802afba73b5d38sm
3120cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3121cfd74d65d832137e20e193c960802afba73b5d38sm    }
3122cfd74d65d832137e20e193c960802afba73b5d38sm
3123cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyKabocha(float positionX, float positionY, boolean flipHorizontal) {
3124cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3125cfd74d65d832137e20e193c960802afba73b5d38sm
3126cfd74d65d832137e20e193c960802afba73b5d38sm
3127cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3128cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3129cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
3130cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
3131cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
3132cfd74d65d832137e20e193c960802afba73b5d38sm
3133cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KABOCHA);
3134cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3135cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 5;
3136cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3137cfd74d65d832137e20e193c960802afba73b5d38sm
3138cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
3139cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
3140cfd74d65d832137e20e193c960802afba73b5d38sm
3141cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
3142cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.0f);
3143cfd74d65d832137e20e193c960802afba73b5d38sm
3144cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
3145cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
3146cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(20, 5, 26, 80, HitType.COLLECT));
3147cfd74d65d832137e20e193c960802afba73b5d38sm
3148cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1);
3149cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3150cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_stand),
3151cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
3152cfd74d65d832137e20e193c960802afba73b5d38sm
3153cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame1 = new AnimationFrame(
3154cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk01),
3155cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3156cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame2 = new AnimationFrame(
3157cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk02),
3158cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3159cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame3 = new AnimationFrame(
3160cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk03),
3161cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3162cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame4 = new AnimationFrame(
3163cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk04),
3164cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3165cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame5 = new AnimationFrame(
3166cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk05),
3167cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3168cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame6 = new AnimationFrame(
3169cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk06),
3170cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3171cfd74d65d832137e20e193c960802afba73b5d38sm
3172cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(NPCAnimationComponent.WALK, 6);
3173cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame1);
3174cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame2);
3175cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame3);
3176cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame4);
3177cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame5);
3178cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame6);
3179cfd74d65d832137e20e193c960802afba73b5d38sm
3180cfd74d65d832137e20e193c960802afba73b5d38sm
3181cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
3182cfd74d65d832137e20e193c960802afba73b5d38sm
3183cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
3184cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
3185cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
3186cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3187cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
3188cfd74d65d832137e20e193c960802afba73b5d38sm
3189cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.KABOCHA, staticData);
3190cfd74d65d832137e20e193c960802afba73b5d38sm        }
3191cfd74d65d832137e20e193c960802afba73b5d38sm
3192cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3193cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.NPC);
3194cfd74d65d832137e20e193c960802afba73b5d38sm
3195cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
3196cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(38, 82);
3197cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(16, 5);
3198cfd74d65d832137e20e193c960802afba73b5d38sm
3199cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3200cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3201cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3202cfd74d65d832137e20e193c960802afba73b5d38sm
3203cfd74d65d832137e20e193c960802afba73b5d38sm        NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class);
3204cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
3205cfd74d65d832137e20e193c960802afba73b5d38sm
3206cfd74d65d832137e20e193c960802afba73b5d38sm        NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class);
3207cfd74d65d832137e20e193c960802afba73b5d38sm
3208cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3209cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
3210cfd74d65d832137e20e193c960802afba73b5d38sm
3211cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3212cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
3213cfd74d65d832137e20e193c960802afba73b5d38sm
3214cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setHitReactionComponent(hitReact);
3215cfd74d65d832137e20e193c960802afba73b5d38sm
3216cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
3217cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
3218cfd74d65d832137e20e193c960802afba73b5d38sm
3219cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
3220cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
3221cfd74d65d832137e20e193c960802afba73b5d38sm        }
3222cfd74d65d832137e20e193c960802afba73b5d38sm
3223cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3224cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3225cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
3226cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
3227cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
3228cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
3229cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3230cfd74d65d832137e20e193c960802afba73b5d38sm
3231cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.KABOCHA, object, sprite);
3232cfd74d65d832137e20e193c960802afba73b5d38sm
3233cfd74d65d832137e20e193c960802afba73b5d38sm
3234cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3235cfd74d65d832137e20e193c960802afba73b5d38sm
3236cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3237cfd74d65d832137e20e193c960802afba73b5d38sm    }
3238cfd74d65d832137e20e193c960802afba73b5d38sm
3239cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnRokudouTerminal(float positionX, float positionY) {
3240cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3241cfd74d65d832137e20e193c960802afba73b5d38sm
3242cfd74d65d832137e20e193c960802afba73b5d38sm
3243cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3244cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3245cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
3246cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
3247cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
3248cfd74d65d832137e20e193c960802afba73b5d38sm
3249cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ROKUDOU_TERMINAL);
3250cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3251cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
3252cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3253cfd74d65d832137e20e193c960802afba73b5d38sm
3254cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1);
3255cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(0, 0, 64, 64));
3256cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT);
3257cfd74d65d832137e20e193c960802afba73b5d38sm
3258cfd74d65d832137e20e193c960802afba73b5d38sm
3259cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal01),
3260cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3261cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal02),
3262cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3263cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame3 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal03),
3264cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3265cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame4 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal01),
3266cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
3267cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame5 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal02),
3268cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
3269cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame6 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal01),
3270cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume);
3271cfd74d65d832137e20e193c960802afba73b5d38sm
3272cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 12);
3273cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
3274cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame5);
3275cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame4);
3276cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame3);
3277cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
3278cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame6);
3279cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame6);
3280cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame3);
3281cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
3282cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
3283cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
3284cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame6);
3285cfd74d65d832137e20e193c960802afba73b5d38sm
3286cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
3287cfd74d65d832137e20e193c960802afba73b5d38sm
3288cfd74d65d832137e20e193c960802afba73b5d38sm
3289cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3290cfd74d65d832137e20e193c960802afba73b5d38sm
3291cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.ROKUDOU_TERMINAL, staticData);
3292cfd74d65d832137e20e193c960802afba73b5d38sm        }
3293cfd74d65d832137e20e193c960802afba73b5d38sm
3294cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3295cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
3296cfd74d65d832137e20e193c960802afba73b5d38sm
3297cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3298cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3299cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3300cfd74d65d832137e20e193c960802afba73b5d38sm
3301cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3302cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
3303cfd74d65d832137e20e193c960802afba73b5d38sm
3304cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3305cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setSpawnGameEventOnHit(HitType.COLLECT, GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER2, 0);
3306cfd74d65d832137e20e193c960802afba73b5d38sm
3307cfd74d65d832137e20e193c960802afba73b5d38sm        SelectDialogComponent dialogSelect = (SelectDialogComponent)allocateComponent(SelectDialogComponent.class);
3308cfd74d65d832137e20e193c960802afba73b5d38sm        dialogSelect.setHitReact(hitReact);
3309cfd74d65d832137e20e193c960802afba73b5d38sm
3310cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
3311cfd74d65d832137e20e193c960802afba73b5d38sm
3312cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dialogSelect);
3313cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3314cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3315cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
3316cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3317cfd74d65d832137e20e193c960802afba73b5d38sm
3318cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.ROKUDOU_TERMINAL, object, sprite);
3319cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3320cfd74d65d832137e20e193c960802afba73b5d38sm
3321cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3322cfd74d65d832137e20e193c960802afba73b5d38sm    }
3323cfd74d65d832137e20e193c960802afba73b5d38sm
3324cfd74d65d832137e20e193c960802afba73b5d38sm
3325cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnKabochaTerminal(float positionX, float positionY) {
3326cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3327cfd74d65d832137e20e193c960802afba73b5d38sm
3328cfd74d65d832137e20e193c960802afba73b5d38sm
3329cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3330cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3331cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
3332cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
3333cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
3334cfd74d65d832137e20e193c960802afba73b5d38sm
3335cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KABOCHA_TERMINAL);
3336cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3337cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
3338cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3339cfd74d65d832137e20e193c960802afba73b5d38sm
3340cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1);
3341cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(0, 0, 64, 64));
3342cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT);
3343cfd74d65d832137e20e193c960802afba73b5d38sm
3344cfd74d65d832137e20e193c960802afba73b5d38sm
3345cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha01),
3346cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3347cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha02),
3348cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3349cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame3 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha03),
3350cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3351cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame4 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha01),
3352cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
3353cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame5 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha02),
3354cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
3355cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame6 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha01),
3356cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume);
3357cfd74d65d832137e20e193c960802afba73b5d38sm
3358cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 12);
3359cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
3360cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame5);
3361cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame4);
3362cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame3);
3363cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
3364cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame6);
3365cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame6);
3366cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame3);
3367cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
3368cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
3369cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
3370cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame6);
3371cfd74d65d832137e20e193c960802afba73b5d38sm
3372cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
3373cfd74d65d832137e20e193c960802afba73b5d38sm
3374cfd74d65d832137e20e193c960802afba73b5d38sm
3375cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3376cfd74d65d832137e20e193c960802afba73b5d38sm
3377cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.KABOCHA_TERMINAL, staticData);
3378cfd74d65d832137e20e193c960802afba73b5d38sm        }
3379cfd74d65d832137e20e193c960802afba73b5d38sm
3380cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3381cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
3382cfd74d65d832137e20e193c960802afba73b5d38sm
3383cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3384cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3385cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3386cfd74d65d832137e20e193c960802afba73b5d38sm
3387cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3388cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
3389cfd74d65d832137e20e193c960802afba73b5d38sm
3390cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3391cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setSpawnGameEventOnHit(HitType.COLLECT, GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER2, 0);
3392cfd74d65d832137e20e193c960802afba73b5d38sm
3393cfd74d65d832137e20e193c960802afba73b5d38sm        SelectDialogComponent dialogSelect = (SelectDialogComponent)allocateComponent(SelectDialogComponent.class);
3394cfd74d65d832137e20e193c960802afba73b5d38sm        dialogSelect.setHitReact(hitReact);
3395cfd74d65d832137e20e193c960802afba73b5d38sm
3396cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
3397cfd74d65d832137e20e193c960802afba73b5d38sm
3398cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dialogSelect);
3399cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3400cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3401cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
3402cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3403cfd74d65d832137e20e193c960802afba73b5d38sm
3404cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.KABOCHA_TERMINAL, object, sprite);
3405cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3406cfd74d65d832137e20e193c960802afba73b5d38sm
3407cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3408cfd74d65d832137e20e193c960802afba73b5d38sm    }
3409cfd74d65d832137e20e193c960802afba73b5d38sm
3410cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyEvilKabocha(float positionX, float positionY, boolean flipHorizontal) {
3411cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3412cfd74d65d832137e20e193c960802afba73b5d38sm
3413cfd74d65d832137e20e193c960802afba73b5d38sm
3414cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3415cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3416cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
3417cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 128;
3418cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
3419cfd74d65d832137e20e193c960802afba73b5d38sm
3420cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.EVIL_KABOCHA);
3421cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3422cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 8;
3423cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3424cfd74d65d832137e20e193c960802afba73b5d38sm
3425cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
3426cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
3427cfd74d65d832137e20e193c960802afba73b5d38sm
3428cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
3429cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.0f);
3430cfd74d65d832137e20e193c960802afba73b5d38sm
3431cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
3432cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
3433cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(52, 5, 26, 80, HitType.HIT));
3434cfd74d65d832137e20e193c960802afba73b5d38sm
3435cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1);
3436cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3437cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_stand),
3438cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
3439cfd74d65d832137e20e193c960802afba73b5d38sm
3440cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame1 = new AnimationFrame(
3441cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk01),
3442cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3443cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame2 = new AnimationFrame(
3444cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk02),
3445cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3446cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame3 = new AnimationFrame(
3447cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk03),
3448cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3449cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame4 = new AnimationFrame(
3450cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk04),
3451cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3452cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame5 = new AnimationFrame(
3453cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk05),
3454cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3455cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame6 = new AnimationFrame(
3456cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk06),
3457cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3458cfd74d65d832137e20e193c960802afba73b5d38sm
3459cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(NPCAnimationComponent.WALK, 6);
3460cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame1);
3461cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame2);
3462cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame3);
3463cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame4);
3464cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame5);
3465cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame6);
3466cfd74d65d832137e20e193c960802afba73b5d38sm
3467cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
3468cfd74d65d832137e20e193c960802afba73b5d38sm
3469cfd74d65d832137e20e193c960802afba73b5d38sm
3470cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation surprised = new SpriteAnimation(NPCAnimationComponent.SURPRISED, 1);
3471cfd74d65d832137e20e193c960802afba73b5d38sm            surprised.addFrame(new AnimationFrame(
3472cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_surprised),
3473cfd74d65d832137e20e193c960802afba73b5d38sm                    4.0f, null, null));
3474cfd74d65d832137e20e193c960802afba73b5d38sm
3475cfd74d65d832137e20e193c960802afba73b5d38sm
3476cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation hit = new SpriteAnimation(NPCAnimationComponent.TAKE_HIT, 2);
3477cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(new AnimationFrame(
3478cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_hit01),
3479cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
3480cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(new AnimationFrame(
3481cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_hit02),
3482cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 10), null, null));
3483cfd74d65d832137e20e193c960802afba73b5d38sm
3484cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation die = new SpriteAnimation(NPCAnimationComponent.DEATH, 5);
3485cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3486cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_die01),
3487cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), null, null));
3488cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3489cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_stand),
3490cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
3491cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3492cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_die02),
3493cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
3494cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3495cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_die03),
3496cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
3497cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3498cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_die04),
3499cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), null, null));
3500cfd74d65d832137e20e193c960802afba73b5d38sm
3501cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
3502cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
3503cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
3504cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3505cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
3506cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(surprised);
3507cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(hit);
3508cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(die);
3509cfd74d65d832137e20e193c960802afba73b5d38sm
3510cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.EVIL_KABOCHA, staticData);
3511cfd74d65d832137e20e193c960802afba73b5d38sm        }
3512cfd74d65d832137e20e193c960802afba73b5d38sm
3513cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3514cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.NPC);
3515cfd74d65d832137e20e193c960802afba73b5d38sm
3516cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
3517cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(38, 82);
3518cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(45, 5);
3519cfd74d65d832137e20e193c960802afba73b5d38sm
3520cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3521cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3522cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3523cfd74d65d832137e20e193c960802afba73b5d38sm
3524cfd74d65d832137e20e193c960802afba73b5d38sm        NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class);
3525cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
3526cfd74d65d832137e20e193c960802afba73b5d38sm
3527cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem.Channel surpriseChannel = null;
3528cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem;
3529cfd74d65d832137e20e193c960802afba73b5d38sm        surpriseChannel = channelSystem.registerChannel(sSurprisedNPCChannel);
3530cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setChannel(surpriseChannel);
3531cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setChannelTrigger(NPCAnimationComponent.SURPRISED);
3532cfd74d65d832137e20e193c960802afba73b5d38sm
3533cfd74d65d832137e20e193c960802afba73b5d38sm        NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class);
3534cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setSpeeds(50.0f, 50.0f, 0.0f, -10.0f, 200.0f);
3535cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setReactToHits(true);
3536cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setGameEvent(GameFlowEvent.EVENT_SHOW_ANIMATION, AnimationPlayerActivity.ROKUDOU_ENDING, true);
3537cfd74d65d832137e20e193c960802afba73b5d38sm
3538cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3539cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
3540cfd74d65d832137e20e193c960802afba73b5d38sm
3541cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3542cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
3543cfd74d65d832137e20e193c960802afba73b5d38sm
3544cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = sSystemRegistry.soundSystem;
3545cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
3546cfd74d65d832137e20e193c960802afba73b5d38sm        	hitReact.setTakeHitSound(HitType.HIT, sound.load(R.raw.sound_kabocha_hit));
3547cfd74d65d832137e20e193c960802afba73b5d38sm        }
3548cfd74d65d832137e20e193c960802afba73b5d38sm
3549cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setHitReactionComponent(hitReact);
3550cfd74d65d832137e20e193c960802afba73b5d38sm
3551cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
3552cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 3;
3553cfd74d65d832137e20e193c960802afba73b5d38sm
3554cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
3555cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
3556cfd74d65d832137e20e193c960802afba73b5d38sm        }
3557cfd74d65d832137e20e193c960802afba73b5d38sm
3558cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3559cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3560cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
3561cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
3562cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
3563cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
3564cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3565cfd74d65d832137e20e193c960802afba73b5d38sm
3566cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.EVIL_KABOCHA, object, sprite);
3567cfd74d65d832137e20e193c960802afba73b5d38sm
3568cfd74d65d832137e20e193c960802afba73b5d38sm
3569cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3570cfd74d65d832137e20e193c960802afba73b5d38sm
3571cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3572cfd74d65d832137e20e193c960802afba73b5d38sm    }
3573cfd74d65d832137e20e193c960802afba73b5d38sm
3574cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyRokudou(float positionX, float positionY, boolean flipHorizontal) {
3575cfd74d65d832137e20e193c960802afba73b5d38sm    	TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3576cfd74d65d832137e20e193c960802afba73b5d38sm
3577cfd74d65d832137e20e193c960802afba73b5d38sm    	// Make sure related textures are loaded.
3578cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball01);
3579cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball02);
3580cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball03);
3581cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball04);
3582cfd74d65d832137e20e193c960802afba73b5d38sm
3583cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_bullet01);
3584cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_bullet02);
3585cfd74d65d832137e20e193c960802afba73b5d38sm
3586cfd74d65d832137e20e193c960802afba73b5d38sm
3587cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3588cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3589cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
3590cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 128;
3591cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
3592cfd74d65d832137e20e193c960802afba73b5d38sm
3593cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ROKUDOU);
3594cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3595cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 8;
3596cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3597cfd74d65d832137e20e193c960802afba73b5d38sm
3598cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
3599cfd74d65d832137e20e193c960802afba73b5d38sm
3600cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
3601cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.0f);
3602cfd74d65d832137e20e193c960802afba73b5d38sm
3603cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
3604cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
3605cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(45, 23, 42, 75, HitType.HIT));
3606cfd74d65d832137e20e193c960802afba73b5d38sm
3607cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1);
3608cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3609cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_stand),
3610cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
3611cfd74d65d832137e20e193c960802afba73b5d38sm
3612cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation fly = new SpriteAnimation(NPCAnimationComponent.WALK, 2);
3613cfd74d65d832137e20e193c960802afba73b5d38sm            fly.addFrame(new AnimationFrame(
3614cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_fly01),
3615cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume));
3616cfd74d65d832137e20e193c960802afba73b5d38sm            fly.addFrame(new AnimationFrame(
3617cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_fly02),
3618cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume));
3619cfd74d65d832137e20e193c960802afba73b5d38sm            fly.setLoop(true);
3620cfd74d65d832137e20e193c960802afba73b5d38sm
3621cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation shoot = new SpriteAnimation(NPCAnimationComponent.SHOOT, 2);
3622cfd74d65d832137e20e193c960802afba73b5d38sm            shoot.addFrame(new AnimationFrame(
3623cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_shoot01),
3624cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
3625cfd74d65d832137e20e193c960802afba73b5d38sm            shoot.addFrame(new AnimationFrame(
3626cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_shoot02),
3627cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
3628cfd74d65d832137e20e193c960802afba73b5d38sm            shoot.setLoop(true);
3629cfd74d65d832137e20e193c960802afba73b5d38sm
3630cfd74d65d832137e20e193c960802afba73b5d38sm
3631cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation surprised = new SpriteAnimation(NPCAnimationComponent.SURPRISED, 1);
3632cfd74d65d832137e20e193c960802afba73b5d38sm            surprised.addFrame(new AnimationFrame(
3633cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_surprise),
3634cfd74d65d832137e20e193c960802afba73b5d38sm                    4.0f, null, null));
3635cfd74d65d832137e20e193c960802afba73b5d38sm
3636cfd74d65d832137e20e193c960802afba73b5d38sm
3637cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation hit = new SpriteAnimation(NPCAnimationComponent.TAKE_HIT, 7);
3638cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame hitFrame1 = new AnimationFrame(
3639cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_hit01),
3640cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null);
3641cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame hitFrame2 = new AnimationFrame(
3642cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_hit02),
3643cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
3644cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame hitFrame3 = new AnimationFrame(
3645cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_hit03),
3646cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
3647cfd74d65d832137e20e193c960802afba73b5d38sm
3648cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame1);
3649cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame2);
3650cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame3);
3651cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame2);
3652cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame3);
3653cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame2);
3654cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame3);
3655cfd74d65d832137e20e193c960802afba73b5d38sm
3656cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation die = new SpriteAnimation(NPCAnimationComponent.DEATH, 5);
3657cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3658cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_stand),
3659cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), null, null));
3660cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3661cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_die01),
3662cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
3663cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3664cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_die02),
3665cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, null));
3666cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3667cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_die03),
3668cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), null, null));
3669cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3670cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_die04),
3671cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), null, null));
3672cfd74d65d832137e20e193c960802afba73b5d38sm
3673cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
3674cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
3675cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3676cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(fly);
3677cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(surprised);
3678cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(hit);
3679cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(die);
3680cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(shoot);
3681cfd74d65d832137e20e193c960802afba73b5d38sm
3682cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.ROKUDOU, staticData);
3683cfd74d65d832137e20e193c960802afba73b5d38sm        }
3684cfd74d65d832137e20e193c960802afba73b5d38sm
3685cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3686cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.NPC);
3687cfd74d65d832137e20e193c960802afba73b5d38sm
3688cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
3689cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(45, 75);
3690cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(45, 23);
3691cfd74d65d832137e20e193c960802afba73b5d38sm
3692cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3693cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3694cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3695cfd74d65d832137e20e193c960802afba73b5d38sm
3696cfd74d65d832137e20e193c960802afba73b5d38sm
3697cfd74d65d832137e20e193c960802afba73b5d38sm
3698cfd74d65d832137e20e193c960802afba73b5d38sm        NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class);
3699cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
3700cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setFlying(true);
3701cfd74d65d832137e20e193c960802afba73b5d38sm
3702cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem.Channel surpriseChannel = null;
3703cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem;
3704cfd74d65d832137e20e193c960802afba73b5d38sm        surpriseChannel = channelSystem.registerChannel(sSurprisedNPCChannel);
3705cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setChannel(surpriseChannel);
3706cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setChannelTrigger(NPCAnimationComponent.SURPRISED);
3707cfd74d65d832137e20e193c960802afba73b5d38sm
3708cfd74d65d832137e20e193c960802afba73b5d38sm        NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class);
3709cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setSpeeds(500.0f, 100.0f, 100.0f, -100.0f, 400.0f);
3710cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setFlying(true);
3711cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setReactToHits(true);
3712cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setGameEvent(GameFlowEvent.EVENT_SHOW_ANIMATION, AnimationPlayerActivity.KABOCHA_ENDING, true);
3713cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setPauseOnAttack(false);
3714cfd74d65d832137e20e193c960802afba73b5d38sm
3715cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3716cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
3717cfd74d65d832137e20e193c960802afba73b5d38sm
3718cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3719cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
3720cfd74d65d832137e20e193c960802afba73b5d38sm
3721cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = sSystemRegistry.soundSystem;
3722cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
3723cfd74d65d832137e20e193c960802afba73b5d38sm        	hitReact.setTakeHitSound(HitType.HIT, sound.load(R.raw.sound_rokudou_hit));
3724cfd74d65d832137e20e193c960802afba73b5d38sm        }
3725cfd74d65d832137e20e193c960802afba73b5d38sm
3726cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setHitReactionComponent(hitReact);
3727cfd74d65d832137e20e193c960802afba73b5d38sm
3728cfd74d65d832137e20e193c960802afba73b5d38sm        ChangeComponentsComponent deathSwap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class);
3729cfd74d65d832137e20e193c960802afba73b5d38sm        deathSwap.addSwapInComponent(allocateComponent(GravityComponent.class));
3730cfd74d65d832137e20e193c960802afba73b5d38sm        deathSwap.setSwapAction(ActionType.DEATH);
3731cfd74d65d832137e20e193c960802afba73b5d38sm
3732cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent gun
3733cfd74d65d832137e20e193c960802afba73b5d38sm	        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
3734cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setShotsPerSet(1);
3735cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setSetsPerActivation(-1);
3736cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setDelayBetweenSets(1.5f);
3737cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setObjectTypeToSpawn(GameObjectType.ENERGY_BALL);
3738cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setOffsetX(75);
3739cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setOffsetY(42);
3740cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setRequiredAction(GameObject.ActionType.ATTACK);
3741cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setVelocityX(300.0f);
3742cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setVelocityY(-300.0f);
3743cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShootSound(sound.load(R.raw.sound_poing));
3744cfd74d65d832137e20e193c960802afba73b5d38sm
3745cfd74d65d832137e20e193c960802afba73b5d38sm
3746cfd74d65d832137e20e193c960802afba73b5d38sm	    LaunchProjectileComponent gun2
3747cfd74d65d832137e20e193c960802afba73b5d38sm        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
3748cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setShotsPerSet(5);
3749cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setDelayBetweenShots(0.1f);
3750cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setSetsPerActivation(-1);
3751cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setDelayBetweenSets(2.5f);
3752cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setObjectTypeToSpawn(GameObjectType.TURRET_BULLET);
3753cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setOffsetX(75);
3754cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setOffsetY(42);
3755cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setRequiredAction(GameObject.ActionType.ATTACK);
3756cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setVelocityX(300.0f);
3757cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setVelocityY(-300.0f);
3758cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShootSound(sound.load(R.raw.sound_gun));
3759cfd74d65d832137e20e193c960802afba73b5d38sm
3760cfd74d65d832137e20e193c960802afba73b5d38sm
3761cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
3762cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 3;
3763cfd74d65d832137e20e193c960802afba73b5d38sm
3764cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
3765cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
3766cfd74d65d832137e20e193c960802afba73b5d38sm        }
3767cfd74d65d832137e20e193c960802afba73b5d38sm
3768cfd74d65d832137e20e193c960802afba73b5d38sm        // HACK! Since there's no gravity and this is a big character, align him to the floor
3769cfd74d65d832137e20e193c960802afba73b5d38sm        // manually.
3770cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().y -= 23;
3771cfd74d65d832137e20e193c960802afba73b5d38sm
3772cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3773cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3774cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
3775cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
3776cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
3777cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
3778cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3779cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(deathSwap);
3780cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun);
3781cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun2);
3782cfd74d65d832137e20e193c960802afba73b5d38sm
3783cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.ROKUDOU, object, sprite);
3784cfd74d65d832137e20e193c960802afba73b5d38sm
3785cfd74d65d832137e20e193c960802afba73b5d38sm
3786cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3787cfd74d65d832137e20e193c960802afba73b5d38sm
3788cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3789cfd74d65d832137e20e193c960802afba73b5d38sm    }
3790cfd74d65d832137e20e193c960802afba73b5d38sm
3791cfd74d65d832137e20e193c960802afba73b5d38sm
3792cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnPlayerGhost(float positionX, float positionY, GameObject player, float lifeTime) {
3793cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
3794cfd74d65d832137e20e193c960802afba73b5d38sm
3795cfd74d65d832137e20e193c960802afba73b5d38sm
3796cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3797cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3798cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
3799cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
3800cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
3801cfd74d65d832137e20e193c960802afba73b5d38sm
3802cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.GHOST);
3803cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3804cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 4;
3805cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3806cfd74d65d832137e20e193c960802afba73b5d38sm
3807cfd74d65d832137e20e193c960802afba73b5d38sm            //GravityComponent gravity = (GravityComponent)allocateComponent(GravityComponent.class);
3808cfd74d65d832137e20e193c960802afba73b5d38sm            //gravity.setGravityMultiplier(0.1f);
3809cfd74d65d832137e20e193c960802afba73b5d38sm
3810cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
3811cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
3812cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.6f);
3813cfd74d65d832137e20e193c960802afba73b5d38sm
3814cfd74d65d832137e20e193c960802afba73b5d38sm            GhostComponent ghost = (GhostComponent)allocateComponent(GhostComponent.class);
3815cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.setMovementSpeed(2000.0f);
3816cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.setAcceleration(300.0f);
3817cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.setUseOrientationSensor(true);
3818cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.setKillOnRelease(true);
3819cfd74d65d832137e20e193c960802afba73b5d38sm
3820cfd74d65d832137e20e193c960802afba73b5d38sm            SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
3821cfd74d65d832137e20e193c960802afba73b5d38sm            if (sound != null) {
3822cfd74d65d832137e20e193c960802afba73b5d38sm            	ghost.setAmbientSound(sound.load(R.raw.sound_possession));
3823cfd74d65d832137e20e193c960802afba73b5d38sm            }
3824cfd74d65d832137e20e193c960802afba73b5d38sm
3825cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
3826cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
3827cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(32, 32, 32, HitType.POSSESS));
3828cfd74d65d832137e20e193c960802afba73b5d38sm
3829cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 4);
3830cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3831cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_energyball01),
3832cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3833cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3834cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_energyball02),
3835cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3836cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3837cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_energyball03),
3838cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3839cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3840cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_energyball04),
3841cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3842cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
3843cfd74d65d832137e20e193c960802afba73b5d38sm
3844cfd74d65d832137e20e193c960802afba73b5d38sm            //staticData.add(gravity);
3845cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
3846cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
3847cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(ghost);
3848cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3849cfd74d65d832137e20e193c960802afba73b5d38sm
3850cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.GHOST, staticData);
3851cfd74d65d832137e20e193c960802afba73b5d38sm        }
3852cfd74d65d832137e20e193c960802afba73b5d38sm
3853cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3854cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PROJECTILE);
3855cfd74d65d832137e20e193c960802afba73b5d38sm
3856cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
3857cfd74d65d832137e20e193c960802afba73b5d38sm		bgcollision.setSize(64, 64);
3858cfd74d65d832137e20e193c960802afba73b5d38sm		bgcollision.setOffset(0, 0);
3859cfd74d65d832137e20e193c960802afba73b5d38sm
3860cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3861cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
3862cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3863cfd74d65d832137e20e193c960802afba73b5d38sm
3864cfd74d65d832137e20e193c960802afba73b5d38sm
3865cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3866cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
3867cfd74d65d832137e20e193c960802afba73b5d38sm
3868cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3869cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieOnAttack(true);
3870cfd74d65d832137e20e193c960802afba73b5d38sm
3871cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
3872cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
3873cfd74d65d832137e20e193c960802afba73b5d38sm        // when the ghost dies it either releases itself or passes control to another object, so we
3874cfd74d65d832137e20e193c960802afba73b5d38sm        // don't want control to return to the player.
3875cfd74d65d832137e20e193c960802afba73b5d38sm
3876cfd74d65d832137e20e193c960802afba73b5d38sm        life.setReleaseGhostOnDeath(false);
3877cfd74d65d832137e20e193c960802afba73b5d38sm
3878cfd74d65d832137e20e193c960802afba73b5d38sm
3879cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
3880cfd74d65d832137e20e193c960802afba73b5d38sm
3881cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
3882cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3883cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3884cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
3885cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3886cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(life);
3887cfd74d65d832137e20e193c960802afba73b5d38sm
3888cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.GHOST, object, sprite);
3889cfd74d65d832137e20e193c960802afba73b5d38sm
3890cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
3891cfd74d65d832137e20e193c960802afba73b5d38sm
3892cfd74d65d832137e20e193c960802afba73b5d38sm        GhostComponent ghost = object.findByClass(GhostComponent.class);
3893cfd74d65d832137e20e193c960802afba73b5d38sm        if (ghost != null) {
3894cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.setLifeTime(lifeTime);
3895cfd74d65d832137e20e193c960802afba73b5d38sm        }
3896cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3897cfd74d65d832137e20e193c960802afba73b5d38sm
3898cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3899cfd74d65d832137e20e193c960802afba73b5d38sm    }
3900cfd74d65d832137e20e193c960802afba73b5d38sm
3901cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnergyBall(float positionX, float positionY, boolean flipHorizontal) {
3902cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3903cfd74d65d832137e20e193c960802afba73b5d38sm
3904cfd74d65d832137e20e193c960802afba73b5d38sm
3905cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3906cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3907cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
3908cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
3909cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
3910cfd74d65d832137e20e193c960802afba73b5d38sm
3911cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ENERGY_BALL);
3912cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3913cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
3914cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3915cfd74d65d832137e20e193c960802afba73b5d38sm
3916cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
3917cfd74d65d832137e20e193c960802afba73b5d38sm
3918cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
3919cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
3920cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 16, 16, HitType.HIT));
3921cfd74d65d832137e20e193c960802afba73b5d38sm
3922cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 4);
3923cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3924cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball01),
3925cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3926cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3927cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball02),
3928cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3929cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3930cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball03),
3931cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3932cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3933cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball04),
3934cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3935cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
3936cfd74d65d832137e20e193c960802afba73b5d38sm
3937cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
3938cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3939cfd74d65d832137e20e193c960802afba73b5d38sm
3940cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.ENERGY_BALL, staticData);
3941cfd74d65d832137e20e193c960802afba73b5d38sm
3942cfd74d65d832137e20e193c960802afba73b5d38sm        }
3943cfd74d65d832137e20e193c960802afba73b5d38sm
3944cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3945cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PROJECTILE);
3946cfd74d65d832137e20e193c960802afba73b5d38sm
3947cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
3948cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(5.0f);
3949cfd74d65d832137e20e193c960802afba73b5d38sm
3950cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3951cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
3952cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3953cfd74d65d832137e20e193c960802afba73b5d38sm
3954cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3955cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
3956cfd74d65d832137e20e193c960802afba73b5d38sm
3957cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3958cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieOnAttack(true);
3959cfd74d65d832137e20e193c960802afba73b5d38sm
3960cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
3961cfd74d65d832137e20e193c960802afba73b5d38sm
3962cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
3963cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
3964cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
3965cfd74d65d832137e20e193c960802afba73b5d38sm
3966cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
3967cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
3968cfd74d65d832137e20e193c960802afba73b5d38sm        }
3969cfd74d65d832137e20e193c960802afba73b5d38sm
3970cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
3971cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3972cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3973cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
3974cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3975cfd74d65d832137e20e193c960802afba73b5d38sm
3976cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.ENERGY_BALL, object, sprite);
3977cfd74d65d832137e20e193c960802afba73b5d38sm
3978cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3979cfd74d65d832137e20e193c960802afba73b5d38sm
3980cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3981cfd74d65d832137e20e193c960802afba73b5d38sm    }
3982cfd74d65d832137e20e193c960802afba73b5d38sm
3983cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnWandaShot(float positionX, float positionY, boolean flipHorizontal) {
3984cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3985cfd74d65d832137e20e193c960802afba73b5d38sm
3986cfd74d65d832137e20e193c960802afba73b5d38sm
3987cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3988cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3989cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
3990cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
3991cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
3992cfd74d65d832137e20e193c960802afba73b5d38sm
3993cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.WANDA_SHOT);
3994cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3995cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
3996cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3997cfd74d65d832137e20e193c960802afba73b5d38sm
3998cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
3999cfd74d65d832137e20e193c960802afba73b5d38sm
4000cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
4001cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
4002cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 16, 16, HitType.HIT));
4003cfd74d65d832137e20e193c960802afba73b5d38sm
4004cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 4);
4005cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4006cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball01),
4007cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4008cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4009cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball02),
4010cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4011cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4012cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball03),
4013cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4014cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4015cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball04),
4016cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4017cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
4018cfd74d65d832137e20e193c960802afba73b5d38sm
4019cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
4020cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4021cfd74d65d832137e20e193c960802afba73b5d38sm
4022cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.WANDA_SHOT, staticData);
4023cfd74d65d832137e20e193c960802afba73b5d38sm
4024cfd74d65d832137e20e193c960802afba73b5d38sm        }
4025cfd74d65d832137e20e193c960802afba73b5d38sm
4026cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4027cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PROJECTILE);
4028cfd74d65d832137e20e193c960802afba73b5d38sm
4029cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
4030cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(5.0f);
4031cfd74d65d832137e20e193c960802afba73b5d38sm
4032cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4033cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
4034cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4035cfd74d65d832137e20e193c960802afba73b5d38sm
4036cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4037cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4038cfd74d65d832137e20e193c960802afba73b5d38sm
4039cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4040cfd74d65d832137e20e193c960802afba73b5d38sm        //hitReact.setDieOnAttack(true);
4041cfd74d65d832137e20e193c960802afba73b5d38sm
4042cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4043cfd74d65d832137e20e193c960802afba73b5d38sm
4044cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4045cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.NONE;
4046cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
4047cfd74d65d832137e20e193c960802afba73b5d38sm
4048cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
4049cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
4050cfd74d65d832137e20e193c960802afba73b5d38sm        }
4051cfd74d65d832137e20e193c960802afba73b5d38sm
4052cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
4053cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4054cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4055cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4056cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4057cfd74d65d832137e20e193c960802afba73b5d38sm
4058cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.WANDA_SHOT, object, sprite);
4059cfd74d65d832137e20e193c960802afba73b5d38sm
4060cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4061cfd74d65d832137e20e193c960802afba73b5d38sm
4062cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4063cfd74d65d832137e20e193c960802afba73b5d38sm    }
4064cfd74d65d832137e20e193c960802afba73b5d38sm
4065cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnCannonBall(float positionX, float positionY, boolean flipHorizontal) {
4066cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4067cfd74d65d832137e20e193c960802afba73b5d38sm
4068cfd74d65d832137e20e193c960802afba73b5d38sm
4069cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4070cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4071cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4072cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
4073cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
4074cfd74d65d832137e20e193c960802afba73b5d38sm
4075cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CANNON_BALL);
4076cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4077cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4078cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4079cfd74d65d832137e20e193c960802afba73b5d38sm
4080cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
4081cfd74d65d832137e20e193c960802afba73b5d38sm
4082cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
4083cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
4084cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(8, 16, 16, HitType.HIT));
4085cfd74d65d832137e20e193c960802afba73b5d38sm
4086cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 1);
4087cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.snail_bomb),
4088cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4089cfd74d65d832137e20e193c960802afba73b5d38sm
4090cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
4091cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4092cfd74d65d832137e20e193c960802afba73b5d38sm
4093cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.CANNON_BALL, staticData);
4094cfd74d65d832137e20e193c960802afba73b5d38sm        }
4095cfd74d65d832137e20e193c960802afba73b5d38sm
4096cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4097cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PROJECTILE);
4098cfd74d65d832137e20e193c960802afba73b5d38sm
4099cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
4100cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(3.0f);
4101cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setDieOnHitBackground(true);
4102cfd74d65d832137e20e193c960802afba73b5d38sm
4103cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4104cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
4105cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4106cfd74d65d832137e20e193c960802afba73b5d38sm
4107cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4108cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4109cfd74d65d832137e20e193c960802afba73b5d38sm
4110cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4111cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieOnAttack(true);
4112cfd74d65d832137e20e193c960802afba73b5d38sm
4113cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4114cfd74d65d832137e20e193c960802afba73b5d38sm
4115cfd74d65d832137e20e193c960802afba73b5d38sm        SimpleCollisionComponent collision = (SimpleCollisionComponent)allocateComponent(SimpleCollisionComponent.class);
4116cfd74d65d832137e20e193c960802afba73b5d38sm
4117cfd74d65d832137e20e193c960802afba73b5d38sm
4118cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4119cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
4120cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
4121cfd74d65d832137e20e193c960802afba73b5d38sm
4122cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
4123cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
4124cfd74d65d832137e20e193c960802afba73b5d38sm        }
4125cfd74d65d832137e20e193c960802afba73b5d38sm
4126cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
4127cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4128cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4129cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4130cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4131cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
4132cfd74d65d832137e20e193c960802afba73b5d38sm
4133cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.CANNON_BALL, object, sprite);
4134cfd74d65d832137e20e193c960802afba73b5d38sm
4135cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4136cfd74d65d832137e20e193c960802afba73b5d38sm
4137cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4138cfd74d65d832137e20e193c960802afba73b5d38sm    }
4139cfd74d65d832137e20e193c960802afba73b5d38sm
4140cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnTurretBullet(float positionX, float positionY, boolean flipHorizontal) {
4141cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4142cfd74d65d832137e20e193c960802afba73b5d38sm
4143cfd74d65d832137e20e193c960802afba73b5d38sm
4144cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4145cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4146cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4147cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 16;
4148cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 16;
4149cfd74d65d832137e20e193c960802afba73b5d38sm
4150cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.TURRET_BULLET);
4151cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4152cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4153cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4154cfd74d65d832137e20e193c960802afba73b5d38sm
4155cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
4156cfd74d65d832137e20e193c960802afba73b5d38sm
4157cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
4158cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
4159cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(8, 8, 8, HitType.HIT));
4160cfd74d65d832137e20e193c960802afba73b5d38sm
4161cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 2);
4162cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_bullet01),
4163cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4164cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_bullet02),
4165cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4166cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
4167cfd74d65d832137e20e193c960802afba73b5d38sm
4168cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
4169cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4170cfd74d65d832137e20e193c960802afba73b5d38sm
4171cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.TURRET_BULLET, staticData);
4172cfd74d65d832137e20e193c960802afba73b5d38sm        }
4173cfd74d65d832137e20e193c960802afba73b5d38sm
4174cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4175cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PROJECTILE);
4176cfd74d65d832137e20e193c960802afba73b5d38sm
4177cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
4178cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(3.0f);
4179cfd74d65d832137e20e193c960802afba73b5d38sm
4180cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4181cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
4182cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4183cfd74d65d832137e20e193c960802afba73b5d38sm
4184cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4185cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4186cfd74d65d832137e20e193c960802afba73b5d38sm
4187cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4188cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieOnAttack(true);
4189cfd74d65d832137e20e193c960802afba73b5d38sm
4190cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4191cfd74d65d832137e20e193c960802afba73b5d38sm
4192cfd74d65d832137e20e193c960802afba73b5d38sm
4193cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4194cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
4195cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
4196cfd74d65d832137e20e193c960802afba73b5d38sm
4197cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
4198cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
4199cfd74d65d832137e20e193c960802afba73b5d38sm        }
4200cfd74d65d832137e20e193c960802afba73b5d38sm
4201cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
4202cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4203cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4204cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4205cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4206cfd74d65d832137e20e193c960802afba73b5d38sm
4207cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.TURRET_BULLET, object, sprite);
4208cfd74d65d832137e20e193c960802afba73b5d38sm
4209cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4210cfd74d65d832137e20e193c960802afba73b5d38sm
4211cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4212cfd74d65d832137e20e193c960802afba73b5d38sm    }
4213cfd74d65d832137e20e193c960802afba73b5d38sm
4214cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnBrobotBullet(float positionX, float positionY, boolean flipHorizontal) {
4215cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4216cfd74d65d832137e20e193c960802afba73b5d38sm
4217cfd74d65d832137e20e193c960802afba73b5d38sm
4218cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4219cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4220cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4221cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
4222cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
4223cfd74d65d832137e20e193c960802afba73b5d38sm
4224cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BROBOT_BULLET);
4225cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4226cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4227cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4228cfd74d65d832137e20e193c960802afba73b5d38sm
4229cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
4230cfd74d65d832137e20e193c960802afba73b5d38sm
4231cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 3);
4232cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4233cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk01),
4234cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
4235cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4236cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk02),
4237cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
4238cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4239cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk03),
4240cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
4241cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
4242cfd74d65d832137e20e193c960802afba73b5d38sm
4243cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
4244cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4245cfd74d65d832137e20e193c960802afba73b5d38sm
4246cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.BROBOT_BULLET, staticData);
4247cfd74d65d832137e20e193c960802afba73b5d38sm        }
4248cfd74d65d832137e20e193c960802afba73b5d38sm
4249cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4250cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PROJECTILE);
4251cfd74d65d832137e20e193c960802afba73b5d38sm
4252cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
4253cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(3.0f);
4254cfd74d65d832137e20e193c960802afba73b5d38sm
4255cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4256cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
4257cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4258cfd74d65d832137e20e193c960802afba73b5d38sm
4259cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4260cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
4261cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
4262cfd74d65d832137e20e193c960802afba73b5d38sm
4263cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
4264cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
4265cfd74d65d832137e20e193c960802afba73b5d38sm        }
4266cfd74d65d832137e20e193c960802afba73b5d38sm
4267cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
4268cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4269cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4270cfd74d65d832137e20e193c960802afba73b5d38sm
4271cfd74d65d832137e20e193c960802afba73b5d38sm
4272cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.BROBOT_BULLET, object, sprite);
4273cfd74d65d832137e20e193c960802afba73b5d38sm
4274cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4275cfd74d65d832137e20e193c960802afba73b5d38sm
4276cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4277cfd74d65d832137e20e193c960802afba73b5d38sm    }
4278cfd74d65d832137e20e193c960802afba73b5d38sm
4279cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnCoin(float positionX, float positionY) {
4280cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4281cfd74d65d832137e20e193c960802afba73b5d38sm
4282cfd74d65d832137e20e193c960802afba73b5d38sm
4283cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4284cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4285cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4286cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 16;
4287cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 16;
4288cfd74d65d832137e20e193c960802afba73b5d38sm
4289cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.COIN);
4290cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4291cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4292cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4293cfd74d65d832137e20e193c960802afba73b5d38sm
4294cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = null; /*new FixedSizeArray<CollisionVolume>(1);
4295cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(8, 8, 8));
4296cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT);*/
4297cfd74d65d832137e20e193c960802afba73b5d38sm
4298cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 5);
4299cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin01),
4300cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 30), null, basicVulnerabilityVolume));
4301cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin02),
4302cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4303cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin03),
4304cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4305cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin04),
4306cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
4307cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin05),
4308cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4309cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
4310cfd74d65d832137e20e193c960802afba73b5d38sm
4311cfd74d65d832137e20e193c960802afba73b5d38sm            InventoryComponent.UpdateRecord addCoin = new InventoryComponent.UpdateRecord();
4312cfd74d65d832137e20e193c960802afba73b5d38sm            addCoin.coinCount = 1;
4313cfd74d65d832137e20e193c960802afba73b5d38sm
4314cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(addCoin);
4315cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4316cfd74d65d832137e20e193c960802afba73b5d38sm
4317cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.COIN, staticData);
4318cfd74d65d832137e20e193c960802afba73b5d38sm        }
4319cfd74d65d832137e20e193c960802afba73b5d38sm
4320cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4321cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
4322cfd74d65d832137e20e193c960802afba73b5d38sm
4323cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4324cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
4325cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4326cfd74d65d832137e20e193c960802afba73b5d38sm
4327cfd74d65d832137e20e193c960802afba73b5d38sm        //DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4328cfd74d65d832137e20e193c960802afba73b5d38sm        //sprite.setCollisionComponent(dynamicCollision);
4329cfd74d65d832137e20e193c960802afba73b5d38sm
4330cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4331cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieWhenCollected(true);
4332cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincible(true);
4333cfd74d65d832137e20e193c960802afba73b5d38sm
4334cfd74d65d832137e20e193c960802afba73b5d38sm        HitPlayerComponent hitPlayer = (HitPlayerComponent)allocateComponent(HitPlayerComponent.class);
4335cfd74d65d832137e20e193c960802afba73b5d38sm        hitPlayer.setup(32, hitReact, HitType.COLLECT, false);
4336cfd74d65d832137e20e193c960802afba73b5d38sm
4337cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = sSystemRegistry.soundSystem;
4338cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
4339cfd74d65d832137e20e193c960802afba73b5d38sm            hitReact.setTakeHitSound(HitType.COLLECT, sound.load(R.raw.ding));
4340cfd74d65d832137e20e193c960802afba73b5d38sm        }
4341cfd74d65d832137e20e193c960802afba73b5d38sm
4342cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO: this is pretty dumb.  The static data binding needs to be made generic.
4343cfd74d65d832137e20e193c960802afba73b5d38sm        final int staticDataSize = staticData.getCount();
4344cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < staticDataSize; x++) {
4345cfd74d65d832137e20e193c960802afba73b5d38sm            final BaseObject entry = staticData.get(x);
4346cfd74d65d832137e20e193c960802afba73b5d38sm            if (entry instanceof InventoryComponent.UpdateRecord) {
4347cfd74d65d832137e20e193c960802afba73b5d38sm                hitReact.setInventoryUpdate((InventoryComponent.UpdateRecord)entry);
4348cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4349cfd74d65d832137e20e193c960802afba73b5d38sm            }
4350cfd74d65d832137e20e193c960802afba73b5d38sm        }
4351cfd74d65d832137e20e193c960802afba73b5d38sm
4352cfd74d65d832137e20e193c960802afba73b5d38sm        //dynamicCollision.setHitReactionComponent(hitReact);
4353cfd74d65d832137e20e193c960802afba73b5d38sm
4354cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
4355cfd74d65d832137e20e193c960802afba73b5d38sm
4356cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4357cfd74d65d832137e20e193c960802afba73b5d38sm
4358cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4359cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4360cfd74d65d832137e20e193c960802afba73b5d38sm        //object.add(dynamicCollision);
4361cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitPlayer);
4362cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4363cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(life);
4364cfd74d65d832137e20e193c960802afba73b5d38sm
4365cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.COIN, object, sprite);
4366cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4367cfd74d65d832137e20e193c960802afba73b5d38sm
4368cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4369cfd74d65d832137e20e193c960802afba73b5d38sm    }
4370cfd74d65d832137e20e193c960802afba73b5d38sm
4371cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnRuby(float positionX, float positionY) {
4372cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4373cfd74d65d832137e20e193c960802afba73b5d38sm
4374cfd74d65d832137e20e193c960802afba73b5d38sm
4375cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4376cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4377cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4378cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
4379cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
4380cfd74d65d832137e20e193c960802afba73b5d38sm
4381cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.RUBY);
4382cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4383cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4384cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4385cfd74d65d832137e20e193c960802afba73b5d38sm
4386cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1);
4387cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 16, 16));
4388cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT);
4389cfd74d65d832137e20e193c960802afba73b5d38sm
4390cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 5);
4391cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4392cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_ruby01),
4393cfd74d65d832137e20e193c960802afba73b5d38sm                    2.0f, null, basicVulnerabilityVolume));
4394cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4395cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_ruby02),
4396cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4397cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4398cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_ruby03),
4399cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
4400cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4401cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_ruby04),
4402cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
4403cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4404cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_ruby05),
4405cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4406cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
4407cfd74d65d832137e20e193c960802afba73b5d38sm
4408cfd74d65d832137e20e193c960802afba73b5d38sm            InventoryComponent.UpdateRecord addRuby = new InventoryComponent.UpdateRecord();
4409cfd74d65d832137e20e193c960802afba73b5d38sm            addRuby.rubyCount = 1;
4410cfd74d65d832137e20e193c960802afba73b5d38sm
4411cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(addRuby);
4412cfd74d65d832137e20e193c960802afba73b5d38sm
4413cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4414cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.RUBY, staticData);
4415cfd74d65d832137e20e193c960802afba73b5d38sm        }
4416cfd74d65d832137e20e193c960802afba73b5d38sm
4417cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4418cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
4419cfd74d65d832137e20e193c960802afba73b5d38sm
4420cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4421cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
4422cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4423cfd74d65d832137e20e193c960802afba73b5d38sm
4424cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4425cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4426cfd74d65d832137e20e193c960802afba73b5d38sm
4427cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4428cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieWhenCollected(true);
4429cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincible(true);
4430cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO: this is pretty dumb.  The static data binding needs to be made generic.
4431cfd74d65d832137e20e193c960802afba73b5d38sm        final int staticDataSize = staticData.getCount();
4432cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < staticDataSize; x++) {
4433cfd74d65d832137e20e193c960802afba73b5d38sm            final BaseObject entry = staticData.get(x);
4434cfd74d65d832137e20e193c960802afba73b5d38sm            if (entry instanceof InventoryComponent.UpdateRecord) {
4435cfd74d65d832137e20e193c960802afba73b5d38sm                hitReact.setInventoryUpdate((InventoryComponent.UpdateRecord)entry);
4436cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4437cfd74d65d832137e20e193c960802afba73b5d38sm            }
4438cfd74d65d832137e20e193c960802afba73b5d38sm        }
4439cfd74d65d832137e20e193c960802afba73b5d38sm
4440cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4441cfd74d65d832137e20e193c960802afba73b5d38sm
4442cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
4443cfd74d65d832137e20e193c960802afba73b5d38sm        life.setObjectToSpawnOnDeath(GameObjectType.GEM_EFFECT_SPAWNER);
4444cfd74d65d832137e20e193c960802afba73b5d38sm
4445cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4446cfd74d65d832137e20e193c960802afba73b5d38sm
4447cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4448cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4449cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4450cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4451cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(life);
4452cfd74d65d832137e20e193c960802afba73b5d38sm
4453cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.RUBY, object, sprite);
4454cfd74d65d832137e20e193c960802afba73b5d38sm
4455cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4456cfd74d65d832137e20e193c960802afba73b5d38sm
4457cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4458cfd74d65d832137e20e193c960802afba73b5d38sm    }
4459cfd74d65d832137e20e193c960802afba73b5d38sm
4460cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnDiary(float positionX, float positionY) {
4461cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4462cfd74d65d832137e20e193c960802afba73b5d38sm
4463cfd74d65d832137e20e193c960802afba73b5d38sm        LevelSystem level = sSystemRegistry.levelSystem;
4464cfd74d65d832137e20e193c960802afba73b5d38sm        if (level != null) {
4465cfd74d65d832137e20e193c960802afba73b5d38sm        	final LevelTree.Level currentLevel = level.getCurrentLevel();
4466cfd74d65d832137e20e193c960802afba73b5d38sm        	if (currentLevel != null && currentLevel.diaryCollected) {
4467cfd74d65d832137e20e193c960802afba73b5d38sm        		return null;
4468cfd74d65d832137e20e193c960802afba73b5d38sm        	}
4469cfd74d65d832137e20e193c960802afba73b5d38sm        }
4470cfd74d65d832137e20e193c960802afba73b5d38sm
4471cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4472cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4473cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4474cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
4475cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
4476cfd74d65d832137e20e193c960802afba73b5d38sm
4477cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.DIARY);
4478cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4479cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4480cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4481cfd74d65d832137e20e193c960802afba73b5d38sm
4482cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1);
4483cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 16, 16));
4484cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT);
4485cfd74d65d832137e20e193c960802afba73b5d38sm
4486cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 8);
4487cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary01),
4488cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
4489cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary02),
4490cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
4491cfd74d65d832137e20e193c960802afba73b5d38sm
4492cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary01),
4493cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume));
4494cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
4495cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
4496cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
4497cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary03),
4498cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4499cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary04),
4500cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4501cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary05),
4502cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4503cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary06),
4504cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4505cfd74d65d832137e20e193c960802afba73b5d38sm
4506cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
4507cfd74d65d832137e20e193c960802afba73b5d38sm
4508cfd74d65d832137e20e193c960802afba73b5d38sm            InventoryComponent.UpdateRecord addDiary = new InventoryComponent.UpdateRecord();
4509cfd74d65d832137e20e193c960802afba73b5d38sm            addDiary.diaryCount = 1;
4510cfd74d65d832137e20e193c960802afba73b5d38sm
4511cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(addDiary);
4512cfd74d65d832137e20e193c960802afba73b5d38sm
4513cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4514cfd74d65d832137e20e193c960802afba73b5d38sm
4515cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.DIARY, staticData);
4516cfd74d65d832137e20e193c960802afba73b5d38sm        }
4517cfd74d65d832137e20e193c960802afba73b5d38sm
4518cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4519cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
4520cfd74d65d832137e20e193c960802afba73b5d38sm
4521cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4522cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
4523cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4524cfd74d65d832137e20e193c960802afba73b5d38sm
4525cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4526cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4527cfd74d65d832137e20e193c960802afba73b5d38sm
4528cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4529cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieWhenCollected(true);
4530cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincible(true);
4531cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setSpawnGameEventOnHit(CollisionParameters.HitType.COLLECT,
4532cfd74d65d832137e20e193c960802afba73b5d38sm                GameFlowEvent.EVENT_SHOW_DIARY, 0);
4533cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO: this is pretty dumb.  The static data binding needs to be made generic.
4534cfd74d65d832137e20e193c960802afba73b5d38sm        final int staticDataSize = staticData.getCount();
4535cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < staticDataSize; x++) {
4536cfd74d65d832137e20e193c960802afba73b5d38sm            final BaseObject entry = staticData.get(x);
4537cfd74d65d832137e20e193c960802afba73b5d38sm            if (entry instanceof InventoryComponent.UpdateRecord) {
4538cfd74d65d832137e20e193c960802afba73b5d38sm                hitReact.setInventoryUpdate((InventoryComponent.UpdateRecord)entry);
4539cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4540cfd74d65d832137e20e193c960802afba73b5d38sm            }
4541cfd74d65d832137e20e193c960802afba73b5d38sm        }
4542cfd74d65d832137e20e193c960802afba73b5d38sm
4543cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4544cfd74d65d832137e20e193c960802afba73b5d38sm
4545cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
4546cfd74d65d832137e20e193c960802afba73b5d38sm
4547cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4548cfd74d65d832137e20e193c960802afba73b5d38sm
4549cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4550cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4551cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4552cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4553cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(life);
4554cfd74d65d832137e20e193c960802afba73b5d38sm
4555cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.DIARY, object, sprite);
4556cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4557cfd74d65d832137e20e193c960802afba73b5d38sm
4558cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4559cfd74d65d832137e20e193c960802afba73b5d38sm    }
4560cfd74d65d832137e20e193c960802afba73b5d38sm
4561cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnObjectDoor(float positionX, float positionY, GameObjectType type, boolean solid) {
4562cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4563cfd74d65d832137e20e193c960802afba73b5d38sm
4564cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4565cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4566cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4567cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
4568cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
4569cfd74d65d832137e20e193c960802afba73b5d38sm
4570cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(type);
4571cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4572cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 5;
4573cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4574cfd74d65d832137e20e193c960802afba73b5d38sm
4575cfd74d65d832137e20e193c960802afba73b5d38sm            final int red_frames[] = {
4576cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_red01,
4577cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_red02,
4578cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_red03,
4579cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_red04,
4580cfd74d65d832137e20e193c960802afba73b5d38sm            };
4581cfd74d65d832137e20e193c960802afba73b5d38sm
4582cfd74d65d832137e20e193c960802afba73b5d38sm            final int blue_frames[] = {
4583cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_blue01,
4584cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_blue02,
4585cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_blue03,
4586cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_blue04,
4587cfd74d65d832137e20e193c960802afba73b5d38sm            };
4588cfd74d65d832137e20e193c960802afba73b5d38sm
4589cfd74d65d832137e20e193c960802afba73b5d38sm            final int green_frames[] = {
4590cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_green01,
4591cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_green02,
4592cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_green03,
4593cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_green04,
4594cfd74d65d832137e20e193c960802afba73b5d38sm            };
4595cfd74d65d832137e20e193c960802afba73b5d38sm
4596cfd74d65d832137e20e193c960802afba73b5d38sm            int frames[] = red_frames;
4597cfd74d65d832137e20e193c960802afba73b5d38sm
4598cfd74d65d832137e20e193c960802afba73b5d38sm            if (type == GameObjectType.DOOR_GREEN) {
4599cfd74d65d832137e20e193c960802afba73b5d38sm                frames = green_frames;
4600cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (type == GameObjectType.DOOR_BLUE) {
4601cfd74d65d832137e20e193c960802afba73b5d38sm                frames = blue_frames;
4602cfd74d65d832137e20e193c960802afba73b5d38sm            }
4603cfd74d65d832137e20e193c960802afba73b5d38sm
4604cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> vulnerabilityVolume = null;
4605cfd74d65d832137e20e193c960802afba73b5d38sm
4606cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(frames[0]),
4607cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, vulnerabilityVolume);
4608cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(frames[1]),
4609cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2));
4610cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame3 = new AnimationFrame(textureLibrary.allocateTexture(frames[2]),
4611cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2));
4612cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame4 = new AnimationFrame(textureLibrary.allocateTexture(frames[3]),
4613cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1));
4614cfd74d65d832137e20e193c960802afba73b5d38sm
4615cfd74d65d832137e20e193c960802afba73b5d38sm            // one frame of closing is deadly
4616cfd74d65d832137e20e193c960802afba73b5d38sm
4617cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> attackVolume =
4618cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
4619cfd74d65d832137e20e193c960802afba73b5d38sm            attackVolume.add(new AABoxCollisionVolume(12, 8, 8, 56));
4620cfd74d65d832137e20e193c960802afba73b5d38sm            attackVolume.get(0).setHitType(HitType.DEATH);
4621cfd74d65d832137e20e193c960802afba73b5d38sm
4622cfd74d65d832137e20e193c960802afba73b5d38sm
4623cfd74d65d832137e20e193c960802afba73b5d38sm
4624cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame closeFrame2 = new AnimationFrame(textureLibrary.allocateTexture(frames[1]),
4625cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), attackVolume, vulnerabilityVolume);
4626cfd74d65d832137e20e193c960802afba73b5d38sm
4627cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle_closed = new SpriteAnimation(DoorAnimationComponent.Animation.CLOSED, 1);
4628cfd74d65d832137e20e193c960802afba73b5d38sm            idle_closed.addFrame(frame1);
4629cfd74d65d832137e20e193c960802afba73b5d38sm
4630cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle_open = new SpriteAnimation(DoorAnimationComponent.Animation.OPEN, 1);
4631cfd74d65d832137e20e193c960802afba73b5d38sm            idle_open.addFrame(frame4);
4632cfd74d65d832137e20e193c960802afba73b5d38sm
4633cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation open = new SpriteAnimation(DoorAnimationComponent.Animation.OPENING, 2);
4634cfd74d65d832137e20e193c960802afba73b5d38sm            open.addFrame(frame2);
4635cfd74d65d832137e20e193c960802afba73b5d38sm            open.addFrame(frame3);
4636cfd74d65d832137e20e193c960802afba73b5d38sm
4637cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation close = new SpriteAnimation(DoorAnimationComponent.Animation.CLOSING, 2);
4638cfd74d65d832137e20e193c960802afba73b5d38sm            close.addFrame(frame3);
4639cfd74d65d832137e20e193c960802afba73b5d38sm            close.addFrame(closeFrame2);
4640cfd74d65d832137e20e193c960802afba73b5d38sm
4641cfd74d65d832137e20e193c960802afba73b5d38sm            SolidSurfaceComponent solidSurface
4642cfd74d65d832137e20e193c960802afba73b5d38sm                = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class);
4643cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.inititalize(4);
4644cfd74d65d832137e20e193c960802afba73b5d38sm            // box shape:
4645cfd74d65d832137e20e193c960802afba73b5d38sm            // ___       ___1
4646cfd74d65d832137e20e193c960802afba73b5d38sm            // | |      2| |3
4647cfd74d65d832137e20e193c960802afba73b5d38sm            // ---       ---4
4648cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Start = new Vector2(0, object.height);
4649cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1End = new Vector2(object.width, object.height);
4650cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Normal = new Vector2(0.0f, -1.0f);
4651cfd74d65d832137e20e193c960802afba73b5d38sm            surface1Normal.normalize();
4652cfd74d65d832137e20e193c960802afba73b5d38sm
4653cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Start = new Vector2(0, object.height);
4654cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2End = new Vector2(0, 0);
4655cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Normal = new Vector2(-1.0f, 0.0f);
4656cfd74d65d832137e20e193c960802afba73b5d38sm            surface2Normal.normalize();
4657cfd74d65d832137e20e193c960802afba73b5d38sm
4658cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Start = new Vector2(object.width, object.height);
4659cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3End = new Vector2(object.width, 0);
4660cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Normal = new Vector2(1.0f, 0);
4661cfd74d65d832137e20e193c960802afba73b5d38sm
4662cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Start = new Vector2(0, 0);
4663cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4End = new Vector2(object.width, 0);
4664cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Normal = new Vector2(0, 1.0f);
4665cfd74d65d832137e20e193c960802afba73b5d38sm
4666cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface1Start, surface1End, surface1Normal);
4667cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface2Start, surface2End, surface2Normal);
4668cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface3Start, surface3End, surface3Normal);
4669cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface4Start, surface4End, surface4Normal);
4670cfd74d65d832137e20e193c960802afba73b5d38sm
4671cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle_open);
4672cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle_closed);
4673cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(open);
4674cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(close);
4675cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(solidSurface);
4676cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(type, staticData);
4677cfd74d65d832137e20e193c960802afba73b5d38sm        }
4678cfd74d65d832137e20e193c960802afba73b5d38sm
4679cfd74d65d832137e20e193c960802afba73b5d38sm
4680cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4681cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.FOREGROUND_OBJECT);
4682cfd74d65d832137e20e193c960802afba73b5d38sm
4683cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4684cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
4685cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4686cfd74d65d832137e20e193c960802afba73b5d38sm
4687cfd74d65d832137e20e193c960802afba73b5d38sm        DoorAnimationComponent doorAnim = (DoorAnimationComponent)allocateComponent(DoorAnimationComponent.class);
4688cfd74d65d832137e20e193c960802afba73b5d38sm        doorAnim.setSprite(sprite);
4689cfd74d65d832137e20e193c960802afba73b5d38sm
4690cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
4691cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
4692cfd74d65d832137e20e193c960802afba73b5d38sm        	doorAnim.setSounds(sound.load(R.raw.sound_open), sound.load(R.raw.sound_close));
4693cfd74d65d832137e20e193c960802afba73b5d38sm        }
4694cfd74d65d832137e20e193c960802afba73b5d38sm
4695cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem.Channel doorChannel = null;
4696cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem;
4697cfd74d65d832137e20e193c960802afba73b5d38sm        switch (type) {
4698cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_RED:
4699cfd74d65d832137e20e193c960802afba73b5d38sm                doorChannel = channelSystem.registerChannel(sRedButtonChannel);
4700cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4701cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_BLUE:
4702cfd74d65d832137e20e193c960802afba73b5d38sm                doorChannel = channelSystem.registerChannel(sBlueButtonChannel);
4703cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4704cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_GREEN:
4705cfd74d65d832137e20e193c960802afba73b5d38sm                doorChannel = channelSystem.registerChannel(sGreenButtonChannel);
4706cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4707cfd74d65d832137e20e193c960802afba73b5d38sm        }
4708cfd74d65d832137e20e193c960802afba73b5d38sm        doorAnim.setChannel(doorChannel);
4709cfd74d65d832137e20e193c960802afba73b5d38sm
4710cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4711cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4712cfd74d65d832137e20e193c960802afba73b5d38sm
4713cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
4714cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4715cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4716cfd74d65d832137e20e193c960802afba73b5d38sm
4717cfd74d65d832137e20e193c960802afba73b5d38sm
4718cfd74d65d832137e20e193c960802afba73b5d38sm
4719cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4720cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4721cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(doorAnim);
4722cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4723cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4724cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(type, object, sprite);
4725cfd74d65d832137e20e193c960802afba73b5d38sm
4726cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
4727cfd74d65d832137e20e193c960802afba73b5d38sm
4728cfd74d65d832137e20e193c960802afba73b5d38sm        SolidSurfaceComponent solidSurface = object.findByClass(SolidSurfaceComponent.class);
4729cfd74d65d832137e20e193c960802afba73b5d38sm        if (solid) {
4730cfd74d65d832137e20e193c960802afba73b5d38sm            doorAnim.setSolidSurface(solidSurface);
4731cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
4732cfd74d65d832137e20e193c960802afba73b5d38sm            object.remove(solidSurface);
4733cfd74d65d832137e20e193c960802afba73b5d38sm            object.commitUpdates();
4734cfd74d65d832137e20e193c960802afba73b5d38sm        }
4735cfd74d65d832137e20e193c960802afba73b5d38sm
4736cfd74d65d832137e20e193c960802afba73b5d38sm
4737cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4738cfd74d65d832137e20e193c960802afba73b5d38sm
4739cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4740cfd74d65d832137e20e193c960802afba73b5d38sm    }
4741cfd74d65d832137e20e193c960802afba73b5d38sm
4742cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnObjectButton(float positionX, float positionY, GameObjectType type) {
4743cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4744cfd74d65d832137e20e193c960802afba73b5d38sm
4745cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4746cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4747cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4748cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
4749cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
4750cfd74d65d832137e20e193c960802afba73b5d38sm
4751cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(type);
4752cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4753cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4754cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4755cfd74d65d832137e20e193c960802afba73b5d38sm
4756cfd74d65d832137e20e193c960802afba73b5d38sm            final int red_frames[] = {
4757cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_button_red,
4758cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_button_pressed_red,
4759cfd74d65d832137e20e193c960802afba73b5d38sm            };
4760cfd74d65d832137e20e193c960802afba73b5d38sm
4761cfd74d65d832137e20e193c960802afba73b5d38sm            final int blue_frames[] = {
4762cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_button_blue,
4763cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_button_pressed_blue,
4764cfd74d65d832137e20e193c960802afba73b5d38sm            };
4765cfd74d65d832137e20e193c960802afba73b5d38sm
4766cfd74d65d832137e20e193c960802afba73b5d38sm            final int green_frames[] = {
4767cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_button_green,
4768cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_button_pressed_green,
4769cfd74d65d832137e20e193c960802afba73b5d38sm            };
4770cfd74d65d832137e20e193c960802afba73b5d38sm
4771cfd74d65d832137e20e193c960802afba73b5d38sm            int frames[] = red_frames;
4772cfd74d65d832137e20e193c960802afba73b5d38sm
4773cfd74d65d832137e20e193c960802afba73b5d38sm            if (type == GameObjectType.BUTTON_GREEN) {
4774cfd74d65d832137e20e193c960802afba73b5d38sm                frames = green_frames;
4775cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (type == GameObjectType.BUTTON_BLUE) {
4776cfd74d65d832137e20e193c960802afba73b5d38sm                frames = blue_frames;
4777cfd74d65d832137e20e193c960802afba73b5d38sm            }
4778cfd74d65d832137e20e193c960802afba73b5d38sm
4779cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> vulnerabilityVolume =
4780cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
4781cfd74d65d832137e20e193c960802afba73b5d38sm            vulnerabilityVolume.add(new AABoxCollisionVolume(0, 0, 32, 16));
4782cfd74d65d832137e20e193c960802afba73b5d38sm            vulnerabilityVolume.get(0).setHitType(HitType.DEPRESS);
4783cfd74d65d832137e20e193c960802afba73b5d38sm
4784cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(frames[0]),
4785cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, vulnerabilityVolume);
4786cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(frames[1]),
4787cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, vulnerabilityVolume);
4788cfd74d65d832137e20e193c960802afba73b5d38sm
4789cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(ButtonAnimationComponent.Animation.UP, 1);
4790cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
4791cfd74d65d832137e20e193c960802afba73b5d38sm
4792cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation pressed = new SpriteAnimation(ButtonAnimationComponent.Animation.DOWN, 1);
4793cfd74d65d832137e20e193c960802afba73b5d38sm            pressed.addFrame(frame2);
4794cfd74d65d832137e20e193c960802afba73b5d38sm
4795cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4796cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(pressed);
4797cfd74d65d832137e20e193c960802afba73b5d38sm
4798cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(type, staticData);
4799cfd74d65d832137e20e193c960802afba73b5d38sm        }
4800cfd74d65d832137e20e193c960802afba73b5d38sm
4801cfd74d65d832137e20e193c960802afba73b5d38sm
4802cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4803cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
4804cfd74d65d832137e20e193c960802afba73b5d38sm
4805cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4806cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
4807cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4808cfd74d65d832137e20e193c960802afba73b5d38sm
4809cfd74d65d832137e20e193c960802afba73b5d38sm        ButtonAnimationComponent button = (ButtonAnimationComponent)allocateComponent(ButtonAnimationComponent.class);
4810cfd74d65d832137e20e193c960802afba73b5d38sm        button.setSprite(sprite);
4811cfd74d65d832137e20e193c960802afba73b5d38sm
4812cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
4813cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
4814cfd74d65d832137e20e193c960802afba73b5d38sm        	button.setDepressSound(sound.load(R.raw.sound_button));
4815cfd74d65d832137e20e193c960802afba73b5d38sm        }
4816cfd74d65d832137e20e193c960802afba73b5d38sm
4817cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem.Channel buttonChannel = null;
4818cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem;
4819cfd74d65d832137e20e193c960802afba73b5d38sm        switch (type) {
4820cfd74d65d832137e20e193c960802afba73b5d38sm            case BUTTON_RED:
4821cfd74d65d832137e20e193c960802afba73b5d38sm                buttonChannel = channelSystem.registerChannel(sRedButtonChannel);
4822cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4823cfd74d65d832137e20e193c960802afba73b5d38sm            case BUTTON_BLUE:
4824cfd74d65d832137e20e193c960802afba73b5d38sm                buttonChannel = channelSystem.registerChannel(sBlueButtonChannel);
4825cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4826cfd74d65d832137e20e193c960802afba73b5d38sm            case BUTTON_GREEN:
4827cfd74d65d832137e20e193c960802afba73b5d38sm                buttonChannel = channelSystem.registerChannel(sGreenButtonChannel);
4828cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4829cfd74d65d832137e20e193c960802afba73b5d38sm        }
4830cfd74d65d832137e20e193c960802afba73b5d38sm        button.setChannel(buttonChannel);
4831cfd74d65d832137e20e193c960802afba73b5d38sm
4832cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4833cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4834cfd74d65d832137e20e193c960802afba73b5d38sm
4835cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4836cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincible(false);
4837cfd74d65d832137e20e193c960802afba73b5d38sm
4838cfd74d65d832137e20e193c960802afba73b5d38sm
4839cfd74d65d832137e20e193c960802afba73b5d38sm
4840cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4841cfd74d65d832137e20e193c960802afba73b5d38sm
4842cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.NONE;
4843cfd74d65d832137e20e193c960802afba73b5d38sm
4844cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4845cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4846cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(button);
4847cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4848cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4849cfd74d65d832137e20e193c960802afba73b5d38sm
4850cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(type, object, sprite);
4851cfd74d65d832137e20e193c960802afba73b5d38sm
4852cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4853cfd74d65d832137e20e193c960802afba73b5d38sm
4854cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4855cfd74d65d832137e20e193c960802afba73b5d38sm    }
4856cfd74d65d832137e20e193c960802afba73b5d38sm
4857cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnObjectCannon(float positionX, float positionY) {
4858cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4859cfd74d65d832137e20e193c960802afba73b5d38sm
4860cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4861cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4862cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4863cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
4864cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
4865cfd74d65d832137e20e193c960802afba73b5d38sm
4866cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CANNON);
4867cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4868cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4869cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4870cfd74d65d832137e20e193c960802afba73b5d38sm
4871cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> attackVolume =
4872cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
4873cfd74d65d832137e20e193c960802afba73b5d38sm            attackVolume.add(new AABoxCollisionVolume(16, 16, 32, 80));
4874cfd74d65d832137e20e193c960802afba73b5d38sm            attackVolume.get(0).setHitType(HitType.LAUNCH);
4875cfd74d65d832137e20e193c960802afba73b5d38sm
4876cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(
4877cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_cannon),
4878cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, attackVolume, null);
4879cfd74d65d832137e20e193c960802afba73b5d38sm
4880cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(GenericAnimationComponent.Animation.IDLE, 1);
4881cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
4882cfd74d65d832137e20e193c960802afba73b5d38sm
4883cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1NoAttack = new AnimationFrame(
4884cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_cannon),
4885cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, null);
4886cfd74d65d832137e20e193c960802afba73b5d38sm
4887cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation shoot = new SpriteAnimation(GenericAnimationComponent.Animation.ATTACK, 1);
4888cfd74d65d832137e20e193c960802afba73b5d38sm            shoot.addFrame(frame1NoAttack);
4889cfd74d65d832137e20e193c960802afba73b5d38sm
4890cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4891cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(shoot);
4892cfd74d65d832137e20e193c960802afba73b5d38sm
4893cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.CANNON, staticData);
4894cfd74d65d832137e20e193c960802afba73b5d38sm        }
4895cfd74d65d832137e20e193c960802afba73b5d38sm
4896cfd74d65d832137e20e193c960802afba73b5d38sm
4897cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4898cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.FOREGROUND_OBJECT);
4899cfd74d65d832137e20e193c960802afba73b5d38sm
4900cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4901cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
4902cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4903cfd74d65d832137e20e193c960802afba73b5d38sm
4904cfd74d65d832137e20e193c960802afba73b5d38sm        LauncherComponent launcher = (LauncherComponent)allocateComponent(LauncherComponent.class);
4905cfd74d65d832137e20e193c960802afba73b5d38sm        launcher.setLaunchEffect(GameObjectType.SMOKE_POOF, 32.0f, 85.0f);
4906cfd74d65d832137e20e193c960802afba73b5d38sm
4907cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
4908cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
4909cfd74d65d832137e20e193c960802afba73b5d38sm        	launcher.setLaunchSound(sound.load(R.raw.sound_cannon));
4910cfd74d65d832137e20e193c960802afba73b5d38sm        }
4911cfd74d65d832137e20e193c960802afba73b5d38sm
4912cfd74d65d832137e20e193c960802afba73b5d38sm
4913cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4914cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4915cfd74d65d832137e20e193c960802afba73b5d38sm
4916cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4917cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincible(false);
4918cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setLauncherComponent(launcher, HitType.LAUNCH);
4919cfd74d65d832137e20e193c960802afba73b5d38sm
4920cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4921cfd74d65d832137e20e193c960802afba73b5d38sm
4922cfd74d65d832137e20e193c960802afba73b5d38sm        GenericAnimationComponent anim = (GenericAnimationComponent)allocateComponent(GenericAnimationComponent.class);
4923cfd74d65d832137e20e193c960802afba73b5d38sm        anim.setSprite(sprite);
4924cfd74d65d832137e20e193c960802afba73b5d38sm
4925cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.NONE;
4926cfd74d65d832137e20e193c960802afba73b5d38sm
4927cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4928cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4929cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4930cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4931cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(launcher);
4932cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(anim);
4933cfd74d65d832137e20e193c960802afba73b5d38sm
4934cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.CANNON, object, sprite);
4935cfd74d65d832137e20e193c960802afba73b5d38sm
4936cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4937cfd74d65d832137e20e193c960802afba73b5d38sm
4938cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4939cfd74d65d832137e20e193c960802afba73b5d38sm    }
4940cfd74d65d832137e20e193c960802afba73b5d38sm
4941cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnObjectBrobotSpawner(float positionX, float positionY, boolean flipHorizontal) {
4942cfd74d65d832137e20e193c960802afba73b5d38sm
4943cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4944cfd74d65d832137e20e193c960802afba73b5d38sm
4945cfd74d65d832137e20e193c960802afba73b5d38sm        // This is pretty heavy-handed.
4946cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO: figure out a general solution for objects that depend on other objects.
4947cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle01);
4948cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle02);
4949cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle03);
4950cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk01);
4951cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk02);
4952cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk03);
4953cfd74d65d832137e20e193c960802afba73b5d38sm
4954cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4955cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4956cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4957cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
4958cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
4959cfd74d65d832137e20e193c960802afba73b5d38sm
4960cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BROBOT_SPAWNER);
4961cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4962cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 3;
4963cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4964cfd74d65d832137e20e193c960802afba73b5d38sm
4965cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
4966cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
4967cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(32, 32, 32));
4968cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.POSSESS);
4969cfd74d65d832137e20e193c960802afba73b5d38sm
4970cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 1);
4971cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4972cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_brobot_machine),
4973cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume));
4974cfd74d65d832137e20e193c960802afba73b5d38sm
4975cfd74d65d832137e20e193c960802afba73b5d38sm            SolidSurfaceComponent solidSurface
4976cfd74d65d832137e20e193c960802afba73b5d38sm                = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class);
4977cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.inititalize(3);
4978cfd74d65d832137e20e193c960802afba73b5d38sm            /*
4979cfd74d65d832137e20e193c960802afba73b5d38sm                0:2,0:8,59:-0.99532399996093,0.09659262446878
4980cfd74d65d832137e20e193c960802afba73b5d38sm                0:8,59:61,33:0.44551558813576,0.89527418187282
4981cfd74d65d832137e20e193c960802afba73b5d38sm                0:61,33:61,-1:1,0
4982cfd74d65d832137e20e193c960802afba73b5d38sm
4983cfd74d65d832137e20e193c960802afba73b5d38sm             */
4984cfd74d65d832137e20e193c960802afba73b5d38sm            // trapezoid shape:
4985cfd74d65d832137e20e193c960802afba73b5d38sm            // |\        |\2
4986cfd74d65d832137e20e193c960802afba73b5d38sm            // | |      1| |3
4987cfd74d65d832137e20e193c960802afba73b5d38sm
4988cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Start = new Vector2(0, 0);
4989cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1End = new Vector2(8.0f, 59.0f);
4990cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Normal = new Vector2(-0.9953f, 0.0965f);
4991cfd74d65d832137e20e193c960802afba73b5d38sm            surface1Normal.normalize();
4992cfd74d65d832137e20e193c960802afba73b5d38sm
4993cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Start = new Vector2(8.0f, 59.0f);
4994cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2End = new Vector2(61.0f, 33.0f);
4995cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Normal = new Vector2(0.445515f, 0.89527f);
4996cfd74d65d832137e20e193c960802afba73b5d38sm            surface2Normal.normalize();
4997cfd74d65d832137e20e193c960802afba73b5d38sm
4998cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Start = new Vector2(61.0f, 33.0f);
4999cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3End = new Vector2(61.0f, 0.0f);
5000cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Normal = new Vector2(1.0f, 0.0f);
5001cfd74d65d832137e20e193c960802afba73b5d38sm
5002cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface1Start, surface1End, surface1Normal);
5003cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface2Start, surface2End, surface2Normal);
5004cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface3Start, surface3End, surface3Normal);
5005cfd74d65d832137e20e193c960802afba73b5d38sm
5006cfd74d65d832137e20e193c960802afba73b5d38sm            GhostComponent ghost = (GhostComponent)allocateComponent(GhostComponent.class);
5007cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.setTargetAction(ActionType.IDLE);
5008cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.changeActionOnButton(ActionType.ATTACK);
5009cfd74d65d832137e20e193c960802afba73b5d38sm
5010cfd74d65d832137e20e193c960802afba73b5d38sm            SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
5011cfd74d65d832137e20e193c960802afba73b5d38sm            if (sound != null) {
5012cfd74d65d832137e20e193c960802afba73b5d38sm            	ghost.setAmbientSound(sound.load(R.raw.sound_possession));
5013cfd74d65d832137e20e193c960802afba73b5d38sm            }
5014cfd74d65d832137e20e193c960802afba73b5d38sm
5015cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(ghost);
5016cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(solidSurface);
5017cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5018cfd74d65d832137e20e193c960802afba73b5d38sm
5019cfd74d65d832137e20e193c960802afba73b5d38sm
5020cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.BROBOT_SPAWNER, staticData);
5021cfd74d65d832137e20e193c960802afba73b5d38sm        }
5022cfd74d65d832137e20e193c960802afba73b5d38sm
5023cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5024cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
5025cfd74d65d832137e20e193c960802afba73b5d38sm
5026cfd74d65d832137e20e193c960802afba73b5d38sm
5027cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5028cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
5029cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5030cfd74d65d832137e20e193c960802afba73b5d38sm
5031cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
5032cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
5033cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
5034cfd74d65d832137e20e193c960802afba73b5d38sm
5035cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
5036cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
5037cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
5038cfd74d65d832137e20e193c960802afba73b5d38sm
5039cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent gun
5040cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
5041cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setDelayBeforeFirstSet(3.0f);
5042cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setObjectTypeToSpawn(GameObjectType.BROBOT);
5043cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetX(36);
5044cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetY(50);
5045cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityX(100.0f);
5046cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityY(300.0f);
5047cfd74d65d832137e20e193c960802afba73b5d38sm        gun.enableProjectileTracking(1);
5048cfd74d65d832137e20e193c960802afba73b5d38sm
5049cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent possessedGun
5050cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
5051cfd74d65d832137e20e193c960802afba73b5d38sm        possessedGun.setRequiredAction(ActionType.ATTACK);
5052cfd74d65d832137e20e193c960802afba73b5d38sm        possessedGun.setDelayBeforeFirstSet(0.0f);
5053cfd74d65d832137e20e193c960802afba73b5d38sm        possessedGun.setObjectTypeToSpawn(GameObjectType.BROBOT_BULLET);
5054cfd74d65d832137e20e193c960802afba73b5d38sm        possessedGun.setOffsetX(36);
5055cfd74d65d832137e20e193c960802afba73b5d38sm        possessedGun.setOffsetY(50);
5056cfd74d65d832137e20e193c960802afba73b5d38sm        possessedGun.setVelocityX(600.0f);
5057cfd74d65d832137e20e193c960802afba73b5d38sm        possessedGun.setVelocityY(600.0f);
5058cfd74d65d832137e20e193c960802afba73b5d38sm        possessedGun.setThetaError(0.3f);
5059cfd74d65d832137e20e193c960802afba73b5d38sm
5060cfd74d65d832137e20e193c960802afba73b5d38sm        ChangeComponentsComponent componentSwap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class);
5061cfd74d65d832137e20e193c960802afba73b5d38sm        componentSwap.addSwapOutComponent(gun);
5062cfd74d65d832137e20e193c960802afba73b5d38sm        componentSwap.addSwapInComponent(possessedGun);
5063cfd74d65d832137e20e193c960802afba73b5d38sm        componentSwap.setPingPongBehavior(true);
5064cfd74d65d832137e20e193c960802afba73b5d38sm
5065cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setPossessionComponent(componentSwap);
5066cfd74d65d832137e20e193c960802afba73b5d38sm
5067cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
5068cfd74d65d832137e20e193c960802afba73b5d38sm
5069cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
5070cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
5071cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
5072cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = 1.0f;
5073cfd74d65d832137e20e193c960802afba73b5d38sm        }
5074cfd74d65d832137e20e193c960802afba73b5d38sm
5075cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
5076cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
5077cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun);
5078cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
5079cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
5080cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(componentSwap);
5081cfd74d65d832137e20e193c960802afba73b5d38sm
5082cfd74d65d832137e20e193c960802afba73b5d38sm
5083cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.BROBOT_SPAWNER, object, sprite);
5084cfd74d65d832137e20e193c960802afba73b5d38sm
5085cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
5086cfd74d65d832137e20e193c960802afba73b5d38sm
5087cfd74d65d832137e20e193c960802afba73b5d38sm        GhostComponent possessedGhost = object.findByClass(GhostComponent.class);
5088cfd74d65d832137e20e193c960802afba73b5d38sm        if (possessedGhost != null) {
5089cfd74d65d832137e20e193c960802afba73b5d38sm            object.remove(possessedGhost);   // Not supposed to be added yet.
5090cfd74d65d832137e20e193c960802afba73b5d38sm            componentSwap.addSwapInComponent(possessedGhost);
5091cfd74d65d832137e20e193c960802afba73b5d38sm        }
5092cfd74d65d832137e20e193c960802afba73b5d38sm
5093cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
5094cfd74d65d832137e20e193c960802afba73b5d38sm
5095cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5096cfd74d65d832137e20e193c960802afba73b5d38sm    }
5097cfd74d65d832137e20e193c960802afba73b5d38sm
5098cfd74d65d832137e20e193c960802afba73b5d38smpublic GameObject spawnObjectBreakableBlock(float positionX, float positionY) {
5099cfd74d65d832137e20e193c960802afba73b5d38sm
5100cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
5101cfd74d65d832137e20e193c960802afba73b5d38sm
5102cfd74d65d832137e20e193c960802afba73b5d38sm        // Preload block piece texture.
5103cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.object_debris_piece);
5104cfd74d65d832137e20e193c960802afba73b5d38sm
5105cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5106cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5107cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
5108cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
5109cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
5110cfd74d65d832137e20e193c960802afba73b5d38sm
5111cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BREAKABLE_BLOCK);
5112cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5113cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
5114cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5115cfd74d65d832137e20e193c960802afba73b5d38sm
5116cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
5117cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
5118cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(7, 0, 32 - 7, 42, HitType.HIT));
5119cfd74d65d832137e20e193c960802afba73b5d38sm
5120cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 1);
5121cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5122cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_debris_block),
5123cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume));
5124cfd74d65d832137e20e193c960802afba73b5d38sm
5125cfd74d65d832137e20e193c960802afba73b5d38sm            SolidSurfaceComponent solidSurface
5126cfd74d65d832137e20e193c960802afba73b5d38sm                = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class);
5127cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.inititalize(4);
5128cfd74d65d832137e20e193c960802afba73b5d38sm
5129cfd74d65d832137e20e193c960802afba73b5d38sm            // box shape:
5130cfd74d65d832137e20e193c960802afba73b5d38sm            // ___       ___2
5131cfd74d65d832137e20e193c960802afba73b5d38sm            // | |      1| |3
5132cfd74d65d832137e20e193c960802afba73b5d38sm            // ---       ---4
5133cfd74d65d832137e20e193c960802afba73b5d38sm
5134cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Start = new Vector2(0.0f, 0.0f);
5135cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1End = new Vector2(0.0f, 32.0f);
5136cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Normal = new Vector2(-1.0f, 0.0f);
5137cfd74d65d832137e20e193c960802afba73b5d38sm            surface1Normal.normalize();
5138cfd74d65d832137e20e193c960802afba73b5d38sm
5139cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Start = new Vector2(0.0f, 32.0f);
5140cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2End = new Vector2(32.0f, 32.0f);
5141cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Normal = new Vector2(0.0f, 1.0f);
5142cfd74d65d832137e20e193c960802afba73b5d38sm            surface2Normal.normalize();
5143cfd74d65d832137e20e193c960802afba73b5d38sm
5144cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Start = new Vector2(32.0f, 32.0f);
5145cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3End = new Vector2(32.0f, 0.0f);
5146cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Normal = new Vector2(1.0f, 0.0f);
5147cfd74d65d832137e20e193c960802afba73b5d38sm
5148cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Start = new Vector2(32.0f, 0.0f);
5149cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4End = new Vector2(0.0f, 0.0f);
5150cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Normal = new Vector2(0.0f, -1.0f);
5151cfd74d65d832137e20e193c960802afba73b5d38sm
5152cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface1Start, surface1End, surface1Normal);
5153cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface2Start, surface2End, surface2Normal);
5154cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface3Start, surface3End, surface3Normal);
5155cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface4Start, surface4End, surface4Normal);
5156cfd74d65d832137e20e193c960802afba73b5d38sm
5157cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(solidSurface);
5158cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5159cfd74d65d832137e20e193c960802afba73b5d38sm
5160cfd74d65d832137e20e193c960802afba73b5d38sm
5161cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.BREAKABLE_BLOCK, staticData);
5162cfd74d65d832137e20e193c960802afba73b5d38sm        }
5163cfd74d65d832137e20e193c960802afba73b5d38sm
5164cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5165cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
5166cfd74d65d832137e20e193c960802afba73b5d38sm
5167cfd74d65d832137e20e193c960802afba73b5d38sm
5168cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5169cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
5170cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5171cfd74d65d832137e20e193c960802afba73b5d38sm
5172cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
5173cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
5174cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
5175cfd74d65d832137e20e193c960802afba73b5d38sm
5176cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
5177cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
5178cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
5179cfd74d65d832137e20e193c960802afba73b5d38sm
5180cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
5181cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.BREAKABLE_BLOCK_PIECE_SPAWNER);
5182cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
5183cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
5184cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_break_block));
5185cfd74d65d832137e20e193c960802afba73b5d38sm        }
5186cfd74d65d832137e20e193c960802afba73b5d38sm
5187cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
5188cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
5189cfd74d65d832137e20e193c960802afba73b5d38sm
5190cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
5191cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
5192cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
5193cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
5194cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
5195cfd74d65d832137e20e193c960802afba73b5d38sm
5196cfd74d65d832137e20e193c960802afba73b5d38sm
5197cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.BREAKABLE_BLOCK, object, sprite);
5198cfd74d65d832137e20e193c960802afba73b5d38sm
5199cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
5200cfd74d65d832137e20e193c960802afba73b5d38sm
5201cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5202cfd74d65d832137e20e193c960802afba73b5d38sm    }
5203cfd74d65d832137e20e193c960802afba73b5d38sm
5204cfd74d65d832137e20e193c960802afba73b5d38sm	public GameObject spawnObjectTheSource(float positionX, float positionY) {
5205cfd74d65d832137e20e193c960802afba73b5d38sm
5206cfd74d65d832137e20e193c960802afba73b5d38sm	    final TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
5207cfd74d65d832137e20e193c960802afba73b5d38sm
5208cfd74d65d832137e20e193c960802afba73b5d38sm	    GameObject object = mGameObjectPool.allocate();
5209cfd74d65d832137e20e193c960802afba73b5d38sm	    object.activationRadius = mAlwaysActive;
5210cfd74d65d832137e20e193c960802afba73b5d38sm	    object.width = 512;
5211cfd74d65d832137e20e193c960802afba73b5d38sm	    object.height = 512;
5212cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5213cfd74d65d832137e20e193c960802afba73b5d38sm
5214cfd74d65d832137e20e193c960802afba73b5d38sm	    RenderComponent layer1Render = (RenderComponent)allocateComponent(RenderComponent.class);
5215cfd74d65d832137e20e193c960802afba73b5d38sm	    layer1Render.setPriority(SortConstants.THE_SOURCE_START);
5216cfd74d65d832137e20e193c960802afba73b5d38sm	    FadeDrawableComponent layer1Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
5217cfd74d65d832137e20e193c960802afba73b5d38sm	    layer1Fade.setRenderComponent(layer1Render);
5218cfd74d65d832137e20e193c960802afba73b5d38sm	    layer1Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_spikes));
5219cfd74d65d832137e20e193c960802afba73b5d38sm	    layer1Fade.setupFade(1.0f, 0.2f, 1.9f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_EASE, 0.0f);
5220cfd74d65d832137e20e193c960802afba73b5d38sm
5221cfd74d65d832137e20e193c960802afba73b5d38sm	    RenderComponent layer2Render = (RenderComponent)allocateComponent(RenderComponent.class);
5222cfd74d65d832137e20e193c960802afba73b5d38sm	    layer2Render.setPriority(SortConstants.THE_SOURCE_START + 1);
5223cfd74d65d832137e20e193c960802afba73b5d38sm	    FadeDrawableComponent layer2Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
5224cfd74d65d832137e20e193c960802afba73b5d38sm	    layer2Fade.setRenderComponent(layer2Render);
5225cfd74d65d832137e20e193c960802afba73b5d38sm	    layer2Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_body));
5226cfd74d65d832137e20e193c960802afba73b5d38sm	    layer2Fade.setupFade(1.0f, 0.8f, 5.0f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_EASE, 0.0f);
5227cfd74d65d832137e20e193c960802afba73b5d38sm
5228cfd74d65d832137e20e193c960802afba73b5d38sm	    RenderComponent layer3Render = (RenderComponent)allocateComponent(RenderComponent.class);
5229cfd74d65d832137e20e193c960802afba73b5d38sm	    layer3Render.setPriority(SortConstants.THE_SOURCE_START + 2);
5230cfd74d65d832137e20e193c960802afba73b5d38sm	    FadeDrawableComponent layer3Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
5231cfd74d65d832137e20e193c960802afba73b5d38sm	    layer3Fade.setRenderComponent(layer3Render);
5232cfd74d65d832137e20e193c960802afba73b5d38sm	    layer3Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_black));
5233cfd74d65d832137e20e193c960802afba73b5d38sm	    layer3Fade.setupFade(0.0f, 1.0f, 6.0f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_LINEAR, 0.0f);
5234cfd74d65d832137e20e193c960802afba73b5d38sm
5235cfd74d65d832137e20e193c960802afba73b5d38sm	    RenderComponent layer4Render = (RenderComponent)allocateComponent(RenderComponent.class);
5236cfd74d65d832137e20e193c960802afba73b5d38sm	    layer4Render.setPriority(SortConstants.THE_SOURCE_START + 3);
5237cfd74d65d832137e20e193c960802afba73b5d38sm	    FadeDrawableComponent layer4Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
5238cfd74d65d832137e20e193c960802afba73b5d38sm	    layer4Fade.setRenderComponent(layer4Render);
5239cfd74d65d832137e20e193c960802afba73b5d38sm	    layer4Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_spots));
5240cfd74d65d832137e20e193c960802afba73b5d38sm	    layer4Fade.setupFade(0.0f, 1.0f, 2.3f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_EASE, 0.0f);
5241cfd74d65d832137e20e193c960802afba73b5d38sm
5242cfd74d65d832137e20e193c960802afba73b5d38sm	    RenderComponent layer5Render = (RenderComponent)allocateComponent(RenderComponent.class);
5243cfd74d65d832137e20e193c960802afba73b5d38sm	    layer5Render.setPriority(SortConstants.THE_SOURCE_START + 4);
5244cfd74d65d832137e20e193c960802afba73b5d38sm	    FadeDrawableComponent layer5Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
5245cfd74d65d832137e20e193c960802afba73b5d38sm	    layer5Fade.setRenderComponent(layer5Render);
5246cfd74d65d832137e20e193c960802afba73b5d38sm	    layer5Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_core));
5247cfd74d65d832137e20e193c960802afba73b5d38sm	    layer5Fade.setupFade(0.2f, 1.0f, 1.2f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_EASE, 0.0f);
5248cfd74d65d832137e20e193c960802afba73b5d38sm
5249cfd74d65d832137e20e193c960802afba73b5d38sm
5250cfd74d65d832137e20e193c960802afba73b5d38sm	    OrbitalMagnetComponent orbit = (OrbitalMagnetComponent)allocateComponent(OrbitalMagnetComponent.class);
5251cfd74d65d832137e20e193c960802afba73b5d38sm	    orbit.setup(320.0f, 220.0f);
5252cfd74d65d832137e20e193c960802afba73b5d38sm
5253cfd74d65d832137e20e193c960802afba73b5d38sm	    DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
5254cfd74d65d832137e20e193c960802afba73b5d38sm	    FixedSizeArray<CollisionVolume> vulnerabilityVolume =
5255cfd74d65d832137e20e193c960802afba73b5d38sm            new FixedSizeArray<CollisionVolume>(1);
5256cfd74d65d832137e20e193c960802afba73b5d38sm	    vulnerabilityVolume.add(new SphereCollisionVolume(256, 256, 256, HitType.HIT));
5257cfd74d65d832137e20e193c960802afba73b5d38sm	    FixedSizeArray<CollisionVolume> attackVolume =
5258cfd74d65d832137e20e193c960802afba73b5d38sm            new FixedSizeArray<CollisionVolume>(1);
5259cfd74d65d832137e20e193c960802afba73b5d38sm	    attackVolume.add(new SphereCollisionVolume(256, 256, 256, HitType.HIT));
5260cfd74d65d832137e20e193c960802afba73b5d38sm	    collision.setCollisionVolumes(attackVolume, vulnerabilityVolume);
5261cfd74d65d832137e20e193c960802afba73b5d38sm
5262cfd74d65d832137e20e193c960802afba73b5d38sm	    HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
5263cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
5264cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincibleTime(TheSourceComponent.SHAKE_TIME);
5265cfd74d65d832137e20e193c960802afba73b5d38sm
5266cfd74d65d832137e20e193c960802afba73b5d38sm        TheSourceComponent theSource = (TheSourceComponent)allocateComponent(TheSourceComponent.class);
5267cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem.Channel surpriseChannel = null;
5268cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem;
5269cfd74d65d832137e20e193c960802afba73b5d38sm        surpriseChannel = channelSystem.registerChannel(sSurprisedNPCChannel);
5270cfd74d65d832137e20e193c960802afba73b5d38sm        theSource.setChannel(surpriseChannel);
5271cfd74d65d832137e20e193c960802afba73b5d38sm        theSource.setGameEvent(GameFlowEvent.EVENT_SHOW_ANIMATION, AnimationPlayerActivity.WANDA_ENDING);
5272cfd74d65d832137e20e193c960802afba73b5d38sm
5273cfd74d65d832137e20e193c960802afba73b5d38sm
5274cfd74d65d832137e20e193c960802afba73b5d38sm	    object.life = 3;
5275cfd74d65d832137e20e193c960802afba73b5d38sm	    object.team = Team.PLAYER;
5276cfd74d65d832137e20e193c960802afba73b5d38sm
5277cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer1Render);
5278cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer2Render);
5279cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer3Render);
5280cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer4Render);
5281cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer5Render);
5282cfd74d65d832137e20e193c960802afba73b5d38sm
5283cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer1Fade);
5284cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer2Fade);
5285cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer3Fade);
5286cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer4Fade);
5287cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer5Fade);
5288cfd74d65d832137e20e193c960802afba73b5d38sm
5289cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(orbit);
5290cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(collision);
5291cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(hitReact);
5292cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(theSource);
5293cfd74d65d832137e20e193c960802afba73b5d38sm
5294cfd74d65d832137e20e193c960802afba73b5d38sm	    return object;
5295cfd74d65d832137e20e193c960802afba73b5d38sm	}
5296cfd74d65d832137e20e193c960802afba73b5d38sm
5297cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnObjectTurret(float positionX, float positionY, boolean flipHorizontal) {
5298cfd74d65d832137e20e193c960802afba73b5d38sm
5299cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
5300cfd74d65d832137e20e193c960802afba73b5d38sm
5301cfd74d65d832137e20e193c960802afba73b5d38sm        // Make sure related textures are loaded.
5302cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_bullet01);
5303cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_bullet02);
5304cfd74d65d832137e20e193c960802afba73b5d38sm
5305cfd74d65d832137e20e193c960802afba73b5d38sm
5306cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5307cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5308cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
5309cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
5310cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
5311cfd74d65d832137e20e193c960802afba73b5d38sm
5312cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.TURRET);
5313cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5314cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 3;
5315cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5316cfd74d65d832137e20e193c960802afba73b5d38sm
5317cfd74d65d832137e20e193c960802afba73b5d38sm            // Animations
5318cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
5319cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
5320cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(32, 32, 32));
5321cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.POSSESS);
5322cfd74d65d832137e20e193c960802afba73b5d38sm
5323cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 2);
5324cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5325cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_gunturret01),
5326cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume));
5327cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5328cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_gunturret_idle),
5329cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
5330cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
5331cfd74d65d832137e20e193c960802afba73b5d38sm
5332cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 4);
5333cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
5334cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_gunturret02),
5335cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
5336cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
5337cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_gunturret01),
5338cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
5339cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
5340cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_gunturret03),
5341cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
5342cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
5343cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_gunturret01),
5344cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
5345cfd74d65d832137e20e193c960802afba73b5d38sm            attack.setLoop(true);
5346cfd74d65d832137e20e193c960802afba73b5d38sm
5347cfd74d65d832137e20e193c960802afba73b5d38sm            GhostComponent ghost = (GhostComponent)allocateComponent(GhostComponent.class);
5348cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.setTargetAction(ActionType.IDLE);
5349cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.changeActionOnButton(ActionType.ATTACK);
5350cfd74d65d832137e20e193c960802afba73b5d38sm
5351cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5352cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
5353cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(ghost);
5354cfd74d65d832137e20e193c960802afba73b5d38sm
5355cfd74d65d832137e20e193c960802afba73b5d38sm
5356cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.TURRET, staticData);
5357cfd74d65d832137e20e193c960802afba73b5d38sm        }
5358cfd74d65d832137e20e193c960802afba73b5d38sm
5359cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5360cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
5361cfd74d65d832137e20e193c960802afba73b5d38sm
5362cfd74d65d832137e20e193c960802afba73b5d38sm
5363cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5364cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
5365cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5366cfd74d65d832137e20e193c960802afba73b5d38sm
5367cfd74d65d832137e20e193c960802afba73b5d38sm        GenericAnimationComponent animation
5368cfd74d65d832137e20e193c960802afba73b5d38sm            = (GenericAnimationComponent)allocateComponent(GenericAnimationComponent.class);
5369cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
5370cfd74d65d832137e20e193c960802afba73b5d38sm
5371cfd74d65d832137e20e193c960802afba73b5d38sm        AttackAtDistanceComponent attack = (AttackAtDistanceComponent)
5372cfd74d65d832137e20e193c960802afba73b5d38sm            allocateComponent(AttackAtDistanceComponent.class);
5373cfd74d65d832137e20e193c960802afba73b5d38sm        attack.setupAttack(300, 0.0f, 1.0f, true);
5374cfd74d65d832137e20e193c960802afba73b5d38sm
5375cfd74d65d832137e20e193c960802afba73b5d38sm
5376cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
5377cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
5378cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
5379cfd74d65d832137e20e193c960802afba73b5d38sm
5380cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
5381cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
5382cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
5383cfd74d65d832137e20e193c960802afba73b5d38sm
5384cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
5385cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.EXPLOSION_LARGE);
5386cfd74d65d832137e20e193c960802afba73b5d38sm
5387cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = sSystemRegistry.soundSystem;
5388cfd74d65d832137e20e193c960802afba73b5d38sm
5389cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent gun
5390cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
5391cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShotsPerSet(1);
5392cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setDelayBetweenShots(0.0f);
5393cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setDelayBetweenSets(0.3f);
5394cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setObjectTypeToSpawn(GameObjectType.TURRET_BULLET);
5395cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetX(54);
5396cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetY(13);
5397cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setRequiredAction(GameObject.ActionType.ATTACK);
5398cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityX(300.0f);
5399cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityY(-300.0f);
5400cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShootSound(sound.load(R.raw.sound_gun));
5401cfd74d65d832137e20e193c960802afba73b5d38sm
5402cfd74d65d832137e20e193c960802afba73b5d38sm        // Components for possession
5403cfd74d65d832137e20e193c960802afba73b5d38sm
5404cfd74d65d832137e20e193c960802afba73b5d38sm        ChangeComponentsComponent componentSwap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class);
5405cfd74d65d832137e20e193c960802afba73b5d38sm        componentSwap.addSwapOutComponent(attack);
5406cfd74d65d832137e20e193c960802afba73b5d38sm        componentSwap.setPingPongBehavior(true);
5407cfd74d65d832137e20e193c960802afba73b5d38sm
5408cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setPossessionComponent(componentSwap);
5409cfd74d65d832137e20e193c960802afba73b5d38sm
5410cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
5411cfd74d65d832137e20e193c960802afba73b5d38sm
5412cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
5413cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
5414cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
5415cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = 1.0f;
5416cfd74d65d832137e20e193c960802afba73b5d38sm        }
5417cfd74d65d832137e20e193c960802afba73b5d38sm
5418cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
5419cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
5420cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
5421cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(attack);
5422cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
5423cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
5424cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
5425cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun);
5426cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(componentSwap);
5427cfd74d65d832137e20e193c960802afba73b5d38sm
5428cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.TURRET, object, sprite);
5429cfd74d65d832137e20e193c960802afba73b5d38sm
5430cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
5431cfd74d65d832137e20e193c960802afba73b5d38sm
5432cfd74d65d832137e20e193c960802afba73b5d38sm        GhostComponent possessedGhost = object.findByClass(GhostComponent.class);
5433cfd74d65d832137e20e193c960802afba73b5d38sm        if (possessedGhost != null) {
5434cfd74d65d832137e20e193c960802afba73b5d38sm            object.remove(possessedGhost);   // Not supposed to be added yet.
5435cfd74d65d832137e20e193c960802afba73b5d38sm            componentSwap.addSwapInComponent(possessedGhost);
5436cfd74d65d832137e20e193c960802afba73b5d38sm        }
5437cfd74d65d832137e20e193c960802afba73b5d38sm
5438cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
5439cfd74d65d832137e20e193c960802afba73b5d38sm
5440cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5441cfd74d65d832137e20e193c960802afba73b5d38sm    }
5442cfd74d65d832137e20e193c960802afba73b5d38sm
5443cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnDust(float positionX, float positionY, boolean flipHorizontal) {
5444cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
5445cfd74d65d832137e20e193c960802afba73b5d38sm
5446cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5447cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5448cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
5449cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
5450cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
5451cfd74d65d832137e20e193c960802afba73b5d38sm
5452cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.DUST);
5453cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5454cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
5455cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5456cfd74d65d832137e20e193c960802afba73b5d38sm
5457cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 5);
5458cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust01),
5459cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1)));
5460cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust02),
5461cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1)));
5462cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust03),
5463cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1)));
5464cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust04),
5465cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1)));
5466cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust05),
5467cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1)));
5468cfd74d65d832137e20e193c960802afba73b5d38sm
5469cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5470cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.DUST, staticData);
5471cfd74d65d832137e20e193c960802afba73b5d38sm        }
5472cfd74d65d832137e20e193c960802afba73b5d38sm
5473cfd74d65d832137e20e193c960802afba73b5d38sm
5474cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5475cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
5476cfd74d65d832137e20e193c960802afba73b5d38sm
5477cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
5478cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(0.30f);
5479cfd74d65d832137e20e193c960802afba73b5d38sm
5480cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5481cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
5482cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5483cfd74d65d832137e20e193c960802afba73b5d38sm
5484cfd74d65d832137e20e193c960802afba73b5d38sm
5485cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
5486cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
5487cfd74d65d832137e20e193c960802afba73b5d38sm        }
5488cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
5489cfd74d65d832137e20e193c960802afba73b5d38sm
5490cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
5491cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
5492cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
5493cfd74d65d832137e20e193c960802afba73b5d38sm
5494cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.DUST, object, sprite);
5495cfd74d65d832137e20e193c960802afba73b5d38sm
5496cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
5497cfd74d65d832137e20e193c960802afba73b5d38sm
5498cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5499cfd74d65d832137e20e193c960802afba73b5d38sm    }
5500cfd74d65d832137e20e193c960802afba73b5d38sm
5501cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEffectExplosionSmall(float positionX, float positionY) {
5502cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
5503cfd74d65d832137e20e193c960802afba73b5d38sm
5504cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5505cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5506cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
5507cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
5508cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
5509cfd74d65d832137e20e193c960802afba73b5d38sm
5510cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.EXPLOSION_SMALL);
5511cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5512cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
5513cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5514cfd74d65d832137e20e193c960802afba73b5d38sm
5515cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
5516cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
5517cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 16, 16, HitType.HIT));
5518cfd74d65d832137e20e193c960802afba73b5d38sm
5519cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 7);
5520cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5521cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small01),
5522cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5523cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5524cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small02),
5525cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5526cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5527cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small03),
5528cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5529cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5530cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small04),
5531cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5532cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5533cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small05),
5534cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5535cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5536cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small06),
5537cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5538cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5539cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small07),
5540cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5541cfd74d65d832137e20e193c960802afba73b5d38sm
5542cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5543cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.EXPLOSION_SMALL, staticData);
5544cfd74d65d832137e20e193c960802afba73b5d38sm        }
5545cfd74d65d832137e20e193c960802afba73b5d38sm
5546cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5547cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
5548cfd74d65d832137e20e193c960802afba73b5d38sm
5549cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5550cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
5551cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5552cfd74d65d832137e20e193c960802afba73b5d38sm
5553cfd74d65d832137e20e193c960802afba73b5d38sm
5554cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
5555cfd74d65d832137e20e193c960802afba73b5d38sm
5556cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
5557cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
5558cfd74d65d832137e20e193c960802afba73b5d38sm
5559cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
5560cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
5561cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
5562cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
5563cfd74d65d832137e20e193c960802afba73b5d38sm
5564cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.EXPLOSION_SMALL, object, sprite);
5565cfd74d65d832137e20e193c960802afba73b5d38sm
5566cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation idle = sprite.findAnimation(0);
5567cfd74d65d832137e20e193c960802afba73b5d38sm        if (idle != null) {
5568cfd74d65d832137e20e193c960802afba73b5d38sm            lifetime.setTimeUntilDeath(idle.getLength());
5569cfd74d65d832137e20e193c960802afba73b5d38sm        }
5570cfd74d65d832137e20e193c960802afba73b5d38sm
5571cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
5572cfd74d65d832137e20e193c960802afba73b5d38sm
5573cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5574cfd74d65d832137e20e193c960802afba73b5d38sm    }
5575cfd74d65d832137e20e193c960802afba73b5d38sm
5576cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEffectExplosionLarge(float positionX, float positionY) {
5577cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
5578cfd74d65d832137e20e193c960802afba73b5d38sm
5579cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5580cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5581cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
5582cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
5583cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
5584cfd74d65d832137e20e193c960802afba73b5d38sm
5585cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.EXPLOSION_LARGE);
5586cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5587cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
5588cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5589cfd74d65d832137e20e193c960802afba73b5d38sm
5590cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
5591cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
5592cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(32, 32, 32, HitType.HIT));
5593cfd74d65d832137e20e193c960802afba73b5d38sm
5594cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 9);
5595cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5596cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big01),
5597cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5598cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5599cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big02),
5600cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5601cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5602cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big03),
5603cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5604cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5605cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big04),
5606cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5607cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5608cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big05),
5609cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5610cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5611cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big06),
5612cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5613cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5614cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big07),
5615cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5616cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5617cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big08),
5618cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5619cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5620cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big09),
5621cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5622cfd74d65d832137e20e193c960802afba73b5d38sm
5623cfd74d65d832137e20e193c960802afba73b5d38sm
5624cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5625cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.EXPLOSION_LARGE, staticData);
5626cfd74d65d832137e20e193c960802afba73b5d38sm        }
5627cfd74d65d832137e20e193c960802afba73b5d38sm
5628cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5629cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
5630cfd74d65d832137e20e193c960802afba73b5d38sm
5631cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5632cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
5633cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5634cfd74d65d832137e20e193c960802afba73b5d38sm
5635cfd74d65d832137e20e193c960802afba73b5d38sm
5636cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
5637cfd74d65d832137e20e193c960802afba73b5d38sm
5638cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision =
5639cfd74d65d832137e20e193c960802afba73b5d38sm            (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
5640cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
5641cfd74d65d832137e20e193c960802afba73b5d38sm
5642cfd74d65d832137e20e193c960802afba73b5d38sm        PlaySingleSoundComponent soundEffect = (PlaySingleSoundComponent)allocateComponent(PlaySingleSoundComponent.class);
5643cfd74d65d832137e20e193c960802afba73b5d38sm        soundEffect.setSound(sSystemRegistry.soundSystem.load(R.raw.quick_explosion));
5644cfd74d65d832137e20e193c960802afba73b5d38sm
5645cfd74d65d832137e20e193c960802afba73b5d38sm
5646cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(soundEffect);
5647cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
5648cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
5649cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
5650cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
5651cfd74d65d832137e20e193c960802afba73b5d38sm
5652cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.EXPLOSION_LARGE, object, sprite);
5653cfd74d65d832137e20e193c960802afba73b5d38sm
5654cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation idle = sprite.findAnimation(0);
5655cfd74d65d832137e20e193c960802afba73b5d38sm        if (idle != null) {
5656cfd74d65d832137e20e193c960802afba73b5d38sm            lifetime.setTimeUntilDeath(idle.getLength());
5657cfd74d65d832137e20e193c960802afba73b5d38sm        }
5658cfd74d65d832137e20e193c960802afba73b5d38sm
5659cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
5660cfd74d65d832137e20e193c960802afba73b5d38sm
5661cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5662cfd74d65d832137e20e193c960802afba73b5d38sm    }
5663cfd74d65d832137e20e193c960802afba73b5d38sm
5664cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEffectExplosionGiant(float positionX, float positionY) {
5665cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
5666cfd74d65d832137e20e193c960802afba73b5d38sm
5667cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5668cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5669cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
5670cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
5671cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
5672cfd74d65d832137e20e193c960802afba73b5d38sm
5673cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.EXPLOSION_GIANT);
5674cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5675cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 4;
5676cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5677cfd74d65d832137e20e193c960802afba73b5d38sm
5678cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume = new FixedSizeArray<CollisionVolume>(1);
5679cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(64, 32, 32, HitType.HIT));
5680cfd74d65d832137e20e193c960802afba73b5d38sm
5681cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 9);
5682cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5683cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big01),
5684cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5685cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5686cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big02),
5687cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5688cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5689cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big03),
5690cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5691cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5692cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big04),
5693cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5694cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5695cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big05),
5696cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5697cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5698cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big06),
5699cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5700cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5701cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big07),
5702cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5703cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5704cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big08),
5705cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5706cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5707cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big09),
5708cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5709cfd74d65d832137e20e193c960802afba73b5d38sm
5710cfd74d65d832137e20e193c960802afba73b5d38sm
5711cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame1 = new AnimationFrame(
5712cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small01),
5713cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5714cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame2 = new AnimationFrame(
5715cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small02),
5716cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5717cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame3 = new AnimationFrame(
5718cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small03),
5719cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5720cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame4 = new AnimationFrame(
5721cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small04),
5722cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5723cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame5 = new AnimationFrame(
5724cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small05),
5725cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5726cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame6 = new AnimationFrame(
5727cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small06),
5728cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5729cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame7 = new AnimationFrame
5730cfd74d65d832137e20e193c960802afba73b5d38sm            (textureLibrary.getTextureByResource(R.drawable.effect_explosion_small07),
5731cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5732cfd74d65d832137e20e193c960802afba73b5d38sm
5733cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation smallBlast1 = new SpriteAnimation(0, 7);
5734cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame1);
5735cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame2);
5736cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame3);
5737cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame4);
5738cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame5);
5739cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame6);
5740cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame7);
5741cfd74d65d832137e20e193c960802afba73b5d38sm
5742cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation smallBlast2 = new SpriteAnimation(0, 8);
5743cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(new AnimationFrame(null, Utils.framesToTime(24, 4), null, null));
5744cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame1);
5745cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame2);
5746cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame3);
5747cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame4);
5748cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame5);
5749cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame6);
5750cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame7);
5751cfd74d65d832137e20e193c960802afba73b5d38sm
5752cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation smallBlast3 = new SpriteAnimation(0, 8);
5753cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(new AnimationFrame(null, Utils.framesToTime(24, 8), null, null));
5754cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame1);
5755cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame2);
5756cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame3);
5757cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame4);
5758cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame5);
5759cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame6);
5760cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame7);
5761cfd74d65d832137e20e193c960802afba73b5d38sm
5762cfd74d65d832137e20e193c960802afba73b5d38sm
5763cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5764cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(smallBlast1);
5765cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(smallBlast2);
5766cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(smallBlast3);
5767cfd74d65d832137e20e193c960802afba73b5d38sm
5768cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.EXPLOSION_GIANT, staticData);
5769cfd74d65d832137e20e193c960802afba73b5d38sm        }
5770cfd74d65d832137e20e193c960802afba73b5d38sm
5771cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5772cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
5773cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5774cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
5775cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5776cfd74d65d832137e20e193c960802afba73b5d38sm
5777cfd74d65d832137e20e193c960802afba73b5d38sm        // Hack.  Use static data differently for this object so we can share three animations
5778cfd74d65d832137e20e193c960802afba73b5d38sm        // amongst three separate sprites.
5779cfd74d65d832137e20e193c960802afba73b5d38sm
5780cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation idle = (SpriteAnimation)staticData.get(0);
5781cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation smallBlast1 = (SpriteAnimation)staticData.get(1);
5782cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation smallBlast2 = (SpriteAnimation)staticData.get(2);
5783cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation smallBlast3 = (SpriteAnimation)staticData.get(3);
5784cfd74d65d832137e20e193c960802afba73b5d38sm
5785cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.addAnimation(idle);
5786cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
5787cfd74d65d832137e20e193c960802afba73b5d38sm
5788cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent blast1Render = (RenderComponent)allocateComponent(RenderComponent.class);
5789cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
5790cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent blast1Sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5791cfd74d65d832137e20e193c960802afba73b5d38sm		blast1Sprite.setSize(32, 32);
5792cfd74d65d832137e20e193c960802afba73b5d38sm        blast1Sprite.setRenderComponent(blast1Render);
5793cfd74d65d832137e20e193c960802afba73b5d38sm        blast1Render.setDrawOffset(40, 50);
5794cfd74d65d832137e20e193c960802afba73b5d38sm        blast1Sprite.addAnimation(smallBlast1);
5795cfd74d65d832137e20e193c960802afba73b5d38sm        blast1Sprite.playAnimation(0);
5796cfd74d65d832137e20e193c960802afba73b5d38sm
5797cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent blast2Render = (RenderComponent)allocateComponent(RenderComponent.class);
5798cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
5799cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent blast2Sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5800cfd74d65d832137e20e193c960802afba73b5d38sm		blast2Sprite.setSize(32, 32);
5801cfd74d65d832137e20e193c960802afba73b5d38sm        blast2Sprite.setRenderComponent(blast2Render);
5802cfd74d65d832137e20e193c960802afba73b5d38sm        blast2Render.setDrawOffset(-10, 0);
5803cfd74d65d832137e20e193c960802afba73b5d38sm        blast2Sprite.addAnimation(smallBlast2);
5804cfd74d65d832137e20e193c960802afba73b5d38sm        blast2Sprite.playAnimation(0);
5805cfd74d65d832137e20e193c960802afba73b5d38sm
5806cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent blast3Render = (RenderComponent)allocateComponent(RenderComponent.class);
5807cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
5808cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent blast3Sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5809cfd74d65d832137e20e193c960802afba73b5d38sm		blast3Sprite.setSize(32, 32);
5810cfd74d65d832137e20e193c960802afba73b5d38sm        blast3Sprite.setRenderComponent(blast3Render);
5811cfd74d65d832137e20e193c960802afba73b5d38sm        blast3Render.setDrawOffset(0, 32);
5812cfd74d65d832137e20e193c960802afba73b5d38sm        blast3Sprite.addAnimation(smallBlast3);
5813cfd74d65d832137e20e193c960802afba73b5d38sm        blast3Sprite.playAnimation(0);
5814cfd74d65d832137e20e193c960802afba73b5d38sm
5815cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
5816cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(Math.max(
5817cfd74d65d832137e20e193c960802afba73b5d38sm                Math.max(
5818cfd74d65d832137e20e193c960802afba73b5d38sm                        Math.max(idle.getLength(), smallBlast1.getLength()),
5819cfd74d65d832137e20e193c960802afba73b5d38sm                        smallBlast2.getLength()),
5820cfd74d65d832137e20e193c960802afba73b5d38sm                smallBlast3.getLength()));
5821cfd74d65d832137e20e193c960802afba73b5d38sm
5822cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision =
5823cfd74d65d832137e20e193c960802afba73b5d38sm            (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
5824cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
5825cfd74d65d832137e20e193c960802afba73b5d38sm
5826cfd74d65d832137e20e193c960802afba73b5d38sm        PlaySingleSoundComponent soundEffect = (PlaySingleSoundComponent)allocateComponent(PlaySingleSoundComponent.class);
5827cfd74d65d832137e20e193c960802afba73b5d38sm        soundEffect.setSound(sSystemRegistry.soundSystem.load(R.raw.quick_explosion));
5828cfd74d65d832137e20e193c960802afba73b5d38sm
5829cfd74d65d832137e20e193c960802afba73b5d38sm
5830cfd74d65d832137e20e193c960802afba73b5d38sm
5831cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.PLAYER;  // Maybe this should be an argument to this function.
5832cfd74d65d832137e20e193c960802afba73b5d38sm
5833cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
5834cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
5835cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
5836cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
5837cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(soundEffect);
5838cfd74d65d832137e20e193c960802afba73b5d38sm
5839cfd74d65d832137e20e193c960802afba73b5d38sm
5840cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(blast1Render);
5841cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(blast1Sprite);
5842cfd74d65d832137e20e193c960802afba73b5d38sm
5843cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(blast2Render);
5844cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(blast2Sprite);
5845cfd74d65d832137e20e193c960802afba73b5d38sm
5846cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(blast3Render);
5847cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(blast3Sprite);
5848cfd74d65d832137e20e193c960802afba73b5d38sm
5849cfd74d65d832137e20e193c960802afba73b5d38sm
5850cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5851cfd74d65d832137e20e193c960802afba73b5d38sm    }
5852cfd74d65d832137e20e193c960802afba73b5d38sm
5853cfd74d65d832137e20e193c960802afba73b5d38sm
5854cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnGhostNPC(float positionX, float positionY) {
5855cfd74d65d832137e20e193c960802afba73b5d38sm
5856cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5857cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5858cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
5859cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
5860cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
5861cfd74d65d832137e20e193c960802afba73b5d38sm
5862cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.GHOST_NPC);
5863cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5864cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
5865cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5866cfd74d65d832137e20e193c960802afba73b5d38sm
5867cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
5868cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
5869cfd74d65d832137e20e193c960802afba73b5d38sm
5870cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
5871cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
5872cfd74d65d832137e20e193c960802afba73b5d38sm
5873cfd74d65d832137e20e193c960802afba73b5d38sm
5874cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.GHOST_NPC, staticData);
5875cfd74d65d832137e20e193c960802afba73b5d38sm        }
5876cfd74d65d832137e20e193c960802afba73b5d38sm
5877cfd74d65d832137e20e193c960802afba73b5d38sm        NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class);
5878cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
5879cfd74d65d832137e20e193c960802afba73b5d38sm
5880cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.NONE;
5881cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
5882cfd74d65d832137e20e193c960802afba73b5d38sm
5883cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
5884cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(life);
5885cfd74d65d832137e20e193c960802afba73b5d38sm
5886cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.GHOST_NPC, object, null);
5887cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5888cfd74d65d832137e20e193c960802afba73b5d38sm    }
5889cfd74d65d832137e20e193c960802afba73b5d38sm
5890cfd74d65d832137e20e193c960802afba73b5d38sm    private GameObject spawnCameraBias(float positionX, float positionY) {
5891cfd74d65d832137e20e193c960802afba73b5d38sm    	GameObject object = mGameObjectPool.allocate();
5892cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5893cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
5894cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
5895cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
5896cfd74d65d832137e20e193c960802afba73b5d38sm
5897cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CAMERA_BIAS);
5898cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5899cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
5900cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5901cfd74d65d832137e20e193c960802afba73b5d38sm
5902cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent bias = allocateComponent(CameraBiasComponent.class);
5903cfd74d65d832137e20e193c960802afba73b5d38sm
5904cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(bias);
5905cfd74d65d832137e20e193c960802afba73b5d38sm
5906cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.CAMERA_BIAS, staticData);
5907cfd74d65d832137e20e193c960802afba73b5d38sm        }
5908cfd74d65d832137e20e193c960802afba73b5d38sm
5909cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.CAMERA_BIAS, object, null);
5910cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5911cfd74d65d832137e20e193c960802afba73b5d38sm	}
5912cfd74d65d832137e20e193c960802afba73b5d38sm
5913cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEffectSmokeBig(float positionX, float positionY) {
5914cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
5915cfd74d65d832137e20e193c960802afba73b5d38sm
5916cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5917cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5918cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
5919cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
5920cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
5921cfd74d65d832137e20e193c960802afba73b5d38sm
5922cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SMOKE_BIG);
5923cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5924cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 6;
5925cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5926cfd74d65d832137e20e193c960802afba73b5d38sm
5927cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
5928cfd74d65d832137e20e193c960802afba73b5d38sm
5929cfd74d65d832137e20e193c960802afba73b5d38sm
5930cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame2 = new AnimationFrame(
5931cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big02),
5932cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5933cfd74d65d832137e20e193c960802afba73b5d38sm
5934cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame3 = new AnimationFrame(
5935cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big03),
5936cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5937cfd74d65d832137e20e193c960802afba73b5d38sm
5938cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame4 = new AnimationFrame(
5939cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big04),
5940cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5941cfd74d65d832137e20e193c960802afba73b5d38sm
5942cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame5 = new AnimationFrame(
5943cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big05),
5944cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5945cfd74d65d832137e20e193c960802afba73b5d38sm
5946cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 5);
5947cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5948cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01),
5949cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 10), null, null));
5950cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
5951cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame3);
5952cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame4);
5953cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame5);
5954cfd74d65d832137e20e193c960802afba73b5d38sm
5955cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle2 = new SpriteAnimation(1, 5);
5956cfd74d65d832137e20e193c960802afba73b5d38sm            idle2.addFrame(new AnimationFrame(
5957cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01),
5958cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 13), null, null));
5959cfd74d65d832137e20e193c960802afba73b5d38sm            idle2.addFrame(frame2);
5960cfd74d65d832137e20e193c960802afba73b5d38sm            idle2.addFrame(frame3);
5961cfd74d65d832137e20e193c960802afba73b5d38sm            idle2.addFrame(frame4);
5962cfd74d65d832137e20e193c960802afba73b5d38sm            idle2.addFrame(frame5);
5963cfd74d65d832137e20e193c960802afba73b5d38sm
5964cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle3 = new SpriteAnimation(2, 5);
5965cfd74d65d832137e20e193c960802afba73b5d38sm            idle3.addFrame(new AnimationFrame(
5966cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01),
5967cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 8), null, null));
5968cfd74d65d832137e20e193c960802afba73b5d38sm            idle3.addFrame(frame2);
5969cfd74d65d832137e20e193c960802afba73b5d38sm            idle3.addFrame(frame3);
5970cfd74d65d832137e20e193c960802afba73b5d38sm            idle3.addFrame(frame4);
5971cfd74d65d832137e20e193c960802afba73b5d38sm            idle3.addFrame(frame5);
5972cfd74d65d832137e20e193c960802afba73b5d38sm
5973cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle4 = new SpriteAnimation(3, 5);
5974cfd74d65d832137e20e193c960802afba73b5d38sm            idle4.addFrame(new AnimationFrame(
5975cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01),
5976cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 5), null, null));
5977cfd74d65d832137e20e193c960802afba73b5d38sm            idle4.addFrame(frame2);
5978cfd74d65d832137e20e193c960802afba73b5d38sm            idle4.addFrame(frame3);
5979cfd74d65d832137e20e193c960802afba73b5d38sm            idle4.addFrame(frame4);
5980cfd74d65d832137e20e193c960802afba73b5d38sm            idle4.addFrame(frame5);
5981cfd74d65d832137e20e193c960802afba73b5d38sm
5982cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle5 = new SpriteAnimation(4, 5);
5983cfd74d65d832137e20e193c960802afba73b5d38sm            idle5.addFrame(new AnimationFrame(
5984cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01),
5985cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 15), null, null));
5986cfd74d65d832137e20e193c960802afba73b5d38sm            idle5.addFrame(frame2);
5987cfd74d65d832137e20e193c960802afba73b5d38sm            idle5.addFrame(frame3);
5988cfd74d65d832137e20e193c960802afba73b5d38sm            idle5.addFrame(frame4);
5989cfd74d65d832137e20e193c960802afba73b5d38sm            idle5.addFrame(frame5);
5990cfd74d65d832137e20e193c960802afba73b5d38sm
5991cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5992cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle2);
5993cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle3);
5994cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle4);
5995cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle5);
5996cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
5997cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.SMOKE_BIG, staticData);
5998cfd74d65d832137e20e193c960802afba73b5d38sm        }
5999cfd74d65d832137e20e193c960802afba73b5d38sm
6000cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
6001cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
6002cfd74d65d832137e20e193c960802afba73b5d38sm
6003cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
6004cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
6005cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
6006cfd74d65d832137e20e193c960802afba73b5d38sm
6007cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6008cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setDieWhenInvisible(true);
6009cfd74d65d832137e20e193c960802afba73b5d38sm
6010cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
6011cfd74d65d832137e20e193c960802afba73b5d38sm
6012cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6013cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
6014cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
6015cfd74d65d832137e20e193c960802afba73b5d38sm
6016cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.SMOKE_BIG, object, sprite);
6017cfd74d65d832137e20e193c960802afba73b5d38sm
6018cfd74d65d832137e20e193c960802afba73b5d38sm        final int animIndex = (int)(Math.random() * sprite.getAnimationCount());
6019cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation idle = sprite.findAnimation(animIndex);
6020cfd74d65d832137e20e193c960802afba73b5d38sm        if (idle != null) {
6021cfd74d65d832137e20e193c960802afba73b5d38sm            lifetime.setTimeUntilDeath(idle.getLength());
6022cfd74d65d832137e20e193c960802afba73b5d38sm            sprite.playAnimation(animIndex);
6023cfd74d65d832137e20e193c960802afba73b5d38sm        }
6024cfd74d65d832137e20e193c960802afba73b5d38sm
6025cfd74d65d832137e20e193c960802afba73b5d38sm
6026cfd74d65d832137e20e193c960802afba73b5d38sm
6027cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6028cfd74d65d832137e20e193c960802afba73b5d38sm    }
6029cfd74d65d832137e20e193c960802afba73b5d38sm
6030cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEffectSmokeSmall(float positionX, float positionY) {
6031cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
6032cfd74d65d832137e20e193c960802afba73b5d38sm
6033cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
6034cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6035cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
6036cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 16;
6037cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 16;
6038cfd74d65d832137e20e193c960802afba73b5d38sm
6039cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SMOKE_SMALL);
6040cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
6041cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
6042cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
6043cfd74d65d832137e20e193c960802afba73b5d38sm
6044cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
6045cfd74d65d832137e20e193c960802afba73b5d38sm
6046cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 5);
6047cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
6048cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_small01),
6049cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 10), null, null));
6050cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
6051cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_small02),
6052cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6053cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
6054cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_small03),
6055cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6056cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
6057cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_small04),
6058cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6059cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
6060cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_small05),
6061cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6062cfd74d65d832137e20e193c960802afba73b5d38sm
6063cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
6064cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
6065cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.SMOKE_SMALL, staticData);
6066cfd74d65d832137e20e193c960802afba73b5d38sm        }
6067cfd74d65d832137e20e193c960802afba73b5d38sm
6068cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
6069cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
6070cfd74d65d832137e20e193c960802afba73b5d38sm
6071cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
6072cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
6073cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
6074cfd74d65d832137e20e193c960802afba73b5d38sm
6075cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6076cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setDieWhenInvisible(true);
6077cfd74d65d832137e20e193c960802afba73b5d38sm
6078cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
6079cfd74d65d832137e20e193c960802afba73b5d38sm
6080cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6081cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
6082cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
6083cfd74d65d832137e20e193c960802afba73b5d38sm
6084cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.SMOKE_SMALL, object, sprite);
6085cfd74d65d832137e20e193c960802afba73b5d38sm
6086cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation idle = sprite.findAnimation(0);
6087cfd74d65d832137e20e193c960802afba73b5d38sm        if (idle != null) {
6088cfd74d65d832137e20e193c960802afba73b5d38sm            lifetime.setTimeUntilDeath(idle.getLength());
6089cfd74d65d832137e20e193c960802afba73b5d38sm        }
6090cfd74d65d832137e20e193c960802afba73b5d38sm
6091cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
6092cfd74d65d832137e20e193c960802afba73b5d38sm
6093cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6094cfd74d65d832137e20e193c960802afba73b5d38sm    }
6095cfd74d65d832137e20e193c960802afba73b5d38sm
6096cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEffectCrushFlash(float positionX, float positionY) {
6097cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
6098cfd74d65d832137e20e193c960802afba73b5d38sm
6099cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
6100cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6101cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
6102cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
6103cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
6104cfd74d65d832137e20e193c960802afba73b5d38sm
6105cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CRUSH_FLASH);
6106cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
6107cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
6108cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
6109cfd74d65d832137e20e193c960802afba73b5d38sm
6110cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation back = new SpriteAnimation(0, 3);
6111cfd74d65d832137e20e193c960802afba73b5d38sm            back.addFrame(new AnimationFrame(
6112cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_crush_back01),
6113cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6114cfd74d65d832137e20e193c960802afba73b5d38sm            back.addFrame(new AnimationFrame(
6115cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_crush_back02),
6116cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6117cfd74d65d832137e20e193c960802afba73b5d38sm            back.addFrame(new AnimationFrame(
6118cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_crush_back03),
6119cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6120cfd74d65d832137e20e193c960802afba73b5d38sm
6121cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation front = new SpriteAnimation(1, 7);
6122cfd74d65d832137e20e193c960802afba73b5d38sm            front.addFrame(new AnimationFrame(
6123cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front01),
6124cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6125cfd74d65d832137e20e193c960802afba73b5d38sm            front.addFrame(new AnimationFrame(
6126cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front02),
6127cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6128cfd74d65d832137e20e193c960802afba73b5d38sm            front.addFrame(new AnimationFrame(
6129cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front03),
6130cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6131cfd74d65d832137e20e193c960802afba73b5d38sm            front.addFrame(new AnimationFrame(
6132cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front04),
6133cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6134cfd74d65d832137e20e193c960802afba73b5d38sm            front.addFrame(new AnimationFrame(
6135cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front05),
6136cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6137cfd74d65d832137e20e193c960802afba73b5d38sm            front.addFrame(new AnimationFrame(
6138cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front06),
6139cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6140cfd74d65d832137e20e193c960802afba73b5d38sm            front.addFrame(new AnimationFrame(
6141cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front07),
6142cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6143cfd74d65d832137e20e193c960802afba73b5d38sm
6144cfd74d65d832137e20e193c960802afba73b5d38sm
6145cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(back);
6146cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(front);
6147cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.CRUSH_FLASH, staticData);
6148cfd74d65d832137e20e193c960802afba73b5d38sm        }
6149cfd74d65d832137e20e193c960802afba73b5d38sm
6150cfd74d65d832137e20e193c960802afba73b5d38sm
6151cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent backRender = (RenderComponent)allocateComponent(RenderComponent.class);
6152cfd74d65d832137e20e193c960802afba73b5d38sm        backRender.setPriority(SortConstants.EFFECT);
6153cfd74d65d832137e20e193c960802afba73b5d38sm
6154cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent backSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
6155cfd74d65d832137e20e193c960802afba73b5d38sm        backSprite.setSize((int)object.width, (int)object.height);
6156cfd74d65d832137e20e193c960802afba73b5d38sm        backSprite.setRenderComponent(backRender);
6157cfd74d65d832137e20e193c960802afba73b5d38sm
6158cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent foreRender = (RenderComponent)allocateComponent(RenderComponent.class);
6159cfd74d65d832137e20e193c960802afba73b5d38sm        foreRender.setPriority(SortConstants.FOREGROUND_EFFECT);
6160cfd74d65d832137e20e193c960802afba73b5d38sm
6161cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent foreSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
6162cfd74d65d832137e20e193c960802afba73b5d38sm        foreSprite.setSize((int)object.width, (int)object.height);
6163cfd74d65d832137e20e193c960802afba73b5d38sm        foreSprite.setRenderComponent(foreRender);
6164cfd74d65d832137e20e193c960802afba73b5d38sm
6165cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6166cfd74d65d832137e20e193c960802afba73b5d38sm
6167cfd74d65d832137e20e193c960802afba73b5d38sm
6168cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6169cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(backRender);
6170cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(foreRender);
6171cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(foreSprite);
6172cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(backSprite);
6173cfd74d65d832137e20e193c960802afba73b5d38sm
6174cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.CRUSH_FLASH, object, backSprite);
6175cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.CRUSH_FLASH, null, foreSprite);
6176cfd74d65d832137e20e193c960802afba73b5d38sm
6177cfd74d65d832137e20e193c960802afba73b5d38sm
6178cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation idle = foreSprite.findAnimation(1);
6179cfd74d65d832137e20e193c960802afba73b5d38sm        if (idle != null) {
6180cfd74d65d832137e20e193c960802afba73b5d38sm            lifetime.setTimeUntilDeath(idle.getLength());
6181cfd74d65d832137e20e193c960802afba73b5d38sm        }
6182cfd74d65d832137e20e193c960802afba73b5d38sm
6183cfd74d65d832137e20e193c960802afba73b5d38sm        backSprite.playAnimation(0);
6184cfd74d65d832137e20e193c960802afba73b5d38sm        foreSprite.playAnimation(1);
6185cfd74d65d832137e20e193c960802afba73b5d38sm
6186cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6187cfd74d65d832137e20e193c960802afba73b5d38sm    }
6188cfd74d65d832137e20e193c960802afba73b5d38sm
6189cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEffectFlash(float positionX, float positionY) {
6190cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
6191cfd74d65d832137e20e193c960802afba73b5d38sm
6192cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
6193cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6194cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
6195cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
6196cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
6197cfd74d65d832137e20e193c960802afba73b5d38sm
6198cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.FLASH);
6199cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
6200cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
6201cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
6202cfd74d65d832137e20e193c960802afba73b5d38sm
6203cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation back = new SpriteAnimation(0, 3);
6204cfd74d65d832137e20e193c960802afba73b5d38sm            back.addFrame(new AnimationFrame(
6205cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_crush_back01),
6206cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6207cfd74d65d832137e20e193c960802afba73b5d38sm            back.addFrame(new AnimationFrame(
6208cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_crush_back02),
6209cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6210cfd74d65d832137e20e193c960802afba73b5d38sm            back.addFrame(new AnimationFrame(
6211cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_crush_back03),
6212cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
6213cfd74d65d832137e20e193c960802afba73b5d38sm
6214cfd74d65d832137e20e193c960802afba73b5d38sm
6215cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(back);
6216cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.FLASH, staticData);
6217cfd74d65d832137e20e193c960802afba73b5d38sm        }
6218cfd74d65d832137e20e193c960802afba73b5d38sm
6219cfd74d65d832137e20e193c960802afba73b5d38sm
6220cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent backRender = (RenderComponent)allocateComponent(RenderComponent.class);
6221cfd74d65d832137e20e193c960802afba73b5d38sm        backRender.setPriority(SortConstants.EFFECT);
6222cfd74d65d832137e20e193c960802afba73b5d38sm
6223cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent backSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
6224cfd74d65d832137e20e193c960802afba73b5d38sm        backSprite.setSize((int)object.width, (int)object.height);
6225cfd74d65d832137e20e193c960802afba73b5d38sm        backSprite.setRenderComponent(backRender);
6226cfd74d65d832137e20e193c960802afba73b5d38sm
6227cfd74d65d832137e20e193c960802afba73b5d38sm
6228cfd74d65d832137e20e193c960802afba73b5d38sm
6229cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6230cfd74d65d832137e20e193c960802afba73b5d38sm
6231cfd74d65d832137e20e193c960802afba73b5d38sm
6232cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6233cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(backRender);
6234cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(backSprite);
6235cfd74d65d832137e20e193c960802afba73b5d38sm
6236cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.FLASH, object, backSprite);
6237cfd74d65d832137e20e193c960802afba73b5d38sm
6238cfd74d65d832137e20e193c960802afba73b5d38sm
6239cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation idle = backSprite.findAnimation(0);
6240cfd74d65d832137e20e193c960802afba73b5d38sm        if (idle != null) {
6241cfd74d65d832137e20e193c960802afba73b5d38sm            lifetime.setTimeUntilDeath(idle.getLength());
6242cfd74d65d832137e20e193c960802afba73b5d38sm        }
6243cfd74d65d832137e20e193c960802afba73b5d38sm
6244cfd74d65d832137e20e193c960802afba73b5d38sm        backSprite.playAnimation(0);
6245cfd74d65d832137e20e193c960802afba73b5d38sm
6246cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6247cfd74d65d832137e20e193c960802afba73b5d38sm    }
6248cfd74d65d832137e20e193c960802afba73b5d38sm
6249cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnBreakableBlockPiece(float positionX, float positionY) {
6250cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
6251cfd74d65d832137e20e193c960802afba73b5d38sm
6252cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
6253cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6254cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
6255cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 16;
6256cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 16;
6257cfd74d65d832137e20e193c960802afba73b5d38sm
6258cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BREAKABLE_BLOCK_PIECE);
6259cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
6260cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 4;
6261cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
6262cfd74d65d832137e20e193c960802afba73b5d38sm
6263cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
6264cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
6265cfd74d65d832137e20e193c960802afba73b5d38sm
6266cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
6267cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.3f);
6268cfd74d65d832137e20e193c960802afba73b5d38sm
6269cfd74d65d832137e20e193c960802afba73b5d38sm            DrawableBitmap piece = new DrawableBitmap(
6270cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.object_debris_piece),
6271cfd74d65d832137e20e193c960802afba73b5d38sm                    (int)object.width,
6272cfd74d65d832137e20e193c960802afba73b5d38sm                    (int)object.height);
6273cfd74d65d832137e20e193c960802afba73b5d38sm
6274cfd74d65d832137e20e193c960802afba73b5d38sm
6275cfd74d65d832137e20e193c960802afba73b5d38sm            RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
6276cfd74d65d832137e20e193c960802afba73b5d38sm            render.setPriority(SortConstants.GENERAL_OBJECT);
6277cfd74d65d832137e20e193c960802afba73b5d38sm            render.setDrawable(piece);
6278cfd74d65d832137e20e193c960802afba73b5d38sm
6279cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(render);
6280cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
6281cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
6282cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
6283cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.BREAKABLE_BLOCK_PIECE, staticData);
6284cfd74d65d832137e20e193c960802afba73b5d38sm        }
6285cfd74d65d832137e20e193c960802afba73b5d38sm
6286cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6287cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(3.0f);
6288cfd74d65d832137e20e193c960802afba73b5d38sm
6289cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
6290cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(12, 12);
6291cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(2, 2);
6292cfd74d65d832137e20e193c960802afba73b5d38sm
6293cfd74d65d832137e20e193c960802afba73b5d38sm
6294cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
6295cfd74d65d832137e20e193c960802afba73b5d38sm
6296cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6297cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
6298cfd74d65d832137e20e193c960802afba73b5d38sm
6299cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.BREAKABLE_BLOCK_PIECE, object, null);
6300cfd74d65d832137e20e193c960802afba73b5d38sm
6301cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6302cfd74d65d832137e20e193c960802afba73b5d38sm    }
6303cfd74d65d832137e20e193c960802afba73b5d38sm
6304cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnBreakableBlockPieceSpawner(float positionX, float positionY) {
6305cfd74d65d832137e20e193c960802afba73b5d38sm
6306cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
6307cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6308cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
6309cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 1;
6310cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 1;
6311cfd74d65d832137e20e193c960802afba73b5d38sm
6312cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6313cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(0.5f);
6314cfd74d65d832137e20e193c960802afba73b5d38sm
6315cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent pieceSpawner
6316cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
6317cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setObjectTypeToSpawn(GameObjectType.BREAKABLE_BLOCK_PIECE);
6318cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setDelayBeforeFirstSet(0.0f);
6319cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setSetsPerActivation(1);
6320cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setShotsPerSet(3);
6321cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setDelayBetweenShots(0.0f);
6322cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setOffsetX(16);
6323cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setOffsetY(16);
6324cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setVelocityX(600.0f);
6325cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setVelocityY(-1000.0f);
6326cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setThetaError(1.0f);
6327cfd74d65d832137e20e193c960802afba73b5d38sm
6328cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
6329cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
6330cfd74d65d832137e20e193c960802afba73b5d38sm
6331cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6332cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(pieceSpawner);
6333cfd74d65d832137e20e193c960802afba73b5d38sm
6334cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6335cfd74d65d832137e20e193c960802afba73b5d38sm    }
6336cfd74d65d832137e20e193c960802afba73b5d38sm
6337cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnSmokePoof(float positionX, float positionY) {
6338cfd74d65d832137e20e193c960802afba73b5d38sm
6339cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
6340cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6341cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
6342cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 1;
6343cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 1;
6344cfd74d65d832137e20e193c960802afba73b5d38sm
6345cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6346cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(0.5f);
6347cfd74d65d832137e20e193c960802afba73b5d38sm
6348cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent smokeGun
6349cfd74d65d832137e20e193c960802afba73b5d38sm	        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
6350cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setSetsPerActivation(1);
6351cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setShotsPerSet(3);
6352cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setDelayBetweenShots(0.0f);
6353cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setObjectTypeToSpawn(GameObjectType.SMOKE_BIG);
6354cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setVelocityX(200.0f);
6355cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setVelocityY(200.0f);
6356cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setOffsetX(16);
6357cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setOffsetY(16);
6358cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setThetaError(1.0f);
6359cfd74d65d832137e20e193c960802afba73b5d38sm
6360cfd74d65d832137e20e193c960802afba73b5d38sm	    LaunchProjectileComponent smokeGun2
6361cfd74d65d832137e20e193c960802afba73b5d38sm	        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
6362cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setSetsPerActivation(1);
6363cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setShotsPerSet(3);
6364cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setDelayBetweenShots(0.0f);
6365cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setObjectTypeToSpawn(GameObjectType.SMOKE_SMALL);
6366cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setVelocityX(200.0f);
6367cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setVelocityY(200.0f);
6368cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setThetaError(1.0f);
6369cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setOffsetX(16);
6370cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setOffsetY(16);
6371cfd74d65d832137e20e193c960802afba73b5d38sm
6372cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
6373cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
6374cfd74d65d832137e20e193c960802afba73b5d38sm
6375cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6376cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(smokeGun);
6377cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(smokeGun2);
6378cfd74d65d832137e20e193c960802afba73b5d38sm
6379cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6380cfd74d65d832137e20e193c960802afba73b5d38sm    }
6381cfd74d65d832137e20e193c960802afba73b5d38sm
6382cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnGemEffect(float positionX, float positionY) {
6383cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
6384cfd74d65d832137e20e193c960802afba73b5d38sm
6385cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
6386cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6387cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
6388cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
6389cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
6390cfd74d65d832137e20e193c960802afba73b5d38sm
6391cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.GEM_EFFECT);
6392cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
6393cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
6394cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
6395cfd74d65d832137e20e193c960802afba73b5d38sm
6396cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
6397cfd74d65d832137e20e193c960802afba73b5d38sm
6398cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
6399cfd74d65d832137e20e193c960802afba73b5d38sm
6400cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.GEM_EFFECT, staticData);
6401cfd74d65d832137e20e193c960802afba73b5d38sm        }
6402cfd74d65d832137e20e193c960802afba73b5d38sm
6403cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
6404cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
6405cfd74d65d832137e20e193c960802afba73b5d38sm
6406cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6407cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(0.5f);
6408cfd74d65d832137e20e193c960802afba73b5d38sm
6409cfd74d65d832137e20e193c960802afba73b5d38sm        FadeDrawableComponent fadeOut = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
6410cfd74d65d832137e20e193c960802afba73b5d38sm        fadeOut.setupFade(1.0f, 0.0f, 0.5f, FadeDrawableComponent.LOOP_TYPE_NONE, FadeDrawableComponent.FADE_LINEAR, 0.0f);
6411cfd74d65d832137e20e193c960802afba73b5d38sm        fadeOut.setTexture(textureLibrary.allocateTexture(R.drawable.object_ruby01));
6412cfd74d65d832137e20e193c960802afba73b5d38sm        fadeOut.setRenderComponent(render);
6413cfd74d65d832137e20e193c960802afba73b5d38sm
6414cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
6415cfd74d65d832137e20e193c960802afba73b5d38sm
6416cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6417cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(fadeOut);
6418cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
6419cfd74d65d832137e20e193c960802afba73b5d38sm
6420cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.GEM_EFFECT, object, null);
6421cfd74d65d832137e20e193c960802afba73b5d38sm
6422cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6423cfd74d65d832137e20e193c960802afba73b5d38sm    }
6424cfd74d65d832137e20e193c960802afba73b5d38sm
6425cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnGemEffectSpawner(float positionX, float positionY) {
6426cfd74d65d832137e20e193c960802afba73b5d38sm
6427cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
6428cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6429cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
6430cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 1;
6431cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 1;
6432cfd74d65d832137e20e193c960802afba73b5d38sm
6433cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6434cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(0.5f);
6435cfd74d65d832137e20e193c960802afba73b5d38sm
6436cfd74d65d832137e20e193c960802afba73b5d38sm        final int gems = 6;
6437cfd74d65d832137e20e193c960802afba73b5d38sm        final float angleIncrement = (float)(2.0f * Math.PI) / gems;
6438cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < gems; x++) {
6439cfd74d65d832137e20e193c960802afba73b5d38sm	        LaunchProjectileComponent gemGun
6440cfd74d65d832137e20e193c960802afba73b5d38sm		        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
6441cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setSetsPerActivation(1);
6442cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setShotsPerSet(1);
6443cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setDelayBetweenShots(0.0f);
6444cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setObjectTypeToSpawn(GameObjectType.GEM_EFFECT);
6445cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setVelocityX((float)Math.sin(angleIncrement * x) * 150.0f);
6446cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setVelocityY((float)Math.cos(angleIncrement * x) * 150.0f);
6447cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setOffsetX(16);
6448cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setOffsetY(16);
6449cfd74d65d832137e20e193c960802afba73b5d38sm
6450cfd74d65d832137e20e193c960802afba73b5d38sm	        object.add(gemGun);
6451cfd74d65d832137e20e193c960802afba73b5d38sm        }
6452cfd74d65d832137e20e193c960802afba73b5d38sm
6453cfd74d65d832137e20e193c960802afba73b5d38sm
6454cfd74d65d832137e20e193c960802afba73b5d38sm
6455cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
6456cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
6457cfd74d65d832137e20e193c960802afba73b5d38sm
6458cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6459cfd74d65d832137e20e193c960802afba73b5d38sm
6460cfd74d65d832137e20e193c960802afba73b5d38sm
6461cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6462cfd74d65d832137e20e193c960802afba73b5d38sm    }
6463cfd74d65d832137e20e193c960802afba73b5d38sm
6464cfd74d65d832137e20e193c960802afba73b5d38sm    /** Comparator for game objects objects. */
6465cfd74d65d832137e20e193c960802afba73b5d38sm    private final static class ComponentPoolComparator implements Comparator<GameComponentPool> {
6466cfd74d65d832137e20e193c960802afba73b5d38sm        public int compare(final GameComponentPool object1, final GameComponentPool object2) {
6467cfd74d65d832137e20e193c960802afba73b5d38sm            int result = 0;
6468cfd74d65d832137e20e193c960802afba73b5d38sm            if (object1 == null && object2 != null) {
6469cfd74d65d832137e20e193c960802afba73b5d38sm                result = 1;
6470cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (object1 != null && object2 == null) {
6471cfd74d65d832137e20e193c960802afba73b5d38sm                result = -1;
6472cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (object1 != null && object2 != null) {
6473cfd74d65d832137e20e193c960802afba73b5d38sm                result = object1.objectClass.hashCode() - object2.objectClass.hashCode();
6474cfd74d65d832137e20e193c960802afba73b5d38sm            }
6475cfd74d65d832137e20e193c960802afba73b5d38sm            return result;
6476cfd74d65d832137e20e193c960802afba73b5d38sm        }
6477cfd74d65d832137e20e193c960802afba73b5d38sm    }
6478cfd74d65d832137e20e193c960802afba73b5d38sm
6479cfd74d65d832137e20e193c960802afba73b5d38sm    public class GameObjectPool extends TObjectPool<GameObject> {
6480cfd74d65d832137e20e193c960802afba73b5d38sm
6481cfd74d65d832137e20e193c960802afba73b5d38sm        public GameObjectPool() {
6482cfd74d65d832137e20e193c960802afba73b5d38sm            super();
6483cfd74d65d832137e20e193c960802afba73b5d38sm        }
6484cfd74d65d832137e20e193c960802afba73b5d38sm
6485cfd74d65d832137e20e193c960802afba73b5d38sm        public GameObjectPool(int size) {
6486cfd74d65d832137e20e193c960802afba73b5d38sm            super(size);
6487cfd74d65d832137e20e193c960802afba73b5d38sm        }
6488cfd74d65d832137e20e193c960802afba73b5d38sm
6489cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
6490cfd74d65d832137e20e193c960802afba73b5d38sm        protected void fill() {
6491cfd74d65d832137e20e193c960802afba73b5d38sm            for (int x = 0; x < getSize(); x++) {
6492cfd74d65d832137e20e193c960802afba73b5d38sm                getAvailable().add(new GameObject());
6493cfd74d65d832137e20e193c960802afba73b5d38sm            }
6494cfd74d65d832137e20e193c960802afba73b5d38sm        }
6495cfd74d65d832137e20e193c960802afba73b5d38sm
6496cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
6497cfd74d65d832137e20e193c960802afba73b5d38sm        public void release(Object entry) {
6498cfd74d65d832137e20e193c960802afba73b5d38sm            ((GameObject)entry).reset();
6499cfd74d65d832137e20e193c960802afba73b5d38sm            super.release(entry);
6500cfd74d65d832137e20e193c960802afba73b5d38sm        }
6501cfd74d65d832137e20e193c960802afba73b5d38sm
6502cfd74d65d832137e20e193c960802afba73b5d38sm    }
6503cfd74d65d832137e20e193c960802afba73b5d38sm}
6504cfd74d65d832137e20e193c960802afba73b5d38sm
6505